From dc439d69a55a03ab673301e222299ba002e6e53e Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 15 Jan 2017 13:25:12 +0100 Subject: [PATCH 001/192] Sdk/Console: Turn console into a widget (WIP) --- SDK/include/NDK/Application.hpp | 6 +- SDK/include/NDK/Application.inl | 1 - SDK/include/NDK/Console.hpp | 37 ++--- SDK/include/NDK/Console.inl | 44 +----- SDK/src/NDK/Application.cpp | 13 +- SDK/src/NDK/Console.cpp | 228 ++++------------------------- SDK/src/NDK/Lua/LuaBinding_SDK.cpp | 15 +- 7 files changed, 58 insertions(+), 286 deletions(-) diff --git a/SDK/include/NDK/Application.hpp b/SDK/include/NDK/Application.hpp index b3f803fe1..cb94ad00c 100644 --- a/SDK/include/NDK/Application.hpp +++ b/SDK/include/NDK/Application.hpp @@ -17,6 +17,7 @@ #include #ifndef NDK_SERVER +#include #include #include #include @@ -83,7 +84,7 @@ namespace Ndk #ifndef NDK_SERVER struct ConsoleOverlay { - std::unique_ptr console; + Console* console; Nz::LuaInstance lua; NazaraSlot(Nz::EventHandler, OnEvent, eventSlot); @@ -116,10 +117,11 @@ namespace Ndk Nz::RenderTarget* renderTarget; std::unique_ptr window; std::unique_ptr console; + std::unique_ptr canvas; std::unique_ptr fpsCounter; std::unique_ptr overlayWorld; }; - + void SetupConsole(WindowInfo& info); void SetupFPSCounter(WindowInfo& info); void SetupOverlay(WindowInfo& info); diff --git a/SDK/include/NDK/Application.inl b/SDK/include/NDK/Application.inl index 0b4f2ce10..31ca1cff6 100644 --- a/SDK/include/NDK/Application.inl +++ b/SDK/include/NDK/Application.inl @@ -114,7 +114,6 @@ namespace Ndk } m_overlayFlags |= OverlayFlags_Console; - } else { diff --git a/SDK/include/NDK/Console.hpp b/SDK/include/NDK/Console.hpp index 59a98df0d..9c776f1ab 100644 --- a/SDK/include/NDK/Console.hpp +++ b/SDK/include/NDK/Console.hpp @@ -15,6 +15,7 @@ #include #include #include +#include #include namespace Nz @@ -26,13 +27,14 @@ namespace Ndk { class Console; class Entity; + class TextAreaWidget; using ConsoleHandle = Nz::ObjectHandle; - class NDK_API Console : public Nz::Node, public Nz::HandledObject + class NDK_API Console : public BaseWidget, public Nz::HandledObject { public: - Console(World& world, const Nz::Vector2f& size, Nz::LuaInstance& instance); + Console(BaseWidget* parent, Nz::LuaInstance& instance); Console(const Console& console) = delete; Console(Console&& console) = default; ~Console() = default; @@ -42,31 +44,22 @@ namespace Ndk void Clear(); inline unsigned int GetCharacterSize() const; - inline const EntityHandle& GetHistory() const; - inline const EntityHandle& GetHistoryBackground() const; - inline const EntityHandle& GetInput() const; - inline const EntityHandle& GetInputBackground() const; - inline const Nz::Vector2f& GetSize() const; + inline const TextAreaWidget* GetHistory() const; + inline const TextAreaWidget* GetInput() const; inline const Nz::FontRef& GetTextFont() const; - inline bool IsVisible() const; - - void SendCharacter(char32_t character); - void SendEvent(const Nz::WindowEvent& event); + void ResizeToContent() override; void SetCharacterSize(unsigned int size); - void SetSize(const Nz::Vector2f& size); void SetTextFont(Nz::FontRef font); - void Show(bool show = true); - Console& operator=(const Console& console) = delete; Console& operator=(Console&& console) = default; private: void AddLineInternal(const Nz::String& text, const Nz::Color& color = Nz::Color::White); void ExecuteInput(); - void Layout(); + void Layout() override; void RefreshHistory(); struct Line @@ -78,20 +71,10 @@ namespace Ndk std::size_t m_historyPosition; std::vector m_commandHistory; std::vector m_historyLines; - EntityOwner m_historyBackground; - EntityOwner m_history; - EntityOwner m_input; - EntityOwner m_inputBackground; + TextAreaWidget* m_history; + TextAreaWidget* m_input; Nz::FontRef m_defaultFont; Nz::LuaInstance& m_instance; - Nz::SpriteRef m_historyBackgroundSprite; - Nz::SpriteRef m_inputBackgroundSprite; - Nz::SimpleTextDrawer m_historyDrawer; - Nz::SimpleTextDrawer m_inputDrawer; - Nz::TextSpriteRef m_historyTextSprite; - Nz::TextSpriteRef m_inputTextSprite; - Nz::Vector2f m_size; - bool m_opened; unsigned int m_characterSize; unsigned int m_maxHistoryLines; }; diff --git a/SDK/include/NDK/Console.inl b/SDK/include/NDK/Console.inl index 94a6daf91..c8e825ebd 100644 --- a/SDK/include/NDK/Console.inl +++ b/SDK/include/NDK/Console.inl @@ -22,51 +22,21 @@ namespace Ndk * \return History of the console */ - inline const EntityHandle& Console::GetHistory() const + inline const TextAreaWidget* Console::GetHistory() const { return m_history; } - /*! - * \brief Gets the entity representing the background of the console's history - * \return Background history of the console - */ - - inline const EntityHandle& Console::GetHistoryBackground() const - { - return m_historyBackground; - } - /*! * \brief Gets the entity representing the input of the console * \return Input of the console */ - inline const EntityHandle& Console::GetInput() const + inline const TextAreaWidget* Console::GetInput() const { return m_input; } - /*! - * \brief Gets the entity representing the background of the console's input - * \return Background input of the console - */ - - inline const EntityHandle& Console::GetInputBackground() const - { - return m_inputBackground; - } - - /*! - * \brief Gets the size of the console - * \return Size (Width, Height) of the console - */ - - inline const Nz::Vector2f& Console::GetSize() const - { - return m_size; - } - /*! * \brief Gets the font used by the console * \return A reference to the font currenty used @@ -76,14 +46,4 @@ namespace Ndk { return m_defaultFont; } - - /*! - * \brief Checks whether the console is visible - * \return true If it is the case - */ - - inline bool Console::IsVisible() const - { - return m_opened; - } } diff --git a/SDK/src/NDK/Application.cpp b/SDK/src/NDK/Application.cpp index 4098b8a2b..caea4fd8f 100644 --- a/SDK/src/NDK/Application.cpp +++ b/SDK/src/NDK/Application.cpp @@ -147,13 +147,15 @@ namespace Ndk Nz::Vector2ui windowDimensions; if (info.window->IsValid()) - windowDimensions.Set(info.window->GetWidth(), info.window->GetHeight() / 4); + windowDimensions.Set(info.window->GetWidth(), info.window->GetHeight()); else windowDimensions.MakeZero(); - overlay->console = std::make_unique(*info.overlayWorld, Nz::Vector2f(windowDimensions), overlay->lua); + overlay->console = info.canvas->Add(overlay->lua); Console& consoleRef = *overlay->console; + consoleRef.SetSize({float(windowDimensions.x), windowDimensions.y / 4.f}); + consoleRef.Show(false); // Redirect logs toward the console overlay->logSlot.Connect(Nz::Log::OnLogWrite, [&consoleRef] (const Nz::String& str) @@ -197,11 +199,11 @@ namespace Ndk // Setup a few event callback to handle the console Nz::EventHandler& eventHandler = info.window->GetEventHandler(); - overlay->eventSlot.Connect(eventHandler.OnEvent, [&consoleRef] (const Nz::EventHandler*, const Nz::WindowEvent& event) + /*overlay->eventSlot.Connect(eventHandler.OnEvent, [&consoleRef] (const Nz::EventHandler*, const Nz::WindowEvent& event) { if (consoleRef.IsVisible()) consoleRef.SendEvent(event); - }); + });*/ overlay->keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&consoleRef] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& event) { @@ -233,6 +235,9 @@ namespace Ndk { info.overlayWorld = std::make_unique(false); //< No default system + if (info.window->IsValid()) + info.canvas = std::make_unique(info.overlayWorld->CreateHandle(), info.window->GetEventHandler()); + RenderSystem& renderSystem = info.overlayWorld->AddSystem(); renderSystem.ChangeRenderTechnique(); renderSystem.SetDefaultBackground(nullptr); diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 82d3d40af..78ff11b04 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include ///TODO: For now is unable to display different color in the history, it needs a RichTextDrawer to do so @@ -33,71 +34,24 @@ namespace Ndk * \param instance Lua instance that will interact with the world */ - Console::Console(World& world, const Nz::Vector2f& size, Nz::LuaInstance& instance) : + Console::Console(BaseWidget* parent, Nz::LuaInstance& instance) : + BaseWidget(parent), m_historyPosition(0), m_defaultFont(Nz::Font::GetDefault()), m_instance(instance), - m_size(size), - m_opened(false), m_characterSize(24) { - Nz::MaterialRef backgroundMaterial = Nz::Material::New(); - backgroundMaterial->EnableBlending(true); - backgroundMaterial->EnableDepthBuffer(false); - backgroundMaterial->SetDstBlend(Nz::BlendFunc_InvSrcAlpha); - backgroundMaterial->SetSrcBlend(Nz::BlendFunc_SrcAlpha); - - // History bakckground - m_historyBackgroundSprite = Nz::Sprite::New(); - m_historyBackgroundSprite->SetColor(Nz::Color(80, 80, 160, 128)); - m_historyBackgroundSprite->SetMaterial(backgroundMaterial); - - m_historyBackground = world.CreateEntity(); - m_historyBackground->Enable(m_opened); - m_historyBackground->AddComponent().Attach(m_historyBackgroundSprite, -1); - m_historyBackground->AddComponent().SetParent(this); - // History - m_historyDrawer.SetCharacterSize(m_characterSize); - m_historyDrawer.SetColor(Nz::Color(200, 200, 200)); - m_historyDrawer.SetFont(m_defaultFont); - - m_historyTextSprite = Nz::TextSprite::New(); - - m_history = world.CreateEntity(); - m_history->Enable(m_opened); - m_history->AddComponent().Attach(m_historyTextSprite); - - Ndk::NodeComponent& historyNode = m_history->AddComponent(); - historyNode.SetParent(this); - - // Input background - m_inputBackgroundSprite = Nz::Sprite::New(); - m_inputBackgroundSprite->SetColor(Nz::Color(255, 255, 255, 200)); - m_inputBackgroundSprite->SetMaterial(backgroundMaterial); - - m_inputBackground = world.CreateEntity(); - m_inputBackground->Enable(m_opened); - m_inputBackground->AddComponent().Attach(m_inputBackgroundSprite, -1); - m_inputBackground->AddComponent().SetParent(this); + m_history = Add(); + m_history->EnableBackground(true); + m_history->SetReadOnly(true); + m_history->SetBackgroundColor(Nz::Color(80, 80, 160, 128)); // Input - m_inputDrawer.SetColor(Nz::Color::Black); - m_inputDrawer.SetCharacterSize(m_characterSize); - m_inputDrawer.SetFont(m_defaultFont); - m_inputDrawer.SetText(s_inputPrefix); - - m_inputTextSprite = Nz::TextSprite::New(); - m_inputTextSprite->Update(m_inputDrawer); - - m_input = world.CreateEntity(); - m_input->Enable(m_opened); - m_input->AddComponent().Attach(m_inputTextSprite); - - Ndk::NodeComponent& inputNode = m_input->AddComponent(); - inputNode.SetParent(this); - - Layout(); + m_input = Add(); + m_input->EnableBackground(true); + m_input->SetText(s_inputPrefix); + m_input->SetTextColor(Nz::Color::Black); } /*! @@ -123,90 +77,8 @@ namespace Ndk RefreshHistory(); } - /*! - * \brief Sends a character to the console - * - * \param character Character that will be added to the console - */ - - void Console::SendCharacter(char32_t character) + void Console::ResizeToContent() { - switch (character) - { - case '\b': - { - Nz::String input = m_inputDrawer.GetText(); - if (input.GetLength() <= s_inputPrefixSize) // Prevent removal of the input prefix - return; // Ignore if no user character is there - - input.Resize(-1, Nz::String::HandleUtf8); - m_inputDrawer.SetText(input); - break; - } - - case '\r': - case '\n': - ExecuteInput(); - break; - - default: - { - if (Nz::Unicode::GetCategory(character) == Nz::Unicode::Category_Other_Control) - return; - - m_inputDrawer.AppendText(Nz::String::Unicode(character)); - break; - } - } - - m_inputTextSprite->Update(m_inputDrawer); - } - - /*! - * \brief Sends an event to the console - * - * \param event Event to be takin into consideration by the console - */ - void Console::SendEvent(const Nz::WindowEvent& event) - { - switch (event.type) - { - case Nz::WindowEventType_TextEntered: - SendCharacter(event.text.character); - break; - - case Nz::WindowEventType_KeyPressed: - { - switch (event.key.code) - { - case Nz::Keyboard::Down: - case Nz::Keyboard::Up: - { - if (event.key.code == Nz::Keyboard::Up) - m_historyPosition = std::min(m_commandHistory.size(), m_historyPosition + 1); - else - { - if (m_historyPosition > 1) - m_historyPosition--; - else if (m_historyPosition == 0) - m_historyPosition = 1; - } - - Nz::String text = m_commandHistory[m_commandHistory.size() - m_historyPosition]; - m_inputDrawer.SetText(s_inputPrefix + text); - m_inputTextSprite->Update(m_inputDrawer); - break; - } - - default: - break; - } - break; - } - - default: - break; - } } /*! @@ -219,27 +91,14 @@ namespace Ndk { m_characterSize = size; - m_historyDrawer.SetCharacterSize(m_characterSize); - m_historyTextSprite->Update(m_historyDrawer); - m_inputDrawer.SetCharacterSize(m_characterSize); - m_inputTextSprite->Update(m_inputDrawer); + //m_historyDrawer.SetCharacterSize(m_characterSize); + //m_historyTextSprite->Update(m_historyDrawer); + //m_inputDrawer.SetCharacterSize(m_characterSize); + //m_inputTextSprite->Update(m_inputDrawer); Layout(); } - /*! - * \brief Sets the console size - * - * \param size (Width, Height) of the console - */ - - void Console::SetSize(const Nz::Vector2f& size) - { - m_size = size; - m_historyBackgroundSprite->SetSize(m_size); - Layout(); - } - /*! * \brief Sets the text font * @@ -253,31 +112,12 @@ namespace Ndk NazaraAssert(font && font->IsValid(), "Invalid font"); m_defaultFont = std::move(font); - m_historyDrawer.SetFont(m_defaultFont); - m_inputDrawer.SetFont(m_defaultFont); + //m_historyDrawer.SetFont(m_defaultFont); + //m_inputDrawer.SetFont(m_defaultFont); Layout(); } - /*! - * \brief Shows the console - * - * \param show Should the console be showed - */ - - void Console::Show(bool show) - { - if (m_opened != show) - { - m_historyBackground->Enable(show); - m_history->Enable(show); - m_input->Enable(show); - m_inputBackground->Enable(show); - - m_opened = show; - } - } - /*! * \brief Adds a line to the history of the console * @@ -296,7 +136,7 @@ namespace Ndk void Console::ExecuteInput() { - Nz::String input = m_inputDrawer.GetText(); + /*Nz::String input = m_inputDrawer.GetText(); Nz::String inputCmd = input.SubString(s_inputPrefixSize);; m_inputDrawer.SetText(s_inputPrefix); @@ -310,7 +150,7 @@ namespace Ndk if (!m_instance.Execute(inputCmd)) AddLineInternal(m_instance.GetLastError(), Nz::Color::Red); - RefreshHistory(); + RefreshHistory();*/ } /*! @@ -319,23 +159,18 @@ namespace Ndk void Console::Layout() { + const Nz::Vector2f& size = GetContentSize(); + unsigned int lineHeight = m_defaultFont->GetSizeInfo(m_characterSize).lineHeight; - - Ndk::NodeComponent& inputNode = m_input->GetComponent(); - inputNode.SetPosition(0.f, m_size.y - lineHeight - 5.f); - - float historyHeight = m_size.y - lineHeight - 5.f - 2.f; - m_historyBackgroundSprite->SetSize(m_size.x, historyHeight); + float historyHeight = size.y - lineHeight - 5.f - 2.f; m_maxHistoryLines = static_cast(std::ceil(historyHeight / lineHeight)); - Ndk::NodeComponent& historyNode = m_history->GetComponent(); - historyNode.SetPosition(0.f, historyHeight - m_maxHistoryLines * lineHeight); + m_history->SetSize({size.x, historyHeight}); + m_history->SetPosition(0.f, historyHeight - m_maxHistoryLines * lineHeight); - Ndk::NodeComponent& inputBackgroundNode = m_inputBackground->GetComponent(); - inputBackgroundNode.SetPosition(0.f, historyHeight + 2.f); - - m_inputBackgroundSprite->SetSize(m_size.x, m_size.y - historyHeight); + m_input->SetPosition(0.f, historyHeight + 2.f); + m_input->SetSize({size.x, size.y - historyHeight}); } /*! @@ -344,7 +179,8 @@ namespace Ndk void Console::RefreshHistory() { - m_historyDrawer.Clear(); + m_history->Clear(); + auto it = m_historyLines.end(); if (m_historyLines.size() > m_maxHistoryLines) it -= m_maxHistoryLines; @@ -355,13 +191,11 @@ namespace Ndk { if (m_maxHistoryLines - i <= m_historyLines.size() && it != m_historyLines.end()) { - m_historyDrawer.AppendText(it->text); + m_history->AppendText(it->text); ++it; } - m_historyDrawer.AppendText(Nz::String('\n')); + m_history->AppendText(Nz::String('\n')); } - - m_historyTextSprite->Update(m_historyDrawer); } } diff --git a/SDK/src/NDK/Lua/LuaBinding_SDK.cpp b/SDK/src/NDK/Lua/LuaBinding_SDK.cpp index ad9bb49e9..739c32573 100644 --- a/SDK/src/NDK/Lua/LuaBinding_SDK.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_SDK.cpp @@ -62,23 +62,12 @@ namespace Ndk console.BindMethod("AddLine", &Console::AddLine, Nz::Color::White); console.BindMethod("Clear", &Console::Clear); console.BindMethod("GetCharacterSize", &Console::GetCharacterSize); - console.BindMethod("GetHistory", &Console::GetHistory); - console.BindMethod("GetHistoryBackground", &Console::GetHistoryBackground); - console.BindMethod("GetInput", &Console::GetInput); - console.BindMethod("GetInputBackground", &Console::GetInputBackground); - console.BindMethod("GetSize", &Console::GetSize); + //console.BindMethod("GetHistory", &Console::GetHistory); + //console.BindMethod("GetInput", &Console::GetInput); console.BindMethod("GetTextFont", &Console::GetTextFont); - console.BindMethod("IsVisible", &Console::IsVisible); - - console.BindMethod("SendCharacter", &Console::SendCharacter); - //consoleClass.SetMethod("SendEvent", &Console::SendEvent); - console.BindMethod("SetCharacterSize", &Console::SetCharacterSize); - console.BindMethod("SetSize", &Console::SetSize); console.BindMethod("SetTextFont", &Console::SetTextFont); - - console.BindMethod("Show", &Console::Show, true); } #endif From 19fdaa918b49ff19b56bfe513dcae9f6b09a85fe Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 20 Jan 2017 20:32:54 +0100 Subject: [PATCH 002/192] Sdk/Application: Fix after merge, allow for cursor handling --- SDK/src/NDK/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDK/src/NDK/Application.cpp b/SDK/src/NDK/Application.cpp index 32b6d0e84..1b2664985 100644 --- a/SDK/src/NDK/Application.cpp +++ b/SDK/src/NDK/Application.cpp @@ -236,7 +236,7 @@ namespace Ndk info.overlayWorld = std::make_unique(false); //< No default system if (info.window->IsValid()) - info.canvas = std::make_unique(info.overlayWorld->CreateHandle(), info.window->GetEventHandler()); + info.canvas = std::make_unique(info.overlayWorld->CreateHandle(), info.window->GetEventHandler(), info.window->GetCursorController().CreateHandle()); RenderSystem& renderSystem = info.overlayWorld->AddSystem(); renderSystem.ChangeRenderTechnique(); From 0257f4be3c895c032e380671d210c6becc6c090e Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 20 Jan 2017 20:35:21 +0100 Subject: [PATCH 003/192] Sdk/Console: Fix style --- SDK/include/NDK/Console.hpp | 1 - SDK/src/NDK/Console.cpp | 68 ++++++++++--------------------------- 2 files changed, 18 insertions(+), 51 deletions(-) diff --git a/SDK/include/NDK/Console.hpp b/SDK/include/NDK/Console.hpp index b609b3d94..4ae400a3e 100644 --- a/SDK/include/NDK/Console.hpp +++ b/SDK/include/NDK/Console.hpp @@ -60,7 +60,6 @@ namespace Ndk void AddLineInternal(const Nz::String& text, const Nz::Color& color = Nz::Color::White); void ExecuteInput(); void Layout() override; - void RefreshHistory(); struct Line { diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 99818a9c1..f24888bca 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -46,12 +46,17 @@ namespace Ndk m_history->EnableBackground(true); m_history->SetReadOnly(true); m_history->SetBackgroundColor(Nz::Color(80, 80, 160, 128)); + m_history->SetPadding(0.f, 0.f, 0.f, 4.f); // Input m_input = Add(); m_input->EnableBackground(true); m_input->SetText(s_inputPrefix); m_input->SetTextColor(Nz::Color::Black); + m_input->SetPadding(0.f, 2.f, 0.f, 2.f); + + // General + SetPadding(0.f, 0.f, 0.f, 0.f); } /*! @@ -63,8 +68,8 @@ namespace Ndk void Console::AddLine(const Nz::String& text, const Nz::Color& color) { - AddLineInternal(text, color); - RefreshHistory(); + m_historyLines.emplace_back(Line{ color, text }); + m_history->AppendText(text + '\n'); } /*! @@ -74,7 +79,8 @@ namespace Ndk void Console::Clear() { m_historyLines.clear(); - RefreshHistory(); + m_history->Clear(); + m_input->SetText(s_inputPrefix); } void Console::ResizeToContent() @@ -118,18 +124,6 @@ namespace Ndk Layout(); } - /*! - * \brief Adds a line to the history of the console - * - * \param text New line of text - * \param color Color for the text - */ - - void Console::AddLineInternal(const Nz::String& text, const Nz::Color& color) - { - m_historyLines.emplace_back(Line{color, text}); - } - /*! * \brief Performs this action when an input is added to the console */ @@ -145,12 +139,10 @@ namespace Ndk m_historyPosition = 0; - AddLineInternal(input); //< With the input prefix + AddLine(input); //< With the input prefix if (!m_instance.Execute(inputCmd)) - AddLineInternal(m_instance.GetLastError(), Nz::Color::Red); - - RefreshHistory();*/ + AddLine(m_instance.GetLastError(), Nz::Color::Red); } /*! @@ -159,43 +151,19 @@ namespace Ndk void Console::Layout() { + Nz::Vector2f origin = GetContentOrigin(); const Nz::Vector2f& size = GetContentSize(); unsigned int lineHeight = m_defaultFont->GetSizeInfo(m_characterSize).lineHeight; - float historyHeight = size.y - lineHeight - 5.f - 2.f; + float historyHeight = size.y - lineHeight; m_maxHistoryLines = static_cast(std::ceil(historyHeight / lineHeight)); + float diff = historyHeight - m_maxHistoryLines * lineHeight; - m_history->SetSize({size.x, historyHeight}); - m_history->SetPosition(0.f, historyHeight - m_maxHistoryLines * lineHeight); + m_history->SetPosition(origin.x, origin.y + diff); + m_history->SetSize({size.x, historyHeight - diff - 4.f}); - m_input->SetPosition(0.f, historyHeight + 2.f); - m_input->SetSize({size.x, size.y - historyHeight}); - } - - /*! - * \brief Refreshes the history of the console - */ - - void Console::RefreshHistory() - { - m_history->Clear(); - - auto it = m_historyLines.end(); - if (m_historyLines.size() > m_maxHistoryLines) - it -= m_maxHistoryLines; - else - it = m_historyLines.begin(); - - for (unsigned int i = 0; i < m_maxHistoryLines; ++i) - { - if (m_maxHistoryLines - i <= m_historyLines.size() && it != m_historyLines.end()) - { - m_history->AppendText(it->text); - ++it; - } - - m_history->AppendText(Nz::String('\n')); - } + m_input->SetContentSize({size.x, size.y - historyHeight}); + m_input->SetPosition(origin.x, origin.y + historyHeight); } } From 2baaaaa554adc03ed116c146fc2281d1670a8472 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 20 Jan 2017 20:40:16 +0100 Subject: [PATCH 004/192] Sdk/Console: Add input processing back --- SDK/include/NDK/Console.hpp | 3 +-- SDK/src/NDK/Console.cpp | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/SDK/include/NDK/Console.hpp b/SDK/include/NDK/Console.hpp index 4ae400a3e..74a98f2ec 100644 --- a/SDK/include/NDK/Console.hpp +++ b/SDK/include/NDK/Console.hpp @@ -57,8 +57,7 @@ namespace Ndk Console& operator=(Console&& console) = default; private: - void AddLineInternal(const Nz::String& text, const Nz::Color& color = Nz::Color::White); - void ExecuteInput(); + void ExecuteInput(const TextAreaWidget* textArea, bool* ignoreDefaultAction); void Layout() override; struct Line diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index f24888bca..d94fa07d4 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -55,6 +55,20 @@ namespace Ndk m_input->SetTextColor(Nz::Color::Black); m_input->SetPadding(0.f, 2.f, 0.f, 2.f); + m_input->OnTextAreaKeyReturn.Connect(this, &Console::ExecuteInput); + + // Protect input prefix from erasure/selection + m_input->OnTextAreaCursorMove.Connect([](const TextAreaWidget* textArea, std::size_t* newCursorPos) + { + *newCursorPos = std::max(*newCursorPos, s_inputPrefixSize); + }); + + m_input->OnTextAreaKeyBackspace.Connect([](const TextAreaWidget* textArea, bool* ignoreDefaultAction) + { + if (textArea->GetCursorPosition() <= s_inputPrefixSize) + *ignoreDefaultAction = true; + }); + // General SetPadding(0.f, 0.f, 0.f, 0.f); } @@ -128,11 +142,13 @@ namespace Ndk * \brief Performs this action when an input is added to the console */ - void Console::ExecuteInput() + void Console::ExecuteInput(const TextAreaWidget* textArea, bool* ignoreDefaultAction) { - /*Nz::String input = m_inputDrawer.GetText(); - Nz::String inputCmd = input.SubString(s_inputPrefixSize);; - m_inputDrawer.SetText(s_inputPrefix); + NazaraAssert(textArea == m_input, "Unexpected signal from an other text area"); + + Nz::String input = m_input->GetText(); + Nz::String inputCmd = input.SubString(s_inputPrefixSize); + m_input->SetText(s_inputPrefix); if (m_commandHistory.empty() || m_commandHistory.back() != inputCmd) m_commandHistory.push_back(inputCmd); From cd332c79ad86647128d055e7c64ab7f73d924033 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 30 Aug 2017 17:06:15 +0200 Subject: [PATCH 005/192] Sdk/Console: Handle history --- SDK/src/NDK/Console.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index a7a90d014..34d7808f5 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -58,6 +58,8 @@ namespace Ndk m_input->OnTextAreaKeyReturn.Connect(this, &Console::ExecuteInput); // Protect input prefix from erasure/selection + m_input->SetCursorPosition(s_inputPrefixSize); + m_input->OnTextAreaCursorMove.Connect([](const TextAreaWidget* textArea, std::size_t* newCursorPos) { *newCursorPos = std::max(*newCursorPos, s_inputPrefixSize); @@ -69,6 +71,27 @@ namespace Ndk *ignoreDefaultAction = true; }); + // Handle history + m_input->OnTextAreaKeyUp.Connect([&] (const TextAreaWidget* textArea, bool* ignoreDefaultAction) + { + *ignoreDefaultAction = true; + + if (m_historyPosition > 0) + m_historyPosition--; + + m_input->SetText(s_inputPrefix + m_commandHistory[m_historyPosition]); + }); + + m_input->OnTextAreaKeyDown.Connect([&] (const TextAreaWidget* textArea, bool* ignoreDefaultAction) + { + *ignoreDefaultAction = true; + + if (++m_historyPosition >= m_commandHistory.size()) + m_historyPosition = 0; + + m_input->SetText(s_inputPrefix + m_commandHistory[m_historyPosition]); + }); + // General SetPadding(0.f, 0.f, 0.f, 0.f); } @@ -153,7 +176,7 @@ namespace Ndk if (m_commandHistory.empty() || m_commandHistory.back() != inputCmd) m_commandHistory.push_back(inputCmd); - m_historyPosition = 0; + m_historyPosition = m_commandHistory.size(); AddLine(input); //< With the input prefix From 583cfb5f7114b702b6d9efb568ac4fa752f8fad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 12 Apr 2018 13:40:03 +0200 Subject: [PATCH 006/192] Fix console size --- SDK/src/NDK/Application.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/SDK/src/NDK/Application.cpp b/SDK/src/NDK/Application.cpp index 011889c37..784df724b 100644 --- a/SDK/src/NDK/Application.cpp +++ b/SDK/src/NDK/Application.cpp @@ -147,10 +147,7 @@ namespace Ndk Nz::Vector2ui windowDimensions; if (info.window->IsValid()) - { windowDimensions = info.window->GetSize(); - windowDimensions.y /= 4; - } else windowDimensions.MakeZero(); From 917c41f90e250c28a1c3fc17fefe19c083e30df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 12 Apr 2018 13:40:39 +0200 Subject: [PATCH 007/192] Sdk/TextAreaWidget: Fix GetGlyphIndex not being const + add overload returning current glyph index --- SDK/include/NDK/Widgets/TextAreaWidget.hpp | 3 ++- SDK/include/NDK/Widgets/TextAreaWidget.inl | 17 +++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index e0f08053e..873ca274a 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -34,7 +34,8 @@ namespace Ndk inline const Nz::Vector2ui& GetCursorPosition() const; inline const Nz::String& GetDisplayText() const; inline EchoMode GetEchoMode() const; - inline std::size_t GetGlyphIndex(const Nz::Vector2ui& cursorPosition); + inline std::size_t GetGlyphIndex() const; + inline std::size_t GetGlyphIndex(const Nz::Vector2ui& cursorPosition) const; inline const Nz::String& GetText() const; inline const Nz::Color& GetTextColor() const; diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index 07daf7896..1e13a96e5 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -37,7 +37,17 @@ namespace Ndk return m_drawer.GetText(); } - inline std::size_t TextAreaWidget::GetGlyphIndex(const Nz::Vector2ui& cursorPosition) + inline EchoMode TextAreaWidget::GetEchoMode() const + { + return m_echoMode; + } + + inline std::size_t TextAreaWidget::GetGlyphIndex() const + { + return GetGlyphIndex(m_cursorPosition); + } + + inline std::size_t TextAreaWidget::GetGlyphIndex(const Nz::Vector2ui& cursorPosition) const { std::size_t glyphIndex = m_drawer.GetLine(cursorPosition.y).glyphIndex + cursorPosition.x; if (m_drawer.GetLineCount() > cursorPosition.y + 1) @@ -48,11 +58,6 @@ namespace Ndk return glyphIndex; } - inline EchoMode TextAreaWidget::GetEchoMode() const - { - return m_echoMode; - } - inline const Nz::String& TextAreaWidget::GetText() const { return m_text; From f44a4dd3490311df9a402482f0cefdb4a8cc99ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 12 Apr 2018 13:41:09 +0200 Subject: [PATCH 008/192] Sdk/TextAreaWidget: Fix SetCharacterSize not updating displayed text --- SDK/include/NDK/Widgets/TextAreaWidget.inl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index 1e13a96e5..e13c0a640 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -119,6 +119,8 @@ namespace Ndk inline void TextAreaWidget::SetCharacterSize(unsigned int characterSize) { m_drawer.SetCharacterSize(characterSize); + + UpdateDisplayText(); } inline void TextAreaWidget::SetCursorPosition(std::size_t glyphIndex) From 7cc94d06173ef764e45f2741081c45977f914bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 12 Apr 2018 13:41:30 +0200 Subject: [PATCH 009/192] Sdk/Console: Fix merge issue --- SDK/src/NDK/Console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index b1d302d68..8d3992868 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -68,7 +68,7 @@ namespace Ndk m_input->OnTextAreaKeyBackspace.Connect([](const TextAreaWidget* textArea, bool* ignoreDefaultAction) { - if (textArea->GetGlyphUnderCursor() <= s_inputPrefixSize) + if (textArea->GetGlyphIndex() <= s_inputPrefixSize) *ignoreDefaultAction = true; }); From 6fb44796a0ca24f1d24c9e4ca9eb8f234f0566c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 12 Apr 2018 13:41:48 +0200 Subject: [PATCH 010/192] Sdk/Console: Fix SetCharacterSize not updating character size --- SDK/src/NDK/Console.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 8d3992868..184d6e9d2 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -135,10 +135,8 @@ namespace Ndk { m_characterSize = size; - //m_historyDrawer.SetCharacterSize(m_characterSize); - //m_historyTextSprite->Update(m_historyDrawer); - //m_inputDrawer.SetCharacterSize(m_characterSize); - //m_inputTextSprite->Update(m_inputDrawer); + m_history->SetCharacterSize(size); + m_input->SetCharacterSize(size); Layout(); } From 26f0a9fec934f0bff088aad92e1814a7dae8ac8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 12 Apr 2018 13:42:36 +0200 Subject: [PATCH 011/192] Sdk/Console: Add ClearFocus/SetFocus methods Theses should be virtuals --- SDK/include/NDK/Console.hpp | 2 ++ SDK/src/NDK/Console.cpp | 25 +++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/SDK/include/NDK/Console.hpp b/SDK/include/NDK/Console.hpp index 1f6e5f9a1..ae6b63b48 100644 --- a/SDK/include/NDK/Console.hpp +++ b/SDK/include/NDK/Console.hpp @@ -42,6 +42,7 @@ namespace Ndk void AddLine(const Nz::String& text, const Nz::Color& color = Nz::Color::White); void Clear(); + void ClearFocus(); inline unsigned int GetCharacterSize() const; inline const TextAreaWidget* GetHistory() const; @@ -51,6 +52,7 @@ namespace Ndk void ResizeToContent() override; void SetCharacterSize(unsigned int size); + void SetFocus(); void SetTextFont(Nz::FontRef font); Console& operator=(const Console& console) = delete; diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 184d6e9d2..f1f43ed9d 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -103,7 +103,6 @@ namespace Ndk * \param text New line of text * \param color Color for the text */ - void Console::AddLine(const Nz::String& text, const Nz::Color& color) { m_historyLines.emplace_back(Line{ color, text }); @@ -112,8 +111,9 @@ namespace Ndk /*! * \brief Clears the console + * + * Clears the console history and input */ - void Console::Clear() { m_historyLines.clear(); @@ -121,6 +121,16 @@ namespace Ndk m_input->SetText(s_inputPrefix); } + /*! + * \brief Clears the console focus + * + * Clear console input widget focus (if owned) + */ + void Console::ClearFocus() + { + m_input->ClearFocus(); + } + void Console::ResizeToContent() { } @@ -130,7 +140,6 @@ namespace Ndk * * \param size Size of the font */ - void Console::SetCharacterSize(unsigned int size) { m_characterSize = size; @@ -141,6 +150,15 @@ namespace Ndk Layout(); } + /*! + * \brief Give the console input focus + * + */ + void Console::SetFocus() + { + m_input->SetFocus(); + } + /*! * \brief Sets the text font * @@ -148,7 +166,6 @@ namespace Ndk * * \remark Produces a NazaraAssert if font is invalid or null */ - void Console::SetTextFont(Nz::FontRef font) { NazaraAssert(font && font->IsValid(), "Invalid font"); From 42b475968018949ac6b324b3421643b7f2eded1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 12 Apr 2018 13:42:54 +0200 Subject: [PATCH 012/192] Sdk/Application: Give/clear console focus when enabling/disabling it --- SDK/src/NDK/Application.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/SDK/src/NDK/Application.cpp b/SDK/src/NDK/Application.cpp index 784df724b..b190250ff 100644 --- a/SDK/src/NDK/Application.cpp +++ b/SDK/src/NDK/Application.cpp @@ -209,7 +209,19 @@ namespace Ndk overlay->keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&consoleRef] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& event) { if (event.code == Nz::Keyboard::F9) - consoleRef.Show(!consoleRef.IsVisible()); + { + // Toggle console visibility and focus + if (consoleRef.IsVisible()) + { + consoleRef.ClearFocus(); + consoleRef.Show(false); + } + else + { + consoleRef.Show(true); + consoleRef.SetFocus(); + } + } }); overlay->resizedSlot.Connect(info.renderTarget->OnRenderTargetSizeChange, [&consoleRef] (const Nz::RenderTarget* renderTarget) From 1c0a234d04fce869c5f60823c267783741199bd4 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 31 Oct 2018 18:39:14 +0100 Subject: [PATCH 013/192] Merge branch 'master' into console-widget --- SDK/include/NDK/Console.hpp | 2 -- SDK/include/NDK/Widgets/TextAreaWidget.inl | 2 +- SDK/src/NDK/Application.cpp | 4 ++-- SDK/src/NDK/Console.cpp | 17 ++++------------- 4 files changed, 7 insertions(+), 18 deletions(-) diff --git a/SDK/include/NDK/Console.hpp b/SDK/include/NDK/Console.hpp index ae6b63b48..75f4d48f9 100644 --- a/SDK/include/NDK/Console.hpp +++ b/SDK/include/NDK/Console.hpp @@ -49,8 +49,6 @@ namespace Ndk inline const TextAreaWidget* GetInput() const; inline const Nz::FontRef& GetTextFont() const; - void ResizeToContent() override; - void SetCharacterSize(unsigned int size); void SetFocus(); void SetTextFont(Nz::FontRef font); diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index 3a02e741f..2a7234b79 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -83,7 +83,7 @@ namespace Ndk inline std::size_t TextAreaWidget::GetGlyphIndex() const { - return GetGlyphIndex(m_cursorPosition); + return GetGlyphIndex(m_cursorPositionBegin); } inline std::size_t TextAreaWidget::GetGlyphIndex(const Nz::Vector2ui& cursorPosition) const diff --git a/SDK/src/NDK/Application.cpp b/SDK/src/NDK/Application.cpp index b190250ff..c26b1e7d2 100644 --- a/SDK/src/NDK/Application.cpp +++ b/SDK/src/NDK/Application.cpp @@ -154,7 +154,7 @@ namespace Ndk overlay->console = info.canvas->Add(overlay->lua); Console& consoleRef = *overlay->console; - consoleRef.SetSize({float(windowDimensions.x), windowDimensions.y / 4.f}); + consoleRef.Resize({float(windowDimensions.x), windowDimensions.y / 4.f}); consoleRef.Show(false); // Redirect logs toward the console @@ -227,7 +227,7 @@ namespace Ndk overlay->resizedSlot.Connect(info.renderTarget->OnRenderTargetSizeChange, [&consoleRef] (const Nz::RenderTarget* renderTarget) { Nz::Vector2ui size = renderTarget->GetSize(); - consoleRef.SetSize({float(size.x), size.y / 4.f}); + consoleRef.Resize({float(size.x), size.y / 4.f}); }); info.console = std::move(overlay); diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index f1f43ed9d..a6ad6d38a 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -47,14 +47,12 @@ namespace Ndk m_history->EnableBackground(true); m_history->SetReadOnly(true); m_history->SetBackgroundColor(Nz::Color(80, 80, 160, 128)); - m_history->SetPadding(0.f, 0.f, 0.f, 4.f); // Input m_input = Add(); m_input->EnableBackground(true); m_input->SetText(s_inputPrefix); m_input->SetTextColor(Nz::Color::Black); - m_input->SetPadding(0.f, 2.f, 0.f, 2.f); m_input->OnTextAreaKeyReturn.Connect(this, &Console::ExecuteInput); @@ -92,9 +90,6 @@ namespace Ndk m_input->SetText(s_inputPrefix + m_commandHistory[m_historyPosition]); }); - - // General - SetPadding(0.f, 0.f, 0.f, 0.f); } /*! @@ -131,10 +126,6 @@ namespace Ndk m_input->ClearFocus(); } - void Console::ResizeToContent() - { - } - /*! * \brief Sets the character size * @@ -206,8 +197,8 @@ namespace Ndk void Console::Layout() { - Nz::Vector2f origin = GetContentOrigin(); - const Nz::Vector2f& size = GetContentSize(); + Nz::Vector2f origin = Nz::Vector2f(GetPosition()); + const Nz::Vector2f& size = GetSize(); unsigned int lineHeight = m_defaultFont->GetSizeInfo(m_characterSize).lineHeight; float historyHeight = size.y - lineHeight; @@ -215,10 +206,10 @@ namespace Ndk m_maxHistoryLines = static_cast(std::ceil(historyHeight / lineHeight)); float diff = historyHeight - m_maxHistoryLines * lineHeight; + m_history->Resize({ size.x, historyHeight - diff - 4.f }); m_history->SetPosition(origin.x, origin.y + diff); - m_history->SetSize({size.x, historyHeight - diff - 4.f}); - m_input->SetContentSize({size.x, size.y - historyHeight}); + m_input->Resize({size.x, size.y - historyHeight}); m_input->SetPosition(origin.x, origin.y + historyHeight); } } From 3beeeebc1da4a270d1438ce2cbefa543c44ca84a Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 18:59:18 +0100 Subject: [PATCH 014/192] Physics2D/RigidBody: Add position offset --- .../NDK/Components/CollisionComponent2D.hpp | 6 ++ .../NDK/Components/CollisionComponent2D.inl | 10 --- .../NDK/Components/CollisionComponent2D.cpp | 67 +++++++++++++++---- include/Nazara/Physics2D/RigidBody2D.hpp | 5 +- include/Nazara/Physics2D/RigidBody2D.inl | 5 ++ src/Nazara/Physics2D/RigidBody2D.cpp | 22 ++++-- 6 files changed, 86 insertions(+), 29 deletions(-) diff --git a/SDK/include/NDK/Components/CollisionComponent2D.hpp b/SDK/include/NDK/Components/CollisionComponent2D.hpp index aecdc5197..140846d62 100644 --- a/SDK/include/NDK/Components/CollisionComponent2D.hpp +++ b/SDK/include/NDK/Components/CollisionComponent2D.hpp @@ -28,10 +28,14 @@ namespace Ndk CollisionComponent2D(const CollisionComponent2D& collision); ~CollisionComponent2D() = default; + void Align(const Nz::Rectf& aabb); + Nz::Rectf GetAABB() const; const Nz::Collider2DRef& GetGeom() const; + const Nz::Vector2f& GetGeomOffset() const; void SetGeom(Nz::Collider2DRef geom); + void SetGeomOffset(const Nz::Vector2f& geomOffset); CollisionComponent2D& operator=(Nz::Collider2DRef geom); CollisionComponent2D& operator=(CollisionComponent2D&& collision) = default; @@ -40,6 +44,8 @@ namespace Ndk private: void InitializeStaticBody(); + Nz::RigidBody2D* GetRigidBody(); + const Nz::RigidBody2D* GetRigidBody() const; Nz::RigidBody2D* GetStaticBody(); void OnAttached() override; diff --git a/SDK/include/NDK/Components/CollisionComponent2D.inl b/SDK/include/NDK/Components/CollisionComponent2D.inl index b85fe3017..010780443 100644 --- a/SDK/include/NDK/Components/CollisionComponent2D.inl +++ b/SDK/include/NDK/Components/CollisionComponent2D.inl @@ -28,16 +28,6 @@ namespace Ndk { } - /*! - * \brief Gets the collision box representing the entity - * \return The physics collision box - */ - - inline Nz::Rectf CollisionComponent2D::GetAABB() const - { - return m_staticBody->GetAABB(); - } - /*! * \brief Gets the geometry representing the entity * \return A constant reference to the physics geometry diff --git a/SDK/src/NDK/Components/CollisionComponent2D.cpp b/SDK/src/NDK/Components/CollisionComponent2D.cpp index 5cdfd1589..84582c261 100644 --- a/SDK/src/NDK/Components/CollisionComponent2D.cpp +++ b/SDK/src/NDK/Components/CollisionComponent2D.cpp @@ -17,28 +17,41 @@ namespace Ndk * \brief NDK class that represents a two-dimensional collision geometry */ + void CollisionComponent2D::Align(const Nz::Rectf& aabb) + { + const Nz::RigidBody2D* rigidBody = GetRigidBody(); + SetGeomOffset(aabb.GetCenter() - rigidBody->GetAABB().GetCenter() + rigidBody->GetPositionOffset()); + } + + /*! + * \brief Gets the collision box representing the entity + * \return The physics collision box + */ + Nz::Rectf CollisionComponent2D::GetAABB() const + { + return GetRigidBody()->GetAABB(); + } + + const Nz::Vector2f& CollisionComponent2D::GetGeomOffset() const + { + return GetRigidBody()->GetPositionOffset(); + } + /*! * \brief Sets geometry for the entity * * \param geom Geometry used for collisions - * - * \remark Produces a NazaraAssert if the entity has no physics component and has no static body */ void CollisionComponent2D::SetGeom(Nz::Collider2DRef geom) { m_geom = std::move(geom); - if (m_entity->HasComponent()) - { - // We update the geometry of the PhysiscsObject linked to the PhysicsComponent2D - PhysicsComponent2D& physComponent = m_entity->GetComponent(); - physComponent.GetRigidBody()->SetGeom(m_geom); - } - else - { - NazaraAssert(m_staticBody, "An entity without physics component should have a static body"); - m_staticBody->SetGeom(m_geom); - } + GetRigidBody()->SetGeom(m_geom); + } + + void CollisionComponent2D::SetGeomOffset(const Nz::Vector2f& geomOffset) + { + GetRigidBody()->SetPositionOffset(geomOffset); } /*! @@ -47,7 +60,6 @@ namespace Ndk * \remark Produces a NazaraAssert if entity is invalid * \remark Produces a NazaraAssert if entity is not linked to a world, or the world has no physics system */ - void CollisionComponent2D::InitializeStaticBody() { NazaraAssert(m_entity, "Invalid entity"); @@ -67,7 +79,34 @@ namespace Ndk matrix.MakeIdentity(); m_staticBody->SetPosition(Nz::Vector2f(matrix.GetTranslation())); + } + Nz::RigidBody2D* CollisionComponent2D::GetRigidBody() + { + if (m_entity->HasComponent()) + { + PhysicsComponent2D& physComponent = m_entity->GetComponent(); + return physComponent.GetRigidBody(); + } + else + { + NazaraAssert(m_staticBody, "An entity without physics component should have a static body"); + return m_staticBody.get(); + } + } + + const Nz::RigidBody2D* CollisionComponent2D::GetRigidBody() const + { + if (m_entity->HasComponent()) + { + PhysicsComponent2D& physComponent = m_entity->GetComponent(); + return physComponent.GetRigidBody(); + } + else + { + NazaraAssert(m_staticBody, "An entity without physics component should have a static body"); + return m_staticBody.get(); + } } /*! diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index be90acc92..bc40ef9c0 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -32,7 +32,7 @@ namespace Nz RigidBody2D(PhysWorld2D* world, float mass); RigidBody2D(PhysWorld2D* world, float mass, Collider2DRef geom); RigidBody2D(const RigidBody2D& object); - RigidBody2D(RigidBody2D&& object); + RigidBody2D(RigidBody2D&& object) noexcept; ~RigidBody2D(); void AddForce(const Vector2f& force, CoordSys coordSys = CoordSys_Global); @@ -60,6 +60,7 @@ namespace Nz Vector2f GetMassCenter(CoordSys coordSys = CoordSys_Local) const; float GetMomentOfInertia() const; Vector2f GetPosition() const; + inline const Vector2f& GetPositionOffset() const; RadianAnglef GetRotation() const; inline std::size_t GetShapeCount() const; std::size_t GetShapeIndex(cpShape* shape) const; @@ -87,6 +88,7 @@ namespace Nz void SetMassCenter(const Vector2f& center, CoordSys coordSys = CoordSys_Local); void SetMomentOfInertia(float moment); void SetPosition(const Vector2f& position); + void SetPositionOffset(const Vector2f& offset); void SetRotation(const RadianAnglef& rotation); void SetSurfaceVelocity(const Vector2f& surfaceVelocity); void SetSurfaceVelocity(std::size_t shapeIndex, const Vector2f& surfaceVelocity); @@ -114,6 +116,7 @@ namespace Nz static void CopyBodyData(cpBody* from, cpBody* to); static void CopyShapeData(cpShape* from, cpShape* to); + Vector2f m_positionOffset; VelocityFunc m_velocityFunc; std::vector m_shapes; Collider2DRef m_geom; diff --git a/include/Nazara/Physics2D/RigidBody2D.inl b/include/Nazara/Physics2D/RigidBody2D.inl index a654c03e7..272c8fe30 100644 --- a/include/Nazara/Physics2D/RigidBody2D.inl +++ b/include/Nazara/Physics2D/RigidBody2D.inl @@ -17,6 +17,11 @@ namespace Nz return GetMassCenter(coordSys); } + inline const Vector2f& RigidBody2D::GetPositionOffset() const + { + return m_positionOffset; + } + inline std::size_t RigidBody2D::GetShapeCount() const { return m_shapes.size(); diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index cc181930f..a4876a1e6 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -19,6 +19,7 @@ namespace Nz } RigidBody2D::RigidBody2D(PhysWorld2D* world, float mass, Collider2DRef geom) : + m_positionOffset(Vector2f::Zero()), m_geom(), m_userData(nullptr), m_world(world), @@ -35,6 +36,7 @@ namespace Nz } RigidBody2D::RigidBody2D(const RigidBody2D& object) : + m_positionOffset(object.m_positionOffset), m_geom(object.m_geom), m_userData(object.m_userData), m_world(object.m_world), @@ -59,9 +61,10 @@ namespace Nz } } - RigidBody2D::RigidBody2D(RigidBody2D&& object) : + RigidBody2D::RigidBody2D(RigidBody2D&& object) noexcept : OnRigidBody2DMove(std::move(object.OnRigidBody2DMove)), OnRigidBody2DRelease(std::move(object.OnRigidBody2DRelease)), + m_positionOffset(std::move(object.m_positionOffset)), m_shapes(std::move(object.m_shapes)), m_geom(std::move(object.m_geom)), m_handle(object.m_handle), @@ -260,7 +263,7 @@ namespace Nz Vector2f RigidBody2D::GetPosition() const { - cpVect pos = cpBodyGetPosition(m_handle); + cpVect pos = cpBodyLocalToWorld(m_handle, cpv(-m_positionOffset.x, -m_positionOffset.y)); return Vector2f(static_cast(pos.x), static_cast(pos.y)); } @@ -467,7 +470,9 @@ namespace Nz void RigidBody2D::SetPosition(const Vector2f& position) { - cpBodySetPosition(m_handle, cpv(position.x, position.y)); + cpVect oldPosition = cpBodyGetPosition(m_handle); + + cpBodySetPosition(m_handle, cpBodyLocalToWorld(m_handle, cpv(position.x - oldPosition.x + m_positionOffset.x, position.y - oldPosition.y + m_positionOffset.y))); if (m_isStatic) { m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) @@ -477,6 +482,13 @@ namespace Nz } } + void RigidBody2D::SetPositionOffset(const Vector2f& offset) + { + Nz::Vector2f position = GetPosition(); + m_positionOffset = offset; + SetPosition(position); + } + void RigidBody2D::SetRotation(const RadianAnglef& rotation) { cpBodySetAngle(m_handle, rotation.value); @@ -573,6 +585,7 @@ namespace Nz m_geom = std::move(object.m_geom); m_gravityFactor = object.m_gravityFactor; m_mass = object.m_mass; + m_positionOffset = object.m_positionOffset; m_shapes = std::move(object.m_shapes); m_userData = object.m_userData; m_velocityFunc = std::move(object.m_velocityFunc); @@ -653,9 +666,10 @@ namespace Nz void RigidBody2D::CopyBodyData(cpBody* from, cpBody* to) { + cpBodySetCenterOfGravity(to, cpBodyGetCenterOfGravity(from)); + cpBodySetAngle(to, cpBodyGetAngle(from)); cpBodySetAngularVelocity(to, cpBodyGetAngularVelocity(from)); - cpBodySetCenterOfGravity(to, cpBodyGetCenterOfGravity(from)); cpBodySetForce(to, cpBodyGetForce(from)); cpBodySetPosition(to, cpBodyGetPosition(from)); cpBodySetTorque(to, cpBodyGetTorque(from)); From ce43b633b9aa2e7d3f75d67ab7bf9b52a5f071f9 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 19:02:27 +0100 Subject: [PATCH 015/192] Physics3D/Collider3D: Update ForEachPolygon signature --- ChangeLog.md | 1 + include/Nazara/Physics3D/Collider3D.hpp | 2 +- src/Nazara/Physics3D/Collider3D.cpp | 6 ++++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 410312517..39ead0d94 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -174,6 +174,7 @@ Nazara Engine: - Signal now implement a copy constructor and copy assignation operator for convenience - Fixed ENet UnreliableFragment packets sent as Unreliable (and such being incomplete upon reception) - ENet DisconnectLater now reflects libenet behavior (and is waiting for unreliable commands to be sent before disconnecting for good) +- ⚠ Collider3D::ForEachPolygon now takes a void(Vector3f\*, std::size_t) callback (instead of void(float\*, std::size_t)) Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Physics3D/Collider3D.hpp b/include/Nazara/Physics3D/Collider3D.hpp index a7a59a2d1..9dbfe126c 100644 --- a/include/Nazara/Physics3D/Collider3D.hpp +++ b/include/Nazara/Physics3D/Collider3D.hpp @@ -54,7 +54,7 @@ namespace Nz virtual void ComputeInertialMatrix(Vector3f* inertia, Vector3f* center) const; virtual float ComputeVolume() const; - virtual void ForEachPolygon(const std::function& callback) const; + virtual void ForEachPolygon(const std::function& callback) const; NewtonCollision* GetHandle(PhysWorld3D* world) const; virtual ColliderType3D GetType() const = 0; diff --git a/src/Nazara/Physics3D/Collider3D.cpp b/src/Nazara/Physics3D/Collider3D.cpp index 4dc2f6821..be7ceb6be 100644 --- a/src/Nazara/Physics3D/Collider3D.cpp +++ b/src/Nazara/Physics3D/Collider3D.cpp @@ -114,12 +114,14 @@ namespace Nz return volume; } - void Collider3D::ForEachPolygon(const std::function& callback) const + void Collider3D::ForEachPolygon(const std::function& callback) const { auto newtCallback = [](void* const userData, int vertexCount, const dFloat* const faceArray, int /*faceId*/) { + static_assert(sizeof(Vector3f) == 3 * sizeof(float), "Vector3 is expected to contain 3 floats without padding"); + const auto& cb = *static_cast>(userData); - cb(faceArray, vertexCount); + cb(reinterpret_cast(faceArray), vertexCount); }; // Check for existing collision handles, and create a temporary one if none is available From 11e98918ab2fe7c0e8d0a7b6f5a85c4d88c16293 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 19:03:56 +0100 Subject: [PATCH 016/192] Physics2D/Collider2D: Add ForEachPolygon method --- ChangeLog.md | 1 + include/Nazara/Physics2D/Collider2D.hpp | 4 +- src/Nazara/Physics2D/Collider2D.cpp | 69 ++++++++++++++++++++++++- 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 39ead0d94..6027f226d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -175,6 +175,7 @@ Nazara Engine: - Fixed ENet UnreliableFragment packets sent as Unreliable (and such being incomplete upon reception) - ENet DisconnectLater now reflects libenet behavior (and is waiting for unreliable commands to be sent before disconnecting for good) - ⚠ Collider3D::ForEachPolygon now takes a void(Vector3f\*, std::size_t) callback (instead of void(float\*, std::size_t)) +- Added Collider2D::ForEachPolygon Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index cc2f62eac..e817457b8 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -41,9 +41,11 @@ namespace Nz Collider2D(Collider2D&&) = delete; virtual ~Collider2D(); - virtual Nz::Vector2f ComputeCenterOfMass() const = 0; + virtual Vector2f ComputeCenterOfMass() const = 0; virtual float ComputeMomentOfInertia(float mass) const = 0; + virtual void ForEachPolygon(const std::function& callback) const; + inline UInt32 GetCategoryMask() const; inline UInt32 GetCollisionGroup() const; inline unsigned int GetCollisionId() const; diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index 75f5fe332..f997f29f6 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -3,14 +3,81 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include +#include #include -#include +#include +#include +#include namespace Nz { Collider2D::~Collider2D() = default; + void Collider2D::ForEachPolygon(const std::function& callback) const + { + // Currently, the only way to get only the polygons of a shape is to create a temporary cpSpace containing only this shape + // A better way to do this would be to reimplement this function in every subclass type in the very same way chipmunk does + + PhysWorld2D physWorld; + RigidBody2D rigidBody(&physWorld, 0.f); + + std::vector shapeVector; + rigidBody.SetGeom(const_cast(this), false, false); //< Won't be used for writing, but still ugly + + PhysWorld2D::DebugDrawOptions drawCallbacks; + drawCallbacks.circleCallback = [&](const Vector2f& origin, const RadianAnglef& /*rotation*/, float radius, Nz::Color /*outlineColor*/, Nz::Color /*fillColor*/, void* /*userData*/) + { + constexpr std::size_t circleVerticesCount = 20; + + std::array vertices; + + RadianAnglef angleBetweenVertices = 2.f * float(M_PI) / vertices.size(); + for (std::size_t i = 0; i < vertices.size(); ++i) + { + RadianAnglef angle = float(i) * angleBetweenVertices; + std::pair sincos = angle.GetSinCos(); + + vertices[i] = origin + Vector2f(radius * sincos.first, radius * sincos.second); + } + + callback(vertices.data(), vertices.size()); + }; + + drawCallbacks.polygonCallback = [&](const Vector2f* vertices, std::size_t vertexCount, float radius, Nz::Color /*outlineColor*/, Nz::Color /*fillColor*/, void* /*userData*/) + { + //TODO: Handle radius + callback(vertices, vertexCount); + }; + + drawCallbacks.segmentCallback = [&](const Vector2f& first, const Vector2f& second, Nz::Color /*color*/, void* /*userData*/) + { + std::array vertices = { first, second }; + + callback(vertices.data(), vertices.size()); + }; + + drawCallbacks.thickSegmentCallback = [&](const Vector2f& first, const Vector2f& second, float thickness, Nz::Color /*outlineColor*/, Nz::Color /*fillColor*/, void* /*userData*/) + { + static std::pair sincos = Nz::DegreeAnglef(90.f).GetSinCos(); + + Vector2f normal = Vector2f::Normalize(second - first); + Vector2f thicknessNormal(sincos.second * normal.x - sincos.first * normal.y, + sincos.first * normal.x + sincos.second * normal.y); + + std::array vertices; + vertices[0] = first + thickness * thicknessNormal; + vertices[1] = first - thickness * thicknessNormal; + vertices[2] = second - thickness * thicknessNormal; + vertices[3] = second + thickness * thicknessNormal; + + callback(vertices.data(), vertices.size()); + }; + + physWorld.DebugDraw(drawCallbacks, true, false, false); + } + std::size_t Collider2D::GenerateShapes(RigidBody2D* body, std::vector* shapes) const { std::size_t shapeCount = CreateShapes(body, shapes); From 1f5a82d1784712e2dbc2b0d0060c280dc2b3eace Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 19:04:13 +0100 Subject: [PATCH 017/192] Physics2D/Collider2D: Fix CircleCollider2D center of mass --- src/Nazara/Physics2D/Collider2D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index f997f29f6..3a67797bd 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -142,7 +142,7 @@ namespace Nz Nz::Vector2f CircleCollider2D::ComputeCenterOfMass() const { - return m_offset + Nz::Vector2f(m_radius, m_radius); + return m_offset; } float CircleCollider2D::ComputeMomentOfInertia(float mass) const From e00d0baa005436603464c4275123ffb39aa509e2 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 19:05:25 +0100 Subject: [PATCH 018/192] SDK/DebugSystem: Add support for Collider2D --- ChangeLog.md | 4 +- SDK/include/NDK/Components/DebugComponent.hpp | 2 +- SDK/include/NDK/Systems/DebugSystem.hpp | 1 + SDK/src/NDK/Systems/DebugSystem.cpp | 106 +++++++++++++++--- 4 files changed, 94 insertions(+), 19 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 6027f226d..44ab35911 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -175,7 +175,7 @@ Nazara Engine: - Fixed ENet UnreliableFragment packets sent as Unreliable (and such being incomplete upon reception) - ENet DisconnectLater now reflects libenet behavior (and is waiting for unreliable commands to be sent before disconnecting for good) - ⚠ Collider3D::ForEachPolygon now takes a void(Vector3f\*, std::size_t) callback (instead of void(float\*, std::size_t)) -- Added Collider2D::ForEachPolygon +- Added Collider2D::ForEachPolygon method Nazara Development Kit: - Added ImageWidget (#139) @@ -219,7 +219,7 @@ Nazara Development Kit: - Fix GraphicsComponent bounding volume not taking local matrix in account - ⚠️ Rewrote all render queue system, which should be more efficient, take scissor box into account - ⚠️ All widgets are now bound to a scissor box when rendering -- Add DebugComponent (a component able to show aabb/obb/collision mesh) +- Add DebugComponent (a component able to show aabb/obb/collision mesh 2D and 3D) - ⚠️ TextAreaWidget now support text selection (WIP) - ⚠️ TextAreaWidget::GetHoveredGlyph now returns a two-dimensional position instead of a single glyph position - Fixed Entity::OnEntityDestruction signal not being properly moved and thus not being called. diff --git a/SDK/include/NDK/Components/DebugComponent.hpp b/SDK/include/NDK/Components/DebugComponent.hpp index 206f85724..0777a9812 100644 --- a/SDK/include/NDK/Components/DebugComponent.hpp +++ b/SDK/include/NDK/Components/DebugComponent.hpp @@ -16,7 +16,7 @@ namespace Ndk { enum class DebugDraw { - //TODO: Collider2D + Collider2D, Collider3D, GraphicsAABB, GraphicsOBB, diff --git a/SDK/include/NDK/Systems/DebugSystem.hpp b/SDK/include/NDK/Systems/DebugSystem.hpp index 3dd186f36..0cb4839b7 100644 --- a/SDK/include/NDK/Systems/DebugSystem.hpp +++ b/SDK/include/NDK/Systems/DebugSystem.hpp @@ -26,6 +26,7 @@ namespace Ndk private: Nz::InstancedRenderableRef GenerateBox(Nz::Boxf box); + Nz::InstancedRenderableRef GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* origin); Nz::InstancedRenderableRef GenerateCollision3DMesh(Entity* entity); Nz::MaterialRef GetCollisionMaterial(); diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 063a25d77..21a184981 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -8,10 +8,12 @@ #include #include #include +#include #include #include #include #include +#include namespace Ndk { @@ -227,17 +229,26 @@ namespace Ndk { switch (option) { + case DebugDraw::Collider2D: + { + const Nz::Boxf& obb = entityGfx.GetAABB(); + + Nz::Vector3f origin; + Nz::InstancedRenderableRef renderable = GenerateCollision2DMesh(entity, &origin); + if (renderable) + entityGfx.Attach(renderable, Nz::Matrix4f::Translate(origin - entityNode.GetPosition()), DebugDrawOrder); + + entityDebug.UpdateDebugRenderable(option, std::move(renderable)); + break; + } + case DebugDraw::Collider3D: { const Nz::Boxf& obb = entityGfx.GetAABB(); Nz::InstancedRenderableRef renderable = GenerateCollision3DMesh(entity); if (renderable) - { - renderable->SetPersistent(false); - entityGfx.Attach(renderable, Nz::Matrix4f::Translate(obb.GetCenter() - entityNode.GetPosition()), DebugDrawOrder); - } entityDebug.UpdateDebugRenderable(option, std::move(renderable)); break; @@ -305,6 +316,73 @@ namespace Ndk return model; } + + Nz::InstancedRenderableRef DebugSystem::GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* origin) + { + if (entity->HasComponent()) + { + CollisionComponent2D& entityCollision = entity->GetComponent(); + const Nz::Collider2DRef& geom = entityCollision.GetGeom(); + + std::vector vertices; + std::vector indices; + + geom->ForEachPolygon([&](const Nz::Vector2f* polygonVertices, std::size_t vertexCount) + { + std::size_t firstIndex = vertices.size(); + + // Don't reserve and let the vector handle its own capacity + for (std::size_t i = 0; i < vertexCount; ++i) + vertices.emplace_back(*polygonVertices++); + + for (std::size_t i = 0; i < vertexCount - 1; ++i) + { + indices.push_back(firstIndex + i); + indices.push_back(firstIndex + i + 1); + } + + indices.push_back(firstIndex + vertexCount - 1); + indices.push_back(firstIndex); + }); + + Nz::IndexBufferRef indexBuffer = Nz::IndexBuffer::New(vertices.size() > 0xFFFF, Nz::UInt32(indices.size()), Nz::DataStorage_Hardware, 0); + Nz::IndexMapper indexMapper(indexBuffer, Nz::BufferAccess_WriteOnly); + + Nz::IndexIterator indexPtr = indexMapper.begin(); + for (std::size_t index : indices) + *indexPtr++ = static_cast(index); + + indexMapper.Unmap(); + + Nz::VertexBufferRef vertexBuffer = Nz::VertexBuffer::New(Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ), Nz::UInt32(vertices.size()), Nz::DataStorage_Hardware, 0); + vertexBuffer->Fill(vertices.data(), 0, Nz::UInt32(vertices.size())); + + Nz::MeshRef mesh = Nz::Mesh::New(); + mesh->CreateStatic(); + + Nz::StaticMeshRef subMesh = Nz::StaticMesh::New(vertexBuffer, indexBuffer); + subMesh->SetPrimitiveMode(Nz::PrimitiveMode_LineList); + subMesh->SetMaterialIndex(0); + subMesh->GenerateAABB(); + + mesh->SetMaterialCount(1); + mesh->AddSubMesh(subMesh); + + Nz::ModelRef model = Nz::Model::New(); + model->SetMesh(mesh); + model->SetMaterial(0, GetCollisionMaterial()); + + // Find center of mass + if (entity->HasComponent()) + *origin = entity->GetComponent().GetMassCenter(Nz::CoordSys_Global); + else + *origin = entity->GetComponent().GetPosition(Nz::CoordSys_Global); + + return model; + } + else + return nullptr; + } Nz::InstancedRenderableRef DebugSystem::GenerateCollision3DMesh(Entity* entity) { @@ -315,16 +393,12 @@ namespace Ndk std::vector vertices; std::vector indices; - - geom->ForEachPolygon([&](const float* polygonVertices, std::size_t vertexCount) + + geom->ForEachPolygon([&](const Nz::Vector3f* polygonVertices, std::size_t vertexCount) { std::size_t firstIndex = vertices.size(); - - for (std::size_t i = 0; i < vertexCount; ++i) - { - const float* vertexData = &polygonVertices[i * 3]; - vertices.emplace_back(vertexData[0], vertexData[1], vertexData[2]); - } + vertices.resize(firstIndex + vertexCount); + std::copy(polygonVertices, polygonVertices + vertexCount, &vertices[firstIndex]); for (std::size_t i = 0; i < vertexCount - 1; ++i) { @@ -378,7 +452,7 @@ namespace Ndk m_globalAabbMaterial->EnableDepthBuffer(true); m_globalAabbMaterial->SetDiffuseColor(Nz::Color::Orange); m_globalAabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); - m_globalAabbMaterial->SetLineWidth(2.f); + //m_globalAabbMaterial->SetLineWidth(2.f); } return m_globalAabbMaterial; @@ -393,7 +467,7 @@ namespace Ndk m_localAabbMaterial->EnableDepthBuffer(true); m_localAabbMaterial->SetDiffuseColor(Nz::Color::Red); m_localAabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); - m_localAabbMaterial->SetLineWidth(2.f); + //m_localAabbMaterial->SetLineWidth(2.f); } return m_localAabbMaterial; @@ -408,7 +482,7 @@ namespace Ndk m_collisionMaterial->EnableDepthBuffer(true); m_collisionMaterial->SetDiffuseColor(Nz::Color::Blue); m_collisionMaterial->SetFaceFilling(Nz::FaceFilling_Line); - m_collisionMaterial->SetLineWidth(2.f); + //m_collisionMaterial->SetLineWidth(2.f); } return m_collisionMaterial; @@ -423,7 +497,7 @@ namespace Ndk m_obbMaterial->EnableDepthBuffer(true); m_obbMaterial->SetDiffuseColor(Nz::Color::Green); m_obbMaterial->SetFaceFilling(Nz::FaceFilling_Line); - m_obbMaterial->SetLineWidth(2.f); + //m_obbMaterial->SetLineWidth(2.f); } return m_obbMaterial; From 00ca0248c6e6ebc72ff5f5e1ff9be64bf052fcac Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 19:05:41 +0100 Subject: [PATCH 019/192] Fix unit tests (WIP) --- tests/Engine/Physics2D/RigidBody2D.cpp | 33 +++++++++++++++++++------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/tests/Engine/Physics2D/RigidBody2D.cpp b/tests/Engine/Physics2D/RigidBody2D.cpp index 7eae99908..e554746d8 100644 --- a/tests/Engine/Physics2D/RigidBody2D.cpp +++ b/tests/Engine/Physics2D/RigidBody2D.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include Nz::RigidBody2D CreateBody(Nz::PhysWorld2D& world); @@ -93,6 +94,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") std::vector tmp; tmp.push_back(CreateBody(world)); tmp.push_back(CreateBody(world)); + world.Step(1.f); THEN("They should be valid") @@ -112,11 +114,14 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") Nz::Rectf aabb(positionAABB.x, positionAABB.y, 1.f, 2.f); Nz::Collider2DRef box = Nz::BoxCollider2D::New(aabb); float mass = 1.f; - Nz::RigidBody2D body(&world, mass, box); + Nz::RigidBody2D body(&world, mass); + body.SetGeom(box, true, false); + bool userData = false; body.SetUserdata(&userData); Nz::Vector2f position = Nz::Vector2f::Zero(); + body.SetPosition(position); world.Step(1.f); @@ -126,7 +131,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") { CHECK(body.GetAABB() == aabb); CHECK(body.GetAngularVelocity() == 0.f); - CHECK(body.GetMassCenter() == Nz::Vector2f::Zero()); + CHECK(body.GetMassCenter(Nz::CoordSys_Global) == position); CHECK(body.GetGeom() == box); CHECK(body.GetMass() == Approx(mass)); CHECK(body.GetPosition() == position); @@ -150,7 +155,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") { aabb.Translate(velocity); CHECK(body.GetAABB() == aabb); - CHECK(body.GetMassCenter() == Nz::Vector2f::Zero()); + CHECK(body.GetMassCenter(Nz::CoordSys_Global) == position); CHECK(body.GetPosition() == position); CHECK(body.GetVelocity() == velocity); } @@ -211,7 +216,9 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") float radius = 5.f; Nz::Collider2DRef circle = Nz::CircleCollider2D::New(radius, position); float mass = 1.f; - Nz::RigidBody2D body(&world, mass, circle); + Nz::RigidBody2D body(&world, mass); + body.SetGeom(circle, true, false); + world.Step(1.f); WHEN("We ask for the aabb of the circle") @@ -240,7 +247,9 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") Nz::CompoundCollider2DRef compound = Nz::CompoundCollider2D::New(colliders); float mass = 1.f; - Nz::RigidBody2D body(&world, mass, compound); + Nz::RigidBody2D body(&world, mass); + body.SetGeom(compound, true, false); + world.Step(1.f); WHEN("We ask for the aabb of the compound") @@ -267,7 +276,9 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") Nz::SparsePtr sparsePtr(vertices.data()); Nz::ConvexCollider2DRef convex = Nz::ConvexCollider2D::New(sparsePtr, vertices.size()); float mass = 1.f; - Nz::RigidBody2D body(&world, mass, convex); + Nz::RigidBody2D body(&world, mass); + body.SetGeom(convex, true, false); + world.Step(1.f); WHEN("We ask for the aabb of the convex") @@ -289,7 +300,9 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") Nz::Vector2f positionB(1.f, -4.f); Nz::Collider2DRef segment = Nz::SegmentCollider2D::New(positionA, positionB, 0.f); float mass = 1.f; - Nz::RigidBody2D body(&world, mass, segment); + Nz::RigidBody2D body(&world, mass); + body.SetGeom(segment, true, false); + world.Step(1.f); WHEN("We ask for the aabb of the segment") @@ -309,7 +322,11 @@ Nz::RigidBody2D CreateBody(Nz::PhysWorld2D& world) Nz::Rectf aabb(positionAABB.x, positionAABB.y, 1.f, 2.f); Nz::Collider2DRef box = Nz::BoxCollider2D::New(aabb); float mass = 1.f; - return Nz::RigidBody2D(&world, mass, box); + + Nz::RigidBody2D body(&world, mass, box); + body.SetPosition(Nz::Vector2f::Zero()); + + return body; } void EQUALITY(const Nz::RigidBody2D& left, const Nz::RigidBody2D& right) From c05d39ed28bafaf0231b6edbf304ba426d35e386 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 19:09:46 +0100 Subject: [PATCH 020/192] Fix some indentation shit --- src/Nazara/Platform/Win32/InputImpl.cpp | 2 +- src/Nazara/Platform/Win32/WindowImpl.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Nazara/Platform/Win32/InputImpl.cpp b/src/Nazara/Platform/Win32/InputImpl.cpp index f44594fa4..79a8b6a3c 100644 --- a/src/Nazara/Platform/Win32/InputImpl.cpp +++ b/src/Nazara/Platform/Win32/InputImpl.cpp @@ -292,5 +292,5 @@ namespace Nz } else NazaraError("Invalid window handle"); - } + } } diff --git a/src/Nazara/Platform/Win32/WindowImpl.cpp b/src/Nazara/Platform/Win32/WindowImpl.cpp index 1e5135168..27b4fa889 100644 --- a/src/Nazara/Platform/Win32/WindowImpl.cpp +++ b/src/Nazara/Platform/Win32/WindowImpl.cpp @@ -71,8 +71,8 @@ namespace Nz win32Mode.dmBitsPerPel = mode.bitsPerPixel; win32Mode.dmPelsHeight = mode.height; win32Mode.dmPelsWidth = mode.width; - win32Mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; - win32Mode.dmSize = sizeof(DEVMODE); + win32Mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; + win32Mode.dmSize = sizeof(DEVMODE); if (ChangeDisplaySettings(&win32Mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { From 1880f88e8f5836c1d1b298166e00a2d73d864097 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 20:33:29 +0100 Subject: [PATCH 021/192] Fix unit tests --- tests/SDK/NDK/Systems/PhysicsSystem2D.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp index d94797065..770f1e190 100644 --- a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp +++ b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp @@ -6,7 +6,7 @@ #include #include -Ndk::EntityHandle CreateBaseEntity(Ndk::World& world, const Nz::Vector2f& position, const Nz::Rectf AABB); +Ndk::EntityHandle CreateBaseEntity(Ndk::World& world, const Nz::Vector2f& position, const Nz::Rectf& AABB); SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") { @@ -80,6 +80,8 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") Ndk::EntityHandle movingEntity = CreateBaseEntity(world, position, movingAABB); Ndk::NodeComponent& nodeComponent = movingEntity->GetComponent(); Ndk::PhysicsComponent2D& physicsComponent2D = movingEntity->AddComponent(); + physicsComponent2D.SetMassCenter(Nz::Vector2f::Zero()); + physicsComponent2D.SetPosition(position); world.GetSystem().SetFixedUpdateRate(30.f); @@ -124,6 +126,8 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") Ndk::EntityHandle movingEntity = CreateBaseEntity(world, position, movingAABB); Ndk::NodeComponent& nodeComponent = movingEntity->GetComponent(); Ndk::PhysicsComponent2D& physicsComponent2D = movingEntity->AddComponent(); + physicsComponent2D.SetMassCenter(Nz::Vector2f::Zero()); + physicsComponent2D.SetPosition(position); world.GetSystem().SetFixedUpdateRate(30.f); @@ -145,7 +149,7 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") } } -Ndk::EntityHandle CreateBaseEntity(Ndk::World& world, const Nz::Vector2f& position, const Nz::Rectf AABB) +Ndk::EntityHandle CreateBaseEntity(Ndk::World& world, const Nz::Vector2f& position, const Nz::Rectf& AABB) { Ndk::EntityHandle entity = world.CreateEntity(); Ndk::NodeComponent& nodeComponent = entity->AddComponent(); From 59dffe1a7bab7b2d2e818fc0adef78cca7c53f11 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 21:02:31 +0100 Subject: [PATCH 022/192] CollisionComponent2D: Rename Align to Center (and make it take a vector) --- .../NDK/Components/CollisionComponent2D.hpp | 4 +-- .../NDK/Components/CollisionComponent2D.cpp | 28 +++++++++++++++---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/SDK/include/NDK/Components/CollisionComponent2D.hpp b/SDK/include/NDK/Components/CollisionComponent2D.hpp index 140846d62..ef8043629 100644 --- a/SDK/include/NDK/Components/CollisionComponent2D.hpp +++ b/SDK/include/NDK/Components/CollisionComponent2D.hpp @@ -28,12 +28,12 @@ namespace Ndk CollisionComponent2D(const CollisionComponent2D& collision); ~CollisionComponent2D() = default; - void Align(const Nz::Rectf& aabb); - Nz::Rectf GetAABB() const; const Nz::Collider2DRef& GetGeom() const; const Nz::Vector2f& GetGeomOffset() const; + void Recenter(const Nz::Vector2f& origin); + void SetGeom(Nz::Collider2DRef geom); void SetGeomOffset(const Nz::Vector2f& geomOffset); diff --git a/SDK/src/NDK/Components/CollisionComponent2D.cpp b/SDK/src/NDK/Components/CollisionComponent2D.cpp index 84582c261..fddbe8842 100644 --- a/SDK/src/NDK/Components/CollisionComponent2D.cpp +++ b/SDK/src/NDK/Components/CollisionComponent2D.cpp @@ -17,12 +17,6 @@ namespace Ndk * \brief NDK class that represents a two-dimensional collision geometry */ - void CollisionComponent2D::Align(const Nz::Rectf& aabb) - { - const Nz::RigidBody2D* rigidBody = GetRigidBody(); - SetGeomOffset(aabb.GetCenter() - rigidBody->GetAABB().GetCenter() + rigidBody->GetPositionOffset()); - } - /*! * \brief Gets the collision box representing the entity * \return The physics collision box @@ -32,11 +26,28 @@ namespace Ndk return GetRigidBody()->GetAABB(); } + /*! + * \brief Gets the position offset between the actual rigid body center of mass position and the origin of the geometry + * \return Position offset + */ const Nz::Vector2f& CollisionComponent2D::GetGeomOffset() const { return GetRigidBody()->GetPositionOffset(); } + /*! + * \brief Convenience function to align center of geometry to a specific point + * + * \param geomOffset Position offset + * + * \remark This does not change the center of mass + */ + void CollisionComponent2D::Recenter(const Nz::Vector2f& origin) + { + const Nz::RigidBody2D* rigidBody = GetRigidBody(); + SetGeomOffset(origin - rigidBody->GetAABB().GetCenter() + rigidBody->GetPositionOffset()); + } + /*! * \brief Sets geometry for the entity * @@ -49,6 +60,11 @@ namespace Ndk GetRigidBody()->SetGeom(m_geom); } + /*! + * \brief Sets the position offset between the actual rigid body center of mass position and the origin of the geometry + * + * \param geomOffset Position offset + */ void CollisionComponent2D::SetGeomOffset(const Nz::Vector2f& geomOffset) { GetRigidBody()->SetPositionOffset(geomOffset); From ae20ad6b65606c989977b209da7e82f6ec90857c Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 21:02:50 +0100 Subject: [PATCH 023/192] Sdk/DebugSystem: Take position offset into account --- SDK/src/NDK/Systems/DebugSystem.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 21a184981..df429dd1d 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -232,11 +232,12 @@ namespace Ndk case DebugDraw::Collider2D: { const Nz::Boxf& obb = entityGfx.GetAABB(); + CollisionComponent2D& entityCollision2D = entity->GetComponent(); Nz::Vector3f origin; Nz::InstancedRenderableRef renderable = GenerateCollision2DMesh(entity, &origin); if (renderable) - entityGfx.Attach(renderable, Nz::Matrix4f::Translate(origin - entityNode.GetPosition()), DebugDrawOrder); + entityGfx.Attach(renderable, Nz::Matrix4f::Translate(origin - entityNode.GetPosition() + entityCollision2D.GetGeomOffset()), DebugDrawOrder); entityDebug.UpdateDebugRenderable(option, std::move(renderable)); break; From 4821eb14a7e27710129dbbe1dc27255666b2e10f Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 22:01:10 +0100 Subject: [PATCH 024/192] Physics2D: Fix some last stuffs --- ChangeLog.md | 2 ++ .../NDK/Components/CollisionComponent2D.hpp | 4 +++- .../NDK/Components/CollisionComponent2D.inl | 10 +++++----- SDK/include/NDK/Systems/DebugSystem.hpp | 2 +- SDK/src/NDK/Components/PhysicsComponent2D.cpp | 11 ++++++++++- SDK/src/NDK/Systems/DebugSystem.cpp | 15 +++++++++------ SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 8 +++----- 7 files changed, 33 insertions(+), 19 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 44ab35911..d2c5b2d83 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -176,6 +176,7 @@ Nazara Engine: - ENet DisconnectLater now reflects libenet behavior (and is waiting for unreliable commands to be sent before disconnecting for good) - ⚠ Collider3D::ForEachPolygon now takes a void(Vector3f\*, std::size_t) callback (instead of void(float\*, std::size_t)) - Added Collider2D::ForEachPolygon method +- Added RigidBody::[Get|Set]PositionOffset allowing set an offset between body logic position and body physics position (center of mass position) Nazara Development Kit: - Added ImageWidget (#139) @@ -248,6 +249,7 @@ Nazara Development Kit: - Add missing `recomputeMoment` parameter to PhysicsComponent2D::SetMass - Added possibility of disabling synchronization between PhysicsComponent2D and NodeComponent - Fixed GraphicsComponent not invalidating render queue on material change (causing crashes or visual errors) +- Added CollisionComponent2D::SetGeomOffset and CollisionComponent2D::Recenter # 0.4: diff --git a/SDK/include/NDK/Components/CollisionComponent2D.hpp b/SDK/include/NDK/Components/CollisionComponent2D.hpp index ef8043629..a5da3b8c2 100644 --- a/SDK/include/NDK/Components/CollisionComponent2D.hpp +++ b/SDK/include/NDK/Components/CollisionComponent2D.hpp @@ -20,8 +20,9 @@ namespace Ndk class NDK_API CollisionComponent2D : public Component { - friend class PhysicsSystem2D; friend class ConstraintComponent2D; + friend class PhysicsComponent2D; + friend class PhysicsSystem2D; public: CollisionComponent2D(Nz::Collider2DRef geom = Nz::Collider2DRef()); @@ -47,6 +48,7 @@ namespace Ndk Nz::RigidBody2D* GetRigidBody(); const Nz::RigidBody2D* GetRigidBody() const; Nz::RigidBody2D* GetStaticBody(); + const Nz::RigidBody2D* GetStaticBody() const; void OnAttached() override; void OnComponentAttached(BaseComponent& component) override; diff --git a/SDK/include/NDK/Components/CollisionComponent2D.inl b/SDK/include/NDK/Components/CollisionComponent2D.inl index 010780443..1bc9f0978 100644 --- a/SDK/include/NDK/Components/CollisionComponent2D.inl +++ b/SDK/include/NDK/Components/CollisionComponent2D.inl @@ -52,13 +52,13 @@ namespace Ndk return *this; } - /*! - * \brief Gets the static body used by the entity - * \return A pointer to the entity - */ - inline Nz::RigidBody2D* CollisionComponent2D::GetStaticBody() { return m_staticBody.get(); } + + inline const Nz::RigidBody2D* CollisionComponent2D::GetStaticBody() const + { + return m_staticBody.get(); + } } diff --git a/SDK/include/NDK/Systems/DebugSystem.hpp b/SDK/include/NDK/Systems/DebugSystem.hpp index 0cb4839b7..362b59f32 100644 --- a/SDK/include/NDK/Systems/DebugSystem.hpp +++ b/SDK/include/NDK/Systems/DebugSystem.hpp @@ -26,7 +26,7 @@ namespace Ndk private: Nz::InstancedRenderableRef GenerateBox(Nz::Boxf box); - Nz::InstancedRenderableRef GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* origin); + Nz::InstancedRenderableRef GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* offset); Nz::InstancedRenderableRef GenerateCollision3DMesh(Entity* entity); Nz::MaterialRef GetCollisionMaterial(); diff --git a/SDK/src/NDK/Components/PhysicsComponent2D.cpp b/SDK/src/NDK/Components/PhysicsComponent2D.cpp index 62cd922a4..f9feaff6e 100644 --- a/SDK/src/NDK/Components/PhysicsComponent2D.cpp +++ b/SDK/src/NDK/Components/PhysicsComponent2D.cpp @@ -31,9 +31,17 @@ namespace Ndk Nz::PhysWorld2D& world = entityWorld->GetSystem().GetPhysWorld(); + Nz::Vector2f positionOffset; + Nz::Collider2DRef geom; if (m_entity->HasComponent()) - geom = m_entity->GetComponent().GetGeom(); + { + const CollisionComponent2D& entityCollision = m_entity->GetComponent(); + geom = entityCollision.GetGeom(); + positionOffset = entityCollision.GetStaticBody()->GetPositionOffset(); //< Calling GetGeomOffset would retrieve current component which is not yet initialized + } + else + positionOffset = Nz::Vector2f::Zero(); Nz::Matrix4f matrix; if (m_entity->HasComponent()) @@ -42,6 +50,7 @@ namespace Ndk matrix.MakeIdentity(); m_object = std::make_unique(&world, 1.f, geom); + m_object->SetPositionOffset(positionOffset); m_object->SetPosition(Nz::Vector2f(matrix.GetTranslation())); m_object->SetUserdata(reinterpret_cast(static_cast(m_entity->GetId()))); } diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index df429dd1d..54295f611 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -234,10 +234,10 @@ namespace Ndk const Nz::Boxf& obb = entityGfx.GetAABB(); CollisionComponent2D& entityCollision2D = entity->GetComponent(); - Nz::Vector3f origin; - Nz::InstancedRenderableRef renderable = GenerateCollision2DMesh(entity, &origin); + Nz::Vector3f offset; + Nz::InstancedRenderableRef renderable = GenerateCollision2DMesh(entity, &offset); if (renderable) - entityGfx.Attach(renderable, Nz::Matrix4f::Translate(origin - entityNode.GetPosition() + entityCollision2D.GetGeomOffset()), DebugDrawOrder); + entityGfx.Attach(renderable, Nz::Matrix4f::Translate(offset), DebugDrawOrder); entityDebug.UpdateDebugRenderable(option, std::move(renderable)); break; @@ -318,7 +318,7 @@ namespace Ndk return model; } - Nz::InstancedRenderableRef DebugSystem::GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* origin) + Nz::InstancedRenderableRef DebugSystem::GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* offset) { if (entity->HasComponent()) { @@ -375,9 +375,12 @@ namespace Ndk // Find center of mass if (entity->HasComponent()) - *origin = entity->GetComponent().GetMassCenter(Nz::CoordSys_Global); + { + const PhysicsComponent2D& entityPhys = entity->GetComponent(); + *offset = entityPhys.GetMassCenter(Nz::CoordSys_Global) - entityPhys.GetPosition(); // GetPosition already takes GetGeomOffset into account + } else - *origin = entity->GetComponent().GetPosition(Nz::CoordSys_Global); + *offset = entityCollision.GetGeomOffset(); return model; } diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index 6579bb1fb..dac509128 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -213,7 +213,7 @@ namespace Ndk Nz::Vector2f newPosition = Nz::Vector2f(node.GetPosition(Nz::CoordSys_Global)); // To move static objects and ensure their collisions, we have to specify them a velocity - // (/!\: the physical motor does not apply the speed on static objects) + // (/!\: the physical engine does not apply the speed on static objects) if (newPosition != oldPosition) { body->SetPosition(newPosition); @@ -222,8 +222,7 @@ namespace Ndk else body->SetVelocity(Nz::Vector2f::Zero()); -/* - if (newRotation != oldRotation) + /*if (newRotation != oldRotation) { Nz::Quaternionf transition = newRotation * oldRotation.GetConjugate(); Nz::EulerAnglesf angles = transition.ToEulerAngles(); @@ -235,8 +234,7 @@ namespace Ndk physObj->SetAngularVelocity(angularVelocity); } else - physObj->SetAngularVelocity(Nz::Vector3f::Zero()); -*/ + physObj->SetAngularVelocity(Nz::Vector3f::Zero());*/ } } From 4ff43f2f72ccc211198a105f6652ceadb26becf1 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 27 Mar 2019 23:10:37 +0100 Subject: [PATCH 025/192] Sdk/DebugSystem: Fix collision 2D offset --- SDK/src/NDK/Systems/DebugSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 54295f611..f2175e559 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -377,7 +377,7 @@ namespace Ndk if (entity->HasComponent()) { const PhysicsComponent2D& entityPhys = entity->GetComponent(); - *offset = entityPhys.GetMassCenter(Nz::CoordSys_Global) - entityPhys.GetPosition(); // GetPosition already takes GetGeomOffset into account + *offset = entityPhys.GetMassCenter(Nz::CoordSys_Local) + entityCollision.GetGeomOffset(); } else *offset = entityCollision.GetGeomOffset(); From b2da8d6c91af5f5d4ec4e5cc1afe85a5ddd5555f Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 27 Mar 2019 23:13:14 +0100 Subject: [PATCH 026/192] Fix compilation --- include/Nazara/Utility/AbstractAtlas.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/Nazara/Utility/AbstractAtlas.hpp b/include/Nazara/Utility/AbstractAtlas.hpp index bb6c77c2f..fc84cfa0e 100644 --- a/include/Nazara/Utility/AbstractAtlas.hpp +++ b/include/Nazara/Utility/AbstractAtlas.hpp @@ -22,6 +22,8 @@ namespace Nz { public: AbstractAtlas() = default; + AbstractAtlas(const AbstractAtlas&) = delete; + AbstractAtlas(AbstractAtlas&&) noexcept = default; virtual ~AbstractAtlas(); virtual void Clear() = 0; @@ -31,6 +33,9 @@ namespace Nz virtual UInt32 GetStorage() const = 0; virtual bool Insert(const Image& image, Rectui* rect, bool* flipped, unsigned int* layerIndex) = 0; + AbstractAtlas& operator=(const AbstractAtlas&) = delete; + AbstractAtlas& operator=(AbstractAtlas&&) noexcept = default; + // Signals: NazaraSignal(OnAtlasCleared, const AbstractAtlas* /*atlas*/); NazaraSignal(OnAtlasLayerChange, const AbstractAtlas* /*atlas*/, AbstractImage* /*oldLayer*/, AbstractImage* /*newLayer*/); From 5b48012deeaef1cfe26584b2dec50cb10d39f036 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 28 Mar 2019 00:02:22 +0100 Subject: [PATCH 027/192] Fix unit test --- tests/Engine/Network/IpAddress.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Engine/Network/IpAddress.cpp b/tests/Engine/Network/IpAddress.cpp index abcb65909..0c36e2a96 100644 --- a/tests/Engine/Network/IpAddress.cpp +++ b/tests/Engine/Network/IpAddress.cpp @@ -40,7 +40,7 @@ SCENARIO("IpAddress", "[NETWORK][IPADDRESS]") Nz::IpAddress google(8, 8, 8, 8); THEN("Google (DNS) is 8.8.8.8") { - CHECK(Nz::IpAddress::ResolveAddress(google) == "google-public-dns-a.google.com"); + CHECK(Nz::IpAddress::ResolveAddress(google) == "dns.google"); } } } From 0ca823f9a695f2d78fe4b8c6de7491635c37db7e Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 31 Mar 2019 16:31:02 +0200 Subject: [PATCH 028/192] Graphics: Remove sprite limit --- .../Nazara/Graphics/DeferredGeometryPass.hpp | 10 +- .../Nazara/Graphics/DepthRenderTechnique.hpp | 10 +- src/Nazara/Graphics/DeferredGeometryPass.cpp | 186 ++++++++------- src/Nazara/Graphics/DepthRenderTechnique.cpp | 188 +++++++++------- .../Graphics/ForwardRenderTechnique.cpp | 211 ++++++++++-------- 5 files changed, 347 insertions(+), 258 deletions(-) diff --git a/include/Nazara/Graphics/DeferredGeometryPass.hpp b/include/Nazara/Graphics/DeferredGeometryPass.hpp index 3c7890bfe..043378642 100644 --- a/include/Nazara/Graphics/DeferredGeometryPass.hpp +++ b/include/Nazara/Graphics/DeferredGeometryPass.hpp @@ -51,8 +51,16 @@ namespace Nz int textureOverlay; }; + struct SpriteBatch + { + std::size_t spriteCount; + const Material* material; + const Texture* overlayTexture; + Recti scissorRect; + }; + mutable std::unordered_map m_shaderUniforms; - mutable std::vector> m_spriteChains; + mutable std::vector m_spriteBatches; Buffer m_vertexBuffer; RenderStates m_clearStates; ShaderRef m_clearShader; diff --git a/include/Nazara/Graphics/DepthRenderTechnique.hpp b/include/Nazara/Graphics/DepthRenderTechnique.hpp index f8f7bc4e3..5ae883352 100644 --- a/include/Nazara/Graphics/DepthRenderTechnique.hpp +++ b/include/Nazara/Graphics/DepthRenderTechnique.hpp @@ -61,8 +61,16 @@ namespace Nz int textureOverlay; }; + struct SpriteBatch + { + std::size_t spriteCount; + const Material* material; + const Texture* overlayTexture; + Recti scissorRect; + }; + mutable std::unordered_map m_shaderUniforms; - mutable std::vector> m_spriteChains; + mutable std::vector m_spriteBatches; Buffer m_vertexBuffer; RenderStates m_clearStates; ShaderRef m_clearShader; diff --git a/src/Nazara/Graphics/DeferredGeometryPass.cpp b/src/Nazara/Graphics/DeferredGeometryPass.cpp index dbd500ea4..0129c4980 100644 --- a/src/Nazara/Graphics/DeferredGeometryPass.cpp +++ b/src/Nazara/Graphics/DeferredGeometryPass.cpp @@ -29,8 +29,8 @@ namespace Nz Vector2f uv; }; - UInt32 s_maxQuads = std::numeric_limits::max() / 6; - UInt32 s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_maxQuadPerDraw = s_vertexBufferSize / sizeof(VertexLayout_XYZ_Color_UV); } /*! @@ -468,62 +468,9 @@ namespace Nz const RenderTarget* renderTarget = sceneData.viewer->GetTarget(); Recti fullscreenScissorRect = Recti(Vector2i(renderTarget->GetSize())); - Renderer::SetIndexBuffer(&s_quadIndexBuffer); - Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); - Renderer::SetVertexBuffer(&m_spriteBuffer); + const std::size_t maxSpriteCount = std::min(s_maxQuadPerDraw, m_spriteBuffer.GetVertexCount() / 4); const unsigned int overlayTextureUnit = Material::GetTextureUnit(TextureMap_Overlay); - const std::size_t maxSpriteCount = std::min(s_maxQuads, m_spriteBuffer.GetVertexCount() / 4); - - m_spriteChains.clear(); - - auto Commit = [&]() - { - std::size_t spriteChainCount = m_spriteChains.size(); - if (spriteChainCount > 0) - { - std::size_t spriteChain = 0; // Which chain of sprites are we treating - std::size_t spriteChainOffset = 0; // Where was the last offset where we stopped in the last chain - - do - { - // We open the buffer in writing mode - BufferMapper vertexMapper(m_spriteBuffer, BufferAccess_DiscardAndWrite); - VertexStruct_XYZ_Color_UV* vertices = static_cast(vertexMapper.GetPointer()); - - std::size_t spriteCount = 0; - - do - { - const VertexStruct_XYZ_Color_UV* currentChain = m_spriteChains[spriteChain].first; - std::size_t currentChainSpriteCount = m_spriteChains[spriteChain].second; - std::size_t count = std::min(maxSpriteCount - spriteCount, currentChainSpriteCount - spriteChainOffset); - - std::memcpy(vertices, currentChain + spriteChainOffset * 4, 4 * count * sizeof(VertexStruct_XYZ_Color_UV)); - vertices += count * 4; - - spriteCount += count; - spriteChainOffset += count; - - // Have we treated the entire chain ? - if (spriteChainOffset == currentChainSpriteCount) - { - spriteChain++; - spriteChainOffset = 0; - } - } - while (spriteCount < maxSpriteCount && spriteChain < spriteChainCount); - - vertexMapper.Unmap(); - - Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, 0, spriteCount * 6); - } - while (spriteChain < spriteChainCount); - } - - m_spriteChains.clear(); - }; - const Material* lastMaterial = nullptr; const MaterialPipeline* lastPipeline = nullptr; const Shader* lastShader = nullptr; @@ -533,18 +480,19 @@ namespace Nz const MaterialPipeline::Instance* pipelineInstance = nullptr; - for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) + Renderer::SetIndexBuffer(&s_quadIndexBuffer); + Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); + Renderer::SetVertexBuffer(&m_spriteBuffer); + + auto Draw = [&]() { - const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - - if (basicSprites.material != lastMaterial || basicSprites.overlay != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + unsigned int firstIndex = 0; + for (const auto& batch : m_spriteBatches) { - Commit(); - - const MaterialPipeline* pipeline = basicSprites.material->GetPipeline(); - if (lastPipeline != pipeline) + const MaterialPipeline* pipeline = batch.material->GetPipeline(); + if (pipeline != lastPipeline) { - pipelineInstance = &basicSprites.material->GetPipeline()->Apply(ShaderFlags_Deferred | ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); + pipelineInstance = &batch.material->GetPipeline()->Apply(ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); const Shader* shader = pipelineInstance->uberInstance->GetShader(); if (shader != lastShader) @@ -566,33 +514,105 @@ namespace Nz lastPipeline = pipeline; } - if (lastMaterial != basicSprites.material) + if (batch.material != lastMaterial) { - basicSprites.material->Apply(*pipelineInstance); + batch.material->Apply(*pipelineInstance); - Renderer::SetTextureSampler(overlayTextureUnit, basicSprites.material->GetDiffuseSampler()); + Renderer::SetTextureSampler(overlayTextureUnit, batch.material->GetDiffuseSampler()); - lastMaterial = basicSprites.material; + lastMaterial = batch.material; } + if (batch.overlayTexture != lastOverlay) + { + Renderer::SetTexture(overlayTextureUnit, batch.overlayTexture); + lastOverlay = batch.overlayTexture; + } + + if (batch.material->IsScissorTestEnabled() && batch.scissorRect != lastScissorRect) + { + Renderer::SetScissorRect(batch.scissorRect); + lastScissorRect = batch.scissorRect; + } + + unsigned int indexCount = batch.spriteCount * 6; + Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, firstIndex, indexCount); + firstIndex += indexCount; + } + }; + + m_spriteBatches.clear(); + { + BufferMapper vertexMapper; + VertexStruct_XYZ_Color_UV* vertices = nullptr; + + std::size_t remainingSprite = maxSpriteCount; + + const Material* lastMaterial = nullptr; + const Texture* lastOverlay = nullptr; + Recti lastScissorRect = Recti(-1, -1); + + for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) + { const Nz::Texture* overlayTexture = (basicSprites.overlay) ? basicSprites.overlay.Get() : m_whiteTexture.Get(); - if (overlayTexture != lastOverlay) - { - Renderer::SetTexture(overlayTextureUnit, overlayTexture); - lastOverlay = overlayTexture; - } + const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - if (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect) + const VertexStruct_XYZ_Color_UV* spriteVertices = basicSprites.vertices; + std::size_t spriteCount = basicSprites.spriteCount; + + for (;;) { - Renderer::SetScissorRect(scissorRect); - lastScissorRect = scissorRect; + if (m_spriteBatches.empty() || basicSprites.material != lastMaterial || overlayTexture != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + { + m_spriteBatches.emplace_back(); + SpriteBatch& newBatch = m_spriteBatches.back(); + newBatch.material = basicSprites.material; + newBatch.overlayTexture = overlayTexture; + newBatch.scissorRect = scissorRect; + newBatch.spriteCount = 0; + + lastMaterial = basicSprites.material; + lastOverlay = overlayTexture; + lastScissorRect = scissorRect; + } + + SpriteBatch& currentBatch = m_spriteBatches.back(); + + if (!vertices) + { + vertexMapper.Map(m_spriteBuffer, BufferAccess_DiscardAndWrite); + vertices = static_cast(vertexMapper.GetPointer()); + } + + std::size_t processedSpriteCount = std::min(remainingSprite, spriteCount); + std::size_t processedVertices = processedSpriteCount * 4; + + std::memcpy(vertices, spriteVertices, processedVertices * sizeof(VertexStruct_XYZ_Color_UV)); + vertices += processedVertices; + spriteVertices += processedVertices; + + currentBatch.spriteCount += processedSpriteCount; + spriteCount -= processedSpriteCount; + + remainingSprite -= processedSpriteCount; + if (remainingSprite == 0) + { + vertexMapper.Unmap(); + vertices = nullptr; + + Draw(); + + remainingSprite = maxSpriteCount; + m_spriteBatches.clear(); + } + + if (spriteCount == 0) + break; } } - - m_spriteChains.emplace_back(basicSprites.vertices, basicSprites.spriteCount); } - Commit(); + Draw(); } const DeferredGeometryPass::ShaderUniforms* DeferredGeometryPass::GetShaderUniforms(const Shader* shader) const @@ -631,12 +651,12 @@ namespace Nz { ErrorFlags flags(ErrorFlag_ThrowException, true); - s_quadIndexBuffer.Reset(false, s_maxQuads * 6, DataStorage_Hardware, 0); + s_quadIndexBuffer.Reset(true, s_maxQuadPerDraw * 6, DataStorage_Hardware, 0); BufferMapper mapper(s_quadIndexBuffer, BufferAccess_WriteOnly); - UInt16* indices = static_cast(mapper.GetPointer()); + UInt32* indices = static_cast(mapper.GetPointer()); - for (unsigned int i = 0; i < s_maxQuads; ++i) + for (UInt32 i = 0; i < s_maxQuadPerDraw; ++i) { *indices++ = i * 4 + 0; *indices++ = i * 4 + 2; diff --git a/src/Nazara/Graphics/DepthRenderTechnique.cpp b/src/Nazara/Graphics/DepthRenderTechnique.cpp index 5435d7497..531b9988a 100644 --- a/src/Nazara/Graphics/DepthRenderTechnique.cpp +++ b/src/Nazara/Graphics/DepthRenderTechnique.cpp @@ -31,8 +31,8 @@ namespace Nz Vector2f uv; }; - unsigned int s_maxQuads = std::numeric_limits::max() / 6; - unsigned int s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_maxQuadPerDraw = s_vertexBufferSize / sizeof(VertexLayout_XYZ_Color_UV); } /*! @@ -46,7 +46,7 @@ namespace Nz */ DepthRenderTechnique::DepthRenderTechnique() : - m_vertexBuffer(BufferType_Vertex) + m_vertexBuffer(BufferType_Vertex) { ErrorFlags flags(ErrorFlag_ThrowException, true); @@ -148,12 +148,12 @@ namespace Nz { ErrorFlags flags(ErrorFlag_ThrowException, true); - s_quadIndexBuffer.Reset(false, s_maxQuads * 6, DataStorage_Hardware, 0); + s_quadIndexBuffer.Reset(true, s_maxQuadPerDraw * 6, DataStorage_Hardware, 0); BufferMapper mapper(s_quadIndexBuffer, BufferAccess_WriteOnly); - UInt16* indices = static_cast(mapper.GetPointer()); + UInt32* indices = static_cast(mapper.GetPointer()); - for (unsigned int i = 0; i < s_maxQuads; ++i) + for (UInt32 i = 0; i < s_maxQuadPerDraw; ++i) { *indices++ = i * 4 + 0; *indices++ = i * 4 + 2; @@ -486,62 +486,9 @@ namespace Nz const RenderTarget* renderTarget = sceneData.viewer->GetTarget(); Recti fullscreenScissorRect = Recti(Vector2i(renderTarget->GetSize())); - Renderer::SetIndexBuffer(&s_quadIndexBuffer); - Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); - Renderer::SetVertexBuffer(&m_spriteBuffer); + const std::size_t maxSpriteCount = std::min(s_maxQuadPerDraw, m_spriteBuffer.GetVertexCount() / 4); const unsigned int overlayTextureUnit = Material::GetTextureUnit(TextureMap_Overlay); - const std::size_t maxSpriteCount = std::min(s_maxQuads, m_spriteBuffer.GetVertexCount() / 4); - - m_spriteChains.clear(); - - auto Commit = [&]() - { - std::size_t spriteChainCount = m_spriteChains.size(); - if (spriteChainCount > 0) - { - std::size_t spriteChain = 0; // Which chain of sprites are we treating - std::size_t spriteChainOffset = 0; // Where was the last offset where we stopped in the last chain - - do - { - // We open the buffer in writing mode - BufferMapper vertexMapper(m_spriteBuffer, BufferAccess_DiscardAndWrite); - VertexStruct_XYZ_Color_UV* vertices = static_cast(vertexMapper.GetPointer()); - - std::size_t spriteCount = 0; - - do - { - const VertexStruct_XYZ_Color_UV* currentChain = m_spriteChains[spriteChain].first; - std::size_t currentChainSpriteCount = m_spriteChains[spriteChain].second; - std::size_t count = std::min(maxSpriteCount - spriteCount, currentChainSpriteCount - spriteChainOffset); - - std::memcpy(vertices, currentChain + spriteChainOffset * 4, 4 * count * sizeof(VertexStruct_XYZ_Color_UV)); - vertices += count * 4; - - spriteCount += count; - spriteChainOffset += count; - - // Have we treated the entire chain ? - if (spriteChainOffset == currentChainSpriteCount) - { - spriteChain++; - spriteChainOffset = 0; - } - } - while (spriteCount < maxSpriteCount && spriteChain < spriteChainCount); - - vertexMapper.Unmap(); - - Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, 0, spriteCount * 6); - } - while (spriteChain < spriteChainCount); - } - - m_spriteChains.clear(); - }; - const Material* lastMaterial = nullptr; const MaterialPipeline* lastPipeline = nullptr; const Shader* lastShader = nullptr; @@ -551,18 +498,19 @@ namespace Nz const MaterialPipeline::Instance* pipelineInstance = nullptr; - for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) + Renderer::SetIndexBuffer(&s_quadIndexBuffer); + Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); + Renderer::SetVertexBuffer(&m_spriteBuffer); + + auto Draw = [&]() { - const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - - if (basicSprites.material != lastMaterial || basicSprites.overlay != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + unsigned int firstIndex = 0; + for (const auto& batch : m_spriteBatches) { - Commit(); - - const MaterialPipeline* pipeline = basicSprites.material->GetPipeline(); - if (lastPipeline != pipeline) + const MaterialPipeline* pipeline = batch.material->GetPipeline(); + if (pipeline != lastPipeline) { - pipelineInstance = &basicSprites.material->GetPipeline()->Apply(ShaderFlags_Deferred | ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); + pipelineInstance = &batch.material->GetPipeline()->Apply(ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); const Shader* shader = pipelineInstance->uberInstance->GetShader(); if (shader != lastShader) @@ -582,33 +530,105 @@ namespace Nz lastPipeline = pipeline; } - if (lastMaterial != basicSprites.material) + if (batch.material != lastMaterial) { - basicSprites.material->Apply(*pipelineInstance); + batch.material->Apply(*pipelineInstance); - Renderer::SetTextureSampler(overlayTextureUnit, basicSprites.material->GetDiffuseSampler()); + Renderer::SetTextureSampler(overlayTextureUnit, batch.material->GetDiffuseSampler()); - lastMaterial = basicSprites.material; + lastMaterial = batch.material; } + if (batch.overlayTexture != lastOverlay) + { + Renderer::SetTexture(overlayTextureUnit, batch.overlayTexture); + lastOverlay = batch.overlayTexture; + } + + if (batch.material->IsScissorTestEnabled() && batch.scissorRect != lastScissorRect) + { + Renderer::SetScissorRect(batch.scissorRect); + lastScissorRect = batch.scissorRect; + } + + unsigned int indexCount = batch.spriteCount * 6; + Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, firstIndex, indexCount); + firstIndex += indexCount; + } + }; + + m_spriteBatches.clear(); + { + BufferMapper vertexMapper; + VertexStruct_XYZ_Color_UV* vertices = nullptr; + + std::size_t remainingSprite = maxSpriteCount; + + const Material* lastMaterial = nullptr; + const Texture* lastOverlay = nullptr; + Recti lastScissorRect = Recti(-1, -1); + + for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) + { const Nz::Texture* overlayTexture = (basicSprites.overlay) ? basicSprites.overlay.Get() : m_whiteTexture.Get(); - if (overlayTexture != lastOverlay) - { - Renderer::SetTexture(overlayTextureUnit, overlayTexture); - lastOverlay = overlayTexture; - } + const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - if (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect) + const VertexStruct_XYZ_Color_UV* spriteVertices = basicSprites.vertices; + std::size_t spriteCount = basicSprites.spriteCount; + + for (;;) { - Renderer::SetScissorRect(scissorRect); - lastScissorRect = scissorRect; + if (m_spriteBatches.empty() || basicSprites.material != lastMaterial || overlayTexture != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + { + m_spriteBatches.emplace_back(); + SpriteBatch& newBatch = m_spriteBatches.back(); + newBatch.material = basicSprites.material; + newBatch.overlayTexture = overlayTexture; + newBatch.scissorRect = scissorRect; + newBatch.spriteCount = 0; + + lastMaterial = basicSprites.material; + lastOverlay = overlayTexture; + lastScissorRect = scissorRect; + } + + SpriteBatch& currentBatch = m_spriteBatches.back(); + + if (!vertices) + { + vertexMapper.Map(m_spriteBuffer, BufferAccess_DiscardAndWrite); + vertices = static_cast(vertexMapper.GetPointer()); + } + + std::size_t processedSpriteCount = std::min(remainingSprite, spriteCount); + std::size_t processedVertices = processedSpriteCount * 4; + + std::memcpy(vertices, spriteVertices, processedVertices * sizeof(VertexStruct_XYZ_Color_UV)); + vertices += processedVertices; + spriteVertices += processedVertices; + + currentBatch.spriteCount += processedSpriteCount; + spriteCount -= processedSpriteCount; + + remainingSprite -= processedSpriteCount; + if (remainingSprite == 0) + { + vertexMapper.Unmap(); + vertices = nullptr; + + Draw(); + + remainingSprite = maxSpriteCount; + m_spriteBatches.clear(); + } + + if (spriteCount == 0) + break; } } - - m_spriteChains.emplace_back(basicSprites.vertices, basicSprites.spriteCount); } - Commit(); + Draw(); } /*! diff --git a/src/Nazara/Graphics/ForwardRenderTechnique.cpp b/src/Nazara/Graphics/ForwardRenderTechnique.cpp index 934d54d6d..77098ecf5 100644 --- a/src/Nazara/Graphics/ForwardRenderTechnique.cpp +++ b/src/Nazara/Graphics/ForwardRenderTechnique.cpp @@ -32,8 +32,8 @@ namespace Nz Vector2f uv; }; - UInt32 s_maxQuads = std::numeric_limits::max() / 6; - UInt32 s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_vertexBufferSize = 4 * 1024 * 1024; // 4 MiB + constexpr UInt32 s_maxQuadPerDraw = s_vertexBufferSize / sizeof(VertexLayout_XYZ_Color_UV); } /*! @@ -175,12 +175,12 @@ namespace Nz { ErrorFlags flags(ErrorFlag_ThrowException, true); - s_quadIndexBuffer.Reset(false, s_maxQuads * 6, DataStorage_Hardware, 0); + s_quadIndexBuffer.Reset(true, s_maxQuadPerDraw * 6, DataStorage_Hardware, 0); BufferMapper mapper(s_quadIndexBuffer, BufferAccess_WriteOnly); - UInt16* indices = static_cast(mapper.GetPointer()); + UInt32* indices = static_cast(mapper.GetPointer()); - for (unsigned int i = 0; i < s_maxQuads; ++i) + for (UInt32 i = 0; i < s_maxQuadPerDraw; ++i) { *indices++ = i * 4 + 0; *indices++ = i * 4 + 2; @@ -618,52 +618,9 @@ namespace Nz const RenderTarget* renderTarget = sceneData.viewer->GetTarget(); Recti fullscreenScissorRect = Recti(Vector2i(renderTarget->GetSize())); + const std::size_t maxSpriteCount = std::min(s_maxQuadPerDraw, m_spriteBuffer.GetVertexCount() / 4); + const unsigned int overlayTextureUnit = Material::GetTextureUnit(TextureMap_Overlay); - const std::size_t maxSpriteCount = std::min(s_maxQuads, m_spriteBuffer.GetVertexCount() / 4); - - m_spriteBatches.clear(); - { - BufferMapper vertexMapper(m_spriteBuffer, BufferAccess_DiscardAndWrite); - VertexStruct_XYZ_Color_UV* vertices = static_cast(vertexMapper.GetPointer()); - - std::size_t remainingSprite = maxSpriteCount; - - const Material* lastMaterial = nullptr; - const Texture* lastOverlay = nullptr; - Recti lastScissorRect = Recti(-1, -1); - - for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) - { - const Nz::Texture* overlayTexture = (basicSprites.overlay) ? basicSprites.overlay.Get() : m_whiteTexture.Get(); - const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - if (basicSprites.material != lastMaterial || overlayTexture != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) - { - m_spriteBatches.emplace_back(); - SpriteBatch& newBatch = m_spriteBatches.back(); - newBatch.material = basicSprites.material; - newBatch.overlayTexture = overlayTexture; - newBatch.scissorRect = scissorRect; - newBatch.spriteCount = 0; - - lastMaterial = basicSprites.material; - lastOverlay = overlayTexture; - lastScissorRect = scissorRect; - } - - SpriteBatch& currentBatch = m_spriteBatches.back(); - - std::size_t spriteCount = std::min(remainingSprite, basicSprites.spriteCount); - std::memcpy(vertices, basicSprites.vertices, spriteCount * 4 * sizeof(VertexStruct_XYZ_Color_UV)); - vertices += spriteCount * 4; - - currentBatch.spriteCount += spriteCount; - - remainingSprite -= spriteCount; - if (remainingSprite == 0) - break; - } - } - const Material* lastMaterial = nullptr; const MaterialPipeline* lastPipeline = nullptr; const Shader* lastShader = nullptr; @@ -677,59 +634,135 @@ namespace Nz Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); Renderer::SetVertexBuffer(&m_spriteBuffer); - unsigned int firstIndex = 0; - for (const auto& batch : m_spriteBatches) + auto Draw = [&]() { - const MaterialPipeline* pipeline = batch.material->GetPipeline(); - if (pipeline != lastPipeline) + unsigned int firstIndex = 0; + for (const auto& batch : m_spriteBatches) { - pipelineInstance = &batch.material->GetPipeline()->Apply(ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); - - const Shader* shader = pipelineInstance->uberInstance->GetShader(); - if (shader != lastShader) + const MaterialPipeline* pipeline = batch.material->GetPipeline(); + if (pipeline != lastPipeline) { - // Index of uniforms in the shader - shaderUniforms = GetShaderUniforms(shader); + pipelineInstance = &batch.material->GetPipeline()->Apply(ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); - // Ambient color of the scene - shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); - // Position of the camera - shader->SendVector(shaderUniforms->eyePosition, sceneData.viewer->GetEyePosition()); + const Shader* shader = pipelineInstance->uberInstance->GetShader(); + if (shader != lastShader) + { + // Index of uniforms in the shader + shaderUniforms = GetShaderUniforms(shader); - // Overlay texture unit - shader->SendInteger(shaderUniforms->textureOverlay, overlayTextureUnit); + // Ambient color of the scene + shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); + // Position of the camera + shader->SendVector(shaderUniforms->eyePosition, sceneData.viewer->GetEyePosition()); - lastShader = shader; + // Overlay texture unit + shader->SendInteger(shaderUniforms->textureOverlay, overlayTextureUnit); + + lastShader = shader; + } + + lastPipeline = pipeline; } - lastPipeline = pipeline; - } + if (batch.material != lastMaterial) + { + batch.material->Apply(*pipelineInstance); - if (batch.material != lastMaterial) + Renderer::SetTextureSampler(overlayTextureUnit, batch.material->GetDiffuseSampler()); + + lastMaterial = batch.material; + } + + if (batch.overlayTexture != lastOverlay) + { + Renderer::SetTexture(overlayTextureUnit, batch.overlayTexture); + lastOverlay = batch.overlayTexture; + } + + if (batch.material->IsScissorTestEnabled() && batch.scissorRect != lastScissorRect) + { + Renderer::SetScissorRect(batch.scissorRect); + lastScissorRect = batch.scissorRect; + } + + unsigned int indexCount = batch.spriteCount * 6; + Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, firstIndex, indexCount); + firstIndex += indexCount; + } + }; + + m_spriteBatches.clear(); + { + BufferMapper vertexMapper; + VertexStruct_XYZ_Color_UV* vertices = nullptr; + + std::size_t remainingSprite = maxSpriteCount; + + const Material* lastMaterial = nullptr; + const Texture* lastOverlay = nullptr; + Recti lastScissorRect = Recti(-1, -1); + + for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) { - batch.material->Apply(*pipelineInstance); + const Nz::Texture* overlayTexture = (basicSprites.overlay) ? basicSprites.overlay.Get() : m_whiteTexture.Get(); + const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - Renderer::SetTextureSampler(overlayTextureUnit, batch.material->GetDiffuseSampler()); + const VertexStruct_XYZ_Color_UV* spriteVertices = basicSprites.vertices; + std::size_t spriteCount = basicSprites.spriteCount; + + for (;;) + { + if (m_spriteBatches.empty() || basicSprites.material != lastMaterial || overlayTexture != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + { + m_spriteBatches.emplace_back(); + SpriteBatch& newBatch = m_spriteBatches.back(); + newBatch.material = basicSprites.material; + newBatch.overlayTexture = overlayTexture; + newBatch.scissorRect = scissorRect; + newBatch.spriteCount = 0; - lastMaterial = batch.material; + lastMaterial = basicSprites.material; + lastOverlay = overlayTexture; + lastScissorRect = scissorRect; + } + + SpriteBatch& currentBatch = m_spriteBatches.back(); + + if (!vertices) + { + vertexMapper.Map(m_spriteBuffer, BufferAccess_DiscardAndWrite); + vertices = static_cast(vertexMapper.GetPointer()); + } + + std::size_t processedSpriteCount = std::min(remainingSprite, spriteCount); + std::size_t processedVertices = processedSpriteCount * 4; + + std::memcpy(vertices, spriteVertices, processedVertices * sizeof(VertexStruct_XYZ_Color_UV)); + vertices += processedVertices; + spriteVertices += processedVertices; + + currentBatch.spriteCount += processedSpriteCount; + spriteCount -= processedSpriteCount; + + remainingSprite -= processedSpriteCount; + if (remainingSprite == 0) + { + vertexMapper.Unmap(); + vertices = nullptr; + + Draw(); + + remainingSprite = maxSpriteCount; + m_spriteBatches.clear(); + } + + if (spriteCount == 0) + break; + } } - - if (batch.overlayTexture != lastOverlay) - { - Renderer::SetTexture(overlayTextureUnit, batch.overlayTexture); - lastOverlay = batch.overlayTexture; - } - - if (batch.material->IsScissorTestEnabled() && batch.scissorRect != lastScissorRect) - { - Renderer::SetScissorRect(batch.scissorRect); - lastScissorRect = batch.scissorRect; - } - - unsigned int indexCount = batch.spriteCount * 6; - Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, firstIndex, indexCount); - firstIndex += indexCount; } + + Draw(); } const ForwardRenderTechnique::ShaderUniforms* ForwardRenderTechnique::GetShaderUniforms(const Shader* shader) const From 3efb54ea3c38487074dcf9a26534b67472508809 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 3 Apr 2019 21:14:17 +0200 Subject: [PATCH 029/192] Physics2D/RigidBody2D: Fix SetPosition --- src/Nazara/Physics2D/RigidBody2D.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index a4876a1e6..e4c29b19a 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -470,9 +470,8 @@ namespace Nz void RigidBody2D::SetPosition(const Vector2f& position) { - cpVect oldPosition = cpBodyGetPosition(m_handle); - - cpBodySetPosition(m_handle, cpBodyLocalToWorld(m_handle, cpv(position.x - oldPosition.x + m_positionOffset.x, position.y - oldPosition.y + m_positionOffset.y))); + // Use cpTransformVect to rotate/scale the position offset + cpBodySetPosition(m_handle, cpvadd(cpv(position.x, position.y), cpTransformVect(m_handle->transform, cpv(m_positionOffset.x, m_positionOffset.y)))); if (m_isStatic) { m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) From 5e724b9c047166928ebb0f403842823fb602ef45 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 3 Apr 2019 21:14:40 +0200 Subject: [PATCH 030/192] SDK/PhysicsSystem2D: Fix crash when raycast doesn't hit --- SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 36 ++++++++++++++----------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index dac509128..1273d66bc 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -86,14 +86,17 @@ namespace Ndk bool PhysicsSystem2D::NearestBodyQuery(const Nz::Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, NearestQueryResult* result) { Nz::PhysWorld2D::NearestQueryResult queryResult; - bool res = GetPhysWorld().NearestBodyQuery(from, maxDistance, collisionGroup, categoryMask, collisionMask, &queryResult); + if (GetPhysWorld().NearestBodyQuery(from, maxDistance, collisionGroup, categoryMask, collisionMask, &queryResult)) + { + result->nearestBody = GetEntityFromBody(*queryResult.nearestBody); + result->closestPoint = std::move(queryResult.closestPoint); + result->fraction = std::move(queryResult.fraction); + result->distance = queryResult.distance; - result->nearestBody = GetEntityFromBody(*queryResult.nearestBody); - result->closestPoint = std::move(queryResult.closestPoint); - result->fraction = std::move(queryResult.fraction); - result->distance = queryResult.distance; - - return res; + return true; + } + else + return false; } bool PhysicsSystem2D::RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* hitInfos) @@ -108,7 +111,7 @@ namespace Ndk std::move(hitResult.hitPos), std::move(hitResult.hitNormal), hitResult.fraction - }); + }); } return res; @@ -117,14 +120,17 @@ namespace Ndk bool PhysicsSystem2D::RaycastQueryFirst(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, RaycastHit* hitInfo) { Nz::PhysWorld2D::RaycastHit queryResult; - bool res = GetPhysWorld().RaycastQueryFirst(from, to, radius, collisionGroup, categoryMask, collisionMask, &queryResult); + if (GetPhysWorld().RaycastQueryFirst(from, to, radius, collisionGroup, categoryMask, collisionMask, &queryResult)) + { + hitInfo->body = GetEntityFromBody(*queryResult.nearestBody); + hitInfo->hitPos = std::move(queryResult.hitPos); + hitInfo->hitNormal = std::move(queryResult.hitNormal); + hitInfo->fraction = queryResult.fraction; - hitInfo->body = GetEntityFromBody(*queryResult.nearestBody); - hitInfo->hitPos = std::move(queryResult.hitPos); - hitInfo->hitNormal = std::move(queryResult.hitNormal); - hitInfo->fraction = queryResult.fraction; - - return res; + return true; + } + else + return false; } void PhysicsSystem2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies) From 2f5e9e481b7b278e9b2b0230c288999af86845fb Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 3 Apr 2019 22:15:53 +0200 Subject: [PATCH 031/192] Fix unit tests --- tests/Engine/Network/IpAddress.cpp | 2 +- tests/SDK/NDK/Systems/RenderSystem.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Engine/Network/IpAddress.cpp b/tests/Engine/Network/IpAddress.cpp index 0c36e2a96..abcb65909 100644 --- a/tests/Engine/Network/IpAddress.cpp +++ b/tests/Engine/Network/IpAddress.cpp @@ -40,7 +40,7 @@ SCENARIO("IpAddress", "[NETWORK][IPADDRESS]") Nz::IpAddress google(8, 8, 8, 8); THEN("Google (DNS) is 8.8.8.8") { - CHECK(Nz::IpAddress::ResolveAddress(google) == "dns.google"); + CHECK(Nz::IpAddress::ResolveAddress(google) == "google-public-dns-a.google.com"); } } } diff --git a/tests/SDK/NDK/Systems/RenderSystem.cpp b/tests/SDK/NDK/Systems/RenderSystem.cpp index 329818f74..e30fa3a03 100644 --- a/tests/SDK/NDK/Systems/RenderSystem.cpp +++ b/tests/SDK/NDK/Systems/RenderSystem.cpp @@ -90,17 +90,17 @@ SCENARIO("RenderSystem", "[NDK][RenderSystem]") { CHECK(physicsComponent2D.GetAngularVelocity() == angularSpeed); CHECK(physicsComponent2D.GetRotation() == angularSpeed); - CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(1.f, 4.f, 2.f, 1.f)); + CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(2.5f, 4.5f, 2.f, 1.f)); CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); CHECK(physicsComponent2D.GetRotation() == 2.f * angularSpeed); - CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(2.f, 2.f, 1.f, 2.f)); + CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(3.f, 4.0f, 1.f, 2.f)); CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); CHECK(physicsComponent2D.GetRotation() == 3.f * angularSpeed); - CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(3.f, 3.f, 2.f, 1.f)); + CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(2.5f, 4.5f, 2.f, 1.f)); CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); From ac4904867941dbe7d141010768c66c71542590ae Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 3 Apr 2019 22:16:11 +0200 Subject: [PATCH 032/192] Fix crash when debug drawing Collider2D with no CollisionComponent2D --- SDK/src/NDK/Systems/DebugSystem.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index f2175e559..d8c61b9bc 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -231,9 +231,6 @@ namespace Ndk { case DebugDraw::Collider2D: { - const Nz::Boxf& obb = entityGfx.GetAABB(); - CollisionComponent2D& entityCollision2D = entity->GetComponent(); - Nz::Vector3f offset; Nz::InstancedRenderableRef renderable = GenerateCollision2DMesh(entity, &offset); if (renderable) From 713a70dd1099eadee8777c9f4734d5d25c3e2dcc Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 6 Apr 2019 15:09:05 +0200 Subject: [PATCH 033/192] Renderer/TextureSampler: Set default texture sampler to Clamp --- ChangeLog.md | 1 + src/Nazara/Renderer/TextureSampler.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index d2c5b2d83..3f22ba700 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -177,6 +177,7 @@ Nazara Engine: - ⚠ Collider3D::ForEachPolygon now takes a void(Vector3f\*, std::size_t) callback (instead of void(float\*, std::size_t)) - Added Collider2D::ForEachPolygon method - Added RigidBody::[Get|Set]PositionOffset allowing set an offset between body logic position and body physics position (center of mass position) +- ⚠ Default TextureSampler WrapMode is now Clamp (instead of Repeat) Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Renderer/TextureSampler.cpp b/src/Nazara/Renderer/TextureSampler.cpp index 4f1f9233f..3d24e5d1d 100644 --- a/src/Nazara/Renderer/TextureSampler.cpp +++ b/src/Nazara/Renderer/TextureSampler.cpp @@ -389,5 +389,5 @@ namespace Nz UInt8 TextureSampler::s_defaultAnisotropyLevel = 1; SamplerFilter TextureSampler::s_defaultFilterMode = SamplerFilter_Trilinear; - SamplerWrap TextureSampler::s_defaultWrapMode = SamplerWrap_Repeat; + SamplerWrap TextureSampler::s_defaultWrapMode = SamplerWrap_Clamp; } From 793c5abfe3652ea566d6b0ac3d622d55b53a8604 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Apr 2019 21:35:10 +0200 Subject: [PATCH 034/192] SDK: Add LifetimeComponent and LifetimeSystem --- ChangeLog.md | 1 + .../NDK/Components/LifetimeComponent.hpp | 40 +++++++++++++++++++ .../NDK/Components/LifetimeComponent.inl | 24 +++++++++++ SDK/include/NDK/Systems/LifetimeSystem.hpp | 29 ++++++++++++++ SDK/include/NDK/Systems/LifetimeSystem.inl | 3 ++ SDK/src/NDK/Components/LifetimeComponent.cpp | 10 +++++ SDK/src/NDK/Sdk.cpp | 4 ++ SDK/src/NDK/Systems/LifetimeSystem.cpp | 27 +++++++++++++ SDK/src/NDK/World.cpp | 2 + 9 files changed, 140 insertions(+) create mode 100644 SDK/include/NDK/Components/LifetimeComponent.hpp create mode 100644 SDK/include/NDK/Components/LifetimeComponent.inl create mode 100644 SDK/include/NDK/Systems/LifetimeSystem.hpp create mode 100644 SDK/include/NDK/Systems/LifetimeSystem.inl create mode 100644 SDK/src/NDK/Components/LifetimeComponent.cpp create mode 100644 SDK/src/NDK/Systems/LifetimeSystem.cpp diff --git a/ChangeLog.md b/ChangeLog.md index 3f22ba700..a700b072b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -251,6 +251,7 @@ Nazara Development Kit: - Added possibility of disabling synchronization between PhysicsComponent2D and NodeComponent - Fixed GraphicsComponent not invalidating render queue on material change (causing crashes or visual errors) - Added CollisionComponent2D::SetGeomOffset and CollisionComponent2D::Recenter +- Added LifetimeComponent and LifetimeSystem # 0.4: diff --git a/SDK/include/NDK/Components/LifetimeComponent.hpp b/SDK/include/NDK/Components/LifetimeComponent.hpp new file mode 100644 index 000000000..72004a90d --- /dev/null +++ b/SDK/include/NDK/Components/LifetimeComponent.hpp @@ -0,0 +1,40 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#pragma once + +#ifndef NDK_COMPONENTS_LIFETIMECOMPONENT_HPP +#define NDK_COMPONENTS_LIFETIMECOMPONENT_HPP + +#include + +namespace Ndk +{ + class LifetimeComponent; + + using LifetimeComponentHandle = Nz::ObjectHandle; + + class NDK_API LifetimeComponent : public Component + { + friend class LifetimeSystem; + + public: + inline LifetimeComponent(float lifetime); + LifetimeComponent(const LifetimeComponent&) = default; + ~LifetimeComponent() = default; + + inline float GetRemainingTime() const; + + static ComponentIndex componentIndex; + + private: + inline bool UpdateLifetime(float elapsedTime); + + float m_lifetime; + }; +} + +#include + +#endif // NDK_COMPONENTS_LIFETIMECOMPONENT_HPP diff --git a/SDK/include/NDK/Components/LifetimeComponent.inl b/SDK/include/NDK/Components/LifetimeComponent.inl new file mode 100644 index 000000000..145e160ba --- /dev/null +++ b/SDK/include/NDK/Components/LifetimeComponent.inl @@ -0,0 +1,24 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + inline LifetimeComponent::LifetimeComponent(float lifetime) : + m_lifetime(lifetime) + { + } + + inline float Ndk::LifetimeComponent::GetRemainingTime() const + { + return m_lifetime; + } + + inline bool LifetimeComponent::UpdateLifetime(float elapsedTime) + { + m_lifetime -= elapsedTime; + return m_lifetime < 0.f; + } +} diff --git a/SDK/include/NDK/Systems/LifetimeSystem.hpp b/SDK/include/NDK/Systems/LifetimeSystem.hpp new file mode 100644 index 000000000..9957c1b53 --- /dev/null +++ b/SDK/include/NDK/Systems/LifetimeSystem.hpp @@ -0,0 +1,29 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#pragma once + +#ifndef NDK_SYSTEMS_LIFETIMESYSTEM_HPP +#define NDK_SYSTEMS_LIFETIMESYSTEM_HPP + +#include + +namespace Ndk +{ + class NDK_API LifetimeSystem : public System + { + public: + LifetimeSystem(); + ~LifetimeSystem() = default; + + static SystemIndex systemIndex; + + private: + void OnUpdate(float elapsedTime) override; + }; +} + +#include + +#endif // NDK_SYSTEMS_LIFETIMESYSTEM_HPP diff --git a/SDK/include/NDK/Systems/LifetimeSystem.inl b/SDK/include/NDK/Systems/LifetimeSystem.inl new file mode 100644 index 000000000..5302ce8d0 --- /dev/null +++ b/SDK/include/NDK/Systems/LifetimeSystem.inl @@ -0,0 +1,3 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp diff --git a/SDK/src/NDK/Components/LifetimeComponent.cpp b/SDK/src/NDK/Components/LifetimeComponent.cpp new file mode 100644 index 000000000..5ffa6da82 --- /dev/null +++ b/SDK/src/NDK/Components/LifetimeComponent.cpp @@ -0,0 +1,10 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + ComponentIndex LifetimeComponent::componentIndex; +} diff --git a/SDK/src/NDK/Sdk.cpp b/SDK/src/NDK/Sdk.cpp index 90d07c738..341e6f0d5 100644 --- a/SDK/src/NDK/Sdk.cpp +++ b/SDK/src/NDK/Sdk.cpp @@ -17,11 +17,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -88,6 +90,7 @@ namespace Ndk // Shared components InitializeComponent("NdkColl2"); InitializeComponent("NdkColl3"); + InitializeComponent("NdkLiftm"); InitializeComponent("NdkNode"); InitializeComponent("NdkPhys2"); InitializeComponent("NdkPhys3"); @@ -110,6 +113,7 @@ namespace Ndk BaseSystem::Initialize(); // Shared systems + InitializeSystem(); InitializeSystem(); InitializeSystem(); InitializeSystem(); diff --git a/SDK/src/NDK/Systems/LifetimeSystem.cpp b/SDK/src/NDK/Systems/LifetimeSystem.cpp new file mode 100644 index 000000000..d575ebdc4 --- /dev/null +++ b/SDK/src/NDK/Systems/LifetimeSystem.cpp @@ -0,0 +1,27 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include +#include + +namespace Ndk +{ + LifetimeSystem::LifetimeSystem() + { + Requires(); + } + + void LifetimeSystem::OnUpdate(float elapsedTime) + { + for (const Ndk::EntityHandle& entity : GetEntities()) + { + auto& lifetime = entity->GetComponent(); + + if (lifetime.UpdateLifetime(elapsedTime)) + entity->Kill(); + } + } + + SystemIndex LifetimeSystem::systemIndex; +} diff --git a/SDK/src/NDK/World.cpp b/SDK/src/NDK/World.cpp index bfbe0140c..579985297 100644 --- a/SDK/src/NDK/World.cpp +++ b/SDK/src/NDK/World.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +44,7 @@ namespace Ndk void World::AddDefaultSystems() { + AddSystem(); AddSystem(); AddSystem(); AddSystem(); From d234d2084db47c204350328b7bbc98527bd35ce7 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Apr 2019 21:36:08 +0200 Subject: [PATCH 035/192] SDK/StateMachine: Fixed ignored transitiions --- ChangeLog.md | 1 + SDK/include/NDK/StateMachine.inl | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index a700b072b..0a890109b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -178,6 +178,7 @@ Nazara Engine: - Added Collider2D::ForEachPolygon method - Added RigidBody::[Get|Set]PositionOffset allowing set an offset between body logic position and body physics position (center of mass position) - ⚠ Default TextureSampler WrapMode is now Clamp (instead of Repeat) +- Fixed StateMachine ignoring transitions made in Enter/Leave events of states Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/include/NDK/StateMachine.inl b/SDK/include/NDK/StateMachine.inl index 1b2a625ab..ba2a74928 100644 --- a/SDK/include/NDK/StateMachine.inl +++ b/SDK/include/NDK/StateMachine.inl @@ -159,8 +159,13 @@ namespace Ndk */ inline bool StateMachine::Update(float elapsedTime) { - for (StateTransition& transition : m_transitions) + // Use a classic for instead of a range-for because some state may push/pop on enter/leave, adding new transitions as we iterate + // (range-for is a problem here because it doesn't handle mutable containers) + + for (std::size_t i = 0; i < m_transitions.size(); ++i) { + StateTransition& transition = m_transitions[i]; + switch (transition.type) { case TransitionType::Pop: From 9d195c275081d1868cadab638deb06e1a983d48f Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Apr 2019 21:36:16 +0200 Subject: [PATCH 036/192] Regenerate global headers --- SDK/include/NDK/Components.hpp | 1 + SDK/include/NDK/Systems.hpp | 1 + SDK/include/NDK/Widgets.hpp | 1 + 3 files changed, 3 insertions(+) diff --git a/SDK/include/NDK/Components.hpp b/SDK/include/NDK/Components.hpp index 97c15fc7c..cc8c37d93 100644 --- a/SDK/include/NDK/Components.hpp +++ b/SDK/include/NDK/Components.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include diff --git a/SDK/include/NDK/Systems.hpp b/SDK/include/NDK/Systems.hpp index 80571ef45..e9a60f0c3 100644 --- a/SDK/include/NDK/Systems.hpp +++ b/SDK/include/NDK/Systems.hpp @@ -6,6 +6,7 @@ #define NDK_SYSTEMS_GLOBAL_HPP #include +#include #include #include #include diff --git a/SDK/include/NDK/Widgets.hpp b/SDK/include/NDK/Widgets.hpp index 26917a4c9..a4b74b2d6 100644 --- a/SDK/include/NDK/Widgets.hpp +++ b/SDK/include/NDK/Widgets.hpp @@ -5,6 +5,7 @@ #ifndef NDK_WIDGETS_GLOBAL_HPP #define NDK_WIDGETS_GLOBAL_HPP +#include #include #include #include From e665ea537321e3e3df9fe8b0add087d678afc258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 12 Apr 2019 15:29:15 +0200 Subject: [PATCH 037/192] Graphics/Material: Fix Configure resetting textures --- ChangeLog.md | 1 + include/Nazara/Graphics/Material.inl | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 0a890109b..4476c6eb3 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -179,6 +179,7 @@ Nazara Engine: - Added RigidBody::[Get|Set]PositionOffset allowing set an offset between body logic position and body physics position (center of mass position) - ⚠ Default TextureSampler WrapMode is now Clamp (instead of Repeat) - Fixed StateMachine ignoring transitions made in Enter/Leave events of states +- Fixed Material::Configure resetting textures Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Graphics/Material.inl b/include/Nazara/Graphics/Material.inl index 32a59b1bb..66c34e19c 100644 --- a/include/Nazara/Graphics/Material.inl +++ b/include/Nazara/Graphics/Material.inl @@ -119,6 +119,14 @@ namespace Nz { m_pipelineInfo = pipelineInfo; + // Temp and dirty fix for pipeline overriding has*Map + m_pipelineInfo.hasAlphaMap = m_alphaMap.IsValid(); + m_pipelineInfo.hasDiffuseMap = m_diffuseMap.IsValid(); + m_pipelineInfo.hasEmissiveMap = m_emissiveMap.IsValid(); + m_pipelineInfo.hasHeightMap = m_heightMap.IsValid(); + m_pipelineInfo.hasNormalMap = m_normalMap.IsValid(); + m_pipelineInfo.hasSpecularMap = m_specularMap.IsValid(); + InvalidatePipeline(); } From 0582cbfc265ca8864326723d64565e28e27acda4 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 13 Apr 2019 13:09:53 +0200 Subject: [PATCH 038/192] Utility: Replace UInt32 by TextStyleFlags --- ChangeLog.md | 2 ++ SDK/src/NDK/Lua/LuaBinding_Utility.cpp | 4 ++-- include/Nazara/Utility/Enums.hpp | 24 ++++++++++++------- include/Nazara/Utility/Font.hpp | 15 ++++++------ include/Nazara/Utility/FontData.hpp | 5 ++-- include/Nazara/Utility/SimpleTextDrawer.hpp | 10 ++++---- src/Nazara/Utility/Font.cpp | 16 ++++++------- src/Nazara/Utility/Formats/FreeTypeLoader.cpp | 8 +++---- src/Nazara/Utility/SimpleTextDrawer.cpp | 8 +++---- 9 files changed, 52 insertions(+), 40 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 4476c6eb3..5b65ee66d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -180,6 +180,8 @@ Nazara Engine: - ⚠ Default TextureSampler WrapMode is now Clamp (instead of Repeat) - Fixed StateMachine ignoring transitions made in Enter/Leave events of states - Fixed Material::Configure resetting textures +- ⚠ Renamed TextStyleFlags enum to TextStyle, introduced Flags specialization of TextStyle as TextStyleFlags +- ⚠ Font, FontData and SimpleTextDrawer now use a proper TextStyleFlags instead of a UInt32 Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/src/NDK/Lua/LuaBinding_Utility.cpp b/SDK/src/NDK/Lua/LuaBinding_Utility.cpp index 43ea4a8c7..a98bd4ed7 100644 --- a/SDK/src/NDK/Lua/LuaBinding_Utility.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_Utility.cpp @@ -126,7 +126,7 @@ namespace Ndk case 2: { unsigned int characterSize = lua.Check(&argIndex); - Nz::UInt32 style = lua.Check(&argIndex); + Nz::TextStyleFlags style = lua.Check(&argIndex); lua.Push(instance->GetCachedGlyphCount(characterSize, style)); return 1; @@ -146,7 +146,7 @@ namespace Ndk font.BindMethod("IsValid", &Nz::Font::IsValid); - font.BindMethod("Precache", (bool(Nz::Font::*)(unsigned int, Nz::UInt32, const Nz::String&) const) &Nz::Font::Precache); + font.BindMethod("Precache", (bool(Nz::Font::*)(unsigned int, Nz::TextStyleFlags, const Nz::String&) const) &Nz::Font::Precache); font.BindMethod("SetGlyphBorder", &Nz::Font::SetGlyphBorder); font.BindMethod("SetMinimumStepSize", &Nz::Font::SetMinimumStepSize); diff --git a/include/Nazara/Utility/Enums.hpp b/include/Nazara/Utility/Enums.hpp index d6fee2127..f4d343acc 100644 --- a/include/Nazara/Utility/Enums.hpp +++ b/include/Nazara/Utility/Enums.hpp @@ -329,18 +329,26 @@ namespace Nz TextAlign_Max = TextAlign_Right }; - enum TextStyleFlags + enum TextStyle { - TextStyle_Regular = 0x0, + TextStyle_Bold, + TextStyle_Italic, + TextStyle_StrikeThrough, + TextStyle_Underlined, - TextStyle_Bold = 0x1, - TextStyle_Italic = 0x2, - TextStyle_StrikeThrough = 0x4, - TextStyle_Underlined = 0x8, - - TextStyle_Max = TextStyle_Underlined*2-1 + TextStyle_Max = TextStyle_Underlined }; + template<> + struct EnumAsFlags + { + static constexpr TextStyle max = TextStyle_Max; + }; + + using TextStyleFlags = Flags; + + constexpr TextStyleFlags TextStyle_Regular = 0; + enum VertexComponent { VertexComponent_Unused = -1, diff --git a/include/Nazara/Utility/Font.hpp b/include/Nazara/Utility/Font.hpp index be67c92e7..bac5db49c 100644 --- a/include/Nazara/Utility/Font.hpp +++ b/include/Nazara/Utility/Font.hpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -58,14 +59,14 @@ namespace Nz bool Create(FontData* data); void Destroy(); - bool ExtractGlyph(unsigned int characterSize, char32_t character, UInt32 style, FontGlyph* glyph) const; + bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, FontGlyph* glyph) const; const std::shared_ptr& GetAtlas() const; - std::size_t GetCachedGlyphCount(unsigned int characterSize, UInt32 style) const; + std::size_t GetCachedGlyphCount(unsigned int characterSize, TextStyleFlags style) const; std::size_t GetCachedGlyphCount() const; String GetFamilyName() const; int GetKerning(unsigned int characterSize, char32_t first, char32_t second) const; - const Glyph& GetGlyph(unsigned int characterSize, UInt32 style, char32_t character) const; + const Glyph& GetGlyph(unsigned int characterSize, TextStyleFlags style, char32_t character) const; unsigned int GetGlyphBorder() const; unsigned int GetMinimumStepSize() const; const SizeInfo& GetSizeInfo(unsigned int characterSize) const; @@ -73,8 +74,8 @@ namespace Nz bool IsValid() const; - bool Precache(unsigned int characterSize, UInt32 style, char32_t character) const; - bool Precache(unsigned int characterSize, UInt32 style, const String& characterSet) const; + bool Precache(unsigned int characterSize, TextStyleFlags style, char32_t character) const; + bool Precache(unsigned int characterSize, TextStyleFlags style, const String& characterSet) const; void SetAtlas(const std::shared_ptr& atlas); void SetGlyphBorder(unsigned int borderSize); @@ -130,11 +131,11 @@ namespace Nz private: using GlyphMap = std::unordered_map; - UInt64 ComputeKey(unsigned int characterSize, UInt32 style) const; + UInt64 ComputeKey(unsigned int characterSize, TextStyleFlags style) const; void OnAtlasCleared(const AbstractAtlas* atlas); void OnAtlasLayerChange(const AbstractAtlas* atlas, AbstractImage* oldLayer, AbstractImage* newLayer); void OnAtlasRelease(const AbstractAtlas* atlas); - const Glyph& PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, UInt32 style, char32_t character) const; + const Glyph& PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, TextStyleFlags style, char32_t character) const; static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Utility/FontData.hpp b/include/Nazara/Utility/FontData.hpp index efd2e6d94..a3ac4901a 100644 --- a/include/Nazara/Utility/FontData.hpp +++ b/include/Nazara/Utility/FontData.hpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace Nz { @@ -21,7 +22,7 @@ namespace Nz FontData() = default; virtual ~FontData(); - virtual bool ExtractGlyph(unsigned int characterSize, char32_t character, UInt32 style, FontGlyph* dst) = 0; + virtual bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, FontGlyph* dst) = 0; virtual String GetFamilyName() const = 0; virtual String GetStyleName() const = 0; @@ -35,7 +36,7 @@ namespace Nz virtual float QueryUnderlinePosition(unsigned int characterSize) const = 0; virtual float QueryUnderlineThickness(unsigned int characterSize) const = 0; - virtual bool SupportsStyle(UInt32 style) const = 0; + virtual bool SupportsStyle(TextStyleFlags style) const = 0; }; } diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index d3c3bd9cc..c41a5d8be 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -38,20 +38,20 @@ namespace Nz std::size_t GetGlyphCount() const override; const Line& GetLine(std::size_t index) const override; std::size_t GetLineCount() const override; - UInt32 GetStyle() const; + TextStyleFlags GetStyle() const; const String& GetText() const; void SetCharacterSize(unsigned int characterSize); void SetColor(const Color& color); void SetFont(Font* font); - void SetStyle(UInt32 style); + void SetStyle(TextStyleFlags style); void SetText(const String& str); SimpleTextDrawer& operator=(const SimpleTextDrawer& drawer); SimpleTextDrawer& operator=(SimpleTextDrawer&& drawer); - static SimpleTextDrawer Draw(const String& str, unsigned int characterSize, UInt32 style = TextStyle_Regular, const Color& color = Color::White); - static SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, UInt32 style = TextStyle_Regular, const Color& color = Color::White); + static SimpleTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); + static SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); private: void ClearGlyphs() const; @@ -76,8 +76,8 @@ namespace Nz mutable Rectf m_workingBounds; mutable Recti m_bounds; String m_text; + TextStyleFlags m_style; mutable UInt32 m_previousCharacter; - UInt32 m_style; mutable Vector2ui m_drawPos; mutable bool m_colorUpdated; mutable bool m_glyphUpdated; diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index 731557628..0ccc09269 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -109,7 +109,7 @@ namespace Nz } } - bool Font::ExtractGlyph(unsigned int characterSize, char32_t character, UInt32 style, FontGlyph* glyph) const + bool Font::ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, FontGlyph* glyph) const { #if NAZARA_UTILITY_SAFE if (!IsValid()) @@ -127,7 +127,7 @@ namespace Nz return m_atlas; } - std::size_t Font::GetCachedGlyphCount(unsigned int characterSize, UInt32 style) const + std::size_t Font::GetCachedGlyphCount(unsigned int characterSize, TextStyleFlags style) const { UInt64 key = ComputeKey(characterSize, style); auto it = m_glyphes.find(key); @@ -187,7 +187,7 @@ namespace Nz return it->second; // Présent dans le cache, tout va bien } - const Font::Glyph& Font::GetGlyph(unsigned int characterSize, UInt32 style, char32_t character) const + const Font::Glyph& Font::GetGlyph(unsigned int characterSize, TextStyleFlags style, char32_t character) const { UInt64 key = ComputeKey(characterSize, style); return PrecacheGlyph(m_glyphes[key], characterSize, style, character); @@ -256,13 +256,13 @@ namespace Nz return m_data != nullptr; } - bool Font::Precache(unsigned int characterSize, UInt32 style, char32_t character) const + bool Font::Precache(unsigned int characterSize, TextStyleFlags style, char32_t character) const { UInt64 key = ComputeKey(characterSize, style); return PrecacheGlyph(m_glyphes[key], characterSize, style, character).valid; } - bool Font::Precache(unsigned int characterSize, UInt32 style, const String& characterSet) const + bool Font::Precache(unsigned int characterSize, TextStyleFlags style, const String& characterSet) const { ///TODO: Itération UTF-8 => UTF-32 sans allocation de buffer (Exposer utf8cpp ?) std::u32string set = characterSet.GetUtf32String(); @@ -399,7 +399,7 @@ namespace Nz s_defaultMinimumStepSize = minimumStepSize; } - UInt64 Font::ComputeKey(unsigned int characterSize, UInt32 style) const + UInt64 Font::ComputeKey(unsigned int characterSize, TextStyleFlags style) const { // On prend le pas en compte UInt64 sizePart = static_cast((characterSize/m_minimumStepSize)*m_minimumStepSize); @@ -471,7 +471,7 @@ namespace Nz NazaraError("Atlas has been released while in use"); } - const Font::Glyph& Font::PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, UInt32 style, char32_t character) const + const Font::Glyph& Font::PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, TextStyleFlags style, char32_t character) const { auto it = glyphMap.find(character); if (it != glyphMap.end()) // Si le glyphe n'est pas déjà chargé @@ -492,7 +492,7 @@ namespace Nz glyph.requireFauxBold = false; glyph.requireFauxItalic = false; - UInt32 supportedStyle = style; + TextStyleFlags supportedStyle = style; if (style & TextStyle_Bold && !m_data->SupportsStyle(TextStyle_Bold)) { glyph.requireFauxBold = true; diff --git a/src/Nazara/Utility/Formats/FreeTypeLoader.cpp b/src/Nazara/Utility/Formats/FreeTypeLoader.cpp index 2cd2c51e3..9f890385f 100644 --- a/src/Nazara/Utility/Formats/FreeTypeLoader.cpp +++ b/src/Nazara/Utility/Formats/FreeTypeLoader.cpp @@ -25,7 +25,7 @@ namespace Nz FT_Library s_library; std::shared_ptr s_libraryOwner; - float s_invScaleFactor = 1.f / (1 << 6); // 1/64 + constexpr float s_invScaleFactor = 1.f / (1 << 6); // 1/64 extern "C" unsigned long FT_StreamRead(FT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count) @@ -96,7 +96,7 @@ namespace Nz return FT_Open_Face(s_library, &m_args, -1, nullptr) == 0; } - bool ExtractGlyph(unsigned int characterSize, char32_t character, UInt32 style, FontGlyph* dst) override + bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, FontGlyph* dst) override { #ifdef NAZARA_DEBUG if (!dst) @@ -118,7 +118,7 @@ namespace Nz const FT_Pos boldStrength = 2 << 6; - bool embolden = (style & TextStyle_Bold); + bool embolden = (style & TextStyle_Bold) != 0; dst->advance = (embolden) ? boldStrength >> 6 : 0; @@ -312,7 +312,7 @@ namespace Nz m_args.stream = &m_stream; } - bool SupportsStyle(UInt32 style) const override + bool SupportsStyle(TextStyleFlags style) const override { ///TODO return style == TextStyle_Regular || style == TextStyle_Bold; diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 89accf012..ec684a8e0 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -120,7 +120,7 @@ namespace Nz return m_lines.size(); } - UInt32 SimpleTextDrawer::GetStyle() const + TextStyleFlags SimpleTextDrawer::GetStyle() const { return m_style; } @@ -159,7 +159,7 @@ namespace Nz } } - void SimpleTextDrawer::SetStyle(UInt32 style) + void SimpleTextDrawer::SetStyle(TextStyleFlags style) { m_style = style; @@ -207,7 +207,7 @@ namespace Nz return *this; } - SimpleTextDrawer SimpleTextDrawer::Draw(const String& str, unsigned int characterSize, UInt32 style, const Color& color) + SimpleTextDrawer SimpleTextDrawer::Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color) { SimpleTextDrawer drawer; drawer.SetCharacterSize(characterSize); @@ -218,7 +218,7 @@ namespace Nz return drawer; } - SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, UInt32 style, const Color& color) + SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color) { SimpleTextDrawer drawer; drawer.SetCharacterSize(characterSize); From 080b76a23c974c2afa65247b1c1e07ce1519cbe1 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 13 Apr 2019 13:39:19 +0200 Subject: [PATCH 039/192] Utility/Font: Fix bold not working since last commit --- src/Nazara/Utility/Font.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index 0ccc09269..0628a4337 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -405,7 +405,7 @@ namespace Nz UInt64 sizePart = static_cast((characterSize/m_minimumStepSize)*m_minimumStepSize); // Ainsi que le style (uniquement le gras et l'italique, les autres sont gérés par un TextDrawer) - UInt64 stylePart = 0; + TextStyleFlags stylePart = 0; if (style & TextStyle_Bold) stylePart |= TextStyle_Bold; @@ -413,7 +413,7 @@ namespace Nz if (style & TextStyle_Italic) stylePart |= TextStyle_Italic; - return (stylePart << 32) | sizePart; + return (static_cast(stylePart) << 32) | sizePart; } void Font::OnAtlasCleared(const AbstractAtlas* atlas) From 8c7d886f73e472e7f352a512dd445873273660ee Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 15 Apr 2019 14:16:57 +0200 Subject: [PATCH 040/192] Math/Algorithm: Reenable constexpr --- ChangeLog.md | 1 + include/Nazara/Math/Algorithm.hpp | 18 ++++----- include/Nazara/Math/Algorithm.inl | 61 ++++++------------------------- 3 files changed, 22 insertions(+), 58 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5b65ee66d..f35121273 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -182,6 +182,7 @@ Nazara Engine: - Fixed Material::Configure resetting textures - ⚠ Renamed TextStyleFlags enum to TextStyle, introduced Flags specialization of TextStyle as TextStyleFlags - ⚠ Font, FontData and SimpleTextDrawer now use a proper TextStyleFlags instead of a UInt32 +- Almost all Math algorithms are now constexpr Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Math/Algorithm.hpp b/include/Nazara/Math/Algorithm.hpp index dd9cb4d5a..7bd77437d 100644 --- a/include/Nazara/Math/Algorithm.hpp +++ b/include/Nazara/Math/Algorithm.hpp @@ -35,15 +35,15 @@ namespace Nz { - template /*constexpr*/ T Approach(T value, T objective, T increment); + template constexpr T Approach(T value, T objective, T increment); template constexpr T Clamp(T value, T min, T max); - template /*constexpr*/ std::size_t CountBits(T value); + template constexpr std::size_t CountBits(T value); template constexpr T FromDegrees(T degrees); template constexpr T FromRadians(T radians); template constexpr T DegreeToRadian(T degrees); - template /*constexpr*/ T GetNearestPowerOfTwo(T number); - /*constexpr*/ unsigned int GetNumberLength(signed char number); - /*constexpr*/ unsigned int GetNumberLength(unsigned char number); + template constexpr T GetNearestPowerOfTwo(T number); + constexpr unsigned int GetNumberLength(signed char number); + constexpr unsigned int GetNumberLength(unsigned char number); unsigned int GetNumberLength(int number); /*constexpr*/ unsigned int GetNumberLength(unsigned int number); unsigned int GetNumberLength(long long number); @@ -53,12 +53,12 @@ namespace Nz unsigned int GetNumberLength(long double number, UInt8 precision = NAZARA_CORE_DECIMAL_DIGITS); template /*constexpr*/ unsigned int IntegralLog2(T number); template /*constexpr*/ unsigned int IntegralLog2Pot(T pot); - template /*constexpr*/ T IntegralPow(T base, unsigned int exponent); + template constexpr T IntegralPow(T base, unsigned int exponent); template constexpr T Lerp(const T& from, const T& to, const T2& interpolation); template constexpr T MultiplyAdd(T x, T y, T z); - template /*constexpr*/ T NormalizeAngle(T angle); - template /*constexpr*/ bool NumberEquals(T a, T b); - template /*constexpr*/ bool NumberEquals(T a, T b, T maxDifference); + template constexpr T NormalizeAngle(T angle); + template constexpr bool NumberEquals(T a, T b); + template constexpr bool NumberEquals(T a, T b, T maxDifference); String NumberToString(long long number, UInt8 radix = 10); template constexpr T RadianToDegree(T radians); long long StringToNumber(String str, UInt8 radix = 10, bool* ok = nullptr); diff --git a/include/Nazara/Math/Algorithm.inl b/include/Nazara/Math/Algorithm.inl index b393d38e6..5a7bfb8fc 100644 --- a/include/Nazara/Math/Algorithm.inl +++ b/include/Nazara/Math/Algorithm.inl @@ -98,13 +98,13 @@ namespace Nz return 0; } - template /*constexpr*/ std::enable_if_t::value, bool> NumberEquals(T a, T b, T maxDifference) + template constexpr std::enable_if_t::value, bool> NumberEquals(T a, T b, T maxDifference) { T diff = std::abs(a - b); return diff <= maxDifference; } - template /*constexpr*/ std::enable_if_t::value || (!std::is_integral::value && !std::is_floating_point::value), bool> NumberEquals(T a, T b, T maxDifference) + template constexpr std::enable_if_t::value || (!std::is_integral::value && !std::is_floating_point::value), bool> NumberEquals(T a, T b, T maxDifference) { if (b > a) std::swap(a, b); @@ -113,7 +113,7 @@ namespace Nz return diff <= maxDifference; } - template /*constexpr*/ std::enable_if_t::value && std::is_integral::value, bool> NumberEquals(T a, T b, T maxDifference) + template constexpr std::enable_if_t::value && std::is_integral::value, bool> NumberEquals(T a, T b, T maxDifference) { if (b > a) std::swap(a, b); @@ -132,10 +132,8 @@ namespace Nz * \param objective Target value * \param increment One step value */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline T Approach(T value, T objective, T increment) + constexpr inline T Approach(T value, T objective, T increment) { if (value < objective) return std::min(value + increment, objective); @@ -154,7 +152,6 @@ namespace Nz * \param min Minimum of the interval * \param max Maximum of the interval */ - template constexpr T Clamp(T value, T min, T max) { @@ -168,10 +165,8 @@ namespace Nz * * \param value The value to count bits */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline std::size_t CountBits(T value) + constexpr inline std::size_t CountBits(T value) { // https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan std::size_t count = 0; @@ -191,7 +186,6 @@ namespace Nz * * \param degrees Angle in degree (this is expected between 0..360) */ - template constexpr T DegreeToRadian(T degrees) { @@ -205,7 +199,6 @@ namespace Nz * * \param degrees Convert degree to NAZARA_MATH_ANGLE_RADIAN unit */ - template constexpr T FromDegrees(T degrees) { @@ -223,7 +216,6 @@ namespace Nz * * \param radians Convert radian to NAZARA_MATH_ANGLE_RADIAN unit */ - template constexpr T FromRadians(T radians) { @@ -241,10 +233,8 @@ namespace Nz * * \param number Number to get nearest power */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline T GetNearestPowerOfTwo(T number) + constexpr inline T GetNearestPowerOfTwo(T number) { T x = 1; while (x < number) @@ -260,9 +250,7 @@ namespace Nz * * \param number Number to get number of digits */ - - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline unsigned int GetNumberLength(signed char number) + constexpr inline unsigned int GetNumberLength(signed char number) { // Char is expected to be 1 byte static_assert(sizeof(number) == 1, "Signed char must be one byte-sized"); @@ -288,9 +276,7 @@ namespace Nz * * \param number Number to get number of digits */ - - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline unsigned int GetNumberLength(unsigned char number) + constexpr inline unsigned int GetNumberLength(unsigned char number) { // Char is expected to be 1 byte static_assert(sizeof(number) == 1, "Unsigned char must be one byte-sized"); @@ -310,7 +296,6 @@ namespace Nz * * \param number Number to get number of digits */ - inline unsigned int GetNumberLength(int number) { if (number == 0) @@ -326,7 +311,6 @@ namespace Nz * * \param number Number to get number of digits */ - //TODO: Mark as constexpr when supported by all major compilers /*constexpr*/ inline unsigned int GetNumberLength(unsigned int number) { @@ -343,7 +327,6 @@ namespace Nz * * \param number Number to get number of digits */ - inline unsigned int GetNumberLength(long long number) { if (number == 0) @@ -359,7 +342,6 @@ namespace Nz * * \param number Number to get number of digits */ - //TODO: Mark as constexpr when supported by all major compilers /*constexpr*/ inline unsigned int GetNumberLength(unsigned long long number) { @@ -377,7 +359,6 @@ namespace Nz * \param number Number to get number of digits * \param precision Number of digit after the dot */ - inline unsigned int GetNumberLength(float number, UInt8 precision) { // The imprecision of floats need a cast (log10(9.99999) = 0.99999) @@ -392,7 +373,6 @@ namespace Nz * \param number Number to get number of digits * \param precision Number of digit after the dot */ - inline unsigned int GetNumberLength(double number, UInt8 precision) { // The imprecision of floats need a cast (log10(9.99999) = 0.99999) @@ -407,7 +387,6 @@ namespace Nz * \param number Number to get number of digits * \param precision Number of digit after the dot */ - inline unsigned int GetNumberLength(long double number, UInt8 precision) { // The imprecision of floats need a cast (log10(9.99999) = 0.99999) @@ -423,7 +402,6 @@ namespace Nz * * \remark If number is 0, 0 is returned */ - template //TODO: Mark as constexpr when supported by all major compilers /*constexpr*/ inline unsigned int IntegralLog2(T number) @@ -442,7 +420,6 @@ namespace Nz * \remark Only works for power of two * \remark If number is 0, 0 is returned */ - template //TODO: Mark as constexpr when supported by all major compilers /*constexpr*/ inline unsigned int IntegralLog2Pot(T pot) @@ -458,10 +435,8 @@ namespace Nz * \param base Base of the exponentation * \param exponent Power for the base */ - - //TODO: Mark as constexpr when supported by all major compilers template - /*constexpr*/ T IntegralPow(T base, unsigned int exponent) + constexpr T IntegralPow(T base, unsigned int exponent) { T r = 1; for (unsigned int i = 0; i < exponent; ++i) @@ -484,7 +459,6 @@ namespace Nz * * \see Lerp */ - template constexpr T Lerp(const T& from, const T& to, const T2& interpolation) { @@ -540,10 +514,8 @@ namespace Nz * * \param angle Angle to normalize */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline T NormalizeAngle(T angle) + constexpr inline T NormalizeAngle(T angle) { #if NAZARA_MATH_ANGLE_RADIAN const T limit = T(M_PI); @@ -567,10 +539,8 @@ namespace Nz * \param a First value * \param b Second value */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline bool NumberEquals(T a, T b) + constexpr inline bool NumberEquals(T a, T b) { return NumberEquals(a, b, std::numeric_limits::epsilon()); } @@ -584,10 +554,8 @@ namespace Nz * \param b Second value * \param maxDifference Epsilon of comparison (expected to be positive) */ - template - //TODO: Mark as constexpr when supported by all major compilers - /*constexpr*/ inline bool NumberEquals(T a, T b, T maxDifference) + constexpr inline bool NumberEquals(T a, T b, T maxDifference) { return Detail::NumberEquals(a, b, maxDifference); } @@ -603,7 +571,6 @@ namespace Nz * \remark radix is meant to be between 2 and 36, other values are potentially undefined behavior * \remark With NAZARA_MATH_SAFE, a NazaraError is produced and String() is returned */ - inline String NumberToString(long long number, UInt8 radix) { #if NAZARA_MATH_SAFE @@ -651,7 +618,6 @@ namespace Nz * * \param radians Angle in radian (this is expected between 0..2*pi) */ - template constexpr T RadianToDegree(T radians) { @@ -670,7 +636,6 @@ namespace Nz * \remark radix is meant to be between 2 and 36, other values are potentially undefined behavior * \remark With NAZARA_MATH_SAFE, a NazaraError is produced and 0 is returned */ - inline long long StringToNumber(String str, UInt8 radix, bool* ok) { #if NAZARA_MATH_SAFE @@ -727,7 +692,6 @@ namespace Nz * * \param angle Convert degree from NAZARA_MATH_ANGLE_RADIAN unit to degrees */ - template constexpr T ToDegrees(T angle) { @@ -745,7 +709,6 @@ namespace Nz * * \param angle Convert degree from NAZARA_MATH_ANGLE_RADIAN unit to radians */ - template constexpr T ToRadians(T angle) { From e61faae0897c2899194b51d1e64d4b932ca931ec Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 15 Apr 2019 16:25:40 +0200 Subject: [PATCH 041/192] Physics2D/PhysWorld2D: Fix multiple calls to RegisterCallbacks with the same collision id --- ChangeLog.md | 1 + SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 2 +- include/Nazara/Physics2D/PhysWorld2D.hpp | 8 +-- src/Nazara/Physics2D/PhysWorld2D.cpp | 71 ++++++++++++++++++------ 4 files changed, 61 insertions(+), 21 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f35121273..37cb5f5c0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -183,6 +183,7 @@ Nazara Engine: - ⚠ Renamed TextStyleFlags enum to TextStyle, introduced Flags specialization of TextStyle as TextStyleFlags - ⚠ Font, FontData and SimpleTextDrawer now use a proper TextStyleFlags instead of a UInt32 - Almost all Math algorithms are now constexpr +- PhysWorld2D: Fixed callbacks not properly replacing each others when registering twice with the same collisionId (pair) Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index 1273d66bc..8cce2e9aa 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -287,7 +287,7 @@ namespace Ndk void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, Callback callbacks) { - Nz::PhysWorld2D::Callback worldCallbacks{}; + Nz::PhysWorld2D::Callback worldCallbacks; if (callbacks.endCallback) { diff --git a/include/Nazara/Physics2D/PhysWorld2D.hpp b/include/Nazara/Physics2D/PhysWorld2D.hpp index 42e9288a1..86de8f003 100644 --- a/include/Nazara/Physics2D/PhysWorld2D.hpp +++ b/include/Nazara/Physics2D/PhysWorld2D.hpp @@ -69,8 +69,8 @@ namespace Nz void RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies); - void RegisterCallbacks(unsigned int collisionId, const Callback& callbacks); - void RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, const Callback& callbacks); + void RegisterCallbacks(unsigned int collisionId, Callback callbacks); + void RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, Callback callbacks); void SetDamping(float dampingValue); void SetGravity(const Vector2f& gravity); @@ -91,7 +91,7 @@ namespace Nz ContactPreSolveCallback preSolveCallback = nullptr; ContactPostSolveCallback postSolveCallback = nullptr; ContactStartCallback startCallback = nullptr; - void* userdata; + void* userdata = nullptr; }; struct DebugDrawOptions @@ -130,7 +130,7 @@ namespace Nz NazaraSignal(OnPhysWorld2DPostStep, const PhysWorld2D* /*physWorld*/, float /*invStepCount*/); private: - void InitCallbacks(cpCollisionHandler* handler, const Callback& callbacks); + void InitCallbacks(cpCollisionHandler* handler, Callback callbacks); using PostStep = std::function; diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp index 7383510f8..319a10582 100644 --- a/src/Nazara/Physics2D/PhysWorld2D.cpp +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -273,14 +273,14 @@ namespace Nz cpSpaceBBQuery(m_handle, cpBBNew(boundingBox.x, boundingBox.y, boundingBox.x + boundingBox.width, boundingBox.y + boundingBox.height), filter, callback, bodies); } - void PhysWorld2D::RegisterCallbacks(unsigned int collisionId, const Callback& callbacks) + void PhysWorld2D::RegisterCallbacks(unsigned int collisionId, Callback callbacks) { - InitCallbacks(cpSpaceAddWildcardHandler(m_handle, collisionId), callbacks); + InitCallbacks(cpSpaceAddWildcardHandler(m_handle, collisionId), std::move(callbacks)); } - void PhysWorld2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, const Callback& callbacks) + void PhysWorld2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, Callback callbacks) { - InitCallbacks(cpSpaceAddCollisionHandler(m_handle, collisionIdA, collisionIdB), callbacks); + InitCallbacks(cpSpaceAddCollisionHandler(m_handle, collisionIdA, collisionIdB), std::move(callbacks)); } void PhysWorld2D::SetDamping(float dampingValue) @@ -341,15 +341,20 @@ namespace Nz cpSpaceUseSpatialHash(m_handle, cpFloat(cellSize), int(entityCount)); } - void PhysWorld2D::InitCallbacks(cpCollisionHandler* handler, const Callback& callbacks) + void PhysWorld2D::InitCallbacks(cpCollisionHandler* handler, Callback callbacks) { - auto it = m_callbacks.emplace(handler, std::make_unique(callbacks)).first; + auto it = m_callbacks.find(handler); + if (it == m_callbacks.end()) + it = m_callbacks.emplace(handler, std::make_unique(std::move(callbacks))).first; + else + it->second = std::make_unique(std::move(callbacks)); - handler->userData = it->second.get(); + Callback* callbackFunctions = it->second.get(); + handler->userData = callbackFunctions; - if (callbacks.startCallback) + if (callbackFunctions->startCallback) { - handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void *data) -> cpBool + handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void*) -> cpBool { cpBody* firstBody; cpBody* secondBody; @@ -372,10 +377,19 @@ namespace Nz return cpFalse; }; } - - if (callbacks.endCallback) + else { - handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void *data) + handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void*) -> cpBool + { + cpBool retA = cpArbiterCallWildcardBeginA(arb, space); + cpBool retB = cpArbiterCallWildcardBeginB(arb, space); + return retA && retB; + }; + } + + if (callbackFunctions->endCallback) + { + handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void*) { cpBody* firstBody; cpBody* secondBody; @@ -394,10 +408,18 @@ namespace Nz cpArbiterCallWildcardSeparateB(arb, space); }; } - - if (callbacks.preSolveCallback) + else { - handler->preSolveFunc = [](cpArbiter* arb, cpSpace* space, void *data) -> cpBool + handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void*) + { + cpArbiterCallWildcardSeparateA(arb, space); + cpArbiterCallWildcardSeparateB(arb, space); + }; + } + + if (callbackFunctions->preSolveCallback) + { + handler->preSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) -> cpBool { cpBody* firstBody; cpBody* secondBody; @@ -420,8 +442,17 @@ namespace Nz return cpFalse; }; } + else + { + handler->preSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) -> cpBool + { + cpBool retA = cpArbiterCallWildcardPreSolveA(arb, space); + cpBool retB = cpArbiterCallWildcardPreSolveB(arb, space); + return retA && retB; + }; + } - if (callbacks.postSolveCallback) + if (callbackFunctions->postSolveCallback) { handler->postSolveFunc = [](cpArbiter* arb, cpSpace* space, void *data) { @@ -442,6 +473,14 @@ namespace Nz cpArbiterCallWildcardPostSolveB(arb, space); }; } + else + { + handler->postSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) + { + cpArbiterCallWildcardPostSolveA(arb, space); + cpArbiterCallWildcardPostSolveB(arb, space); + }; + } } void PhysWorld2D::OnRigidBodyMoved(RigidBody2D* oldPointer, RigidBody2D* newPointer) From 8a8c233840d5d94754137e820d4b129185c377c6 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 15 Apr 2019 16:26:30 +0200 Subject: [PATCH 042/192] Oops --- src/Nazara/Physics2D/PhysWorld2D.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp index 319a10582..57ea8113e 100644 --- a/src/Nazara/Physics2D/PhysWorld2D.cpp +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -354,7 +354,7 @@ namespace Nz if (callbackFunctions->startCallback) { - handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void*) -> cpBool + handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void* data) -> cpBool { cpBody* firstBody; cpBody* secondBody; @@ -389,7 +389,7 @@ namespace Nz if (callbackFunctions->endCallback) { - handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void*) + handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void* data) { cpBody* firstBody; cpBody* secondBody; From 79b0bd644ce5ee41654b32f6d35c5bd5734d29f6 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 16 Apr 2019 01:46:26 +0200 Subject: [PATCH 043/192] Add text outlines! --- ChangeLog.md | 4 + SDK/src/NDK/Lua/LuaBinding_Utility.cpp | 7 +- examples/Tut01/main.cpp | 6 +- include/Nazara/Graphics/TextSprite.hpp | 27 +++- include/Nazara/Utility/AbstractTextDrawer.hpp | 1 + include/Nazara/Utility/Font.hpp | 15 +- include/Nazara/Utility/FontData.hpp | 3 +- include/Nazara/Utility/SimpleTextDrawer.hpp | 8 + src/Nazara/Graphics/TextSprite.cpp | 75 +++++---- src/Nazara/Utility/Font.cpp | 104 ++++++------- src/Nazara/Utility/Formats/FreeTypeLoader.cpp | 103 +++++++++---- src/Nazara/Utility/SimpleTextDrawer.cpp | 145 +++++++++++++----- 12 files changed, 332 insertions(+), 166 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 37cb5f5c0..6f9dfa1e3 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -184,6 +184,10 @@ Nazara Engine: - ⚠ Font, FontData and SimpleTextDrawer now use a proper TextStyleFlags instead of a UInt32 - Almost all Math algorithms are now constexpr - PhysWorld2D: Fixed callbacks not properly replacing each others when registering twice with the same collisionId (pair) +- ⚠ **Font, FontData and SimpleTextDrawer now supports text outlining.** +- Fixed TextSprite not handling multiple textures well +- ⚠ TextSprite will now use multiple render layers by itself (the current one and the one right before, ex: [-1, 0] if base layer is 0) if you use text outlines. +- ⚠ SimpleTextDrawer no longer supports faux bold rendering Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/src/NDK/Lua/LuaBinding_Utility.cpp b/SDK/src/NDK/Lua/LuaBinding_Utility.cpp index a98bd4ed7..262620b12 100644 --- a/SDK/src/NDK/Lua/LuaBinding_Utility.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_Utility.cpp @@ -123,12 +123,13 @@ namespace Ndk lua.Push(instance->GetCachedGlyphCount()); return 1; - case 2: + case 3: { unsigned int characterSize = lua.Check(&argIndex); Nz::TextStyleFlags style = lua.Check(&argIndex); + float outlineThickness = lua.Check(&argIndex); - lua.Push(instance->GetCachedGlyphCount(characterSize, style)); + lua.Push(instance->GetCachedGlyphCount(characterSize, style, outlineThickness)); return 1; } } @@ -146,7 +147,7 @@ namespace Ndk font.BindMethod("IsValid", &Nz::Font::IsValid); - font.BindMethod("Precache", (bool(Nz::Font::*)(unsigned int, Nz::TextStyleFlags, const Nz::String&) const) &Nz::Font::Precache); + font.BindMethod("Precache", (bool(Nz::Font::*)(unsigned int, Nz::TextStyleFlags, float, const Nz::String&) const) &Nz::Font::Precache); font.BindMethod("SetGlyphBorder", &Nz::Font::SetGlyphBorder); font.BindMethod("SetMinimumStepSize", &Nz::Font::SetMinimumStepSize); diff --git a/examples/Tut01/main.cpp b/examples/Tut01/main.cpp index 9d53b7b5e..4570cec08 100644 --- a/examples/Tut01/main.cpp +++ b/examples/Tut01/main.cpp @@ -29,9 +29,13 @@ int main(int argc, char* argv[]) viewer.SetTarget(&mainWindow); viewer.SetProjectionType(Nz::ProjectionType_Orthogonal); + Nz::SimpleTextDrawer textDrawer; + textDrawer.SetCharacterSize(72); + textDrawer.SetOutlineThickness(4.f); + textDrawer.SetText("Hello world !"); Nz::TextSpriteRef textSprite = Nz::TextSprite::New(); - textSprite->Update(Nz::SimpleTextDrawer::Draw("Hello world !", 72)); + textSprite->Update(textDrawer); Ndk::EntityHandle text = world.CreateEntity(); Ndk::NodeComponent& nodeComponent = text->AddComponent(); diff --git a/include/Nazara/Graphics/TextSprite.hpp b/include/Nazara/Graphics/TextSprite.hpp index d86d999ad..3811fea95 100644 --- a/include/Nazara/Graphics/TextSprite.hpp +++ b/include/Nazara/Graphics/TextSprite.hpp @@ -59,6 +59,31 @@ namespace Nz void OnAtlasLayerChange(const AbstractAtlas* atlas, AbstractImage* oldLayer, AbstractImage* newLayer); void UpdateData(InstanceData* instanceData) const override; + struct RenderKey + { + Texture* texture; + int renderOrder; + + bool operator==(const RenderKey& rhs) const + { + return texture == rhs.texture && renderOrder == rhs.renderOrder; + } + + bool operator!=(const RenderKey& rhs) const + { + return !operator==(rhs); + } + }; + + struct HashRenderKey + { + std::size_t operator()(const RenderKey& key) const + { + // Since renderOrder will be very small, this will be enough + return std::hash()(key.texture) + key.renderOrder; + } + }; + struct RenderIndices { unsigned int first; @@ -74,7 +99,7 @@ namespace Nz }; std::unordered_map m_atlases; - mutable std::unordered_map m_renderInfos; + mutable std::unordered_map m_renderInfos; mutable std::vector m_localVertices; Color m_color; Recti m_localBounds; diff --git a/include/Nazara/Utility/AbstractTextDrawer.hpp b/include/Nazara/Utility/AbstractTextDrawer.hpp index c52051a5c..0b45d422d 100644 --- a/include/Nazara/Utility/AbstractTextDrawer.hpp +++ b/include/Nazara/Utility/AbstractTextDrawer.hpp @@ -44,6 +44,7 @@ namespace Nz Vector2f corners[4]; AbstractImage* atlas; bool flipped; + int renderOrder; }; struct Line diff --git a/include/Nazara/Utility/Font.hpp b/include/Nazara/Utility/Font.hpp index bac5db49c..70cbf6150 100644 --- a/include/Nazara/Utility/Font.hpp +++ b/include/Nazara/Utility/Font.hpp @@ -59,14 +59,14 @@ namespace Nz bool Create(FontData* data); void Destroy(); - bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, FontGlyph* glyph) const; + bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, float outlineThickness, FontGlyph* glyph) const; const std::shared_ptr& GetAtlas() const; - std::size_t GetCachedGlyphCount(unsigned int characterSize, TextStyleFlags style) const; + std::size_t GetCachedGlyphCount(unsigned int characterSize, TextStyleFlags style, float outlineThickness) const; std::size_t GetCachedGlyphCount() const; String GetFamilyName() const; int GetKerning(unsigned int characterSize, char32_t first, char32_t second) const; - const Glyph& GetGlyph(unsigned int characterSize, TextStyleFlags style, char32_t character) const; + const Glyph& GetGlyph(unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const; unsigned int GetGlyphBorder() const; unsigned int GetMinimumStepSize() const; const SizeInfo& GetSizeInfo(unsigned int characterSize) const; @@ -74,8 +74,8 @@ namespace Nz bool IsValid() const; - bool Precache(unsigned int characterSize, TextStyleFlags style, char32_t character) const; - bool Precache(unsigned int characterSize, TextStyleFlags style, const String& characterSet) const; + bool Precache(unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const; + bool Precache(unsigned int characterSize, TextStyleFlags style, float outlineThickness, const String& characterSet) const; void SetAtlas(const std::shared_ptr& atlas); void SetGlyphBorder(unsigned int borderSize); @@ -107,6 +107,7 @@ namespace Nz bool requireFauxItalic; bool flipped; bool valid; + float fauxOutlineThickness; int advance; unsigned int layerIndex; }; @@ -131,11 +132,11 @@ namespace Nz private: using GlyphMap = std::unordered_map; - UInt64 ComputeKey(unsigned int characterSize, TextStyleFlags style) const; + UInt64 ComputeKey(unsigned int characterSize, TextStyleFlags style, float outlineThickness) const; void OnAtlasCleared(const AbstractAtlas* atlas); void OnAtlasLayerChange(const AbstractAtlas* atlas, AbstractImage* oldLayer, AbstractImage* newLayer); void OnAtlasRelease(const AbstractAtlas* atlas); - const Glyph& PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, TextStyleFlags style, char32_t character) const; + const Glyph& PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const; static bool Initialize(); static void Uninitialize(); diff --git a/include/Nazara/Utility/FontData.hpp b/include/Nazara/Utility/FontData.hpp index a3ac4901a..88838a3b7 100644 --- a/include/Nazara/Utility/FontData.hpp +++ b/include/Nazara/Utility/FontData.hpp @@ -22,7 +22,7 @@ namespace Nz FontData() = default; virtual ~FontData(); - virtual bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, FontGlyph* dst) = 0; + virtual bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, float outlineThickness, FontGlyph* dst) = 0; virtual String GetFamilyName() const = 0; virtual String GetStyleName() const = 0; @@ -36,6 +36,7 @@ namespace Nz virtual float QueryUnderlinePosition(unsigned int characterSize) const = 0; virtual float QueryUnderlineThickness(unsigned int characterSize) const = 0; + virtual bool SupportsOutline(float outlineThickness) const = 0; virtual bool SupportsStyle(TextStyleFlags style) const = 0; }; } diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index c41a5d8be..5b4225805 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -38,12 +38,16 @@ namespace Nz std::size_t GetGlyphCount() const override; const Line& GetLine(std::size_t index) const override; std::size_t GetLineCount() const override; + const Color& GetOutlineColor() const; + float GetOutlineThickness() const; TextStyleFlags GetStyle() const; const String& GetText() const; void SetCharacterSize(unsigned int characterSize); void SetColor(const Color& color); void SetFont(Font* font); + void SetOutlineColor(const Color& color); + void SetOutlineThickness(float thickness); void SetStyle(TextStyleFlags style); void SetText(const String& str); @@ -51,7 +55,9 @@ namespace Nz SimpleTextDrawer& operator=(SimpleTextDrawer&& drawer); static SimpleTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); + static SimpleTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor); static SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); + static SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor); private: void ClearGlyphs() const; @@ -72,6 +78,7 @@ namespace Nz mutable std::vector m_glyphs; mutable std::vector m_lines; Color m_color; + Color m_outlineColor; FontRef m_font; mutable Rectf m_workingBounds; mutable Recti m_bounds; @@ -81,6 +88,7 @@ namespace Nz mutable Vector2ui m_drawPos; mutable bool m_colorUpdated; mutable bool m_glyphUpdated; + float m_outlineThickness; unsigned int m_characterSize; }; } diff --git a/src/Nazara/Graphics/TextSprite.cpp b/src/Nazara/Graphics/TextSprite.cpp index 8cc4961cf..a694bb563 100644 --- a/src/Nazara/Graphics/TextSprite.cpp +++ b/src/Nazara/Graphics/TextSprite.cpp @@ -30,13 +30,13 @@ namespace Nz { for (auto& pair : m_renderInfos) { - Texture* overlay = pair.first; + const RenderKey& key = pair.first; RenderIndices& indices = pair.second; if (indices.count > 0) { const VertexStruct_XYZ_Color_UV* vertices = reinterpret_cast(instanceData.data.data()); - renderQueue->AddSprites(instanceData.renderOrder, GetMaterial(), &vertices[indices.first * 4], indices.count, scissorRect, overlay); + renderQueue->AddSprites(instanceData.renderOrder + key.renderOrder, GetMaterial(), &vertices[indices.first * 4], indices.count, scissorRect, key.texture); } } } @@ -101,15 +101,16 @@ namespace Nz } std::size_t glyphCount = drawer.GetGlyphCount(); - m_localVertices.resize(glyphCount * 4); // Reset glyph count for every texture to zero for (auto& pair : m_renderInfos) pair.second.count = 0; // Count glyph count for each texture - Texture* lastTexture = nullptr; + RenderKey lastRenderKey { nullptr, 0 }; unsigned int* count = nullptr; + + std::size_t visibleGlyphCount = 0; for (std::size_t i = 0; i < glyphCount; ++i) { const AbstractTextDrawer::Glyph& glyph = drawer.GetGlyph(i); @@ -117,19 +118,23 @@ namespace Nz continue; Texture* texture = static_cast(glyph.atlas); - if (lastTexture != texture) + RenderKey renderKey{ texture, glyph.renderOrder }; + if (lastRenderKey != renderKey) { - auto it = m_renderInfos.find(texture); + auto it = m_renderInfos.find(renderKey); if (it == m_renderInfos.end()) - it = m_renderInfos.insert(std::make_pair(texture, RenderIndices{0U, 0U})).first; + it = m_renderInfos.insert(std::make_pair(renderKey, RenderIndices{0U, 0U})).first; count = &it->second.count; - lastTexture = texture; + lastRenderKey = renderKey; } (*count)++; + visibleGlyphCount++; } + m_localVertices.resize(visibleGlyphCount * 4); + // Attributes indices and reinitialize glyph count to zero to use it as a counter in the next loop // This is because the 1st glyph can use texture A, the 2nd glyph can use texture B and the 3th glyph C can use texture A again // so we need a counter to know where to write informations @@ -140,7 +145,7 @@ namespace Nz { RenderIndices& indices = infoIt->second; if (indices.count == 0) - m_renderInfos.erase(infoIt++); //< No glyph uses this texture, remove from indices + infoIt = m_renderInfos.erase(infoIt); //< No glyph uses this texture, remove from indices else { indices.first = index; @@ -151,7 +156,7 @@ namespace Nz } } - lastTexture = nullptr; + lastRenderKey = { nullptr, 0 }; RenderIndices* indices = nullptr; for (unsigned int i = 0; i < glyphCount; ++i) { @@ -160,10 +165,11 @@ namespace Nz continue; Texture* texture = static_cast(glyph.atlas); - if (lastTexture != texture) + RenderKey renderKey{ texture, glyph.renderOrder }; + if (lastRenderKey != renderKey) { - indices = &m_renderInfos[texture]; //< We changed texture, adjust the pointer - lastTexture = texture; + indices = &m_renderInfos[renderKey]; //< We changed texture, adjust the pointer + lastRenderKey = renderKey; } // First, compute the uv coordinates from our atlas rect @@ -185,9 +191,10 @@ namespace Nz for (unsigned int j = 0; j < 4; ++j) { // Remember that indices->count is a counter here, not a count value - m_localVertices[indices->count * 4 + j].color = glyph.color; - m_localVertices[indices->count * 4 + j].position.Set(glyph.corners[j]); - m_localVertices[indices->count * 4 + j].uv.Set(uvRect.GetCorner((glyph.flipped) ? flippedCorners[j] : normalCorners[j])); + std::size_t offset = (indices->first + indices->count) * 4 + j; + m_localVertices[offset].color = glyph.color; + m_localVertices[offset].position.Set(glyph.corners[j]); + m_localVertices[offset].uv.Set(uvRect.GetCorner((glyph.flipped) ? flippedCorners[j] : normalCorners[j])); } // Increment the counter, go to next glyph @@ -236,13 +243,12 @@ namespace Nz } /*! - * \brief Handle the invalidation of an atlas layer + * \brief Handle the size change of an atlas layer * * \param atlas Atlas being invalidated * \param oldLayer Pointer to the previous layer * \param newLayer Pointer to the new layer */ - void TextSprite::OnAtlasLayerChange(const AbstractAtlas* atlas, AbstractImage* oldLayer, AbstractImage* newLayer) { NazaraUnused(atlas); @@ -255,33 +261,38 @@ namespace Nz } #endif + if (!oldLayer) + return; + + assert(newLayer); + // The texture of an atlas have just been recreated (size change) // we have to adjust the coordinates of the texture and the rendering texture Texture* oldTexture = static_cast(oldLayer); Texture* newTexture = static_cast(newLayer); - // It is possible that we don't use the texture (the atlas warning us for each of its layers) - auto it = m_renderInfos.find(oldTexture); - if (it != m_renderInfos.end()) + Vector2ui oldSize(oldTexture->GetSize()); + Vector2ui newSize(newTexture->GetSize()); + Vector2f scale = Vector2f(oldSize) / Vector2f(newSize); // ratio of the old one to the new one + + // It is possible we actually use that texture multiple times, check them all + for (auto it = m_renderInfos.begin(); it != m_renderInfos.end(); ++it) { - // We indeed use this texture, we have to update its coordinates - RenderIndices indices = std::move(it->second); + const RenderKey& renderKey = it->first; + const RenderIndices& indices = it->second; - Vector2ui oldSize(oldTexture->GetSize()); - Vector2ui newSize(newTexture->GetSize()); - Vector2f scale = Vector2f(oldSize) / Vector2f(newSize); // ratio of the old one to the new one - - // Now we will iterate through each coordinates of the concerned texture to multiply them by the ratio - SparsePtr texCoordPtr(&m_localVertices[indices.first].uv, sizeof(VertexStruct_XYZ_Color_UV)); + // Adjust texture coordinates by size ratio + SparsePtr texCoordPtr(&m_localVertices[indices.first].uv, sizeof(VertexStruct_XY_Color_UV)); for (unsigned int i = 0; i < indices.count; ++i) { for (unsigned int j = 0; j < 4; ++j) - m_localVertices[i*4 + j].uv *= scale; + m_localVertices[i * 4 + j].uv *= scale; } - // We get rid off the old texture and we set the new one at the place (same for indices) + // Erase and re-insert with the new texture handle m_renderInfos.erase(it); - m_renderInfos.insert(std::make_pair(newTexture, std::move(indices))); + m_renderInfos.insert(std::make_pair(RenderKey{ newTexture, renderKey.renderOrder }, indices)); + it = m_renderInfos.begin(); //< std::unordered_map::insert may invalidate all iterators, start from the beginning... } } diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index 0628a4337..c0868c346 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -109,7 +109,7 @@ namespace Nz } } - bool Font::ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, FontGlyph* glyph) const + bool Font::ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, float outlineThickness, FontGlyph* glyph) const { #if NAZARA_UTILITY_SAFE if (!IsValid()) @@ -119,7 +119,7 @@ namespace Nz } #endif - return m_data->ExtractGlyph(characterSize, character, style, glyph); + return m_data->ExtractGlyph(characterSize, character, style, outlineThickness, glyph); } const std::shared_ptr& Font::GetAtlas() const @@ -127,9 +127,9 @@ namespace Nz return m_atlas; } - std::size_t Font::GetCachedGlyphCount(unsigned int characterSize, TextStyleFlags style) const + std::size_t Font::GetCachedGlyphCount(unsigned int characterSize, TextStyleFlags style, float outlineThickness) const { - UInt64 key = ComputeKey(characterSize, style); + UInt64 key = ComputeKey(characterSize, style, outlineThickness); auto it = m_glyphes.find(key); if (it == m_glyphes.end()) return 0; @@ -169,28 +169,27 @@ namespace Nz } #endif - // On utilise un cache car la méthode interne QueryKerning peut se révéler coûteuse (car pouvant induire un changement de taille) + // Use a cache as QueryKerning may be costly (may induce an internal size change) auto& map = m_kerningCache[characterSize]; - UInt64 key = (static_cast(first) << 32) | second; // Combinaison de deux caractères 32 bits dans un nombre 64 bits + UInt64 key = (static_cast(first) << 32) | second; auto it = map.find(key); if (it == map.end()) { - // Absent du cache: on va demander l'information à la police int kerning = m_data->QueryKerning(characterSize, first, second); map.insert(std::make_pair(key, kerning)); return kerning; } else - return it->second; // Présent dans le cache, tout va bien + return it->second; } - const Font::Glyph& Font::GetGlyph(unsigned int characterSize, TextStyleFlags style, char32_t character) const + const Font::Glyph& Font::GetGlyph(unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const { - UInt64 key = ComputeKey(characterSize, style); - return PrecacheGlyph(m_glyphes[key], characterSize, style, character); + UInt64 key = ComputeKey(characterSize, style, outlineThickness); + return PrecacheGlyph(m_glyphes[key], characterSize, style, outlineThickness, character); } unsigned int Font::GetGlyphBorder() const @@ -224,11 +223,11 @@ namespace Nz sizeInfo.underlineThickness = m_data->QueryUnderlineThickness(characterSize); FontGlyph glyph; - if (m_data->ExtractGlyph(characterSize, ' ', TextStyle_Regular, &glyph)) + if (m_data->ExtractGlyph(characterSize, ' ', TextStyle_Regular, 0.f, &glyph)) sizeInfo.spaceAdvance = glyph.advance; else { - NazaraWarning("Failed to extract space character from font, using half the size"); + NazaraWarning("Failed to extract space character from font, using half the character size"); sizeInfo.spaceAdvance = characterSize/2; } @@ -256,13 +255,13 @@ namespace Nz return m_data != nullptr; } - bool Font::Precache(unsigned int characterSize, TextStyleFlags style, char32_t character) const + bool Font::Precache(unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const { - UInt64 key = ComputeKey(characterSize, style); - return PrecacheGlyph(m_glyphes[key], characterSize, style, character).valid; + UInt64 key = ComputeKey(characterSize, style, outlineThickness); + return PrecacheGlyph(m_glyphes[key], characterSize, style, outlineThickness, character).valid; } - bool Font::Precache(unsigned int characterSize, TextStyleFlags style, const String& characterSet) const + bool Font::Precache(unsigned int characterSize, TextStyleFlags style, float outlineThickness, const String& characterSet) const { ///TODO: Itération UTF-8 => UTF-32 sans allocation de buffer (Exposer utf8cpp ?) std::u32string set = characterSet.GetUtf32String(); @@ -272,10 +271,10 @@ namespace Nz return false; } - UInt64 key = ComputeKey(characterSize, style); + UInt64 key = ComputeKey(characterSize, style, outlineThickness); auto& glyphMap = m_glyphes[key]; for (char32_t character : set) - PrecacheGlyph(glyphMap, characterSize, style, character); + PrecacheGlyph(glyphMap, characterSize, style, outlineThickness, character); return true; } @@ -317,13 +316,7 @@ namespace Nz { if (m_minimumStepSize != minimumStepSize) { - #if NAZARA_UTILITY_SAFE - if (minimumStepSize == 0) - { - NazaraError("Minimum step size cannot be zero as it implies division by zero"); - return; - } - #endif + NazaraAssert(minimumStepSize != 0, "Minimum step size cannot be zero"); m_minimumStepSize = minimumStepSize; ClearGlyphCache(); @@ -399,21 +392,21 @@ namespace Nz s_defaultMinimumStepSize = minimumStepSize; } - UInt64 Font::ComputeKey(unsigned int characterSize, TextStyleFlags style) const + UInt64 Font::ComputeKey(unsigned int characterSize, TextStyleFlags style, float outlineThickness) const { - // On prend le pas en compte - UInt64 sizePart = static_cast((characterSize/m_minimumStepSize)*m_minimumStepSize); - - // Ainsi que le style (uniquement le gras et l'italique, les autres sont gérés par un TextDrawer) - TextStyleFlags stylePart = 0; + // Adjust size to step size + UInt64 sizeStylePart = static_cast((characterSize/m_minimumStepSize)*m_minimumStepSize); + sizeStylePart = std::min(sizeStylePart, Nz::IntegralPow(2, 30)); //< 2^30 should be more than enough as a max size + sizeStylePart <<= 2; + // Store bold and italic flags (other style are handled directly by a TextDrawer) if (style & TextStyle_Bold) - stylePart |= TextStyle_Bold; + sizeStylePart |= 1 << 0; if (style & TextStyle_Italic) - stylePart |= TextStyle_Italic; + sizeStylePart |= 1 << 1; - return (static_cast(stylePart) << 32) | sizePart; + return (sizeStylePart << 32) | reinterpret_cast(outlineThickness); } void Font::OnAtlasCleared(const AbstractAtlas* atlas) @@ -471,13 +464,13 @@ namespace Nz NazaraError("Atlas has been released while in use"); } - const Font::Glyph& Font::PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, TextStyleFlags style, char32_t character) const + const Font::Glyph& Font::PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, TextStyleFlags style, float outlineThickness, char32_t character) const { auto it = glyphMap.find(character); - if (it != glyphMap.end()) // Si le glyphe n'est pas déjà chargé + if (it != glyphMap.end()) return it->second; - Glyph& glyph = glyphMap[character]; // Insertion du glyphe + Glyph& glyph = glyphMap[character]; //< Insert a new glyph glyph.valid = false; #if NAZARA_UTILITY_SAFE @@ -488,7 +481,8 @@ namespace Nz } #endif - // On vérifie que le style demandé est supporté par la police (dans le cas contraire il devra être simulé au rendu) + // Check if requested style is supported by our font (otherwise it will need to be simulated) + glyph.fauxOutlineThickness = 0.f; glyph.requireFauxBold = false; glyph.requireFauxItalic = false; @@ -505,12 +499,18 @@ namespace Nz supportedStyle &= ~TextStyle_Italic; } - // Est-ce que la police supporte le style demandé ? - if (style == supportedStyle) + float supportedOutlineThickness = outlineThickness; + if (outlineThickness > 0.f && !m_data->SupportsOutline(outlineThickness)) + { + glyph.fauxOutlineThickness = supportedOutlineThickness; + supportedOutlineThickness = 0.f; + } + + // Does font support requested style? + if (style == supportedStyle && outlineThickness == supportedOutlineThickness) { - // On extrait le glyphe depuis la police FontGlyph fontGlyph; - if (ExtractGlyph(characterSize, character, style, &fontGlyph)) + if (ExtractGlyph(characterSize, character, style, outlineThickness, &fontGlyph)) { if (fontGlyph.image.IsValid()) { @@ -523,21 +523,20 @@ namespace Nz glyph.atlasRect.height = 0; } - // Insertion du rectangle dans l'un des atlas - if (glyph.atlasRect.width > 0 && glyph.atlasRect.height > 0) // Si l'image contient quelque chose + // Insert rectangle (if not empty) into our atlas + if (glyph.atlasRect.width > 0 && glyph.atlasRect.height > 0) { - // Bordure (pour éviter le débordement lors du filtrage) + // Add a small border to prevent GPU to sample another glyph pixel glyph.atlasRect.width += m_glyphBorder*2; glyph.atlasRect.height += m_glyphBorder*2; - // Insertion du rectangle dans l'atlas virtuel if (!m_atlas->Insert(fontGlyph.image, &glyph.atlasRect, &glyph.flipped, &glyph.layerIndex)) { NazaraError("Failed to insert glyph into atlas"); return glyph; } - // Compensation de la bordure (centrage du glyphe) + // Recenter and remove glyph border glyph.atlasRect.x += m_glyphBorder; glyph.atlasRect.y += m_glyphBorder; glyph.atlasRect.width -= m_glyphBorder*2; @@ -549,16 +548,13 @@ namespace Nz glyph.valid = true; } else - { NazaraWarning("Failed to extract glyph \"" + String::Unicode(character) + "\""); - } } else { - // La police ne supporte pas le style demandé, nous allons donc précharger le glyphe supportant le style "minimum" supporté - // et copier ses données - UInt64 newKey = ComputeKey(characterSize, supportedStyle); - const Glyph& referenceGlyph = PrecacheGlyph(m_glyphes[newKey], characterSize, supportedStyle, character); + // Font doesn't support request style, precache the minimal supported version and copy its data + UInt64 newKey = ComputeKey(characterSize, supportedStyle, supportedOutlineThickness); + const Glyph& referenceGlyph = PrecacheGlyph(m_glyphes[newKey], characterSize, supportedStyle, supportedOutlineThickness, character); if (referenceGlyph.valid) { glyph.aabb = referenceGlyph.aabb; diff --git a/src/Nazara/Utility/Formats/FreeTypeLoader.cpp b/src/Nazara/Utility/Formats/FreeTypeLoader.cpp index 9f890385f..05814a903 100644 --- a/src/Nazara/Utility/Formats/FreeTypeLoader.cpp +++ b/src/Nazara/Utility/Formats/FreeTypeLoader.cpp @@ -6,7 +6,9 @@ #include #include FT_FREETYPE_H #include FT_BITMAP_H +#include FT_STROKER_H #include FT_OUTLINE_H +#include #include #include #include @@ -24,8 +26,10 @@ namespace Nz class FreeTypeLibrary; FT_Library s_library; + FT_Stroker s_stroker; std::shared_ptr s_libraryOwner; - constexpr float s_invScaleFactor = 1.f / (1 << 6); // 1/64 + constexpr float s_scaleFactor = 1 << 6; + constexpr float s_invScaleFactor = 1.f / s_scaleFactor; extern "C" unsigned long FT_StreamRead(FT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count) @@ -66,9 +70,23 @@ namespace Nz // pour ne libérer FreeType que lorsque plus personne ne l'utilise public: - FreeTypeLibrary() = default; + FreeTypeLibrary() + { + if (FT_Stroker_New(s_library, &s_stroker) != 0) + { + NazaraWarning("Failed to load FreeType stroker, outline will not be possible"); + s_stroker = nullptr; //< Just in case + } + } + ~FreeTypeLibrary() { + if (s_stroker) + { + FT_Stroker_Done(s_stroker); + s_stroker = nullptr; + } + FT_Done_FreeType(s_library); s_library = nullptr; } @@ -96,7 +114,7 @@ namespace Nz return FT_Open_Face(s_library, &m_args, -1, nullptr) == 0; } - bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, FontGlyph* dst) override + bool ExtractGlyph(unsigned int characterSize, char32_t character, TextStyleFlags style, float outlineThickness, FontGlyph* dst) override { #ifdef NAZARA_DEBUG if (!dst) @@ -114,61 +132,85 @@ namespace Nz return false; } - FT_GlyphSlot& glyph = m_face->glyph; + FT_GlyphSlot glyphSlot = m_face->glyph; + + FT_Glyph glyph; + if (FT_Get_Glyph(glyphSlot, &glyph) != 0) + { + NazaraError("Failed to extract glyph"); + return false; + } + CallOnExit destroyGlyph([&]() { FT_Done_Glyph(glyph); }); const FT_Pos boldStrength = 2 << 6; bool embolden = (style & TextStyle_Bold) != 0; + bool hasOutlineFormat = (glyph->format == FT_GLYPH_FORMAT_OUTLINE); dst->advance = (embolden) ? boldStrength >> 6 : 0; - if (embolden && glyph->format == FT_GLYPH_FORMAT_OUTLINE) + if (hasOutlineFormat) { - // http://www.freetype.org/freetype2/docs/reference/ft2-outline_processing.html#FT_Outline_Embolden - FT_Outline_Embolden(&glyph->outline, boldStrength); - embolden = false; + if (embolden) + { + // FT_Glyph can be casted to FT_OutlineGlyph if format is FT_GLYPH_FORMAT_OUTLINE + FT_OutlineGlyph outlineGlyph = reinterpret_cast(glyph); + if (FT_Outline_Embolden(&outlineGlyph->outline, boldStrength) != 0) + { + NazaraError("Failed to embolden glyph"); + return false; + } + } + + if (outlineThickness > 0.f) + { + FT_Stroker_Set(s_stroker, static_cast(s_scaleFactor * outlineThickness), FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); + if (FT_Glyph_Stroke(&glyph, s_stroker, 1) != 0) + { + NazaraError("Failed to outline glyph"); + return false; + } + } } - // http://www.freetype.org/freetype2/docs/reference/ft2-glyph_management.html#FT_Glyph_To_Bitmap - // Conversion du glyphe vers le format bitmap - // Cette fonction ne fait rien dans le cas où le glyphe est déjà un bitmap - if (FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL) != 0) + if (FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, nullptr, 1) != 0) { NazaraError("Failed to convert glyph to bitmap"); return false; } + FT_Bitmap& bitmap = reinterpret_cast(glyph)->bitmap; + // Dans le cas où nous voulons des caractères gras mais que nous n'avons pas pu agir plus tôt // nous demandons à FreeType d'agir directement sur le bitmap généré if (embolden) { // http://www.freetype.org/freetype2/docs/reference/ft2-bitmap_handling.html#FT_Bitmap_Embolden - // "If you want to embolden the bitmap owned by a FT_GlyphSlot_Rec, you should call FT_GlyphSlot_Own_Bitmap on the slot first" - FT_GlyphSlot_Own_Bitmap(glyph); - FT_Bitmap_Embolden(s_library, &glyph->bitmap, boldStrength, boldStrength); + FT_Bitmap_Embolden(s_library, &bitmap, boldStrength, boldStrength); } - dst->advance += glyph->metrics.horiAdvance >> 6; - dst->aabb.x = glyph->metrics.horiBearingX >> 6; - dst->aabb.y = -(glyph->metrics.horiBearingY >> 6); // Inversion du repère - dst->aabb.width = glyph->metrics.width >> 6; - dst->aabb.height = glyph->metrics.height >> 6; + int outlineThicknessInt = static_cast(outlineThickness * 2.f + 0.5f); //< round it + dst->advance += glyphSlot->metrics.horiAdvance >> 6; + dst->aabb.x = glyphSlot->metrics.horiBearingX >> 6; + dst->aabb.y = -(glyphSlot->metrics.horiBearingY >> 6); // Inversion du repère + dst->aabb.width = (glyphSlot->metrics.width >> 6) + outlineThicknessInt; + dst->aabb.height = (glyphSlot->metrics.height >> 6) + outlineThicknessInt; - unsigned int width = glyph->bitmap.width; - unsigned int height = glyph->bitmap.rows; + unsigned int width = bitmap.width; + unsigned int height = bitmap.rows; if (width > 0 && height > 0) { dst->image.Create(ImageType_2D, PixelFormatType_A8, width, height); UInt8* pixels = dst->image.GetPixels(); - const UInt8* data = glyph->bitmap.buffer; + const UInt8* data = bitmap.buffer; // Selon la documentation FreeType, le glyphe peut être encodé en format A8 (huit bits d'alpha par pixel) // ou au format A1 (un bit d'alpha par pixel). // Cependant dans un cas comme dans l'autre, il nous faut gérer le pitch (les données peuvent ne pas être contigues) // ainsi que le padding dans le cas du format A1 (Chaque ligne prends un nombre fixe d'octets) - if (glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO) + if (bitmap.pixel_mode == FT_PIXEL_MODE_MONO) { // Format A1 for (unsigned int y = 0; y < height; ++y) @@ -176,20 +218,20 @@ namespace Nz for (unsigned int x = 0; x < width; ++x) *pixels++ = (data[x/8] & ((1 << (7 - x%8)) ? 255 : 0)); - data += glyph->bitmap.pitch; + data += bitmap.pitch; } } else { // Format A8 - if (glyph->bitmap.pitch == static_cast(width*sizeof(UInt8))) // Pouvons-nous copier directement ? - dst->image.Update(glyph->bitmap.buffer); + if (bitmap.pitch == static_cast(width*sizeof(UInt8))) // Pouvons-nous copier directement ? + dst->image.Update(bitmap.buffer); //< Small optimization else { for (unsigned int y = 0; y < height; ++y) { std::memcpy(pixels, data, width*sizeof(UInt8)); - data += glyph->bitmap.pitch; + data += bitmap.pitch; pixels += width*sizeof(UInt8); } } @@ -312,6 +354,11 @@ namespace Nz m_args.stream = &m_stream; } + bool SupportsOutline(float /*outlineThickness*/) const override + { + return s_stroker != 0; + } + bool SupportsStyle(TextStyleFlags style) const override { ///TODO diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index ec684a8e0..17c2a9b6d 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -10,9 +10,11 @@ namespace Nz { SimpleTextDrawer::SimpleTextDrawer() : m_color(Color::White), + m_outlineColor(Color::Black), m_style(TextStyle_Regular), m_colorUpdated(true), m_glyphUpdated(true), + m_outlineThickness(0.f), m_characterSize(24) { SetFont(Font::GetDefault()); @@ -24,6 +26,8 @@ namespace Nz m_style(drawer.m_style), m_colorUpdated(false), m_glyphUpdated(false), + m_outlineColor(drawer.m_outlineColor), + m_outlineThickness(drawer.m_outlineThickness), m_characterSize(drawer.m_characterSize) { SetFont(drawer.m_font); @@ -120,6 +124,16 @@ namespace Nz return m_lines.size(); } + const Color& SimpleTextDrawer::GetOutlineColor() const + { + return m_outlineColor; + } + + float SimpleTextDrawer::GetOutlineThickness() const + { + return m_outlineThickness; + } + TextStyleFlags SimpleTextDrawer::GetStyle() const { return m_style; @@ -159,6 +173,22 @@ namespace Nz } } + void SimpleTextDrawer::SetOutlineColor(const Color& color) + { + m_outlineColor = color; + + m_glyphUpdated = false; + } + + void SimpleTextDrawer::SetOutlineThickness(float thickness) + { + NazaraAssert(thickness >= 0.f, "Thickness must be zero or positive"); + + m_outlineThickness = thickness; + + m_glyphUpdated = false; + } + void SimpleTextDrawer::SetStyle(TextStyleFlags style) { m_style = style; @@ -177,6 +207,8 @@ namespace Nz { m_characterSize = drawer.m_characterSize; m_color = drawer.m_color; + m_outlineColor = drawer.m_outlineColor; + m_outlineThickness = drawer.m_outlineThickness; m_style = drawer.m_style; m_text = drawer.m_text; @@ -198,6 +230,8 @@ namespace Nz m_glyphs = std::move(drawer.m_glyphs); m_glyphUpdated = std::move(drawer.m_glyphUpdated); m_font = std::move(drawer.m_font); + m_outlineColor = std::move(drawer.m_outlineColor); + m_outlineThickness = std::move(drawer.m_outlineThickness); m_style = std::move(drawer.m_style); m_text = std::move(drawer.m_text); @@ -218,6 +252,19 @@ namespace Nz return drawer; } + SimpleTextDrawer SimpleTextDrawer::Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor) + { + SimpleTextDrawer drawer; + drawer.SetCharacterSize(characterSize); + drawer.SetColor(color); + drawer.SetOutlineColor(outlineColor); + drawer.SetOutlineThickness(outlineThickness); + drawer.SetStyle(style); + drawer.SetText(str); + + return drawer; + } + SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color) { SimpleTextDrawer drawer; @@ -230,6 +277,20 @@ namespace Nz return drawer; } + SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor) + { + SimpleTextDrawer drawer; + drawer.SetCharacterSize(characterSize); + drawer.SetColor(color); + drawer.SetFont(font); + drawer.SetOutlineColor(outlineColor); + drawer.SetOutlineThickness(outlineThickness); + drawer.SetStyle(style); + drawer.SetText(str); + + return drawer; + } + void SimpleTextDrawer::ClearGlyphs() const { m_bounds.MakeZero(); @@ -278,7 +339,7 @@ namespace Nz const Font::SizeInfo& sizeInfo = m_font->GetSizeInfo(m_characterSize); - m_glyphs.reserve(m_glyphs.size() + characters.size()); + m_glyphs.reserve(m_glyphs.size() + characters.size() * (m_outlineThickness > 0.f) ? 2 : 1); for (char32_t character : characters) { if (m_previousCharacter != 0) @@ -304,51 +365,57 @@ namespace Nz break; } + auto GenerateGlyph = [this](Glyph& glyph, char32_t character, float outlineThickness, Nz::Color color, int renderOrder, int* advance) + { + const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, outlineThickness, character); + if (fontGlyph.valid && fontGlyph.fauxOutlineThickness <= 0.f) + { + glyph.atlas = m_font->GetAtlas()->GetLayer(fontGlyph.layerIndex); + glyph.atlasRect = fontGlyph.atlasRect; + glyph.color = color; + glyph.flipped = fontGlyph.flipped; + glyph.renderOrder = renderOrder; + + glyph.bounds.Set(fontGlyph.aabb); + glyph.bounds.x += m_drawPos.x; + glyph.bounds.y += m_drawPos.y; + + // Faux bold and faux outline thickness are not supported + + // We "lean" the glyph to simulate italics style + float italic = (fontGlyph.requireFauxItalic) ? 0.208f : 0.f; + float italicTop = italic * glyph.bounds.y; + float italicBottom = italic * glyph.bounds.GetMaximum().y; + + glyph.corners[0].Set(glyph.bounds.x - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); + glyph.corners[1].Set(glyph.bounds.x + glyph.bounds.width - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); + glyph.corners[2].Set(glyph.bounds.x - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); + glyph.corners[3].Set(glyph.bounds.x + glyph.bounds.width - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); + + if (advance) + *advance = fontGlyph.advance; + + return true; + } + else + return false; + }; + Glyph glyph; if (!whitespace) { - const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, character); - if (!fontGlyph.valid) + if (!GenerateGlyph(glyph, character, 0.f, m_color, 0, &advance)) continue; // Glyph failed to load, just skip it (can't do much) - advance = fontGlyph.advance; - - glyph.atlas = m_font->GetAtlas()->GetLayer(fontGlyph.layerIndex); - glyph.atlasRect = fontGlyph.atlasRect; - glyph.color = m_color; - glyph.flipped = fontGlyph.flipped; - - glyph.bounds.Set(fontGlyph.aabb); - glyph.bounds.x += m_drawPos.x; - glyph.bounds.y += m_drawPos.y; - - if (fontGlyph.requireFauxBold) + if (m_outlineThickness > 0.f) { - // Let's simulate bold by enlarging the glyph (not a neat idea, but should work) - Vector2f center = glyph.bounds.GetCenter(); - - // Enlarge by 10% - glyph.bounds.width *= 1.1f; - glyph.bounds.height *= 1.1f; - - // Replace it at the correct height - Vector2f offset(glyph.bounds.GetCenter() - center); - glyph.bounds.x -= offset.x; - glyph.bounds.y -= offset.y; - - // Adjust advance (+10%) - advance += advance / 10; + Glyph outlineGlyph; + if (GenerateGlyph(outlineGlyph, character, m_outlineThickness, m_outlineColor, -1, nullptr)) + { + m_lines.back().bounds.ExtendTo(outlineGlyph.bounds); + m_glyphs.push_back(outlineGlyph); + } } - - // We "lean" the glyph to simulate italics style - float italic = (fontGlyph.requireFauxItalic) ? 0.208f : 0.f; - float italicTop = italic * glyph.bounds.y; - float italicBottom = italic * glyph.bounds.GetMaximum().y; - - glyph.corners[0].Set(glyph.bounds.x - italicTop, glyph.bounds.y); - glyph.corners[1].Set(glyph.bounds.x + glyph.bounds.width - italicTop, glyph.bounds.y); - glyph.corners[2].Set(glyph.bounds.x - italicBottom, glyph.bounds.y + glyph.bounds.height); - glyph.corners[3].Set(glyph.bounds.x + glyph.bounds.width - italicBottom, glyph.bounds.y + glyph.bounds.height); } else { From 17236880d24b04b2a7e71162bf85d4c62de0388a Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 16 Apr 2019 01:46:49 +0200 Subject: [PATCH 044/192] SDK/ImageWidget: Fixed sprite not following widget position --- SDK/src/NDK/Widgets/ImageWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDK/src/NDK/Widgets/ImageWidget.cpp b/SDK/src/NDK/Widgets/ImageWidget.cpp index 8a766419b..0a1cfdc81 100644 --- a/SDK/src/NDK/Widgets/ImageWidget.cpp +++ b/SDK/src/NDK/Widgets/ImageWidget.cpp @@ -12,7 +12,7 @@ namespace Ndk BaseWidget(parent) { m_entity = CreateEntity(); - m_entity->AddComponent(); + m_entity->AddComponent().SetParent(this); auto& gfx = m_entity->AddComponent(); m_sprite = Nz::Sprite::New(); From 57264a56501baec1e122f67cb66d8c36ceca391c Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 22 Apr 2019 17:05:15 +0200 Subject: [PATCH 045/192] SimpleTextDrawer: Don't regenerate glyphs on outline color update --- src/Nazara/Utility/SimpleTextDrawer.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 17c2a9b6d..86ba50764 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -177,7 +177,7 @@ namespace Nz { m_outlineColor = color; - m_glyphUpdated = false; + m_colorUpdated = false; } void SimpleTextDrawer::SetOutlineThickness(float thickness) @@ -430,7 +430,7 @@ namespace Nz } m_lines.back().bounds.ExtendTo(glyph.bounds); - + switch (character) { case '\n': @@ -515,8 +515,22 @@ namespace Nz void SimpleTextDrawer::UpdateGlyphColor() const { - for (Glyph& glyph : m_glyphs) - glyph.color = m_color; + if (m_outlineThickness > 0.f) + { + for (std::size_t glyphIndex = 0; glyphIndex < m_glyphs.size(); ++glyphIndex) + { + Glyph& glyph = m_glyphs[glyphIndex]; + if (glyphIndex % 2 == 0) + glyph.color = m_outlineColor; + else + glyph.color = m_color; + } + } + else + { + for (Glyph& glyph : m_glyphs) + glyph.color = m_color; + } m_colorUpdated = true; } From 408d37a27a37147d2f363410aafe3de195838495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 24 Apr 2019 13:46:02 +0200 Subject: [PATCH 046/192] Network/IpAddress: Fix problem with some IPv6 --- src/Nazara/Network/Win32/IpAddressImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Network/Win32/IpAddressImpl.cpp b/src/Nazara/Network/Win32/IpAddressImpl.cpp index 853dae840..38da48b4b 100644 --- a/src/Nazara/Network/Win32/IpAddressImpl.cpp +++ b/src/Nazara/Network/Win32/IpAddressImpl.cpp @@ -157,7 +157,7 @@ namespace Nz IpAddress::IPv6 ipv6; for (unsigned int i = 0; i < 8; ++i) - ipv6[i] = rawIpV6[i * 2] << 8 | rawIpV6[i * 2 + 1]; + ipv6[i] = Nz::UInt16(rawIpV6[i * 2]) << 8 | rawIpV6[i * 2 + 1]; return IpAddress(ipv6, ntohs(addressv6->sin6_port)); } From 278ff2679550fa219143fe6c464cab6963c6d737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 24 Apr 2019 14:29:55 +0200 Subject: [PATCH 047/192] Forgot to fix this for Linux too --- src/Nazara/Network/Posix/IpAddressImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Network/Posix/IpAddressImpl.cpp b/src/Nazara/Network/Posix/IpAddressImpl.cpp index d00d58068..4abaaee94 100644 --- a/src/Nazara/Network/Posix/IpAddressImpl.cpp +++ b/src/Nazara/Network/Posix/IpAddressImpl.cpp @@ -63,7 +63,7 @@ namespace Nz IpAddress::IPv6 ipv6; for (unsigned int i = 0; i < 8; ++i) - ipv6[i] = rawIpV6[i * 2] << 8 | rawIpV6[i * 2 + 1]; + ipv6[i] = Nz::UInt16(rawIpV6[i * 2]) << 8 | rawIpV6[i * 2 + 1]; return ipv6; } From 3871a8373a8de35cc7a297ba168e4e03a99ef2c2 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 25 Apr 2019 21:06:49 +0200 Subject: [PATCH 048/192] Assimp: Add support for animated meshes (WIP) Doesn't work at all for animations --- plugins/Assimp/Plugin.cpp | 265 +++++++++++++++++++++++++++++++++++++- 1 file changed, 260 insertions(+), 5 deletions(-) diff --git a/plugins/Assimp/Plugin.cpp b/plugins/Assimp/Plugin.cpp index b91337f9a..5295d2f5a 100644 --- a/plugins/Assimp/Plugin.cpp +++ b/plugins/Assimp/Plugin.cpp @@ -25,11 +25,14 @@ SOFTWARE. #include #include #include +#include #include #include #include #include #include +#include +#include #include #include #include @@ -77,7 +80,7 @@ bool IsSupported(const String& extension) return (aiIsExtensionSupported(dotExt.GetConstBuffer()) == AI_TRUE); } -Ternary Check(Stream& /*stream*/, const MeshParams& parameters) +Ternary CheckAnimation(Stream& /*stream*/, const AnimationParams& parameters) { bool skip; if (parameters.custom.GetBooleanParameter("SkipAssimpLoader", &skip) && skip) @@ -86,7 +89,102 @@ Ternary Check(Stream& /*stream*/, const MeshParams& parameters) return Ternary_Unknown; } -MeshRef Load(Stream& stream, const MeshParams& parameters) +AnimationRef LoadAnimation(Stream& stream, const AnimationParams& parameters) +{ + Nz::String streamPath = stream.GetPath(); + + FileIOUserdata userdata; + userdata.originalFilePath = (!streamPath.IsEmpty()) ? streamPath.GetConstBuffer() : StreamPath; + userdata.originalStream = &stream; + + aiFileIO fileIO; + fileIO.CloseProc = StreamCloser; + fileIO.OpenProc = StreamOpener; + fileIO.UserData = reinterpret_cast(&userdata); + + unsigned int postProcess = aiProcess_CalcTangentSpace | aiProcess_Debone + | aiProcess_FindInvalidData | aiProcess_FixInfacingNormals + | aiProcess_FlipWindingOrder | aiProcess_GenSmoothNormals + | aiProcess_GenUVCoords | aiProcess_JoinIdenticalVertices + | aiProcess_LimitBoneWeights | aiProcess_MakeLeftHanded + | aiProcess_OptimizeGraph | aiProcess_OptimizeMeshes + | aiProcess_RemoveComponent | aiProcess_RemoveRedundantMaterials + | aiProcess_SortByPType | aiProcess_SplitLargeMeshes + | aiProcess_TransformUVCoords | aiProcess_Triangulate; + + aiPropertyStore* properties = aiCreatePropertyStore(); + aiSetImportPropertyInteger(properties, AI_CONFIG_PP_LBW_MAX_WEIGHTS, 4); + aiSetImportPropertyInteger(properties, AI_CONFIG_PP_RVC_FLAGS, ~aiComponent_ANIMATIONS); + + const aiScene* scene = aiImportFileExWithProperties(userdata.originalFilePath, 0, &fileIO, properties); + aiReleasePropertyStore(properties); + + if (!scene) + { + NazaraError("Assimp failed to import file: " + Nz::String(aiGetErrorString())); + return nullptr; + } + + if (!scene->HasAnimations()) + { + NazaraError("File has no animation"); + return nullptr; + } + + aiAnimation* animation = scene->mAnimations[0]; + + unsigned int maxFrameCount = 0; + for (unsigned int i = 0; i < animation->mNumChannels; ++i) + { + aiNodeAnim* nodeAnim = animation->mChannels[i]; + + maxFrameCount = std::max({ maxFrameCount, nodeAnim->mNumPositionKeys, nodeAnim->mNumRotationKeys, nodeAnim->mNumScalingKeys }); + } + + AnimationRef anim = Animation::New(); + + anim->CreateSkeletal(maxFrameCount, animation->mNumChannels); + + Sequence sequence; + sequence.firstFrame = 0; + sequence.frameCount = maxFrameCount; + sequence.frameRate = animation->mTicksPerSecond; + + anim->AddSequence(sequence); + + SequenceJoint* sequenceJoints = anim->GetSequenceJoints(); + + Quaternionf rotationQuat = Quaternionf::Identity(); + + for (unsigned int i = 0; i < animation->mNumChannels; ++i) + { + aiNodeAnim* nodeAnim = animation->mChannels[i]; + for (unsigned int j = 0; j < nodeAnim->mNumPositionKeys; ++j) + { + SequenceJoint& sequenceJoint = sequenceJoints[i*animation->mNumChannels + j]; + + aiQuaternion rotation = nodeAnim->mRotationKeys[j].mValue; + aiVector3D position = nodeAnim->mPositionKeys[j].mValue; + + sequenceJoint.position = Vector3f(position.x, position.y, position.z); + sequenceJoint.rotation = Quaternionf(rotation.w, rotation.x, rotation.y, rotation.z); + sequenceJoint.scale.Set(1.f); + } + } + + return anim; +} + +Ternary CheckMesh(Stream& /*stream*/, const MeshParams& parameters) +{ + bool skip; + if (parameters.custom.GetBooleanParameter("SkipAssimpLoader", &skip) && skip) + return Ternary_False; + + return Ternary_Unknown; +} + +MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) { Nz::String streamPath = stream.GetPath(); @@ -183,7 +281,162 @@ MeshRef Load(Stream& stream, const MeshParams& parameters) ProcessJoints(scene->mRootNode, skeleton, joints); - return nullptr; + // aiMaterial index in scene => Material index and data in Mesh + std::unordered_map> materials; + + for (unsigned int i = 0; i < scene->mNumMeshes; ++i) + { + aiMesh* iMesh = scene->mMeshes[i]; + if (iMesh->HasBones()) + { + // For now, process only skeletal meshes + } + + unsigned int indexCount = iMesh->mNumFaces * 3; + unsigned int vertexCount = iMesh->mNumVertices; + + // Index buffer + bool largeIndices = (vertexCount > std::numeric_limits::max()); + + IndexBufferRef indexBuffer = IndexBuffer::New(largeIndices, indexCount, parameters.storage, parameters.indexBufferFlags); + + IndexMapper indexMapper(indexBuffer, BufferAccess_DiscardAndWrite); + IndexIterator index = indexMapper.begin(); + + for (unsigned int j = 0; j < iMesh->mNumFaces; ++j) + { + aiFace& face = iMesh->mFaces[j]; + if (face.mNumIndices != 3) + NazaraWarning("Assimp plugin: This face is not a triangle!"); + + *index++ = face.mIndices[0]; + *index++ = face.mIndices[1]; + *index++ = face.mIndices[2]; + } + indexMapper.Unmap(); + + // Make sure the normal/tangent matrix won't rescale our vectors + Nz::Matrix4f normalTangentMatrix = parameters.matrix; + if (normalTangentMatrix.HasScale()) + normalTangentMatrix.ApplyScale(1.f / normalTangentMatrix.GetScale()); + + VertexBufferRef vertexBuffer = VertexBuffer::New(VertexDeclaration::Get(VertexLayout_XYZ_Normal_UV_Tangent_Skinning), vertexCount, parameters.storage, parameters.vertexBufferFlags | BufferUsage_Dynamic); + BufferMapper vertexMapper(vertexBuffer, BufferAccess_ReadWrite); + SkeletalMeshVertex* vertices = static_cast(vertexMapper.GetPointer()); + + for (std::size_t i = 0; i < vertexCount; ++i) + { + aiVector3D normal = iMesh->mNormals[i]; + aiVector3D position = iMesh->mVertices[i]; + aiVector3D tangent = iMesh->mTangents[i]; + aiVector3D uv = iMesh->mTextureCoords[0][i]; + + vertices[i].weightCount = 0; + vertices[i].normal = normalTangentMatrix.Transform({ normal.x, normal.y, normal.z }, 0.f); + vertices[i].position = parameters.matrix * Vector3f(position.x, position.y, position.z); + vertices[i].tangent = normalTangentMatrix.Transform({ tangent.x, tangent.y, tangent.z }, 0.f); + vertices[i].uv = parameters.texCoordOffset + Vector2f(uv.x, uv.y) * parameters.texCoordScale; + } + + for (unsigned int i = 0; i < iMesh->mNumBones; ++i) + { + aiBone* bone = iMesh->mBones[i]; + for (unsigned int j = 0; j < bone->mNumWeights; ++j) + { + aiVertexWeight& vertexWeight = bone->mWeights[j]; + SkeletalMeshVertex& vertex = vertices[vertexWeight.mVertexId]; + + std::size_t weightIndex = vertex.weightCount++; + vertex.jointIndexes[weightIndex] = i; + vertex.weights[weightIndex] = vertexWeight.mWeight; + } + } + + // Submesh + SkeletalMeshRef subMesh = SkeletalMesh::New(vertexBuffer, indexBuffer); + subMesh->SetMaterialIndex(iMesh->mMaterialIndex); + + auto matIt = materials.find(iMesh->mMaterialIndex); + if (matIt == materials.end()) + { + ParameterList matData; + aiMaterial* aiMat = scene->mMaterials[iMesh->mMaterialIndex]; + + auto ConvertColor = [&](const char* aiKey, unsigned int aiType, unsigned int aiIndex, const char* colorKey) + { + aiColor4D color; + if (aiGetMaterialColor(aiMat, aiKey, aiType, aiIndex, &color) == aiReturn_SUCCESS) + { + matData.SetParameter(colorKey, Color(static_cast(color.r * 255), static_cast(color.g * 255), static_cast(color.b * 255), static_cast(color.a * 255))); + } + }; + + auto ConvertTexture = [&](aiTextureType aiType, const char* textureKey, const char* wrapKey = nullptr) + { + aiString path; + aiTextureMapMode mapMode[3]; + if (aiGetMaterialTexture(aiMat, aiType, 0, &path, nullptr, nullptr, nullptr, nullptr, &mapMode[0], nullptr) == aiReturn_SUCCESS) + { + matData.SetParameter(textureKey, stream.GetDirectory() + String(path.data, path.length)); + + if (wrapKey) + { + SamplerWrap wrap = SamplerWrap_Default; + switch (mapMode[0]) + { + case aiTextureMapMode_Clamp: + case aiTextureMapMode_Decal: + wrap = SamplerWrap_Clamp; + break; + + case aiTextureMapMode_Mirror: + wrap = SamplerWrap_MirroredRepeat; + break; + + case aiTextureMapMode_Wrap: + wrap = SamplerWrap_Repeat; + break; + + default: + NazaraWarning("Assimp texture map mode 0x" + String::Number(mapMode[0], 16) + " not handled"); + break; + } + + matData.SetParameter(wrapKey, static_cast(wrap)); + } + } + }; + + ConvertColor(AI_MATKEY_COLOR_AMBIENT, MaterialData::AmbientColor); + ConvertColor(AI_MATKEY_COLOR_DIFFUSE, MaterialData::DiffuseColor); + ConvertColor(AI_MATKEY_COLOR_SPECULAR, MaterialData::SpecularColor); + + ConvertTexture(aiTextureType_DIFFUSE, MaterialData::DiffuseTexturePath, MaterialData::DiffuseWrap); + ConvertTexture(aiTextureType_EMISSIVE, MaterialData::EmissiveTexturePath); + ConvertTexture(aiTextureType_HEIGHT, MaterialData::HeightTexturePath); + ConvertTexture(aiTextureType_NORMALS, MaterialData::NormalTexturePath); + ConvertTexture(aiTextureType_OPACITY, MaterialData::AlphaTexturePath); + ConvertTexture(aiTextureType_SPECULAR, MaterialData::SpecularTexturePath, MaterialData::SpecularWrap); + + aiString name; + if (aiGetMaterialString(aiMat, AI_MATKEY_NAME, &name) == aiReturn_SUCCESS) + matData.SetParameter(MaterialData::Name, String(name.data, name.length)); + + int iValue; + if (aiGetMaterialInteger(aiMat, AI_MATKEY_TWOSIDED, &iValue) == aiReturn_SUCCESS) + matData.SetParameter(MaterialData::FaceCulling, !iValue); + + matIt = materials.insert(std::make_pair(iMesh->mMaterialIndex, std::make_pair(UInt32(materials.size()), std::move(matData)))).first; + } + + subMesh->SetMaterialIndex(matIt->first); + + mesh->AddSubMesh(subMesh); + } + + mesh->SetMaterialCount(std::max(UInt32(materials.size()), 1)); + for (const auto& pair : materials) + mesh->SetMaterialData(pair.second.first, pair.second.second); } else { @@ -385,12 +638,14 @@ extern "C" { NAZARA_EXPORT int PluginLoad() { - Nz::MeshLoader::RegisterLoader(IsSupported, Check, Load); + Nz::AnimationLoader::RegisterLoader(IsSupported, CheckAnimation, LoadAnimation); + Nz::MeshLoader::RegisterLoader(IsSupported, CheckMesh, LoadMesh); return 1; } NAZARA_EXPORT void PluginUnload() { - Nz::MeshLoader::UnregisterLoader(IsSupported, Check, Load); + Nz::AnimationLoader::RegisterLoader(IsSupported, CheckAnimation, LoadAnimation); + Nz::MeshLoader::UnregisterLoader(IsSupported, CheckMesh, LoadMesh); } } From aec88aafa24768a26a52b221700638e74f1628b3 Mon Sep 17 00:00:00 2001 From: Apjue Date: Fri, 26 Apr 2019 21:47:24 +0200 Subject: [PATCH 049/192] Fix Nazara version & fake tab --- include/Nazara/Prerequisites.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Nazara/Prerequisites.hpp b/include/Nazara/Prerequisites.hpp index ddb2796fc..ca3fa889d 100644 --- a/include/Nazara/Prerequisites.hpp +++ b/include/Nazara/Prerequisites.hpp @@ -77,7 +77,7 @@ // Nazara version macro #define NAZARA_VERSION_MAJOR 0 -#define NAZARA_VERSION_MINOR 3 +#define NAZARA_VERSION_MINOR 4 #define NAZARA_VERSION_PATCH 0 #include @@ -136,7 +136,7 @@ // Détection 64 bits #if !defined(NAZARA_PLATFORM_x64) && (defined(_WIN64) || defined(__amd64__) || defined(__x86_64__) || defined(__ia64__) || defined(__ia64) || \ - defined(_M_IA64) || defined(__itanium__) || defined(__MINGW64__) || defined(_M_AMD64) || defined (_M_X64)) + defined(_M_IA64) || defined(__itanium__) || defined(__MINGW64__) || defined(_M_AMD64) || defined (_M_X64)) #define NAZARA_PLATFORM_x64 #endif From 1244ef13034c18afba114c0785171bc726318a5f Mon Sep 17 00:00:00 2001 From: Apjue Date: Fri, 26 Apr 2019 21:51:43 +0200 Subject: [PATCH 050/192] Fix french comment --- include/Nazara/Prerequisites.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Nazara/Prerequisites.hpp b/include/Nazara/Prerequisites.hpp index ca3fa889d..2414aba95 100644 --- a/include/Nazara/Prerequisites.hpp +++ b/include/Nazara/Prerequisites.hpp @@ -134,7 +134,7 @@ #define NAZARA_CORE_API #endif -// Détection 64 bits +// Detect 64 bits #if !defined(NAZARA_PLATFORM_x64) && (defined(_WIN64) || defined(__amd64__) || defined(__x86_64__) || defined(__ia64__) || defined(__ia64) || \ defined(_M_IA64) || defined(__itanium__) || defined(__MINGW64__) || defined(_M_AMD64) || defined (_M_X64)) #define NAZARA_PLATFORM_x64 From 1a8a5e612ea096a9976fc51434e8469c8a47943a Mon Sep 17 00:00:00 2001 From: Apjue Date: Sun, 12 May 2019 16:07:21 +0200 Subject: [PATCH 051/192] Set start project --- build/scripts/common.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/build/scripts/common.lua b/build/scripts/common.lua index f5f50a9f8..4270fb6dd 100644 --- a/build/scripts/common.lua +++ b/build/scripts/common.lua @@ -58,6 +58,7 @@ function NazaraBuild:Execute() workspace("NazaraEngine") platforms(platformData) + startproject "DemoFirstScene" location(_ACTION) do From 73c0dbbd30ffdc3403b94164be7d008b33e3b2ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 13 May 2019 14:05:48 +0200 Subject: [PATCH 052/192] Add vector test --- tests/SDK/NDK/EntityOwner.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/SDK/NDK/EntityOwner.cpp b/tests/SDK/NDK/EntityOwner.cpp index 2d240a6d0..b7ce87e15 100644 --- a/tests/SDK/NDK/EntityOwner.cpp +++ b/tests/SDK/NDK/EntityOwner.cpp @@ -105,4 +105,25 @@ SCENARIO("EntityOwner", "[NDK][ENTITYOWNER]") } } } + + GIVEN("A vector of EntityOwner") + { + Ndk::World world(false); + + std::vector entityOwners; + for (std::size_t i = 1; i <= 10; ++i) + { + for (const Ndk::EntityHandle& entity : world.CreateEntities(10 * i)) + entityOwners.emplace_back(entity); + + entityOwners.clear(); + world.Refresh(); + + std::size_t aliveEntities = 0; + for (const Ndk::EntityHandle& entity : world.GetEntities()) + aliveEntities++; + + CHECK(aliveEntities == 0); + } + } } From b88c9b2cecdef930be98eea368d2f29a84972067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 13 May 2019 16:50:19 +0200 Subject: [PATCH 053/192] Sdk/World: Fix entity kill and invalidation bug --- ChangeLog.md | 1 + SDK/include/NDK/World.hpp | 10 ++++++++-- SDK/include/NDK/World.inl | 10 +++++----- SDK/src/NDK/World.cpp | 18 ++++++++++-------- tests/SDK/NDK/World.cpp | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 15 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 6f9dfa1e3..c9628ed0c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -262,6 +262,7 @@ Nazara Development Kit: - Fixed GraphicsComponent not invalidating render queue on material change (causing crashes or visual errors) - Added CollisionComponent2D::SetGeomOffset and CollisionComponent2D::Recenter - Added LifetimeComponent and LifetimeSystem +- Fixed a subtle bug regarding entities invalidation and kill (ex: if an entity #2 kills entity #1 during Entity::Destroy callbacks, entity #1 will survive destruction). # 0.4: diff --git a/SDK/include/NDK/World.hpp b/SDK/include/NDK/World.hpp index 98e6d87ac..891c3df11 100644 --- a/SDK/include/NDK/World.hpp +++ b/SDK/include/NDK/World.hpp @@ -98,6 +98,12 @@ namespace Ndk inline void InvalidateSystemOrder(); void ReorderSystems(); + struct DoubleBitset + { + Nz::Bitset front; + Nz::Bitset back; + }; + struct EntityBlock { EntityBlock(Entity&& e) : @@ -119,9 +125,9 @@ namespace Ndk std::vector> m_waitingEntities; EntityList m_aliveEntities; ProfilerData m_profilerData; - Nz::Bitset m_dirtyEntities; + DoubleBitset m_dirtyEntities; Nz::Bitset m_freeEntityIds; - Nz::Bitset m_killedEntities; + DoubleBitset m_killedEntities; bool m_orderedSystemsUpdated; bool m_isProfilerEnabled; }; diff --git a/SDK/include/NDK/World.inl b/SDK/include/NDK/World.inl index 860454a0d..1c3e446e1 100644 --- a/SDK/include/NDK/World.inl +++ b/SDK/include/NDK/World.inl @@ -308,7 +308,7 @@ namespace Ndk inline void World::KillEntity(Entity* entity) { if (IsEntityValid(entity)) - m_killedEntities.UnboundedSet(entity->GetId(), true); + m_killedEntities.front.UnboundedSet(entity->GetId(), true); } /*! @@ -343,7 +343,7 @@ namespace Ndk */ inline bool World::IsEntityDying(EntityId id) const { - return m_killedEntities.UnboundedTest(id); + return m_killedEntities.front.UnboundedTest(id); } /*! @@ -467,13 +467,13 @@ namespace Ndk inline void World::Invalidate() { - m_dirtyEntities.Resize(m_entityBlocks.size(), false); - m_dirtyEntities.Set(true); // Activation of all bits + m_dirtyEntities.front.Resize(m_entityBlocks.size(), false); + m_dirtyEntities.front.Set(true); // Activation of all bits } inline void World::Invalidate(EntityId id) { - m_dirtyEntities.UnboundedSet(id, true); + m_dirtyEntities.front.UnboundedSet(id, true); } inline void World::InvalidateSystemOrder() diff --git a/SDK/src/NDK/World.cpp b/SDK/src/NDK/World.cpp index 579985297..d8a1ec0e3 100644 --- a/SDK/src/NDK/World.cpp +++ b/SDK/src/NDK/World.cpp @@ -135,9 +135,9 @@ namespace Ndk m_waitingEntities.clear(); m_aliveEntities.Clear(); - m_dirtyEntities.Clear(); + m_dirtyEntities.front.Clear(); m_freeEntityIds.Clear(); - m_killedEntities.Clear(); + m_killedEntities.front.Clear(); } /*! @@ -210,7 +210,8 @@ namespace Ndk } // Handle killed entities before last call - for (std::size_t i = m_killedEntities.FindFirst(); i != m_killedEntities.npos; i = m_killedEntities.FindNext(i)) + std::swap(m_killedEntities.front, m_killedEntities.back); + for (std::size_t i = m_killedEntities.back.FindFirst(); i != m_killedEntities.back.npos; i = m_killedEntities.back.FindNext(i)) { NazaraAssert(i < m_entityBlocks.size(), "Entity index out of range"); @@ -220,12 +221,13 @@ namespace Ndk entity->Destroy(); // Send back the identifier of the entity to the free queue - m_freeEntityIds.UnboundedSet(entity->GetId()); + m_freeEntityIds.UnboundedSet(i); } - m_killedEntities.Reset(); + m_killedEntities.back.Clear(); // Handle of entities which need an update from the systems - for (std::size_t i = m_dirtyEntities.FindFirst(); i != m_dirtyEntities.npos; i = m_dirtyEntities.FindNext(i)) + std::swap(m_dirtyEntities.front, m_dirtyEntities.back); + for (std::size_t i = m_dirtyEntities.back.FindFirst(); i != m_dirtyEntities.back.npos; i = m_dirtyEntities.back.FindNext(i)) { NazaraAssert(i < m_entityBlocks.size(), "Entity index out of range"); @@ -236,7 +238,7 @@ namespace Ndk continue; Nz::Bitset<>& removedComponents = entity->GetRemovedComponentBits(); - for (std::size_t j = removedComponents.FindFirst(); j != m_dirtyEntities.npos; j = removedComponents.FindNext(j)) + for (std::size_t j = removedComponents.FindFirst(); j != m_dirtyEntities.back.npos; j = removedComponents.FindNext(j)) entity->DestroyComponent(static_cast(j)); removedComponents.Reset(); @@ -262,7 +264,7 @@ namespace Ndk } } } - m_dirtyEntities.Reset(); + m_dirtyEntities.back.Clear(); } /*! diff --git a/tests/SDK/NDK/World.cpp b/tests/SDK/NDK/World.cpp index 185717609..f98a7e2e1 100644 --- a/tests/SDK/NDK/World.cpp +++ b/tests/SDK/NDK/World.cpp @@ -126,4 +126,37 @@ SCENARIO("World", "[NDK][WORLD]") } } } + + GIVEN("An empty world") + { + Ndk::World world(false); + + WHEN("We create two entities") + { + Ndk::EntityHandle a = world.CreateEntity(); + REQUIRE(a->GetId() == 0); + Ndk::EntityHandle b = world.CreateEntity(); + REQUIRE(b->GetId() == 1); + + b->OnEntityDestruction.Connect([a](Ndk::Entity*) + { + REQUIRE(a.IsValid()); + a->Kill(); + }); + + THEN("We kill the second entity which will kill the first one") + { + b->Kill(); + world.Refresh(); + + AND_THEN("Both entities should be dead next refresh") + { + world.Refresh(); + + REQUIRE_FALSE(a.IsValid()); + REQUIRE_FALSE(b.IsValid()); + } + } + } + } } From dcfd2ad8f9015cc28ef923f8ecb848ea1d1c3800 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 27 May 2019 22:42:37 +0200 Subject: [PATCH 054/192] Physics2D/PhysWorld2D: Add RaycastQuery and RegionQuery overloads taking a callback --- ChangeLog.md | 2 ++ SDK/include/NDK/Systems/PhysicsSystem2D.hpp | 2 ++ SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 21 +++++++++++++ include/Nazara/Physics2D/PhysWorld2D.hpp | 2 ++ src/Nazara/Physics2D/PhysWorld2D.cpp | 35 +++++++++++++++++++++ 5 files changed, 62 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index c9628ed0c..100ee3c89 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -188,6 +188,7 @@ Nazara Engine: - Fixed TextSprite not handling multiple textures well - ⚠ TextSprite will now use multiple render layers by itself (the current one and the one right before, ex: [-1, 0] if base layer is 0) if you use text outlines. - ⚠ SimpleTextDrawer no longer supports faux bold rendering +- Added PhysWorld2D::[RaycastQuery, RegionQuery] overloads taking a callback Nazara Development Kit: - Added ImageWidget (#139) @@ -263,6 +264,7 @@ Nazara Development Kit: - Added CollisionComponent2D::SetGeomOffset and CollisionComponent2D::Recenter - Added LifetimeComponent and LifetimeSystem - Fixed a subtle bug regarding entities invalidation and kill (ex: if an entity #2 kills entity #1 during Entity::Destroy callbacks, entity #1 will survive destruction). +- Added PhysicsSystem2D::[RaycastQuery, RegionQuery] overloads taking a callback # 0.4: diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp index a919abbd5..35579862a 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp @@ -51,9 +51,11 @@ namespace Ndk bool NearestBodyQuery(const Nz::Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, EntityHandle* nearestBody = nullptr); bool NearestBodyQuery(const Nz::Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, NearestQueryResult* result); + void RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback); bool RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* hitInfos); bool RaycastQueryFirst(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, RaycastHit* hitInfo = nullptr); + void RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback); void RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies); void RegisterCallbacks(unsigned int collisionId, Callback callbacks); diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index 8cce2e9aa..891b5b8a3 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -99,6 +99,19 @@ namespace Ndk return false; } + void PhysicsSystem2D::RaycastQuery(const Nz::Vector2f & from, const Nz::Vector2f & to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback) + { + return GetPhysWorld().RaycastQuery(from, to, radius, collisionGroup, categoryMask, collisionMask, [this, &callback](const Nz::PhysWorld2D::RaycastHit& hitInfo) + { + callback({ + GetEntityFromBody(*hitInfo.nearestBody), + hitInfo.hitPos, + hitInfo.hitNormal, + hitInfo.fraction + }); + }); + } + bool PhysicsSystem2D::RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* hitInfos) { std::vector queryResult; @@ -133,6 +146,14 @@ namespace Ndk return false; } + void PhysicsSystem2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback) + { + return GetPhysWorld().RegionQuery(boundingBox, collisionGroup, categoryMask, collisionMask, [this, &callback](Nz::RigidBody2D* body) + { + callback(GetEntityFromBody(*body)); + }); + } + void PhysicsSystem2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies) { std::vector queryResult; diff --git a/include/Nazara/Physics2D/PhysWorld2D.hpp b/include/Nazara/Physics2D/PhysWorld2D.hpp index 86de8f003..8d3afe07c 100644 --- a/include/Nazara/Physics2D/PhysWorld2D.hpp +++ b/include/Nazara/Physics2D/PhysWorld2D.hpp @@ -64,9 +64,11 @@ namespace Nz bool NearestBodyQuery(const Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, RigidBody2D** nearestBody = nullptr); bool NearestBodyQuery(const Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, NearestQueryResult* result); + void RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback); bool RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* hitInfos); bool RaycastQueryFirst(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, RaycastHit* hitInfo = nullptr); + void RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback); void RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies); void RegisterCallbacks(unsigned int collisionId, Callback callbacks); diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp index 57ea8113e..1390bc84f 100644 --- a/src/Nazara/Physics2D/PhysWorld2D.cpp +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -205,6 +205,27 @@ namespace Nz } } + void PhysWorld2D::RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback) + { + using CallbackType = const std::function; + + auto cpCallback = [](cpShape* shape, cpVect point, cpVect normal, cpFloat alpha, void* data) + { + CallbackType& callback = *static_cast(data); + + RaycastHit hitInfo; + hitInfo.fraction = float(alpha); + hitInfo.hitNormal.Set(Nz::Vector2(normal.x, normal.y)); + hitInfo.hitPos.Set(Nz::Vector2(point.x, point.y)); + hitInfo.nearestBody = static_cast(cpShapeGetUserData(shape)); + + callback(hitInfo); + }; + + cpShapeFilter filter = cpShapeFilterNew(collisionGroup, categoryMask, collisionMask); + cpSpaceSegmentQuery(m_handle, { from.x, from.y }, { to.x, to.y }, radius, filter, cpCallback, const_cast(static_cast(&callback))); + } + bool PhysWorld2D::RaycastQuery(const Nz::Vector2f& from, const Nz::Vector2f& to, float radius, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* hitInfos) { using ResultType = decltype(hitInfos); @@ -259,6 +280,20 @@ namespace Nz } } + void PhysWorld2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, const std::function& callback) + { + using CallbackType = const std::function; + + auto cpCallback = [](cpShape* shape, void* data) + { + CallbackType& callback = *static_cast(data); + callback(static_cast(cpShapeGetUserData(shape))); + }; + + cpShapeFilter filter = cpShapeFilterNew(collisionGroup, categoryMask, collisionMask); + cpSpaceBBQuery(m_handle, cpBBNew(boundingBox.x, boundingBox.y, boundingBox.x + boundingBox.width, boundingBox.y + boundingBox.height), filter, cpCallback, const_cast(static_cast(&callback))); + } + void PhysWorld2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies) { using ResultType = decltype(bodies); From 29718db08575e4c7d35d77d51097398fe860a616 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 13 Jun 2019 19:05:25 +0200 Subject: [PATCH 055/192] SDK/TextAreaWidget: Add TextOutline property --- ChangeLog.md | 19 ++++++++-------- SDK/include/NDK/Widgets/TextAreaWidget.hpp | 4 ++++ SDK/include/NDK/Widgets/TextAreaWidget.inl | 26 +++++++++++++++++++++- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 100ee3c89..ea46c15c8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -55,7 +55,7 @@ Nazara Engine: - Fix RigidBody3D copy constructor not copying all physics states (angular/linear damping/velocity, mass center, position and rotation) - Add RigidBody3D simulation control (via EnableSimulation and IsSimulationEnabled), which allows to disable physics and collisions at will. - Fix some uninitialized values (found by Valgrind) in Network module -- Fix possible infinite recursion when outputting a Thread::Id object +- Fix possible infinite recursion when outputting a Thread::Id object - ⚠️ Replaced implicit conversion from a Nz::String to a std::string by an explicit method ToStdString() - Fix LuaInstance movement constructor/assignment operator which was corrupting Lua memory - Fix potential bug on SocketImpl::Connect (used by TcpClient::Connect) on POSIX platforms @@ -112,7 +112,7 @@ Nazara Engine: - Fixed SocketPoller not be able to recover from some errors (like invalid sockets and such) - Add LuaImplQuery implementation for std::vector - Fixed LuaState::PushGlobal & LuaState::PushField to copy the object before moving it -- ⚠️ Replaced currentBitPos and currentByte fields by [read|write][BitPos][Byte] to handle properly bit reading/writing. +- ⚠️ Replaced currentBitPos and currentByte fields by [read|write][BitPos][Byte] to handle properly bit reading/writing. - InstancedRenderable::SetMaterial methods are now public. - Fixed Model copy constructor not copying materials - ⚠️ Added InstancedRenderable::Clone() method @@ -148,8 +148,8 @@ Nazara Engine: - ⚠️ CullingList now handles full and partial visibility testing - Added math class Angle, capable of handling both degrees and radians angles and converting them to euler angles/quaternions to improve 2D interface. - ⚠️ AbstractSocket::OnStateChange has been replaced by OnStateChanged, which is now called after state has been changed (with oldState and newState as parameters). -- ⚠️ TcpClient::WaitForconnected now returns the new socket state. -- Added TcpClient::PollForConnected +- ⚠️ TcpClient::WaitForconnected now returns the new socket state. +- Added TcpClient::PollForConnected - ⚠️ Use of the new Angle class instead of floating point angle - It is now possible to set elasticity/friction/surface bodies of 2D colliders and change it at runtime on RigidBody2D - ObjectHandle were remade and should be way more optimized now @@ -188,7 +188,7 @@ Nazara Engine: - Fixed TextSprite not handling multiple textures well - ⚠ TextSprite will now use multiple render layers by itself (the current one and the one right before, ex: [-1, 0] if base layer is 0) if you use text outlines. - ⚠ SimpleTextDrawer no longer supports faux bold rendering -- Added PhysWorld2D::[RaycastQuery, RegionQuery] overloads taking a callback +- Added PhysWorld2D::[RaycastQuery, RegionQuery] overloads taking a callback Nazara Development Kit: - Added ImageWidget (#139) @@ -265,6 +265,7 @@ Nazara Development Kit: - Added LifetimeComponent and LifetimeSystem - Fixed a subtle bug regarding entities invalidation and kill (ex: if an entity #2 kills entity #1 during Entity::Destroy callbacks, entity #1 will survive destruction). - Added PhysicsSystem2D::[RaycastQuery, RegionQuery] overloads taking a callback +- Added TextAreaWidget support for outline # 0.4: @@ -352,8 +353,8 @@ Nazara Engine: - Added [Nz::TcpClient::SendMultiple](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_tcp_client.html#a495c32beb46ed9192699a3b82d358035) method, allowing to send multiple buffers at once. - Added [Nz::PlacementDestroy](https://nazara.digitalpulsesoftware.net/doc/namespace_nz.html#a27c8667def991fc896c5beff3e62668a). (ea985fa76586762f008e4054938db3234eeaf0cb) - Added [Nz::String::Format](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_string.html#a4b699982e7f9ea38f6d44b43ac1e2040) and [Nz::String::FormatVA](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_string.html#abe0fcbce11224b157ac756b60e8dee92) static methods. (cc6e4127dc6c61799a64404770992cef0804ad34). -- Added [Nz::ParticleGroup::GetBuffer](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_particle_mapper.html#aefe1b251efc8c9b8668842275561be0c) method. (4dc85789b59e50d964c83321dbd4b6485c04bef6) -- Added Nz::ParticleMapper::GetPointer method. (1f4e6c2d1594b7bb9dd6f4ea5480fdd16cf5f208) +- Added [Nz::ParticleGroup::GetBuffer](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_particle_mapper.html#aefe1b251efc8c9b8668842275561be0c) method. (4dc85789b59e50d964c83321dbd4b6485c04bef6) +- Added Nz::ParticleMapper::GetPointer method. (1f4e6c2d1594b7bb9dd6f4ea5480fdd16cf5f208) - ⚠️ Structures provied by ParticleStruct header now have a float life. (472d964d587d906764ad1e05bfcc9ab1bf979483) - Fixed scale property of Nz::TextSprite not affecting its bounding volume. (52b29bac775823294c4ad7de70f4dc3f4adfa743) - ⚠️ Nz:MeshParams::flipUVs has been replaced by texCoordOffset and texCoordScale. (a1a7d908adc060fd7a43491c903dfe3b501d98e5) @@ -380,7 +381,7 @@ Nazara Engine: - All noises classes now uses std::mt19937 as a random number generator, to ensure the same results on every machine. (1f5ea9839016964c173d919263827dee69ecb65d) Nazara Development Kit: -- **Added basic widgets**. (c8a12083b3133e946bf60dd060331a4b4631f8d8) +- **Added basic widgets**. (c8a12083b3133e946bf60dd060331a4b4631f8d8) - VelocitySystem will no longer affect entities with PhysicsComponent2D. (a6853234412c744cdcb28344f02f7b0c92704d77) - Fixed EulerAngles constructor in Lua. (d55149a0a70f6230b6f1c3fb50e37dc82a2feb9f) - Fixed Component::OnDetached not being called on entity destruction. (5b777eb4853639d7aeb232ca46d17f0d432f47ca) @@ -391,7 +392,7 @@ Nazara Engine: Nazara Engine: - Nazara binaries are now compiled with Run-Time Type-Information. (a70acdc8f44010627a65282fd3099202116d3e13) -- Nazara demos are now compiled with relative dependencies on Linux. +- Nazara demos are now compiled with relative dependencies on Linux. (d6fbb4c408d48c4a768fad7b43460c76a0df1777) - Added [**Nz::BitCount**](https://nazara.digitalpulsesoftware.net/doc/group__core.html#ga6bfbcff78eb6cfbe3ddaedcfc8c04196) function. (82e31a3ec8449da6618f41690164c2e1d883edb4) - Added [**Nz::Bitset::AppendBits**](https://nazara.digitalpulsesoftware.net/doc/class_nz_1_1_bitset.html#a5ca8f365006c86d6d699d02471904f7e) method. (b018a400499a2356c4455a40d9f6a6c12b3cb36b) diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index 9a5d33335..d215603eb 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -49,6 +49,8 @@ namespace Ndk inline std::size_t GetGlyphIndex(const Nz::Vector2ui& cursorPosition); inline const Nz::String& GetText() const; inline const Nz::Color& GetTextColor() const; + inline const Nz::Color& GetTextOulineColor() const; + inline float GetTextOulineThickness() const; Nz::Vector2ui GetHoveredGlyph(float x, float y) const; @@ -70,6 +72,8 @@ namespace Ndk inline void SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition); inline void SetText(const Nz::String& text); inline void SetTextColor(const Nz::Color& text); + inline void SetTextOutlineColor(const Nz::Color& color); + inline void SetTextOutlineThickness(float thickness); inline void Write(const Nz::String& text); inline void Write(const Nz::String& text, const Nz::Vector2ui& glyphPosition); diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index e4c9f2c30..0c931cebd 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -102,6 +102,16 @@ namespace Ndk return m_drawer.GetColor(); } + inline const Nz::Color& TextAreaWidget::GetTextOulineColor() const + { + return m_drawer.GetOutlineColor(); + } + + inline float TextAreaWidget::GetTextOulineThickness() const + { + return m_drawer.GetOutlineThickness(); + } + inline bool TextAreaWidget::HasSelection() const { return m_cursorPositionBegin != m_cursorPositionEnd; @@ -241,7 +251,21 @@ namespace Ndk { m_drawer.SetColor(text); - m_textSprite->Update(m_drawer); + UpdateDisplayText(); + } + + inline void TextAreaWidget::SetTextOutlineColor(const Nz::Color& color) + { + m_drawer.SetOutlineColor(color); + + UpdateDisplayText(); + } + + inline void TextAreaWidget::SetTextOutlineThickness(float thickness) + { + m_drawer.SetOutlineThickness(thickness); + + UpdateDisplayText(); } inline void TextAreaWidget::Write(const Nz::String& text) From 6e7fd326db12fef4717c61f7cd7d13fe733249f5 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 13 Jun 2019 19:06:09 +0200 Subject: [PATCH 056/192] SDK/BaseWidget: Fix possible crash when disabling background --- ChangeLog.md | 1 + SDK/src/NDK/BaseWidget.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index ea46c15c8..b2f71d16d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -266,6 +266,7 @@ Nazara Development Kit: - Fixed a subtle bug regarding entities invalidation and kill (ex: if an entity #2 kills entity #1 during Entity::Destroy callbacks, entity #1 will survive destruction). - Added PhysicsSystem2D::[RaycastQuery, RegionQuery] overloads taking a callback - Added TextAreaWidget support for outline +- Fixed possible crash when disabling BaseWidget background # 0.4: diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index 89ca6bb9c..499a7aa2b 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -89,6 +89,7 @@ namespace Ndk } else { + DestroyEntity(m_backgroundEntity); m_backgroundEntity.Reset(); m_backgroundSprite.Reset(); } @@ -185,7 +186,7 @@ namespace Ndk void BaseWidget::Layout() { - if (m_backgroundEntity) + if (m_backgroundSprite) m_backgroundSprite->SetSize(m_size.x, m_size.y); UpdatePositionAndSize(); From c23248c56433e6ef9823448b74381e75a88d04ac Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 16 Jun 2019 15:40:24 +0200 Subject: [PATCH 057/192] PhysWorld2D: Fix possible stack overflow when using wildcard collision handler --- src/Nazara/Physics2D/PhysWorld2D.cpp | 30 ++++------------------------ thirdparty/src/chipmunk/chipmunk.c | 2 +- 2 files changed, 5 insertions(+), 27 deletions(-) diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp index 1390bc84f..6e0c9c22a 100644 --- a/src/Nazara/Physics2D/PhysWorld2D.cpp +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -403,11 +403,7 @@ namespace Nz const Callback* customCallbacks = static_cast(data); if (customCallbacks->startCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata)) - { - cpBool retA = cpArbiterCallWildcardBeginA(arb, space); - cpBool retB = cpArbiterCallWildcardBeginB(arb, space); - return retA && retB; - } + return cpTrue; else return cpFalse; }; @@ -416,9 +412,7 @@ namespace Nz { handler->beginFunc = [](cpArbiter* arb, cpSpace* space, void*) -> cpBool { - cpBool retA = cpArbiterCallWildcardBeginA(arb, space); - cpBool retB = cpArbiterCallWildcardBeginB(arb, space); - return retA && retB; + return cpTrue; }; } @@ -438,17 +432,12 @@ namespace Nz const Callback* customCallbacks = static_cast(data); customCallbacks->endCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata); - - cpArbiterCallWildcardSeparateA(arb, space); - cpArbiterCallWildcardSeparateB(arb, space); }; } else { handler->separateFunc = [](cpArbiter* arb, cpSpace* space, void*) { - cpArbiterCallWildcardSeparateA(arb, space); - cpArbiterCallWildcardSeparateB(arb, space); }; } @@ -468,11 +457,7 @@ namespace Nz const Callback* customCallbacks = static_cast(data); if (customCallbacks->preSolveCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata)) - { - cpBool retA = cpArbiterCallWildcardPreSolveA(arb, space); - cpBool retB = cpArbiterCallWildcardPreSolveB(arb, space); - return retA && retB; - } + return cpTrue; else return cpFalse; }; @@ -481,9 +466,7 @@ namespace Nz { handler->preSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) -> cpBool { - cpBool retA = cpArbiterCallWildcardPreSolveA(arb, space); - cpBool retB = cpArbiterCallWildcardPreSolveB(arb, space); - return retA && retB; + return cpTrue; }; } @@ -503,17 +486,12 @@ namespace Nz const Callback* customCallbacks = static_cast(data); customCallbacks->postSolveCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata); - - cpArbiterCallWildcardPostSolveA(arb, space); - cpArbiterCallWildcardPostSolveB(arb, space); }; } else { handler->postSolveFunc = [](cpArbiter* arb, cpSpace* space, void* data) { - cpArbiterCallWildcardPostSolveA(arb, space); - cpArbiterCallWildcardPostSolveB(arb, space); }; } } diff --git a/thirdparty/src/chipmunk/chipmunk.c b/thirdparty/src/chipmunk/chipmunk.c index 503265cf6..a6cc9d6d4 100644 --- a/thirdparty/src/chipmunk/chipmunk.c +++ b/thirdparty/src/chipmunk/chipmunk.c @@ -89,7 +89,7 @@ cpAreaForSegment(cpVect a, cpVect b, cpFloat r) } cpFloat -cpMomentForPoly(cpFloat m, const int count, const cpVect *verts, cpVect offset, cpFloat r) +cpMomentForPoly(cpFloat m, int count, const cpVect *verts, cpVect offset, cpFloat r) { // TODO account for radius. if(count == 2) return cpMomentForSegment(m, verts[0], verts[1], 0.0f); From 37c16dc2029467cb2e98c0a8aa1a72f597870459 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:17:22 +0200 Subject: [PATCH 058/192] Platform/Event: Add x/y mouse position to MouseWheelEvent --- ChangeLog.md | 1 + include/Nazara/Platform/Event.hpp | 2 ++ src/Nazara/Platform/Win32/WindowImpl.cpp | 10 ++++++++-- src/Nazara/Platform/X11/WindowImpl.cpp | 2 ++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index b2f71d16d..820f91e93 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -189,6 +189,7 @@ Nazara Engine: - ⚠ TextSprite will now use multiple render layers by itself (the current one and the one right before, ex: [-1, 0] if base layer is 0) if you use text outlines. - ⚠ SimpleTextDrawer no longer supports faux bold rendering - Added PhysWorld2D::[RaycastQuery, RegionQuery] overloads taking a callback +- Added x and y mouse position to MouseWheelEvent Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Platform/Event.hpp b/include/Nazara/Platform/Event.hpp index 1fe219e8e..02a842889 100644 --- a/include/Nazara/Platform/Event.hpp +++ b/include/Nazara/Platform/Event.hpp @@ -55,6 +55,8 @@ namespace Nz struct MouseWheelEvent { float delta; + int x; + int y; }; // Used by: diff --git a/src/Nazara/Platform/Win32/WindowImpl.cpp b/src/Nazara/Platform/Win32/WindowImpl.cpp index 27b4fa889..6ee3365ac 100644 --- a/src/Nazara/Platform/Win32/WindowImpl.cpp +++ b/src/Nazara/Platform/Win32/WindowImpl.cpp @@ -712,7 +712,10 @@ namespace Nz { WindowEvent event; event.type = WindowEventType_MouseWheelMoved; - event.mouseWheel.delta = static_cast(GET_WHEEL_DELTA_WPARAM(wParam))/WHEEL_DELTA; + event.mouseWheel.delta = static_cast(GET_WHEEL_DELTA_WPARAM(wParam)) / WHEEL_DELTA; + event.mouseWheel.x = GET_X_LPARAM(lParam); + event.mouseWheel.y = GET_Y_LPARAM(lParam); + m_parent->PushEvent(event); } else @@ -722,7 +725,10 @@ namespace Nz { WindowEvent event; event.type = WindowEventType_MouseWheelMoved; - event.mouseWheel.delta = static_cast(m_scrolling/WHEEL_DELTA); + event.mouseWheel.delta = static_cast(m_scrolling / WHEEL_DELTA); + event.mouseWheel.x = GET_X_LPARAM(lParam); + event.mouseWheel.y = GET_Y_LPARAM(lParam); + m_parent->PushEvent(event); m_scrolling %= WHEEL_DELTA; diff --git a/src/Nazara/Platform/X11/WindowImpl.cpp b/src/Nazara/Platform/X11/WindowImpl.cpp index 0e8215e37..abf2db675 100644 --- a/src/Nazara/Platform/X11/WindowImpl.cpp +++ b/src/Nazara/Platform/X11/WindowImpl.cpp @@ -1233,6 +1233,8 @@ namespace Nz { event.type = Nz::WindowEventType_MouseWheelMoved; event.mouseWheel.delta = (buttonReleaseEvent->detail == XCB_BUTTON_INDEX_4) ? 1 : -1; + event.mouseWheel.x = buttonReleaseEvent->event_x; + event.mouseWheel.y = buttonReleaseEvent->event_y; break; } default: From 5039bfbf1defdb1d09d53e85e0c96138da7f8196 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:19:17 +0200 Subject: [PATCH 059/192] SDK/BaseWidget: Add OnMouseWheelMoved event --- ChangeLog.md | 1 + SDK/include/NDK/BaseWidget.hpp | 1 + SDK/include/NDK/Canvas.hpp | 6 ++++-- SDK/include/NDK/Canvas.inl | 3 ++- SDK/src/NDK/BaseWidget.cpp | 4 ++++ SDK/src/NDK/Canvas.cpp | 15 ++++++++++++++- 6 files changed, 26 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 820f91e93..09aec3d4f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -268,6 +268,7 @@ Nazara Development Kit: - Added PhysicsSystem2D::[RaycastQuery, RegionQuery] overloads taking a callback - Added TextAreaWidget support for outline - Fixed possible crash when disabling BaseWidget background +- Added BaseWidget::OnMouseWheelMoved # 0.4: diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index 26c7f5539..aed8359d8 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -115,6 +115,7 @@ namespace Ndk virtual void OnMouseMoved(int x, int y, int deltaX, int deltaY); virtual void OnMouseButtonPress(int x, int y, Nz::Mouse::Button button); virtual void OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button); + virtual void OnMouseWheelMoved(int x, int y, float delta); virtual void OnMouseExit(); virtual void OnParentResized(const Nz::Vector2f& newSize); virtual void OnTextEntered(char32_t character, bool repeated); diff --git a/SDK/include/NDK/Canvas.hpp b/SDK/include/NDK/Canvas.hpp index d563c6cd3..1b0fbda4f 100644 --- a/SDK/include/NDK/Canvas.hpp +++ b/SDK/include/NDK/Canvas.hpp @@ -48,8 +48,9 @@ namespace Ndk private: void OnEventMouseButtonPressed(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseButtonEvent& event); void OnEventMouseButtonRelease(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseButtonEvent& event); - void OnEventMouseMoved(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseMoveEvent& event); void OnEventMouseLeft(const Nz::EventHandler* eventHandler); + void OnEventMouseMoved(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseMoveEvent& event); + void OnEventMouseWheelMoved(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::MouseWheelEvent& event); void OnEventKeyPressed(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::KeyEvent& event); void OnEventKeyReleased(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::KeyEvent& event); void OnEventTextEntered(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::TextEvent& event); @@ -65,8 +66,9 @@ namespace Ndk NazaraSlot(Nz::EventHandler, OnKeyReleased, m_keyReleasedSlot); NazaraSlot(Nz::EventHandler, OnMouseButtonPressed, m_mouseButtonPressedSlot); NazaraSlot(Nz::EventHandler, OnMouseButtonReleased, m_mouseButtonReleasedSlot); - NazaraSlot(Nz::EventHandler, OnMouseMoved, m_mouseMovedSlot); NazaraSlot(Nz::EventHandler, OnMouseLeft, m_mouseLeftSlot); + NazaraSlot(Nz::EventHandler, OnMouseMoved, m_mouseMovedSlot); + NazaraSlot(Nz::EventHandler, OnMouseWheelMoved, m_mouseWheelMovedSlot); NazaraSlot(Nz::EventHandler, OnTextEntered, m_textEnteredSlot); std::size_t m_keyboardOwner; diff --git a/SDK/include/NDK/Canvas.inl b/SDK/include/NDK/Canvas.inl index 7a602cffb..75b642328 100644 --- a/SDK/include/NDK/Canvas.inl +++ b/SDK/include/NDK/Canvas.inl @@ -24,8 +24,9 @@ namespace Ndk m_keyReleasedSlot.Connect(eventHandler.OnKeyReleased, this, &Canvas::OnEventKeyReleased); m_mouseButtonPressedSlot.Connect(eventHandler.OnMouseButtonPressed, this, &Canvas::OnEventMouseButtonPressed); m_mouseButtonReleasedSlot.Connect(eventHandler.OnMouseButtonReleased, this, &Canvas::OnEventMouseButtonRelease); - m_mouseMovedSlot.Connect(eventHandler.OnMouseMoved, this, &Canvas::OnEventMouseMoved); m_mouseLeftSlot.Connect(eventHandler.OnMouseLeft, this, &Canvas::OnEventMouseLeft); + m_mouseMovedSlot.Connect(eventHandler.OnMouseMoved, this, &Canvas::OnEventMouseMoved); + m_mouseWheelMovedSlot.Connect(eventHandler.OnMouseWheelMoved, this, &Canvas::OnEventMouseWheelMoved); m_textEnteredSlot.Connect(eventHandler.OnTextEntered, this, &Canvas::OnEventTextEntered); } diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index 499a7aa2b..669747531 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -237,6 +237,10 @@ namespace Ndk { } + void BaseWidget::OnMouseWheelMoved(int /*x*/, int /*y*/, float /*delta*/) + { + } + void BaseWidget::OnMouseExit() { } diff --git a/SDK/src/NDK/Canvas.cpp b/SDK/src/NDK/Canvas.cpp index 3959f1765..aced59e4e 100644 --- a/SDK/src/NDK/Canvas.cpp +++ b/SDK/src/NDK/Canvas.cpp @@ -61,7 +61,7 @@ namespace Ndk } } - void Canvas::OnEventMouseButtonRelease(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseButtonEvent & event) + void Canvas::OnEventMouseButtonRelease(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseButtonEvent& event) { if (m_hoveredWidget != InvalidCanvasIndex) { @@ -128,6 +128,19 @@ namespace Ndk } } + void Canvas::OnEventMouseWheelMoved(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseWheelEvent& event) + { + if (m_hoveredWidget != InvalidCanvasIndex) + { + WidgetEntry& hoveredWidget = m_widgetEntries[m_hoveredWidget]; + + int x = static_cast(std::round(event.x - hoveredWidget.box.x)); + int y = static_cast(std::round(event.y - hoveredWidget.box.y)); + + hoveredWidget.widget->OnMouseWheelMoved(x, y, event.delta); + } + } + void Canvas::OnEventMouseLeft(const Nz::EventHandler* /*eventHandler*/) { if (m_hoveredWidget != InvalidCanvasIndex) From 912b47cedf623184d6cc672b73aeba684d86cd0e Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:19:53 +0200 Subject: [PATCH 060/192] SDK/BaseWidget: Set preferred size no longer resize the widget --- SDK/include/NDK/BaseWidget.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDK/include/NDK/BaseWidget.inl b/SDK/include/NDK/BaseWidget.inl index e24b89285..4420a7a44 100644 --- a/SDK/include/NDK/BaseWidget.inl +++ b/SDK/include/NDK/BaseWidget.inl @@ -237,7 +237,7 @@ namespace Ndk { m_preferredSize = preferredSize; - Resize(m_preferredSize); + //Resize(m_preferredSize); } inline bool BaseWidget::IsRegisteredToCanvas() const From c4b7534ac119a588f97f1350d218205a24dba86a Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:20:13 +0200 Subject: [PATCH 061/192] SDK/TextAreaWidget: Fix clear not setting preferred size --- SDK/include/NDK/Widgets/TextAreaWidget.inl | 1 + 1 file changed, 1 insertion(+) diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index e5dbced4a..a2e9f22c9 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -13,6 +13,7 @@ namespace Ndk m_drawer.Clear(); m_text.Clear(); m_textSprite->Update(m_drawer); + SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); RefreshCursor(); OnTextChanged(this, m_text); From c09b2d374782f22e15017b5e031c46f8d2ad9d6c Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:21:06 +0200 Subject: [PATCH 062/192] SDK/Entity: Add OnEntity[Disabled|Enabled] signals --- ChangeLog.md | 1 + SDK/include/NDK/Entity.hpp | 2 ++ SDK/src/NDK/Entity.cpp | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 09aec3d4f..ba3b40b55 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -269,6 +269,7 @@ Nazara Development Kit: - Added TextAreaWidget support for outline - Fixed possible crash when disabling BaseWidget background - Added BaseWidget::OnMouseWheelMoved +- Added Entity::OnEntity[Disabled|Enabled] signals # 0.4: diff --git a/SDK/include/NDK/Entity.hpp b/SDK/include/NDK/Entity.hpp index 43a4a43c7..e09f4eac4 100644 --- a/SDK/include/NDK/Entity.hpp +++ b/SDK/include/NDK/Entity.hpp @@ -74,6 +74,8 @@ namespace Ndk Entity& operator=(Entity&&) = delete; NazaraSignal(OnEntityDestruction, Entity* /*entity*/); + NazaraSignal(OnEntityDisabled, Entity* /*entity*/); + NazaraSignal(OnEntityEnabled, Entity* /*entity*/); private: Entity(World* world, EntityId id); diff --git a/SDK/src/NDK/Entity.cpp b/SDK/src/NDK/Entity.cpp index 7bc81982d..4e211f0db 100644 --- a/SDK/src/NDK/Entity.cpp +++ b/SDK/src/NDK/Entity.cpp @@ -111,11 +111,15 @@ namespace Ndk { for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i)) m_components[i]->OnEntityEnabled(); + + OnEntityEnabled(this); } else { for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i)) m_components[i]->OnEntityDisabled(); + + OnEntityDisabled(this); } Invalidate(); From 3bed2fb7fe3376bd3e3c50ee9d18ab3206783100 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:21:35 +0200 Subject: [PATCH 063/192] SDK/BaseWidget: Add SetParent --- ChangeLog.md | 1 + SDK/include/NDK/BaseWidget.hpp | 1 + SDK/src/NDK/BaseWidget.cpp | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index ba3b40b55..a34d932a9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -270,6 +270,7 @@ Nazara Development Kit: - Fixed possible crash when disabling BaseWidget background - Added BaseWidget::OnMouseWheelMoved - Added Entity::OnEntity[Disabled|Enabled] signals +- Added BaseWidget::SetParent # 0.4: diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index aed8359d8..77f97bd1f 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -81,6 +81,7 @@ namespace Ndk void SetBackgroundColor(const Nz::Color& color); void SetCursor(Nz::SystemCursor systemCursor); void SetFocus(); + void SetParent(BaseWidget* widget); inline void SetFixedHeight(float fixedHeight); inline void SetFixedSize(const Nz::Vector2f& fixedSize); diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index 669747531..80978ffaf 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -145,6 +145,27 @@ namespace Ndk m_canvas->SetKeyboardOwner(m_canvasIndex); } + void BaseWidget::SetParent(BaseWidget* widget) + { + Canvas* oldCanvas = m_canvas; + Canvas* newCanvas = widget->GetCanvas(); + + // Changing a widget canvas is a problem because of the canvas entities + NazaraAssert(oldCanvas == newCanvas, "Transferring a widget between canvas is not yet supported"); + + Node::SetParent(widget); + m_widgetParent = widget; + + Layout(); + } + + void BaseWidget::SetRenderingRect(const Nz::Rectf& renderingRect) + { + m_renderingRect = renderingRect; + + UpdatePositionAndSize(); + } + void BaseWidget::Show(bool show) { if (m_visible != show) From 2d4dd7a8ab1dcf93e4847926b5f995a0cc1a331e Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:23:48 +0200 Subject: [PATCH 064/192] SDK/Widgets: Fix Show overriding entity enabled state --- ChangeLog.md | 1 + SDK/include/NDK/BaseWidget.hpp | 6 ++++-- SDK/src/NDK/BaseWidget.cpp | 25 +++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index a34d932a9..5cc4c9924 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -271,6 +271,7 @@ Nazara Development Kit: - Added BaseWidget::OnMouseWheelMoved - Added Entity::OnEntity[Disabled|Enabled] signals - Added BaseWidget::SetParent +- BaseWidget::Show will no longer show entities disabled by the widget # 0.4: diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index 77f97bd1f..ec69cb813 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -26,8 +26,6 @@ namespace Ndk friend Canvas; public: - struct Padding; - BaseWidget(BaseWidget* parent); BaseWidget(const BaseWidget&) = delete; BaseWidget(BaseWidget&&) = delete; @@ -138,6 +136,10 @@ namespace Ndk struct WidgetEntity { EntityOwner handle; + bool isEnabled = true; + + NazaraSlot(Ndk::Entity, OnEntityDisabled, onDisabledSlot); + NazaraSlot(Ndk::Entity, OnEntityEnabled, onEnabledSlot); }; static constexpr std::size_t InvalidCanvasIndex = std::numeric_limits::max(); diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index 80978ffaf..ed3b8265c 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -178,14 +178,20 @@ namespace Ndk UnregisterFromCanvas(); for (WidgetEntity& entity : m_entities) - entity.handle->Enable(show); + { + if (entity.isEnabled) + { + entity.handle->Enable(show); //< This will override isEnabled + entity.isEnabled = true; + } + } for (const auto& widgetPtr : m_children) widgetPtr->Show(show); } } - const Ndk::EntityHandle& BaseWidget::CreateEntity() + const EntityHandle& BaseWidget::CreateEntity() { const EntityHandle& newEntity = m_world->CreateEntity(); newEntity->Enable(m_visible); @@ -193,6 +199,21 @@ namespace Ndk m_entities.emplace_back(); WidgetEntity& widgetEntity = m_entities.back(); widgetEntity.handle = newEntity; + widgetEntity.onDisabledSlot.Connect(newEntity->OnEntityDisabled, [this](Entity* entity) + { + auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; }); + NazaraAssert(it != m_entities.end(), "Entity does not belong to this widget"); + + it->isEnabled = false; + }); + + widgetEntity.onEnabledSlot.Connect(newEntity->OnEntityEnabled, [this](Entity* entity) + { + auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; }); + NazaraAssert(it != m_entities.end(), "Entity does not belong to this widget"); + + it->isEnabled = true; + }); return newEntity; } From b214f482256064e2ba927a2e1af22ab85c465c55 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:24:49 +0200 Subject: [PATCH 065/192] SDK/TextAreaWidget: Preferred size will now adjust to content --- SDK/src/NDK/Widgets/TextAreaWidget.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 09355c09c..9b946eac1 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -31,8 +31,10 @@ namespace Ndk m_textEntity = CreateEntity(); m_textEntity->AddComponent().Attach(m_textSprite); - m_textEntity->AddComponent().SetParent(this); - m_textEntity->GetComponent().SetPosition(5.f, 3.f); + + auto& textNode = m_textEntity->AddComponent(); + textNode.SetParent(this); + textNode.SetPosition(5.f, 3.f); SetCursor(Nz::SystemCursor_Text); SetCharacterSize(GetCharacterSize()); //< Actualize minimum / preferred size @@ -73,6 +75,7 @@ namespace Ndk } m_textSprite->Update(m_drawer); + SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); OnTextChanged(this, m_text); } @@ -163,7 +166,6 @@ namespace Ndk Nz::Vector2f size = { float(spaceAdvance), float(lineHeight) + 5.f }; SetMinimumSize(size); - SetPreferredSize({ size.x * 6.f, size.y }); } void TextAreaWidget::Write(const Nz::String& text, std::size_t glyphPosition) @@ -606,6 +608,7 @@ namespace Ndk } m_textSprite->Update(m_drawer); + SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); SetCursorPosition(m_cursorPositionBegin); //< Refresh cursor position (prevent it from being outside of the text) } From 7c045a50dbe788049ca3cf7f39b666ce970cc234 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:25:45 +0200 Subject: [PATCH 066/192] SDK/BaseWidget: Add Rendering rect --- ChangeLog.md | 1 + SDK/include/NDK/BaseWidget.hpp | 6 ++++++ SDK/include/NDK/BaseWidget.inl | 12 ++++++++++++ SDK/src/NDK/BaseWidget.cpp | 8 +++++++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5cc4c9924..e448c5df6 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -272,6 +272,7 @@ Nazara Development Kit: - Added Entity::OnEntity[Disabled|Enabled] signals - Added BaseWidget::SetParent - BaseWidget::Show will no longer show entities disabled by the widget +- BaseWidget now has a rendering rect property (allowing to tell a widget what part of it will be rendered) # 0.4: diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index ec69cb813..010abd437 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -39,6 +39,7 @@ namespace Ndk inline void CenterVertical(); void ClearFocus(); + inline void ClearRenderingRect(); void Destroy(); @@ -66,6 +67,8 @@ namespace Ndk inline Nz::Vector2f GetPreferredSize() const; inline float GetPreferredWidth() const; + inline const Nz::Rectf& GetRenderingRect() const; + inline Nz::Vector2f GetSize() const; inline float GetWidth() const; inline std::size_t GetWidgetChildCount() const; @@ -93,6 +96,8 @@ namespace Ndk inline void SetMinimumSize(const Nz::Vector2f& minimumSize); inline void SetMinimumWidth(float minimumWidth); + virtual void SetRenderingRect(const Nz::Rectf& renderingRect); + void Show(bool show = true); BaseWidget& operator=(const BaseWidget&) = delete; @@ -151,6 +156,7 @@ namespace Ndk EntityOwner m_backgroundEntity; WorldHandle m_world; Nz::Color m_backgroundColor; + Nz::Rectf m_renderingRect; Nz::SpriteRef m_backgroundSprite; Nz::SystemCursor m_cursor; Nz::Vector2f m_maximumSize; diff --git a/SDK/include/NDK/BaseWidget.inl b/SDK/include/NDK/BaseWidget.inl index 4420a7a44..605220774 100644 --- a/SDK/include/NDK/BaseWidget.inl +++ b/SDK/include/NDK/BaseWidget.inl @@ -5,6 +5,7 @@ #include #include #include +#include namespace Ndk { @@ -12,6 +13,7 @@ namespace Ndk m_canvasIndex(InvalidCanvasIndex), m_canvas(nullptr), m_backgroundColor(Nz::Color(230, 230, 230, 255)), + m_renderingRect(-std::numeric_limits::infinity(), -std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity()), m_cursor(Nz::SystemCursor_Default), m_size(50.f, 50.f), m_maximumSize(std::numeric_limits::infinity()), @@ -66,6 +68,11 @@ namespace Ndk SetPosition(GetPosition(Nz::CoordSys_Local).x, (parentSize.y - mySize.y) / 2.f); } + inline void BaseWidget::ClearRenderingRect() + { + SetRenderingRect(Nz::Rectf(-std::numeric_limits::infinity(), -std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity())); + } + template inline void BaseWidget::ForEachWidgetChild(F iterator) { @@ -145,6 +152,11 @@ namespace Ndk return m_preferredSize.x; } + inline const Nz::Rectf& BaseWidget::GetRenderingRect() const + { + return m_renderingRect; + } + inline Nz::Vector2f BaseWidget::GetSize() const { return Nz::Vector2f(GetWidth(), GetHeight()); diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index ed3b8265c..647f451c6 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -336,7 +336,13 @@ namespace Ndk Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition()); Nz::Vector2f widgetSize = GetSize(); - Nz::Recti fullBounds(Nz::Rectf(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y)); + Nz::Rectf widgetRect(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y); + Nz::Rectf widgetRenderingRect(widgetPos.x + m_renderingRect.x, widgetPos.y + m_renderingRect.y, m_renderingRect.width, m_renderingRect.height); + + Nz::Rectf widgetBounds; + widgetRect.Intersect(widgetRenderingRect, &widgetBounds); + + Nz::Recti fullBounds(widgetBounds); for (WidgetEntity& widgetEntity : m_entities) { const Ndk::EntityHandle& entity = widgetEntity.handle; From 42aa7ca355468ee70c58fec70134649066afeea2 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:26:11 +0200 Subject: [PATCH 067/192] SDK: Add ScrollAreaWidget (WIP) --- ChangeLog.md | 1 + SDK/include/NDK/Widgets.hpp | 1 + SDK/include/NDK/Widgets/ScrollAreaWidget.hpp | 67 +++++++ SDK/include/NDK/Widgets/ScrollAreaWidget.inl | 24 +++ SDK/src/NDK/Widgets/ScrollAreaWidget.cpp | 184 +++++++++++++++++++ 5 files changed, 277 insertions(+) create mode 100644 SDK/include/NDK/Widgets/ScrollAreaWidget.hpp create mode 100644 SDK/include/NDK/Widgets/ScrollAreaWidget.inl create mode 100644 SDK/src/NDK/Widgets/ScrollAreaWidget.cpp diff --git a/ChangeLog.md b/ChangeLog.md index e448c5df6..f027918e9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -273,6 +273,7 @@ Nazara Development Kit: - Added BaseWidget::SetParent - BaseWidget::Show will no longer show entities disabled by the widget - BaseWidget now has a rendering rect property (allowing to tell a widget what part of it will be rendered) +- Added ScrollAreaWidget # 0.4: diff --git a/SDK/include/NDK/Widgets.hpp b/SDK/include/NDK/Widgets.hpp index a4b74b2d6..303b22519 100644 --- a/SDK/include/NDK/Widgets.hpp +++ b/SDK/include/NDK/Widgets.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #endif // NDK_WIDGETS_GLOBAL_HPP diff --git a/SDK/include/NDK/Widgets/ScrollAreaWidget.hpp b/SDK/include/NDK/Widgets/ScrollAreaWidget.hpp new file mode 100644 index 000000000..5b7106b1f --- /dev/null +++ b/SDK/include/NDK/Widgets/ScrollAreaWidget.hpp @@ -0,0 +1,67 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#pragma once + +#ifndef NDK_WIDGETS_SCROLLAREAWIDGET_HPP +#define NDK_WIDGETS_SCROLLAREAWIDGET_HPP + +#include +#include +#include + +namespace Ndk +{ + class NDK_API ScrollAreaWidget : public BaseWidget + { + public: + ScrollAreaWidget(BaseWidget* parent, BaseWidget* content); + ScrollAreaWidget(const ScrollAreaWidget&) = delete; + ScrollAreaWidget(ScrollAreaWidget&&) = default; + ~ScrollAreaWidget() = default; + + inline float GetScrollHeight() const; + inline float GetScrollRatio() const; + + inline void ScrollToHeight(float height); + void ScrollToRatio(float ratio); + + ScrollAreaWidget& operator=(const ScrollAreaWidget&) = delete; + ScrollAreaWidget& operator=(ScrollAreaWidget&&) = default; + + private: + enum class ScrollBarStatus + { + Grabbed, + Hovered, + None + }; + + Nz::Rectf GetScrollbarRect() const; + + void Layout() override; + + void OnMouseButtonPress(int x, int y, Nz::Mouse::Button button) override; + void OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button) override; + void OnMouseExit() override; + void OnMouseMoved(int x, int y, int deltaX, int deltaY) override; + void OnMouseWheelMoved(int x, int y, float delta) override; + + void UpdateScrollbarStatus(ScrollBarStatus status); + + BaseWidget* m_content; + EntityHandle m_scrollbarBackgroundEntity; + EntityHandle m_scrollbarEntity; + Nz::SpriteRef m_scrollbarBackgroundSprite; + Nz::SpriteRef m_scrollbarSprite; + Nz::Vector2i m_grabbedDelta; + ScrollBarStatus m_scrollbarStatus; + bool m_isScrollBarVisible; + float m_scrollRatio; + }; +} + +#include + +#endif // NDK_WIDGETS_SCROLLAREAWIDGET_HPP diff --git a/SDK/include/NDK/Widgets/ScrollAreaWidget.inl b/SDK/include/NDK/Widgets/ScrollAreaWidget.inl new file mode 100644 index 000000000..c98230180 --- /dev/null +++ b/SDK/include/NDK/Widgets/ScrollAreaWidget.inl @@ -0,0 +1,24 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + inline float ScrollAreaWidget::GetScrollHeight() const + { + return m_scrollRatio * m_content->GetHeight(); + } + + inline float ScrollAreaWidget::GetScrollRatio() const + { + return m_scrollRatio; + } + + inline void ScrollAreaWidget::ScrollToHeight(float height) + { + float contentHeight = m_content->GetHeight(); + ScrollToRatio(height / contentHeight); + } +} diff --git a/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp b/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp new file mode 100644 index 000000000..4f5ca3f6b --- /dev/null +++ b/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp @@ -0,0 +1,184 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include +#include +#include +#include + +namespace Ndk +{ + namespace + { + constexpr float scrollbarPadding = 5.f; + } + + ScrollAreaWidget::ScrollAreaWidget(BaseWidget* parent, BaseWidget* content) : + BaseWidget(parent), + m_content(content), + m_scrollbarStatus(ScrollBarStatus::None), + m_scrollRatio(0.f) + { + m_content->SetParent(this); + m_content->SetPosition(Nz::Vector3f::Zero()); + + m_scrollbarBackgroundSprite = Nz::Sprite::New(); + m_scrollbarBackgroundSprite->SetColor(Nz::Color(62, 62, 62)); + m_scrollbarBackgroundSprite->SetMaterial("Basic2D"); + + m_scrollbarBackgroundEntity = CreateEntity(); + m_scrollbarBackgroundEntity->AddComponent().SetParent(this); + m_scrollbarBackgroundEntity->AddComponent().Attach(m_scrollbarBackgroundSprite, 1); + + m_scrollbarSprite = Nz::Sprite::New(); + m_scrollbarSprite->SetColor(Nz::Color(104, 104, 104)); + m_scrollbarSprite->SetMaterial("Basic2D"); + + m_scrollbarEntity = CreateEntity(); + m_scrollbarEntity->AddComponent().SetParent(this); + m_scrollbarEntity->AddComponent().Attach(m_scrollbarSprite); + + Resize(m_content->GetSize()); + } + + void ScrollAreaWidget::ScrollToRatio(float ratio) + { + m_scrollRatio = Nz::Clamp(ratio, 0.f, 1.f); + + float widgetHeight = GetHeight(); + float maxHeight = widgetHeight - m_scrollbarSprite->GetSize().y - 2.f * scrollbarPadding; + + auto& scrollbarNode = m_scrollbarEntity->GetComponent(); + scrollbarNode.SetPosition(Nz::Vector2f(scrollbarNode.GetPosition(Nz::CoordSys_Local).x, scrollbarPadding + m_scrollRatio * maxHeight)); + + float contentPosition = m_scrollRatio * (widgetHeight - m_content->GetHeight()); + + m_content->SetPosition(0.f, contentPosition); + m_content->SetRenderingRect(Nz::Rectf(-std::numeric_limits::infinity(), -contentPosition, std::numeric_limits::infinity(), widgetHeight)); + } + + Nz::Rectf ScrollAreaWidget::GetScrollbarRect() const + { + Nz::Vector2f scrollBarPosition = Nz::Vector2f(m_scrollbarEntity->GetComponent().GetPosition(Nz::CoordSys_Local)); + Nz::Vector2f scrollBarSize = m_scrollbarSprite->GetSize(); + return Nz::Rectf(scrollBarPosition.x, scrollBarPosition.y, scrollBarSize.x, scrollBarSize.y); + } + + void ScrollAreaWidget::Layout() + { + constexpr float scrollBarBackgroundWidth = 20.f; + constexpr float scrollBarWidth = scrollBarBackgroundWidth - 2.f * scrollbarPadding; + + float areaHeight = GetHeight(); + float contentHeight = m_content->GetHeight(); + + if (contentHeight > areaHeight) + { + m_isScrollBarVisible = true; + + Nz::Vector2f contentSize(GetWidth() - scrollBarBackgroundWidth, contentHeight); + m_content->Resize(contentSize); + + m_scrollbarEntity->Enable(); + m_scrollbarBackgroundEntity->Enable(); + + float scrollBarHeight = std::max(std::floor(areaHeight * (areaHeight / contentHeight)), 20.f); + + m_scrollbarBackgroundSprite->SetSize(scrollBarBackgroundWidth, areaHeight); + m_scrollbarSprite->SetSize(scrollBarWidth, scrollBarHeight); + + m_scrollbarBackgroundEntity->GetComponent().SetPosition(contentSize.x, 0.f); + m_scrollbarEntity->GetComponent().SetPosition(contentSize.x + (scrollBarBackgroundWidth - scrollBarWidth) / 2.f, 0.f); + + ScrollToRatio(m_scrollRatio); + } + else + { + m_isScrollBarVisible = false; + + m_content->Resize(GetSize()); + + m_scrollbarEntity->Disable(); + m_scrollbarBackgroundEntity->Disable(); + + ScrollToRatio(0.f); + } + + BaseWidget::Layout(); + } + + void ScrollAreaWidget::OnMouseButtonPress(int x, int y, Nz::Mouse::Button button) + { + if (button != Nz::Mouse::Left) + return; + + if (m_scrollbarStatus == ScrollBarStatus::Hovered) + { + UpdateScrollbarStatus(ScrollBarStatus::Grabbed); + + auto& scrollbarNode = m_scrollbarEntity->GetComponent(); + + m_grabbedDelta.Set(x, y - scrollbarNode.GetPosition(Nz::CoordSys_Local).y); + } + } + + void ScrollAreaWidget::OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button) + { + if (button != Nz::Mouse::Left) + return; + + if (m_scrollbarStatus == ScrollBarStatus::Grabbed) + { + Nz::Rectf scrollBarRect = GetScrollbarRect(); + UpdateScrollbarStatus((scrollBarRect.Contains(Nz::Vector2f(x, y))) ? ScrollBarStatus::Hovered : ScrollBarStatus::None); + } + } + + void ScrollAreaWidget::OnMouseExit() + { + //if (m_scrollbarStatus == ScrollBarStatus::Hovered) + UpdateScrollbarStatus(ScrollBarStatus::None); + } + + void ScrollAreaWidget::OnMouseMoved(int x, int y, int /*deltaX*/, int /*deltaY*/) + { + if (m_scrollbarStatus == ScrollBarStatus::Grabbed) + { + float height = GetHeight(); + float maxHeight = height - m_scrollbarSprite->GetSize().y; + float newHeight = Nz::Clamp(float(y - m_grabbedDelta.y), 0.f, maxHeight); + + ScrollToHeight(newHeight / maxHeight * m_content->GetHeight()); + } + else + { + Nz::Rectf scrollBarRect = GetScrollbarRect(); + UpdateScrollbarStatus((scrollBarRect.Contains(Nz::Vector2f(x, y))) ? ScrollBarStatus::Hovered : ScrollBarStatus::None); + } + } + + void ScrollAreaWidget::OnMouseWheelMoved(int /*x*/, int /*y*/, float delta) + { + constexpr float scrollStep = 100.f; + + ScrollToHeight(GetScrollHeight() - scrollStep * delta); + } + + void ScrollAreaWidget::UpdateScrollbarStatus(ScrollBarStatus status) + { + if (m_scrollbarStatus != status) + { + Nz::Color newColor; + switch (status) + { + case ScrollBarStatus::Grabbed: newColor = Nz::Color(235, 235, 235); break; + case ScrollBarStatus::Hovered: newColor = Nz::Color(152, 152, 152); break; + case ScrollBarStatus::None: newColor = Nz::Color(104, 104, 104); break; + } + + m_scrollbarSprite->SetColor(newColor); + m_scrollbarStatus = status; + } + } +} From 296b5459c646c5ffbdf967ee18e1524e117deb95 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:26:22 +0200 Subject: [PATCH 068/192] SDK/Console: Make use of ScrollAreaWidget --- SDK/include/NDK/Console.hpp | 2 ++ SDK/src/NDK/Console.cpp | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/SDK/include/NDK/Console.hpp b/SDK/include/NDK/Console.hpp index 75f4d48f9..cb79fcbee 100644 --- a/SDK/include/NDK/Console.hpp +++ b/SDK/include/NDK/Console.hpp @@ -27,6 +27,7 @@ namespace Ndk { class Console; class Entity; + class ScrollAreaWidget; class TextAreaWidget; using ConsoleHandle = Nz::ObjectHandle; @@ -69,6 +70,7 @@ namespace Ndk std::size_t m_historyPosition; std::vector m_commandHistory; std::vector m_historyLines; + ScrollAreaWidget* m_historyArea; TextAreaWidget* m_history; TextAreaWidget* m_input; Nz::FontRef m_defaultFont; diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index a6ad6d38a..84d9b08e4 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -48,6 +48,8 @@ namespace Ndk m_history->SetReadOnly(true); m_history->SetBackgroundColor(Nz::Color(80, 80, 160, 128)); + m_historyArea = Add(m_history); + // Input m_input = Add(); m_input->EnableBackground(true); @@ -102,6 +104,9 @@ namespace Ndk { m_historyLines.emplace_back(Line{ color, text }); m_history->AppendText(text + '\n'); + m_history->Resize(m_history->GetPreferredSize()); + m_historyArea->Resize(m_historyArea->GetSize()); + m_historyArea->ScrollToRatio(1.f); } /*! @@ -113,6 +118,8 @@ namespace Ndk { m_historyLines.clear(); m_history->Clear(); + m_history->Resize(m_history->GetPreferredSize()); + m_historyArea->Resize(m_historyArea->GetSize()); m_input->SetText(s_inputPrefix); } @@ -206,8 +213,8 @@ namespace Ndk m_maxHistoryLines = static_cast(std::ceil(historyHeight / lineHeight)); float diff = historyHeight - m_maxHistoryLines * lineHeight; - m_history->Resize({ size.x, historyHeight - diff - 4.f }); - m_history->SetPosition(origin.x, origin.y + diff); + m_historyArea->SetPosition(origin.x, origin.y + diff); + m_historyArea->Resize({ size.x, historyHeight - diff - 4.f }); m_input->Resize({size.x, size.y - historyHeight}); m_input->SetPosition(origin.x, origin.y + historyHeight); From 9975f11ca0b22ba5ee138dacd74043b113c2dace Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 22:26:57 +0200 Subject: [PATCH 069/192] Update ChangeLog.md --- ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog.md b/ChangeLog.md index f027918e9..bfb292c04 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -274,6 +274,7 @@ Nazara Development Kit: - BaseWidget::Show will no longer show entities disabled by the widget - BaseWidget now has a rendering rect property (allowing to tell a widget what part of it will be rendered) - Added ScrollAreaWidget +- Console has been remade with widgets (allowing to scroll back history, select text, etc.) # 0.4: From 0ec1480024c0260e15e6aacf8c414176de9ce455 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Jul 2019 23:12:12 +0200 Subject: [PATCH 070/192] Add line wrapping --- ChangeLog.md | 2 + SDK/include/NDK/Widgets/TextAreaWidget.hpp | 4 +- SDK/include/NDK/Widgets/TextAreaWidget.inl | 5 +++ SDK/src/NDK/Console.cpp | 1 + SDK/src/NDK/Widgets/TextAreaWidget.cpp | 34 ++++++++++++++-- include/Nazara/Utility/SimpleTextDrawer.hpp | 3 ++ src/Nazara/Utility/SimpleTextDrawer.cpp | 43 +++++++++++++++++---- 7 files changed, 79 insertions(+), 13 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index bfb292c04..49790d33f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -190,6 +190,7 @@ Nazara Engine: - ⚠ SimpleTextDrawer no longer supports faux bold rendering - Added PhysWorld2D::[RaycastQuery, RegionQuery] overloads taking a callback - Added x and y mouse position to MouseWheelEvent +- Added SimpleTextDrawer::[Get|Set]MaxLineWidth (which does line wrap) Nazara Development Kit: - Added ImageWidget (#139) @@ -275,6 +276,7 @@ Nazara Development Kit: - BaseWidget now has a rendering rect property (allowing to tell a widget what part of it will be rendered) - Added ScrollAreaWidget - Console has been remade with widgets (allowing to scroll back history, select text, etc.) +- Added TextAreaWidget line wrap option # 0.4: diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index bb121c5f0..069e89add 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -32,7 +32,7 @@ namespace Ndk //virtual TextAreaWidget* Clone() const = 0; - + void EnableLineWrap(bool enable = true); inline void EnableMultiline(bool enable = true); inline void EnableTabWriting(bool enable = true); @@ -57,6 +57,7 @@ namespace Ndk inline bool HasSelection() const; + inline bool IsLineWrapEnabled() const; inline bool IsMultilineEnabled() const; inline bool IsReadOnly() const; inline bool IsTabWritingEnabled() const; @@ -122,6 +123,7 @@ namespace Ndk Nz::Vector2ui m_cursorPositionEnd; Nz::Vector2ui m_selectionCursor; std::vector m_cursorSprites; + bool m_isLineWrapEnabled; bool m_isMouseButtonDown; bool m_multiLineEnabled; bool m_readOnly; diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index a2e9f22c9..c66662f32 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -123,6 +123,11 @@ namespace Ndk return m_cursorPositionBegin != m_cursorPositionEnd; } + inline bool TextAreaWidget::IsLineWrapEnabled() const + { + return m_isLineWrapEnabled; + } + inline bool TextAreaWidget::IsMultilineEnabled() const { return m_multiLineEnabled; diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 84d9b08e4..4108cddc5 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -45,6 +45,7 @@ namespace Ndk // History m_history = Add(); m_history->EnableBackground(true); + m_history->EnableLineWrap(true); m_history->SetReadOnly(true); m_history->SetBackgroundColor(Nz::Color(80, 80, 160, 128)); diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 9b946eac1..9d695cf39 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -16,6 +16,7 @@ namespace Ndk m_echoMode(EchoMode_Normal), m_cursorPositionBegin(0U, 0U), m_cursorPositionEnd(0U, 0U), + m_isLineWrapEnabled(false), m_isMouseButtonDown(false), m_multiLineEnabled(false), m_readOnly(false), @@ -74,12 +75,26 @@ namespace Ndk } } - m_textSprite->Update(m_drawer); - SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + UpdateTextSprite(); OnTextChanged(this, m_text); } + void TextAreaWidget::EnableLineWrap(bool enable) + { + if (m_isLineWrapEnabled != enable) + { + m_isLineWrapEnabled = enable; + + if (enable) + m_drawer.SetMaxLineWidth(GetWidth()); + else + m_drawer.SetMaxLineWidth(std::numeric_limits::infinity()); + + UpdateTextSprite(); + } + } + void TextAreaWidget::Erase(std::size_t firstGlyph, std::size_t lastGlyph) { if (firstGlyph > lastGlyph) @@ -188,6 +203,12 @@ namespace Ndk { BaseWidget::Layout(); + if (m_isLineWrapEnabled) + { + m_drawer.SetMaxLineWidth(GetWidth()); + UpdateTextSprite(); + } + RefreshCursor(); } @@ -607,9 +628,14 @@ namespace Ndk break; } - m_textSprite->Update(m_drawer); - SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + UpdateTextSprite(); SetCursorPosition(m_cursorPositionBegin); //< Refresh cursor position (prevent it from being outside of the text) } + + void TextAreaWidget::UpdateTextSprite() + { + m_textSprite->Update(m_drawer); + SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + } } diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index 5b4225805..a2fdebc3c 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -38,6 +38,7 @@ namespace Nz std::size_t GetGlyphCount() const override; const Line& GetLine(std::size_t index) const override; std::size_t GetLineCount() const override; + float GetMaxLineWidth() const; const Color& GetOutlineColor() const; float GetOutlineThickness() const; TextStyleFlags GetStyle() const; @@ -46,6 +47,7 @@ namespace Nz void SetCharacterSize(unsigned int characterSize); void SetColor(const Color& color); void SetFont(Font* font); + void SetMaxLineWidth(float lineWidth); void SetOutlineColor(const Color& color); void SetOutlineThickness(float thickness); void SetStyle(TextStyleFlags style); @@ -88,6 +90,7 @@ namespace Nz mutable Vector2ui m_drawPos; mutable bool m_colorUpdated; mutable bool m_glyphUpdated; + float m_maxLineWidth; float m_outlineThickness; unsigned int m_characterSize; }; diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 86ba50764..88b954671 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -3,6 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include #include @@ -14,6 +15,7 @@ namespace Nz m_style(TextStyle_Regular), m_colorUpdated(true), m_glyphUpdated(true), + m_maxLineWidth(std::numeric_limits::infinity()), m_outlineThickness(0.f), m_characterSize(24) { @@ -27,6 +29,7 @@ namespace Nz m_colorUpdated(false), m_glyphUpdated(false), m_outlineColor(drawer.m_outlineColor), + m_maxLineWidth(drawer.m_maxLineWidth), m_outlineThickness(drawer.m_outlineThickness), m_characterSize(drawer.m_characterSize) { @@ -124,6 +127,11 @@ namespace Nz return m_lines.size(); } + float SimpleTextDrawer::GetMaxLineWidth() const + { + return m_maxLineWidth; + } + const Color& SimpleTextDrawer::GetOutlineColor() const { return m_outlineColor; @@ -173,6 +181,15 @@ namespace Nz } } + void SimpleTextDrawer::SetMaxLineWidth(float lineWidth) + { + NazaraAssert(m_maxLineWidth > 0.f, "Max line width must be positive"); + + m_maxLineWidth = lineWidth; + + m_glyphUpdated = false; + } + void SimpleTextDrawer::SetOutlineColor(const Color& color) { m_outlineColor = color; @@ -230,6 +247,7 @@ namespace Nz m_glyphs = std::move(drawer.m_glyphs); m_glyphUpdated = std::move(drawer.m_glyphUpdated); m_font = std::move(drawer.m_font); + m_maxLineWidth = drawer.m_maxLineWidth; m_outlineColor = std::move(drawer.m_outlineColor); m_outlineThickness = std::move(drawer.m_outlineThickness); m_style = std::move(drawer.m_style); @@ -365,7 +383,18 @@ namespace Nz break; } - auto GenerateGlyph = [this](Glyph& glyph, char32_t character, float outlineThickness, Nz::Color color, int renderOrder, int* advance) + auto AppendNewLine = [&]() + { + // Reset cursor + //advance = 0; + m_drawPos.x = 0; + m_drawPos.y += sizeInfo.lineHeight; + + m_workingBounds.ExtendTo(m_lines.back().bounds); + m_lines.emplace_back(Line{ Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1 }); + }; + + auto GenerateGlyph = [&](Glyph& glyph, char32_t character, float outlineThickness, Nz::Color color, int renderOrder, int* advance) { const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, outlineThickness, character); if (fontGlyph.valid && fontGlyph.fauxOutlineThickness <= 0.f) @@ -377,6 +406,10 @@ namespace Nz glyph.renderOrder = renderOrder; glyph.bounds.Set(fontGlyph.aabb); + + if (m_lines.back().glyphIndex <= m_glyphs.size() && m_lines.back().bounds.GetMaximum().x + glyph.bounds.width > m_maxLineWidth) + AppendNewLine(); + glyph.bounds.x += m_drawPos.x; glyph.bounds.y += m_drawPos.y; @@ -435,13 +468,7 @@ namespace Nz { case '\n': { - // Reset cursor - advance = 0; - m_drawPos.x = 0; - m_drawPos.y += sizeInfo.lineHeight; - - m_workingBounds.ExtendTo(m_lines.back().bounds); - m_lines.emplace_back(Line{Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1}); + AppendNewLine(); break; } From e1621bc04415885ba825921c5533840d61cda2a5 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 6 Jul 2019 01:09:20 +0200 Subject: [PATCH 071/192] Fix build --- SDK/include/NDK/Widgets/TextAreaWidget.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index 069e89add..52d7a79ad 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -28,6 +28,8 @@ namespace Ndk void AppendText(const Nz::String& text); + void UpdateTextSprite(); + inline void Clear(); //virtual TextAreaWidget* Clone() const = 0; From 7f324dda9a24b2ffd53fcd080b16362634e612e7 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 6 Jul 2019 01:09:50 +0200 Subject: [PATCH 072/192] SDK/TextAreaWidget: Add text shifting by cursor position --- SDK/src/NDK/Widgets/TextAreaWidget.cpp | 100 ++++++++++++++++++------- 1 file changed, 74 insertions(+), 26 deletions(-) diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 9d695cf39..20395a2ed 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -10,6 +10,12 @@ namespace Ndk { + namespace + { + constexpr float paddingWidth = 5.f; + constexpr float paddingHeight = 3.f; + } + TextAreaWidget::TextAreaWidget(BaseWidget* parent) : BaseWidget(parent), m_characterFilter(), @@ -22,12 +28,6 @@ namespace Ndk m_readOnly(false), m_tabEnabled(false) { - m_cursorEntity = CreateEntity(); - m_cursorEntity->AddComponent(); - m_cursorEntity->AddComponent().SetParent(this); - m_cursorEntity->GetComponent().SetPosition(5.f, 3.f); - m_cursorEntity->Enable(false); - m_textSprite = Nz::TextSprite::New(); m_textEntity = CreateEntity(); @@ -35,7 +35,13 @@ namespace Ndk auto& textNode = m_textEntity->AddComponent(); textNode.SetParent(this); - textNode.SetPosition(5.f, 3.f); + textNode.SetPosition(paddingWidth, paddingHeight); + + m_cursorEntity = CreateEntity(); + m_cursorEntity->AddComponent(); + m_cursorEntity->AddComponent().SetParent(m_textEntity); + m_cursorEntity->GetComponent(); + m_cursorEntity->Enable(false); SetCursor(Nz::SystemCursor_Text); SetCharacterSize(GetCharacterSize()); //< Actualize minimum / preferred size @@ -134,6 +140,11 @@ namespace Ndk Nz::Vector2ui TextAreaWidget::GetHoveredGlyph(float x, float y) const { + auto& textNode = m_textEntity->GetComponent(); + Nz::Vector2f textPosition = Nz::Vector2f(textNode.GetPosition(Nz::CoordSys_Local)); + x -= textPosition.x; + y -= textPosition.y; + std::size_t glyphCount = m_drawer.GetGlyphCount(); if (glyphCount > 0) { @@ -401,14 +412,14 @@ namespace Ndk { Erase(firstGlyph); SetSelection(cursorPositionBegin - (cursorPositionBegin.y == line && cursorPositionBegin.x != 0U ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {}), - cursorPositionEnd - (cursorPositionEnd.y == line && cursorPositionEnd.x != 0U ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {})); + cursorPositionEnd - (cursorPositionEnd.y == line && cursorPositionEnd.x != 0U ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {})); } } else { Write(Nz::String('\t'), { 0U, line }); SetSelection(cursorPositionBegin + (cursorPositionBegin.y == line && cursorPositionBegin.x != 0U ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {}), - cursorPositionEnd + (cursorPositionEnd.y == line ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {})); + cursorPositionEnd + (cursorPositionEnd.y == line ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {})); } } } @@ -445,7 +456,7 @@ namespace Ndk { SetFocus(); - Nz::Vector2ui hoveredGlyph = GetHoveredGlyph(float(x) - 5.f, float(y) - 5.f); + Nz::Vector2ui hoveredGlyph = GetHoveredGlyph(float(x), float(y)); // Shift extends selection if (Nz::Keyboard::IsKeyPressed(Nz::Keyboard::LShift) || Nz::Keyboard::IsKeyPressed(Nz::Keyboard::RShift)) @@ -475,7 +486,7 @@ namespace Ndk void TextAreaWidget::OnMouseMoved(int x, int y, int deltaX, int deltaY) { if (m_isMouseButtonDown) - SetSelection(m_selectionCursor, GetHoveredGlyph(float(x) - 5.f, float(y) - 3.f)); + SetSelection(m_selectionCursor, GetHoveredGlyph(float(x), float(y))); } void TextAreaWidget::OnTextEntered(char32_t character, bool /*repeated*/) @@ -552,6 +563,46 @@ namespace Ndk if (m_readOnly) return; + auto GetGlyph = [&](const Nz::Vector2ui& glyphPosition, std::size_t* glyphIndex) -> const Nz::AbstractTextDrawer::Glyph* + { + const auto& lineInfo = m_drawer.GetLine(glyphPosition.y); + + std::size_t cursorGlyph = GetGlyphIndex({ glyphPosition.x, glyphPosition.y }); + if (glyphIndex) + *glyphIndex = cursorGlyph; + + std::size_t glyphCount = m_drawer.GetGlyphCount(); + float position; + if (glyphCount > 0 && lineInfo.glyphIndex < cursorGlyph) + { + const auto& glyph = m_drawer.GetGlyph(std::min(cursorGlyph, glyphCount - 1)); + return &glyph; + } + else + return nullptr; + }; + + // Move text so that cursor is always visible + const auto* glyph = GetGlyph(m_cursorPositionEnd, nullptr); + float glyphPos = (glyph) ? glyph->bounds.x : 0.f; + float glyphWidth = (glyph) ? glyph->bounds.width : 0.f; + + auto& node = m_textEntity->GetComponent(); + float textPosition = node.GetPosition(Nz::CoordSys_Local).x - paddingWidth; + float cursorPosition = glyphPos + textPosition; + float width = GetWidth(); + + if (width <= m_drawer.GetBounds().width) + { + if (cursorPosition + glyphWidth > width) + node.Move(width - cursorPosition - glyphWidth, 0.f); + else if (cursorPosition - glyphWidth < 0.f) + node.Move(-cursorPosition + glyphWidth, 0.f); + } + else + node.Move(-textPosition, 0.f); // Reset text position if we have enough room to show everything + + // Show cursor/selection std::size_t selectionLineCount = m_cursorPositionEnd.y - m_cursorPositionBegin.y + 1; std::size_t oldSpriteCount = m_cursorSprites.size(); if (m_cursorSprites.size() != selectionLineCount) @@ -576,27 +627,24 @@ namespace Ndk Nz::SpriteRef& cursorSprite = m_cursorSprites[i - m_cursorPositionBegin.y]; if (i == m_cursorPositionBegin.y || i == m_cursorPositionEnd.y) { - auto GetGlyphPos = [&](unsigned int localGlyphPos) + auto GetGlyphPos = [&](const Nz::Vector2ui& glyphPosition) { - std::size_t cursorGlyph = GetGlyphIndex({ localGlyphPos, i }); - - std::size_t glyphCount = m_drawer.GetGlyphCount(); - float position; - if (glyphCount > 0 && lineInfo.glyphIndex < cursorGlyph) + std::size_t glyphIndex; + const auto* glyph = GetGlyph(glyphPosition, &glyphIndex); + if (glyph) { - const auto& glyph = m_drawer.GetGlyph(std::min(cursorGlyph, glyphCount - 1)); - position = glyph.bounds.x; - if (cursorGlyph >= glyphCount) - position += glyph.bounds.width; + float position = glyph->bounds.x; + if (glyphIndex >= m_drawer.GetGlyphCount()) + position += glyph->bounds.width; + + return position; } else - position = 0.f; - - return position; + return 0.f; }; - float beginX = (i == m_cursorPositionBegin.y) ? GetGlyphPos(m_cursorPositionBegin.x) : 0.f; - float endX = (i == m_cursorPositionEnd.y) ? GetGlyphPos(m_cursorPositionEnd.x) : lineInfo.bounds.width; + float beginX = (i == m_cursorPositionBegin.y) ? GetGlyphPos({ m_cursorPositionBegin.x, i }) : 0.f; + float endX = (i == m_cursorPositionEnd.y) ? GetGlyphPos({ m_cursorPositionEnd.x, i }) : lineInfo.bounds.width; float spriteSize = std::max(endX - beginX, 1.f); cursorSprite->SetColor((m_cursorPositionBegin == m_cursorPositionEnd) ? Nz::Color::Black : Nz::Color(0, 0, 0, 50)); From 3617f4054ad3ac78b3219bb389b728f697712ac6 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 6 Jul 2019 19:31:29 +0200 Subject: [PATCH 073/192] Update ChangeLog.md --- ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog.md b/ChangeLog.md index 49790d33f..64e1718cd 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -277,6 +277,7 @@ Nazara Development Kit: - Added ScrollAreaWidget - Console has been remade with widgets (allowing to scroll back history, select text, etc.) - Added TextAreaWidget line wrap option +- TextAreaWidget will now shift the text to the left/right in order to keep the cursor visible # 0.4: From 55e3e05f0c8964de53300870a39c8df9b77cd330 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 6 Jul 2019 19:32:11 +0200 Subject: [PATCH 074/192] Improve line wrap It will now try to separate at word separations --- include/Nazara/Utility/SimpleTextDrawer.hpp | 8 + src/Nazara/Utility/SimpleTextDrawer.cpp | 173 +++++++++++++------- 2 files changed, 125 insertions(+), 56 deletions(-) diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index a2fdebc3c..525f49cc5 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -62,21 +62,29 @@ namespace Nz static SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor); private: + void AppendNewLine() const; + void AppendNewLine(std::size_t glyphIndex, unsigned int glyphPosition) const; void ClearGlyphs() const; void ConnectFontSlots(); void DisconnectFontSlots(); + bool GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, Nz::Color color, int renderOrder, int* advance) const; void GenerateGlyphs(const String& text) const; void OnFontAtlasLayerChanged(const Font* font, AbstractImage* oldLayer, AbstractImage* newLayer); void OnFontInvalidated(const Font* font); void OnFontRelease(const Font* object); + bool ShouldLineWrap(Glyph& glyph, float size, bool checkFirstGlyph = true) const; void UpdateGlyphColor() const; void UpdateGlyphs() const; + static constexpr std::size_t InvalidGlyph = std::numeric_limits::max(); + NazaraSlot(Font, OnFontAtlasChanged, m_atlasChangedSlot); NazaraSlot(Font, OnFontAtlasLayerChanged, m_atlasLayerChangedSlot); NazaraSlot(Font, OnFontGlyphCacheCleared, m_glyphCacheClearedSlot); NazaraSlot(Font, OnFontRelease, m_fontReleaseSlot); + mutable std::size_t m_lastSeparatorGlyph; + mutable unsigned int m_lastSeparatorPosition; mutable std::vector m_glyphs; mutable std::vector m_lines; Color m_color; diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 88b954671..6bf0830df 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -309,11 +309,66 @@ namespace Nz return drawer; } + void SimpleTextDrawer::AppendNewLine() const + { + AppendNewLine(InvalidGlyph, 0.f); + } + + void SimpleTextDrawer::AppendNewLine(std::size_t glyphIndex, unsigned int glyphPosition) const + { + // Ensure we're appending from last line + Line& lastLine = m_lines.back(); + + const Font::SizeInfo& sizeInfo = m_font->GetSizeInfo(m_characterSize); + + unsigned int previousDrawPos = m_drawPos.x; + + // Reset cursor + m_drawPos.x = 0; + m_drawPos.y += sizeInfo.lineHeight; + m_lastSeparatorGlyph = InvalidGlyph; + + m_workingBounds.ExtendTo(lastLine.bounds); + m_lines.emplace_back(Line{ Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1 }); + + if (glyphIndex != InvalidGlyph && glyphIndex > lastLine.glyphIndex) + { + Line& newLine = m_lines.back(); + newLine.glyphIndex = glyphIndex; + + for (std::size_t i = glyphIndex; i < m_glyphs.size(); ++i) + { + Glyph& glyph = m_glyphs[i]; + glyph.bounds.x -= glyphPosition; + glyph.bounds.y += sizeInfo.lineHeight; + + for (auto& corner : glyph.corners) + { + corner.x -= glyphPosition; + corner.y += sizeInfo.lineHeight; + } + + newLine.bounds.ExtendTo(glyph.bounds); + } + + assert(previousDrawPos >= glyphPosition); + m_drawPos.x += previousDrawPos - glyphPosition; + + lastLine.bounds.width -= lastLine.bounds.GetMaximum().x - m_lastSeparatorPosition; + + // Regenerate working bounds + m_workingBounds.MakeZero(); + for (std::size_t i = 0; i < m_lines.size(); ++i) + m_workingBounds.ExtendTo(m_lines[i].bounds); + } + } + void SimpleTextDrawer::ClearGlyphs() const { m_bounds.MakeZero(); m_colorUpdated = true; m_drawPos.Set(0, m_characterSize); //< Our draw "cursor" + m_lastSeparatorGlyph = InvalidGlyph; m_lines.clear(); m_glyphs.clear(); m_glyphUpdated = true; @@ -342,6 +397,46 @@ namespace Nz m_glyphCacheClearedSlot.Disconnect(); } + bool SimpleTextDrawer::GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, Nz::Color color, int renderOrder, int* advance) const + { + const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, outlineThickness, character); + if (fontGlyph.valid && fontGlyph.fauxOutlineThickness <= 0.f) + { + glyph.atlas = m_font->GetAtlas()->GetLayer(fontGlyph.layerIndex); + glyph.atlasRect = fontGlyph.atlasRect; + glyph.color = color; + glyph.flipped = fontGlyph.flipped; + glyph.renderOrder = renderOrder; + + glyph.bounds.Set(fontGlyph.aabb); + + if (lineWrap && ShouldLineWrap(glyph, glyph.bounds.width)) + AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); + + glyph.bounds.x += m_drawPos.x; + glyph.bounds.y += m_drawPos.y; + + // Faux bold and faux outline thickness are not supported + + // We "lean" the glyph to simulate italics style + float italic = (fontGlyph.requireFauxItalic) ? 0.208f : 0.f; + float italicTop = italic * glyph.bounds.y; + float italicBottom = italic * glyph.bounds.GetMaximum().y; + + glyph.corners[0].Set(glyph.bounds.x - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); + glyph.corners[1].Set(glyph.bounds.x + glyph.bounds.width - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); + glyph.corners[2].Set(glyph.bounds.x - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); + glyph.corners[3].Set(glyph.bounds.x + glyph.bounds.width - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); + + if (advance) + *advance = fontGlyph.advance; + + return true; + } + else + return false; + }; + void SimpleTextDrawer::GenerateGlyphs(const String& text) const { if (text.IsEmpty()) @@ -383,78 +478,30 @@ namespace Nz break; } - auto AppendNewLine = [&]() - { - // Reset cursor - //advance = 0; - m_drawPos.x = 0; - m_drawPos.y += sizeInfo.lineHeight; - - m_workingBounds.ExtendTo(m_lines.back().bounds); - m_lines.emplace_back(Line{ Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1 }); - }; - - auto GenerateGlyph = [&](Glyph& glyph, char32_t character, float outlineThickness, Nz::Color color, int renderOrder, int* advance) - { - const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, outlineThickness, character); - if (fontGlyph.valid && fontGlyph.fauxOutlineThickness <= 0.f) - { - glyph.atlas = m_font->GetAtlas()->GetLayer(fontGlyph.layerIndex); - glyph.atlasRect = fontGlyph.atlasRect; - glyph.color = color; - glyph.flipped = fontGlyph.flipped; - glyph.renderOrder = renderOrder; - - glyph.bounds.Set(fontGlyph.aabb); - - if (m_lines.back().glyphIndex <= m_glyphs.size() && m_lines.back().bounds.GetMaximum().x + glyph.bounds.width > m_maxLineWidth) - AppendNewLine(); - - glyph.bounds.x += m_drawPos.x; - glyph.bounds.y += m_drawPos.y; - - // Faux bold and faux outline thickness are not supported - - // We "lean" the glyph to simulate italics style - float italic = (fontGlyph.requireFauxItalic) ? 0.208f : 0.f; - float italicTop = italic * glyph.bounds.y; - float italicBottom = italic * glyph.bounds.GetMaximum().y; - - glyph.corners[0].Set(glyph.bounds.x - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); - glyph.corners[1].Set(glyph.bounds.x + glyph.bounds.width - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); - glyph.corners[2].Set(glyph.bounds.x - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); - glyph.corners[3].Set(glyph.bounds.x + glyph.bounds.width - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); - - if (advance) - *advance = fontGlyph.advance; - - return true; - } - else - return false; - }; - Glyph glyph; if (!whitespace) { - if (!GenerateGlyph(glyph, character, 0.f, m_color, 0, &advance)) + if (!GenerateGlyph(glyph, character, 0.f, true, m_color, 0, &advance)) continue; // Glyph failed to load, just skip it (can't do much) if (m_outlineThickness > 0.f) { Glyph outlineGlyph; - if (GenerateGlyph(outlineGlyph, character, m_outlineThickness, m_outlineColor, -1, nullptr)) + if (GenerateGlyph(outlineGlyph, character, m_outlineThickness, false, m_outlineColor, -1, nullptr)) { - m_lines.back().bounds.ExtendTo(outlineGlyph.bounds); m_glyphs.push_back(outlineGlyph); } } } else { - glyph.atlas = nullptr; + float glyphAdvance = advance; - glyph.bounds.Set(float(m_drawPos.x), m_lines.back().bounds.y, float(advance), float(sizeInfo.lineHeight)); + if (ShouldLineWrap(glyph, glyphAdvance)) + AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); + + glyph.atlas = nullptr; + glyph.bounds.Set(float(m_drawPos.x), m_lines.back().bounds.y, glyphAdvance, float(sizeInfo.lineHeight)); glyph.corners[0].Set(glyph.bounds.GetCorner(RectCorner_LeftTop)); glyph.corners[1].Set(glyph.bounds.GetCorner(RectCorner_RightTop)); @@ -477,6 +524,12 @@ namespace Nz break; } + if (whitespace) + { + m_lastSeparatorGlyph = m_glyphs.size(); + m_lastSeparatorPosition = m_drawPos.x; + } + m_glyphs.push_back(glyph); } @@ -540,6 +593,14 @@ namespace Nz SetFont(nullptr); } + bool SimpleTextDrawer::ShouldLineWrap(Glyph& glyph, float size, bool checkFirstGlyph) const + { + if (checkFirstGlyph && m_lines.back().glyphIndex > m_glyphs.size()) + return false; + + return m_lines.back().bounds.GetMaximum().x + size > m_maxLineWidth; + } + void SimpleTextDrawer::UpdateGlyphColor() const { if (m_outlineThickness > 0.f) From 8457cb4df7cf3627338d73c7bcaf95ca12534a17 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Jul 2019 00:23:49 +0200 Subject: [PATCH 075/192] SDK/TextAreaWidget: Add [Get|Set]TextFont --- ChangeLog.md | 1 + SDK/include/NDK/Widgets/TextAreaWidget.hpp | 2 ++ SDK/include/NDK/Widgets/TextAreaWidget.inl | 12 ++++++++++++ SDK/src/NDK/Console.cpp | 4 ++-- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 64e1718cd..077ae0ee7 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -278,6 +278,7 @@ Nazara Development Kit: - Console has been remade with widgets (allowing to scroll back history, select text, etc.) - Added TextAreaWidget line wrap option - TextAreaWidget will now shift the text to the left/right in order to keep the cursor visible +- Added TextAreaWidget::[Get|Set]TextFont # 0.4: diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index 52d7a79ad..223a3759f 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -52,6 +52,7 @@ namespace Ndk inline std::size_t GetGlyphIndex(const Nz::Vector2ui& cursorPosition) const; inline const Nz::String& GetText() const; inline const Nz::Color& GetTextColor() const; + inline Nz::Font* GetTextFont() const; inline const Nz::Color& GetTextOulineColor() const; inline float GetTextOulineThickness() const; @@ -76,6 +77,7 @@ namespace Ndk inline void SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition); inline void SetText(const Nz::String& text); inline void SetTextColor(const Nz::Color& text); + inline void SetTextFont(Nz::FontRef font); inline void SetTextOutlineColor(const Nz::Color& color); inline void SetTextOutlineThickness(float thickness); diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index c66662f32..535936243 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -108,6 +108,11 @@ namespace Ndk return m_drawer.GetColor(); } + inline Nz::Font* TextAreaWidget::GetTextFont() const + { + return m_drawer.GetFont(); + } + inline const Nz::Color& TextAreaWidget::GetTextOulineColor() const { return m_drawer.GetOutlineColor(); @@ -265,6 +270,13 @@ namespace Ndk UpdateDisplayText(); } + inline void TextAreaWidget::SetTextFont(Nz::FontRef font) + { + m_drawer.SetFont(font); + + UpdateDisplayText(); + } + inline void TextAreaWidget::SetTextOutlineColor(const Nz::Color& color) { m_drawer.SetOutlineColor(color); diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 4108cddc5..8bfa48a0f 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -170,8 +170,8 @@ namespace Ndk NazaraAssert(font && font->IsValid(), "Invalid font"); m_defaultFont = std::move(font); - //m_historyDrawer.SetFont(m_defaultFont); - //m_inputDrawer.SetFont(m_defaultFont); + m_history->SetTextFont(m_defaultFont); + m_input->SetTextFont(m_defaultFont); Layout(); } From d8f6af319148db111867982b5f511eec4dde2f65 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Jul 2019 00:24:02 +0200 Subject: [PATCH 076/192] Fix some stuff --- SDK/include/NDK/Widgets/TextAreaWidget.hpp | 3 +-- SDK/src/NDK/Widgets/TextAreaWidget.cpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index 223a3759f..c89f46884 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -28,8 +28,6 @@ namespace Ndk void AppendText(const Nz::String& text); - void UpdateTextSprite(); - inline void Clear(); //virtual TextAreaWidget* Clone() const = 0; @@ -115,6 +113,7 @@ namespace Ndk void RefreshCursor(); void UpdateDisplayText(); + void UpdateTextSprite(); CharacterFilter m_characterFilter; EchoMode m_echoMode; diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 20395a2ed..3ab119a0a 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -168,7 +168,7 @@ namespace Ndk break; } - return Nz::Vector2ui(i - firstLineGlyph, line); + return Nz::Vector2ui(Nz::Vector2(i - firstLineGlyph, line)); } return Nz::Vector2ui::Zero(); @@ -572,7 +572,6 @@ namespace Ndk *glyphIndex = cursorGlyph; std::size_t glyphCount = m_drawer.GetGlyphCount(); - float position; if (glyphCount > 0 && lineInfo.glyphIndex < cursorGlyph) { const auto& glyph = m_drawer.GetGlyph(std::min(cursorGlyph, glyphCount - 1)); From 3bda97a60af7a53f9ef982b8754f01ea0a32ae07 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Jul 2019 00:27:20 +0200 Subject: [PATCH 077/192] SDK/TextAreaWidget: OnTextAreaCursorMove now uses a Vector2ui as its second argument Also add OnTextAreaSelection signal --- ChangeLog.md | 2 + SDK/include/NDK/Widgets/TextAreaWidget.hpp | 8 ++- SDK/include/NDK/Widgets/TextAreaWidget.inl | 71 ++++++++++++++-------- SDK/src/NDK/Console.cpp | 10 ++- 4 files changed, 62 insertions(+), 29 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 077ae0ee7..7100c7027 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -279,6 +279,8 @@ Nazara Development Kit: - Added TextAreaWidget line wrap option - TextAreaWidget will now shift the text to the left/right in order to keep the cursor visible - Added TextAreaWidget::[Get|Set]TextFont +- ⚠️ TextAreaWidget::OnTextAreaCursorMove signal now uses a Vector2ui* position as its second argument (instead of a std::size_t*) +- Added TextAreaWidget::OnTextAreaSelection # 0.4: diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index c89f46884..ebce9e464 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -66,6 +66,8 @@ namespace Ndk inline void MoveCursor(int offset); inline void MoveCursor(const Nz::Vector2i& offset); + inline Nz::Vector2ui NormalizeCursorPosition(Nz::Vector2ui cursorPosition) const; + inline void SetCharacterFilter(CharacterFilter filter); void SetCharacterSize(unsigned int characterSize); inline void SetCursorPosition(std::size_t glyphIndex); @@ -86,7 +88,7 @@ namespace Ndk TextAreaWidget& operator=(const TextAreaWidget&) = delete; TextAreaWidget& operator=(TextAreaWidget&&) = default; - NazaraSignal(OnTextAreaCursorMove, const TextAreaWidget* /*textArea*/, std::size_t* /*newCursorPosition*/); + NazaraSignal(OnTextAreaCursorMove, const TextAreaWidget* /*textArea*/, Nz::Vector2ui* /*newCursorPosition*/); NazaraSignal(OnTextAreaKeyBackspace, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); NazaraSignal(OnTextAreaKeyDown, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); NazaraSignal(OnTextAreaKeyEnd, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); @@ -95,6 +97,7 @@ namespace Ndk NazaraSignal(OnTextAreaKeyReturn, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); NazaraSignal(OnTextAreaKeyRight, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); NazaraSignal(OnTextAreaKeyUp, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaSelection, const TextAreaWidget* /*textArea*/, Nz::Vector2ui* /*start*/, Nz::Vector2ui* /*end*/); NazaraSignal(OnTextChanged, const TextAreaWidget* /*textArea*/, const Nz::String& /*text*/); private: @@ -111,6 +114,9 @@ namespace Ndk void OnMouseMoved(int x, int y, int deltaX, int deltaY) override; void OnTextEntered(char32_t character, bool repeated) override; + inline void SetCursorPositionInternal(std::size_t glyphIndex); + inline void SetCursorPositionInternal(Nz::Vector2ui cursorPosition); + void RefreshCursor(); void UpdateDisplayText(); void UpdateTextSprite(); diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index 535936243..bdb95854e 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -186,29 +186,12 @@ namespace Ndk SetCursorPosition(cursorPosition); } - inline void TextAreaWidget::SetCharacterFilter(CharacterFilter filter) - { - m_characterFilter = std::move(filter); - } - - inline void TextAreaWidget::SetCursorPosition(std::size_t glyphIndex) - { - OnTextAreaCursorMove(this, &glyphIndex); - - m_cursorPositionBegin = GetCursorPosition(glyphIndex); - m_cursorPositionEnd = m_cursorPositionBegin; - - RefreshCursor(); - } - - inline void TextAreaWidget::SetCursorPosition(Nz::Vector2ui cursorPosition) + inline Nz::Vector2ui TextAreaWidget::NormalizeCursorPosition(Nz::Vector2ui cursorPosition) const { std::size_t lineCount = m_drawer.GetLineCount(); if (cursorPosition.y >= lineCount) cursorPosition.y = static_cast(lineCount - 1); - m_cursorPositionBegin = cursorPosition; - const auto& lineInfo = m_drawer.GetLine(cursorPosition.y); if (cursorPosition.y + 1 < lineCount) { @@ -216,13 +199,32 @@ namespace Ndk cursorPosition.x = std::min(cursorPosition.x, static_cast(nextLineInfo.glyphIndex - lineInfo.glyphIndex - 1)); } - m_cursorPositionEnd = m_cursorPositionBegin; + return cursorPosition; + } - std::size_t glyphIndex = lineInfo.glyphIndex + cursorPosition.x; + inline void TextAreaWidget::SetCharacterFilter(CharacterFilter filter) + { + m_characterFilter = std::move(filter); + } - OnTextAreaCursorMove(this, &glyphIndex); + inline void TextAreaWidget::SetCursorPosition(std::size_t glyphIndex) + { + Nz::Vector2ui position = GetCursorPosition(glyphIndex); + Nz::Vector2ui newPosition = position; - RefreshCursor(); + OnTextAreaCursorMove(this, &newPosition); + + if (position == newPosition) + SetCursorPositionInternal(position); + else + SetCursorPositionInternal(GetGlyphIndex(newPosition)); + } + + inline void TextAreaWidget::SetCursorPosition(Nz::Vector2ui cursorPosition) + { + OnTextAreaCursorMove(this, &cursorPosition); + + return SetCursorPositionInternal(NormalizeCursorPosition(cursorPosition)); } inline void TextAreaWidget::SetEchoMode(EchoMode echoMode) @@ -240,16 +242,20 @@ namespace Ndk inline void TextAreaWidget::SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition) { - ///TODO: Check if position are valid - // Ensure begin is before end if (toPosition.y < fromPosition.y || (toPosition.y == fromPosition.y && toPosition.x < fromPosition.x)) std::swap(fromPosition, toPosition); if (m_cursorPositionBegin != fromPosition || m_cursorPositionEnd != toPosition) { - m_cursorPositionBegin = fromPosition; - m_cursorPositionEnd = toPosition; + OnTextAreaSelection(this, &fromPosition, &toPosition); + + // Ensure begin is before end a second time (in case signal changed it) + if (toPosition.y < fromPosition.y || (toPosition.y == fromPosition.y && toPosition.x < fromPosition.x)) + std::swap(fromPosition, toPosition); + + m_cursorPositionBegin = NormalizeCursorPosition(fromPosition); + m_cursorPositionEnd = NormalizeCursorPosition(toPosition); RefreshCursor(); } @@ -300,4 +306,17 @@ namespace Ndk { Write(text, GetGlyphIndex(glyphPosition)); } + + void TextAreaWidget::SetCursorPositionInternal(std::size_t glyphIndex) + { + return SetCursorPositionInternal(GetCursorPosition(glyphIndex)); + } + + inline void TextAreaWidget::SetCursorPositionInternal(Nz::Vector2ui cursorPosition) + { + m_cursorPositionBegin = cursorPosition; + m_cursorPositionEnd = m_cursorPositionBegin; + + RefreshCursor(); + } } diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 8bfa48a0f..088c29444 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -62,9 +62,15 @@ namespace Ndk // Protect input prefix from erasure/selection m_input->SetCursorPosition(s_inputPrefixSize); - m_input->OnTextAreaCursorMove.Connect([](const TextAreaWidget* textArea, std::size_t* newCursorPos) + m_input->OnTextAreaCursorMove.Connect([](const TextAreaWidget* textArea, Nz::Vector2ui* newCursorPos) { - *newCursorPos = std::max(*newCursorPos, s_inputPrefixSize); + newCursorPos->x = std::max(newCursorPos->x, static_cast(s_inputPrefixSize)); + }); + + m_input->OnTextAreaSelection.Connect([](const TextAreaWidget* textArea, Nz::Vector2ui* start, Nz::Vector2ui* end) + { + start->x = std::max(start->x, static_cast(s_inputPrefixSize)); + end->x = std::max(end->x, static_cast(s_inputPrefixSize)); }); m_input->OnTextAreaKeyBackspace.Connect([](const TextAreaWidget* textArea, bool* ignoreDefaultAction) From c6d601c42977969f1d1e9ed2d852f93c76f486e3 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Jul 2019 00:28:51 +0200 Subject: [PATCH 078/192] SDK/Console: Add OnCommand signal and remove LuaState dependency --- ChangeLog.md | 1 + SDK/include/NDK/Console.hpp | 6 +++--- SDK/src/NDK/Application.cpp | 27 ++++++++++++++------------- SDK/src/NDK/Console.cpp | 11 +++-------- 4 files changed, 21 insertions(+), 24 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7100c7027..587e763bd 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -281,6 +281,7 @@ Nazara Development Kit: - Added TextAreaWidget::[Get|Set]TextFont - ⚠️ TextAreaWidget::OnTextAreaCursorMove signal now uses a Vector2ui* position as its second argument (instead of a std::size_t*) - Added TextAreaWidget::OnTextAreaSelection +- ⚠️ Console class is no longer bound to a LuaState and now has a OnCommand signal # 0.4: diff --git a/SDK/include/NDK/Console.hpp b/SDK/include/NDK/Console.hpp index cb79fcbee..32d0cd76a 100644 --- a/SDK/include/NDK/Console.hpp +++ b/SDK/include/NDK/Console.hpp @@ -19,7 +19,6 @@ namespace Nz { - class LuaState; struct WindowEvent; } @@ -35,7 +34,7 @@ namespace Ndk class NDK_API Console : public BaseWidget, public Nz::HandledObject { public: - Console(BaseWidget* parent, Nz::LuaState& state); + Console(BaseWidget* parent); Console(const Console& console) = delete; Console(Console&& console) = default; ~Console() = default; @@ -57,6 +56,8 @@ namespace Ndk Console& operator=(const Console& console) = delete; Console& operator=(Console&& console) = default; + NazaraSignal(OnCommand, Console* /*console*/, const Nz::String& /*command*/); + private: void ExecuteInput(const TextAreaWidget* textArea, bool* ignoreDefaultAction); void Layout() override; @@ -74,7 +75,6 @@ namespace Ndk TextAreaWidget* m_history; TextAreaWidget* m_input; Nz::FontRef m_defaultFont; - Nz::LuaState& m_state; unsigned int m_characterSize; unsigned int m_maxHistoryLines; }; diff --git a/SDK/src/NDK/Application.cpp b/SDK/src/NDK/Application.cpp index c26b1e7d2..cf6fcdbb5 100644 --- a/SDK/src/NDK/Application.cpp +++ b/SDK/src/NDK/Application.cpp @@ -151,7 +151,14 @@ namespace Ndk else windowDimensions.MakeZero(); - overlay->console = info.canvas->Add(overlay->lua); + Nz::LuaInstance& lua = overlay->lua; + + overlay->console = info.canvas->Add(); + overlay->console->OnCommand.Connect([&lua](Ndk::Console* console, const Nz::String& command) + { + if (!lua.Execute(command)) + console->AddLine(lua.GetLastError(), Nz::Color::Red); + }); Console& consoleRef = *overlay->console; consoleRef.Resize({float(windowDimensions.x), windowDimensions.y / 4.f}); @@ -163,11 +170,11 @@ namespace Ndk consoleRef.AddLine(str); }); - overlay->lua.LoadLibraries(); - LuaAPI::RegisterClasses(overlay->lua); + lua.LoadLibraries(); + LuaAPI::RegisterClasses(lua); // Override "print" function to add a line in the console - overlay->lua.PushFunction([&consoleRef] (Nz::LuaState& state) + lua.PushFunction([&consoleRef] (Nz::LuaState& state) { Nz::StringStream stream; @@ -191,21 +198,15 @@ namespace Ndk consoleRef.AddLine(stream); return 0; }); - overlay->lua.SetGlobal("print"); + lua.SetGlobal("print"); // Define a few base variables to allow our interface to interact with the application - overlay->lua.PushGlobal("Application", Ndk::Application::Instance()); - overlay->lua.PushGlobal("Console", consoleRef.CreateHandle()); + lua.PushGlobal("Application", Ndk::Application::Instance()); + lua.PushGlobal("Console", consoleRef.CreateHandle()); // Setup a few event callback to handle the console Nz::EventHandler& eventHandler = info.window->GetEventHandler(); - /*overlay->eventSlot.Connect(eventHandler.OnEvent, [&consoleRef] (const Nz::EventHandler*, const Nz::WindowEvent& event) - { - if (consoleRef.IsVisible()) - consoleRef.SendEvent(event); - });*/ - overlay->keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&consoleRef] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& event) { if (event.code == Nz::Keyboard::F9) diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 088c29444..964bb6b9c 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include #include @@ -35,11 +34,10 @@ namespace Ndk * \param instance Lua instance that will interact with the world */ - Console::Console(BaseWidget* parent, Nz::LuaState& state) : + Console::Console(BaseWidget* parent) : BaseWidget(parent), m_historyPosition(0), m_defaultFont(Nz::Font::GetDefault()), - m_state(state), m_characterSize(24) { // History @@ -185,8 +183,7 @@ namespace Ndk /*! * \brief Performs this action when an input is added to the console */ - - void Console::ExecuteInput(const TextAreaWidget* textArea, bool* ignoreDefaultAction) + void Console::ExecuteInput(const TextAreaWidget* textArea, bool* /*ignoreDefaultAction*/) { NazaraAssert(textArea == m_input, "Unexpected signal from an other text area"); @@ -201,14 +198,12 @@ namespace Ndk AddLine(input); //< With the input prefix - if (!m_state.Execute(inputCmd)) - AddLine(m_state.GetLastError(), Nz::Color::Red); + OnCommand(this, inputCmd); } /*! * \brief Places the console according to its layout */ - void Console::Layout() { Nz::Vector2f origin = Nz::Vector2f(GetPosition()); From f5dc27ba032ec02218847999ab420fb022c4b694 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Jul 2019 00:32:57 +0200 Subject: [PATCH 079/192] Fix unit test --- tests/Engine/Network/IpAddress.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Engine/Network/IpAddress.cpp b/tests/Engine/Network/IpAddress.cpp index abcb65909..571e7ec75 100644 --- a/tests/Engine/Network/IpAddress.cpp +++ b/tests/Engine/Network/IpAddress.cpp @@ -40,7 +40,9 @@ SCENARIO("IpAddress", "[NETWORK][IPADDRESS]") Nz::IpAddress google(8, 8, 8, 8); THEN("Google (DNS) is 8.8.8.8") { - CHECK(Nz::IpAddress::ResolveAddress(google) == "google-public-dns-a.google.com"); + Nz::String dnsAddress = Nz::IpAddress::ResolveAddress(google); + bool dnsCheck = dnsAddress == "google-public-dns-a.google.com" || dnsAddress == "dns.google"; + CHECK(dnsCheck); } } } From 7da8945c72e80fb1f0a82ecaeeac792af1fc4044 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Jul 2019 16:28:09 +0200 Subject: [PATCH 080/192] SDK/ScrollAreaWidget: Add EnableScrollbar --- SDK/include/NDK/Widgets/ScrollAreaWidget.hpp | 9 +++++- SDK/include/NDK/Widgets/ScrollAreaWidget.inl | 15 ++++++++++ SDK/src/NDK/Widgets/ScrollAreaWidget.cpp | 30 +++++++++++++++----- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/SDK/include/NDK/Widgets/ScrollAreaWidget.hpp b/SDK/include/NDK/Widgets/ScrollAreaWidget.hpp index 5b7106b1f..17ada16ef 100644 --- a/SDK/include/NDK/Widgets/ScrollAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/ScrollAreaWidget.hpp @@ -21,9 +21,15 @@ namespace Ndk ScrollAreaWidget(ScrollAreaWidget&&) = default; ~ScrollAreaWidget() = default; + void EnableScrollbar(bool enable); + inline float GetScrollHeight() const; inline float GetScrollRatio() const; + inline bool HasScrollbar() const; + inline bool IsScrollbarEnabled() const; + inline bool IsScrollbarVisible() const; + inline void ScrollToHeight(float height); void ScrollToRatio(float ratio); @@ -57,7 +63,8 @@ namespace Ndk Nz::SpriteRef m_scrollbarSprite; Nz::Vector2i m_grabbedDelta; ScrollBarStatus m_scrollbarStatus; - bool m_isScrollBarVisible; + bool m_isScrollbarEnabled; + bool m_hasScrollbar; float m_scrollRatio; }; } diff --git a/SDK/include/NDK/Widgets/ScrollAreaWidget.inl b/SDK/include/NDK/Widgets/ScrollAreaWidget.inl index c98230180..89bea6d47 100644 --- a/SDK/include/NDK/Widgets/ScrollAreaWidget.inl +++ b/SDK/include/NDK/Widgets/ScrollAreaWidget.inl @@ -16,6 +16,21 @@ namespace Ndk return m_scrollRatio; } + inline bool ScrollAreaWidget::HasScrollbar() const + { + return m_hasScrollbar; + } + + inline bool ScrollAreaWidget::IsScrollbarEnabled() const + { + return m_isScrollbarEnabled; + } + + inline bool ScrollAreaWidget::IsScrollbarVisible() const + { + return HasScrollbar() && IsScrollbarEnabled(); + } + inline void ScrollAreaWidget::ScrollToHeight(float height) { float contentHeight = m_content->GetHeight(); diff --git a/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp b/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp index 4f5ca3f6b..b7ec0d020 100644 --- a/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp @@ -18,6 +18,7 @@ namespace Ndk BaseWidget(parent), m_content(content), m_scrollbarStatus(ScrollBarStatus::None), + m_isScrollbarEnabled(true), m_scrollRatio(0.f) { m_content->SetParent(this); @@ -42,6 +43,18 @@ namespace Ndk Resize(m_content->GetSize()); } + void ScrollAreaWidget::EnableScrollbar(bool enable) + { + if (m_isScrollbarEnabled != enable) + { + m_isScrollbarEnabled = enable; + + bool isVisible = IsScrollbarVisible(); + m_scrollbarEntity->Enable(isVisible); + m_scrollbarBackgroundEntity->Enable(isVisible); + } + } + void ScrollAreaWidget::ScrollToRatio(float ratio) { m_scrollRatio = Nz::Clamp(ratio, 0.f, 1.f); @@ -75,13 +88,16 @@ namespace Ndk if (contentHeight > areaHeight) { - m_isScrollBarVisible = true; + m_hasScrollbar = true; Nz::Vector2f contentSize(GetWidth() - scrollBarBackgroundWidth, contentHeight); m_content->Resize(contentSize); - m_scrollbarEntity->Enable(); - m_scrollbarBackgroundEntity->Enable(); + if (m_isScrollbarEnabled) + { + m_scrollbarEntity->Enable(); + m_scrollbarBackgroundEntity->Enable(); + } float scrollBarHeight = std::max(std::floor(areaHeight * (areaHeight / contentHeight)), 20.f); @@ -95,7 +111,7 @@ namespace Ndk } else { - m_isScrollBarVisible = false; + m_hasScrollbar = false; m_content->Resize(GetSize()); @@ -119,7 +135,7 @@ namespace Ndk auto& scrollbarNode = m_scrollbarEntity->GetComponent(); - m_grabbedDelta.Set(x, y - scrollbarNode.GetPosition(Nz::CoordSys_Local).y); + m_grabbedDelta.Set(x, int(y - scrollbarNode.GetPosition(Nz::CoordSys_Local).y)); } } @@ -131,7 +147,7 @@ namespace Ndk if (m_scrollbarStatus == ScrollBarStatus::Grabbed) { Nz::Rectf scrollBarRect = GetScrollbarRect(); - UpdateScrollbarStatus((scrollBarRect.Contains(Nz::Vector2f(x, y))) ? ScrollBarStatus::Hovered : ScrollBarStatus::None); + UpdateScrollbarStatus((scrollBarRect.Contains(Nz::Vector2f(float(x), float(y)))) ? ScrollBarStatus::Hovered : ScrollBarStatus::None); } } @@ -154,7 +170,7 @@ namespace Ndk else { Nz::Rectf scrollBarRect = GetScrollbarRect(); - UpdateScrollbarStatus((scrollBarRect.Contains(Nz::Vector2f(x, y))) ? ScrollBarStatus::Hovered : ScrollBarStatus::None); + UpdateScrollbarStatus((scrollBarRect.Contains(Nz::Vector2f(float(x), float(y)))) ? ScrollBarStatus::Hovered : ScrollBarStatus::None); } } From 8b30fafda68f571eaeba1fb29fdcfdd90de644b9 Mon Sep 17 00:00:00 2001 From: Alexandre Janniaux Date: Sun, 7 Jul 2019 17:21:25 +0200 Subject: [PATCH 081/192] assimp: fix harmful shadow variable and uniform indices naming --- plugins/Assimp/Plugin.cpp | 72 +++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/plugins/Assimp/Plugin.cpp b/plugins/Assimp/Plugin.cpp index 5295d2f5a..3f1e5200a 100644 --- a/plugins/Assimp/Plugin.cpp +++ b/plugins/Assimp/Plugin.cpp @@ -255,14 +255,14 @@ MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) bool animatedMesh = false; if (parameters.animated) { - for (unsigned int i = 0; i < scene->mNumMeshes; ++i) + for (unsigned int meshIdx = 0; meshIdx < scene->mNumMeshes; ++meshIdx) { - aiMesh* currentMesh = scene->mMeshes[i]; + aiMesh* currentMesh = scene->mMeshes[meshIdx]; if (currentMesh->HasBones()) // Inline functions can be safely called { animatedMesh = true; - for (unsigned int j = 0; j < currentMesh->mNumBones; ++j) - joints.insert(currentMesh->mBones[j]->mName.C_Str()); + for (unsigned int boneIdx = 0; boneIdx < currentMesh->mNumBones; ++boneIdx) + joints.insert(currentMesh->mBones[boneIdx]->mName.C_Str()); } } } @@ -284,9 +284,9 @@ MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) // aiMaterial index in scene => Material index and data in Mesh std::unordered_map> materials; - for (unsigned int i = 0; i < scene->mNumMeshes; ++i) + for (unsigned int meshIdx = 0; meshIdx < scene->mNumMeshes; ++meshIdx) { - aiMesh* iMesh = scene->mMeshes[i]; + aiMesh* iMesh = scene->mMeshes[meshIdx]; if (iMesh->HasBones()) { // For now, process only skeletal meshes @@ -303,9 +303,9 @@ MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) IndexMapper indexMapper(indexBuffer, BufferAccess_DiscardAndWrite); IndexIterator index = indexMapper.begin(); - for (unsigned int j = 0; j < iMesh->mNumFaces; ++j) + for (unsigned int faceIdx = 0; faceIdx < iMesh->mNumFaces; ++faceIdx) { - aiFace& face = iMesh->mFaces[j]; + aiFace& face = iMesh->mFaces[faceIdx]; if (face.mNumIndices != 3) NazaraWarning("Assimp plugin: This face is not a triangle!"); @@ -324,30 +324,30 @@ MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) BufferMapper vertexMapper(vertexBuffer, BufferAccess_ReadWrite); SkeletalMeshVertex* vertices = static_cast(vertexMapper.GetPointer()); - for (std::size_t i = 0; i < vertexCount; ++i) + for (std::size_t vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) { - aiVector3D normal = iMesh->mNormals[i]; - aiVector3D position = iMesh->mVertices[i]; - aiVector3D tangent = iMesh->mTangents[i]; - aiVector3D uv = iMesh->mTextureCoords[0][i]; + aiVector3D normal = iMesh->mNormals[vertexIdx]; + aiVector3D position = iMesh->mVertices[vertexIdx]; + aiVector3D tangent = iMesh->mTangents[vertexIdx]; + aiVector3D uv = iMesh->mTextureCoords[0][vertexIdx]; - vertices[i].weightCount = 0; - vertices[i].normal = normalTangentMatrix.Transform({ normal.x, normal.y, normal.z }, 0.f); - vertices[i].position = parameters.matrix * Vector3f(position.x, position.y, position.z); - vertices[i].tangent = normalTangentMatrix.Transform({ tangent.x, tangent.y, tangent.z }, 0.f); - vertices[i].uv = parameters.texCoordOffset + Vector2f(uv.x, uv.y) * parameters.texCoordScale; + vertices[vertexIdx].weightCount = 0; + vertices[vertexIdx].normal = normalTangentMatrix.Transform({ normal.x, normal.y, normal.z }, 0.f); + vertices[vertexIdx].position = parameters.matrix * Vector3f(position.x, position.y, position.z); + vertices[vertexIdx].tangent = normalTangentMatrix.Transform({ tangent.x, tangent.y, tangent.z }, 0.f); + vertices[vertexIdx].uv = parameters.texCoordOffset + Vector2f(uv.x, uv.y) * parameters.texCoordScale; } - for (unsigned int i = 0; i < iMesh->mNumBones; ++i) + for (unsigned int boneIdx = 0; boneIdx < iMesh->mNumBones; ++boneIdx) { - aiBone* bone = iMesh->mBones[i]; - for (unsigned int j = 0; j < bone->mNumWeights; ++j) + aiBone* bone = iMesh->mBones[boneIdx]; + for (unsigned int weightIdx = 0; weightIdx < bone->mNumWeights; ++weightIdx) { - aiVertexWeight& vertexWeight = bone->mWeights[j]; + aiVertexWeight& vertexWeight = bone->mWeights[weightIdx]; SkeletalMeshVertex& vertex = vertices[vertexWeight.mVertexId]; std::size_t weightIndex = vertex.weightCount++; - vertex.jointIndexes[weightIndex] = i; + vertex.jointIndexes[weightIndex] = boneIdx; vertex.weights[weightIndex] = vertexWeight.mWeight; } } @@ -445,9 +445,9 @@ MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) // aiMaterial index in scene => Material index and data in Mesh std::unordered_map> materials; - for (unsigned int i = 0; i < scene->mNumMeshes; ++i) + for (unsigned int meshIdx = 0; meshIdx < scene->mNumMeshes; ++meshIdx) { - aiMesh* iMesh = scene->mMeshes[i]; + aiMesh* iMesh = scene->mMeshes[meshIdx]; if (!iMesh->HasBones()) // Don't process skeletal meshs { unsigned int indexCount = iMesh->mNumFaces * 3; @@ -461,9 +461,9 @@ MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) IndexMapper indexMapper(indexBuffer, BufferAccess_DiscardAndWrite); IndexIterator index = indexMapper.begin(); - for (unsigned int j = 0; j < iMesh->mNumFaces; ++j) + for (unsigned int faceIdx = 0; faceIdx < iMesh->mNumFaces; ++faceIdx) { - aiFace& face = iMesh->mFaces[j]; + aiFace& face = iMesh->mFaces[faceIdx]; if (face.mNumIndices != 3) NazaraWarning("Assimp plugin: This face is not a triangle!"); @@ -485,17 +485,17 @@ MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) VertexMapper vertexMapper(vertexBuffer, BufferAccess_DiscardAndWrite); auto posPtr = vertexMapper.GetComponentPtr(VertexComponent_Position); - for (unsigned int j = 0; j < vertexCount; ++j) + for (unsigned int vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) { - aiVector3D position = iMesh->mVertices[j]; + aiVector3D position = iMesh->mVertices[vertexIdx]; *posPtr++ = parameters.matrix * Vector3f(position.x, position.y, position.z); } if (auto normalPtr = vertexMapper.GetComponentPtr(VertexComponent_Normal)) { - for (unsigned int j = 0; j < vertexCount; ++j) + for (unsigned int vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) { - aiVector3D normal = iMesh->mNormals[j]; + aiVector3D normal = iMesh->mNormals[vertexIdx]; *normalPtr++ = normalTangentMatrix.Transform({normal.x, normal.y, normal.z}, 0.f); } } @@ -505,9 +505,9 @@ MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) { if (iMesh->HasTangentsAndBitangents()) { - for (unsigned int j = 0; j < vertexCount; ++j) + for (unsigned int vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) { - aiVector3D tangent = iMesh->mTangents[j]; + aiVector3D tangent = iMesh->mTangents[vertexIdx]; *tangentPtr++ = normalTangentMatrix.Transform({tangent.x, tangent.y, tangent.z}, 0.f); } } @@ -519,15 +519,15 @@ MeshRef LoadMesh(Stream& stream, const MeshParams& parameters) { if (iMesh->HasTextureCoords(0)) { - for (unsigned int j = 0; j < vertexCount; ++j) + for (unsigned int vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) { - aiVector3D uv = iMesh->mTextureCoords[0][j]; + aiVector3D uv = iMesh->mTextureCoords[0][vertexIdx]; *uvPtr++ = parameters.texCoordOffset + Vector2f(uv.x, uv.y) * parameters.texCoordScale; } } else { - for (unsigned int j = 0; j < vertexCount; ++j) + for (unsigned int vertexIdx = 0; vertexIdx < vertexCount; ++vertexIdx) *uvPtr++ = Vector2f::Zero(); } } From 724adb599a8c89233267eaf82dfe6b7a17c02436 Mon Sep 17 00:00:00 2001 From: Alexandre Janniaux Date: Sun, 7 Jul 2019 17:24:04 +0200 Subject: [PATCH 082/192] SDK: BaseWidget: silence harmless shadow warnings --- SDK/src/NDK/BaseWidget.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index 647f451c6..07f9afa9f 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -197,9 +197,9 @@ namespace Ndk newEntity->Enable(m_visible); m_entities.emplace_back(); - WidgetEntity& widgetEntity = m_entities.back(); - widgetEntity.handle = newEntity; - widgetEntity.onDisabledSlot.Connect(newEntity->OnEntityDisabled, [this](Entity* entity) + WidgetEntity& newWidgetEntity = m_entities.back(); + newWidgetEntity.handle = newEntity; + newWidgetEntity.onDisabledSlot.Connect(newEntity->OnEntityDisabled, [this](Entity* entity) { auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; }); NazaraAssert(it != m_entities.end(), "Entity does not belong to this widget"); @@ -207,7 +207,7 @@ namespace Ndk it->isEnabled = false; }); - widgetEntity.onEnabledSlot.Connect(newEntity->OnEntityEnabled, [this](Entity* entity) + newWidgetEntity.onEnabledSlot.Connect(newEntity->OnEntityEnabled, [this](Entity* entity) { auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; }); NazaraAssert(it != m_entities.end(), "Entity does not belong to this widget"); From e29f2f7a9203e8dce936b69325ede0231f93851a Mon Sep 17 00:00:00 2001 From: Alexandre Janniaux Date: Sun, 7 Jul 2019 17:24:29 +0200 Subject: [PATCH 083/192] SDK: TextAreaWidget: silence harmless shadow warnings --- SDK/src/NDK/Widgets/TextAreaWidget.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 3ab119a0a..5f331f878 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -582,9 +582,9 @@ namespace Ndk }; // Move text so that cursor is always visible - const auto* glyph = GetGlyph(m_cursorPositionEnd, nullptr); - float glyphPos = (glyph) ? glyph->bounds.x : 0.f; - float glyphWidth = (glyph) ? glyph->bounds.width : 0.f; + const auto* lastGlyph = GetGlyph(m_cursorPositionEnd, nullptr); + float glyphPos = (lastGlyph) ? lastGlyph->bounds.x : 0.f; + float glyphWidth = (lastGlyph) ? lastGlyph->bounds.width : 0.f; auto& node = m_textEntity->GetComponent(); float textPosition = node.GetPosition(Nz::CoordSys_Local).x - paddingWidth; From 6b63679c73d1f64ab4737eeb3c0558fb56672a2d Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Jul 2019 19:19:18 +0200 Subject: [PATCH 084/192] Canvas: Add OnUnhandledKeyPressed|`Released --- SDK/include/NDK/Canvas.hpp | 3 + SDK/src/NDK/Canvas.cpp | 8 +- SDK/src/NDK/Widgets/TextAreaWidget.cpp | 120 ++++++++++++------------- 3 files changed, 68 insertions(+), 63 deletions(-) diff --git a/SDK/include/NDK/Canvas.hpp b/SDK/include/NDK/Canvas.hpp index 1b0fbda4f..26cc36cbd 100644 --- a/SDK/include/NDK/Canvas.hpp +++ b/SDK/include/NDK/Canvas.hpp @@ -31,6 +31,9 @@ namespace Ndk Canvas& operator=(const Canvas&) = delete; Canvas& operator=(Canvas&&) = delete; + NazaraSignal(OnUnhandledKeyPressed, const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::KeyEvent& /*event*/); + NazaraSignal(OnUnhandledKeyReleased, const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::KeyEvent& /*event*/); + protected: inline void ClearKeyboardOwner(std::size_t canvasIndex); diff --git a/SDK/src/NDK/Canvas.cpp b/SDK/src/NDK/Canvas.cpp index aced59e4e..f6d27ad15 100644 --- a/SDK/src/NDK/Canvas.cpp +++ b/SDK/src/NDK/Canvas.cpp @@ -150,7 +150,7 @@ namespace Ndk } } - void Canvas::OnEventKeyPressed(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::KeyEvent& event) + void Canvas::OnEventKeyPressed(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::KeyEvent& event) { if (m_keyboardOwner != InvalidCanvasIndex) { @@ -204,12 +204,16 @@ namespace Ndk } } } + + OnUnhandledKeyPressed(eventHandler, event); } - void Canvas::OnEventKeyReleased(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::KeyEvent& event) + void Canvas::OnEventKeyReleased(const Nz::EventHandler* eventHandler, const Nz::WindowEvent::KeyEvent& event) { if (m_keyboardOwner != InvalidCanvasIndex) m_widgetEntries[m_keyboardOwner].widget->OnKeyReleased(event); + + OnUnhandledKeyReleased(eventHandler, event); } void Canvas::OnEventTextEntered(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::TextEvent& event) diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 3ab119a0a..e823e54e8 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -243,6 +243,39 @@ namespace Ndk { switch (key.code) { + case Nz::Keyboard::Backspace: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyBackspace(this, &ignoreDefaultAction); + + std::size_t cursorGlyphBegin = GetGlyphIndex(m_cursorPositionBegin); + std::size_t cursorGlyphEnd = GetGlyphIndex(m_cursorPositionEnd); + + if (ignoreDefaultAction || cursorGlyphEnd == 0) + return true; + + // When a text is selected, delete key does the same as delete and leave the character behind it + if (HasSelection()) + EraseSelection(); + else + { + Nz::String newText; + + if (cursorGlyphBegin > 1) + newText.Append(m_text.SubString(0, m_text.GetCharacterPosition(cursorGlyphBegin - 1) - 1)); + + if (cursorGlyphEnd < m_text.GetLength()) + newText.Append(m_text.SubString(m_text.GetCharacterPosition(cursorGlyphEnd))); + + // Move cursor before setting text (to prevent SetText to move our cursor) + MoveCursor(-1); + + SetText(newText); + } + + return true; + } + case Nz::Keyboard::Delete: { if (HasSelection()) @@ -335,6 +368,24 @@ namespace Ndk return true; } + case Nz::Keyboard::Return: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyReturn(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (!m_multiLineEnabled) + break; + + if (HasSelection()) + EraseSelection(); + + Write(Nz::String('\n')); + return true;; + } + case Nz::Keyboard::Right: { bool ignoreDefaultAction = false; @@ -442,8 +493,10 @@ namespace Ndk } default: - return false; + break; } + + return false; } void TextAreaWidget::OnKeyReleased(const Nz::WindowEvent::KeyEvent& /*key*/) @@ -494,68 +547,13 @@ namespace Ndk if (m_readOnly) return; - switch (character) - { - case '\b': - { - bool ignoreDefaultAction = false; - OnTextAreaKeyBackspace(this, &ignoreDefaultAction); + if (Nz::Unicode::GetCategory(character) == Nz::Unicode::Category_Other_Control || (m_characterFilter && !m_characterFilter(character))) + return; - std::size_t cursorGlyphBegin = GetGlyphIndex(m_cursorPositionBegin); - std::size_t cursorGlyphEnd = GetGlyphIndex(m_cursorPositionEnd); + if (HasSelection()) + EraseSelection(); - if (ignoreDefaultAction || cursorGlyphEnd == 0) - break; - - // When a text is selected, delete key does the same as delete and leave the character behind it - if (HasSelection()) - EraseSelection(); - else - { - Nz::String newText; - - if (cursorGlyphBegin > 1) - newText.Append(m_text.SubString(0, m_text.GetCharacterPosition(cursorGlyphBegin - 1) - 1)); - - if (cursorGlyphEnd < m_text.GetLength()) - newText.Append(m_text.SubString(m_text.GetCharacterPosition(cursorGlyphEnd))); - - // Move cursor before setting text (to prevent SetText to move our cursor) - MoveCursor(-1); - - SetText(newText); - } - break; - } - - case '\r': - case '\n': - { - bool ignoreDefaultAction = false; - OnTextAreaKeyReturn(this, &ignoreDefaultAction); - - if (ignoreDefaultAction || !m_multiLineEnabled) - break; - - if (HasSelection()) - EraseSelection(); - - Write(Nz::String('\n')); - break; - } - - default: - { - if (Nz::Unicode::GetCategory(character) == Nz::Unicode::Category_Other_Control || (m_characterFilter && !m_characterFilter(character))) - break; - - if (HasSelection()) - EraseSelection(); - - Write(Nz::String::Unicode(character)); - break; - } - } + Write(Nz::String::Unicode(character)); } void TextAreaWidget::RefreshCursor() From 71ca599869ae499bcd4e03d6cc46100249ed6ba5 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Jul 2019 19:19:35 +0200 Subject: [PATCH 085/192] SDK/Console: Fix history lines handling --- SDK/src/NDK/Console.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 964bb6b9c..abd333bd3 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -38,7 +38,8 @@ namespace Ndk BaseWidget(parent), m_historyPosition(0), m_defaultFont(Nz::Font::GetDefault()), - m_characterSize(24) + m_characterSize(24), + m_maxHistoryLines(200) { // History m_history = Add(); @@ -107,6 +108,9 @@ namespace Ndk */ void Console::AddLine(const Nz::String& text, const Nz::Color& color) { + if (m_historyLines.size() >= m_maxHistoryLines) + m_historyLines.erase(m_historyLines.begin()); + m_historyLines.emplace_back(Line{ color, text }); m_history->AppendText(text + '\n'); m_history->Resize(m_history->GetPreferredSize()); @@ -183,10 +187,12 @@ namespace Ndk /*! * \brief Performs this action when an input is added to the console */ - void Console::ExecuteInput(const TextAreaWidget* textArea, bool* /*ignoreDefaultAction*/) + void Console::ExecuteInput(const TextAreaWidget* textArea, bool* ignoreDefaultAction) { NazaraAssert(textArea == m_input, "Unexpected signal from an other text area"); + *ignoreDefaultAction = true; + Nz::String input = m_input->GetText(); Nz::String inputCmd = input.SubString(s_inputPrefixSize); m_input->SetText(s_inputPrefix); @@ -212,11 +218,8 @@ namespace Ndk unsigned int lineHeight = m_defaultFont->GetSizeInfo(m_characterSize).lineHeight; float historyHeight = size.y - lineHeight; - m_maxHistoryLines = static_cast(std::ceil(historyHeight / lineHeight)); - float diff = historyHeight - m_maxHistoryLines * lineHeight; - - m_historyArea->SetPosition(origin.x, origin.y + diff); - m_historyArea->Resize({ size.x, historyHeight - diff - 4.f }); + m_historyArea->SetPosition(origin.x, origin.y); + m_historyArea->Resize({ size.x, historyHeight - 4.f }); m_input->Resize({size.x, size.y - historyHeight}); m_input->SetPosition(origin.x, origin.y + historyHeight); From 161dc5d6c294290e39e00e903e276d1358ebcb62 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 12 Jul 2019 21:17:25 +0200 Subject: [PATCH 086/192] Update ScrollAreaWidget.cpp --- SDK/src/NDK/Widgets/ScrollAreaWidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp b/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp index b7ec0d020..434071f02 100644 --- a/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp @@ -26,7 +26,7 @@ namespace Ndk m_scrollbarBackgroundSprite = Nz::Sprite::New(); m_scrollbarBackgroundSprite->SetColor(Nz::Color(62, 62, 62)); - m_scrollbarBackgroundSprite->SetMaterial("Basic2D"); + m_scrollbarBackgroundSprite->SetMaterial(Nz::Material::New("Basic2D")); m_scrollbarBackgroundEntity = CreateEntity(); m_scrollbarBackgroundEntity->AddComponent().SetParent(this); @@ -34,7 +34,7 @@ namespace Ndk m_scrollbarSprite = Nz::Sprite::New(); m_scrollbarSprite->SetColor(Nz::Color(104, 104, 104)); - m_scrollbarSprite->SetMaterial("Basic2D"); + m_scrollbarSprite->SetMaterial(Nz::Material::New("Basic2D")); m_scrollbarEntity = CreateEntity(); m_scrollbarEntity->AddComponent().SetParent(this); From 9a8ccee04125317806d1f57c92a69634ed4d87f4 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 13 Jul 2019 20:12:13 +0200 Subject: [PATCH 087/192] Update ScrollAreaWidget.cpp --- SDK/src/NDK/Widgets/ScrollAreaWidget.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp b/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp index 434071f02..0d7c1f934 100644 --- a/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/ScrollAreaWidget.cpp @@ -26,7 +26,6 @@ namespace Ndk m_scrollbarBackgroundSprite = Nz::Sprite::New(); m_scrollbarBackgroundSprite->SetColor(Nz::Color(62, 62, 62)); - m_scrollbarBackgroundSprite->SetMaterial(Nz::Material::New("Basic2D")); m_scrollbarBackgroundEntity = CreateEntity(); m_scrollbarBackgroundEntity->AddComponent().SetParent(this); @@ -34,7 +33,6 @@ namespace Ndk m_scrollbarSprite = Nz::Sprite::New(); m_scrollbarSprite->SetColor(Nz::Color(104, 104, 104)); - m_scrollbarSprite->SetMaterial(Nz::Material::New("Basic2D")); m_scrollbarEntity = CreateEntity(); m_scrollbarEntity->AddComponent().SetParent(this); From 6d417c6e54d5fe107a5d9fe09af86742b8efb34c Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 13 Jul 2019 23:52:31 +0200 Subject: [PATCH 088/192] SDK/BaseWidget: Fix entity activation of disabled widgets --- SDK/src/NDK/BaseWidget.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index 07f9afa9f..be7049938 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -212,6 +212,9 @@ namespace Ndk auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; }); NazaraAssert(it != m_entities.end(), "Entity does not belong to this widget"); + if (!IsVisible()) + entity->Disable(); // Next line will override isEnabled status + it->isEnabled = true; }); From bec528c4b54d63faace18a35ee30bf2c17d56217 Mon Sep 17 00:00:00 2001 From: Gawaboumga Date: Sat, 20 Jul 2019 10:12:23 +0200 Subject: [PATCH 089/192] Add special files at root --- AUTHORS | 5 +++++ INSTALL.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ THANKS.md | 26 ++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 AUTHORS create mode 100644 INSTALL.md create mode 100644 THANKS.md diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..24e079909 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,5 @@ +Nazara Engine was originally created in early 2012. +It follows a complete overhaul of a previous project in order to offer more features and modularity. + +Jérôme "Lynix" Leclercq - main developper (lynix680@gmail.com) +Full Cycle Games - sponsor and contributor since January 2017. diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 000000000..05c162982 --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,53 @@ +# Installation + +> **Notice**: For french speakers, a more detailed explanation of the instructions is provided here: [Instructions pour compiler](wiki/(FR)-Compiler-le-moteur). + +The first step to using the engine is to recover it. This can currently be done in two ways: +1) This can be don either from the original github (only the development is continuously evolving): +```git clone https://github.com/DigitalPulseSoftware/NazaraEngine.git``` +2) Or by downloading a [zip file](https://github.com/DigitalPulseSoftware/NazaraEngine/archive/master.zip) containing the entire source code of the engine. + +All you have to do is go to the "build/" folder. The compilation system uses [premake](https://premake.github.io/) to generate build systems. + +## Windows +For Windows users, they can directly use ".bat" files such as: "Build_VS2017.bat". It will generate a solution "NazaraEngine.sln" ready to use that you can directly build to produce the libs or execute the samples. + +## Linux + +Linux users, can type: "./premake5-linux64 gmake" or with the additional argument "--cc=clang" to configure the C++ compiler used. + +Some additional libraries will be required for compilation depending on the modules used: + +#### Audio module (OpenAL and libsndfile) + +- with apt: `sudo apt-get install libopenal-dev libsndfile1-dev` +- with pacman: `sudo pacman -S openal libsndfile` + +#### Platform module (Freetype): + +- with apt: `sudo apt-get install libfreetype6-dev` +- with pacman: `sudo pacman -S freetype2` + +#### Utility module (XCB + X11): + +- with apt: `sudo apt-get install libxcb-cursor-dev libxcb-ewmh-dev libxcb-randr0-dev libxcb-icccm4-dev libxcb-keysyms1-dev libx11-dev` +- with pacman: `sudo pacman -S libxcb libx11` + +#### OpenGL renderer module: + +- with apt: `sudo apt-get install mesa-common-dev libgl1-mesa-dev` +- with pacman: `sudo pacman -S mesa` + +#### Plugin Assimp: + +- with apt: `sudo apt-get install libassimp-dev` +- with pacman: `sudo pacman -S assimp` + +#### The one line command to install everything is: + +- with apt: `sudo apt-get install libopenal-dev libsndfile1-dev libfreetype6-dev libxcb-cursor-dev libxcb-ewmh-dev libxcb-randr0-dev libxcb-icccm4-dev libxcb-keysyms1-dev libx11-dev mesa-common-dev libgl1-mesa-dev libassimp-dev` +- with pacman: `sudo pacman -S openal libsndfile freetype2 libxcb libx11 mesa assimp` + +## Test + +One should now be able to execute the samples provided in the folder "NazaraEngine/examples/bin/" or the unit tests within "NazaraEngine/tests/". \ No newline at end of file diff --git a/THANKS.md b/THANKS.md new file mode 100644 index 000000000..b2821222e --- /dev/null +++ b/THANKS.md @@ -0,0 +1,26 @@ +# Thanks + +A special thank you to all those who may have contributed directly or indirectly to this project. We can mention: + +- **RafBill** and **Raakz:** Finding bugs and/or testing. +- **Fissal "DrFisher" Hannoun**: Helping a lot in architecture design. +- **Alexandre "Danman" Janniaux**: Helping making the POSIX implementation. +- **Youri "Gawaboumga" Hubaut**: Improving the whole project by making the documentation, improving the code, and more. +- **Rémi "overdrivr" Bèges**: Made the Noise module. + +## Additional thanks + +This engine also uses different projects, we obviously thank their respective authors and contributors: + +- [Assimp](http://www.assimp.org/): Model loader. +- [Catch2](https://github.com/catchorg/Catch2): Test framework for C++. +- [Chimpmunk](http://chipmunk-physics.net/): Physics engine for 2D. +- [Freetype](https://www.freetype.org/): Font rendering library. +- [Lua](https://www.lua.org/): Scripting library. +- [Netwon](http://newtondynamics.com/forum/newton.php): Physics engine for 3D. +- [Sndfile](http://www.mega-nerd.com/libsndfile/): Audio loader. +- [Stb](https://github.com/nothings/stb): Image loader. +- [Utfcpp](http://utfcpp.sourceforge.net/): UTF-8 handler. +- [OpenAL](https://www.openal.org/): Audio API specification. +- [OpenGL](https://www.khronos.org/opengl/): Graphics API specification. +- [Vulkan](https://www.khronos.org/vulkan/): New graphics API specification which replaced OpenGL. From 6c733ec19727db735b1db934a4bdcd620003ad1b Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 21 Jul 2019 11:18:36 +0200 Subject: [PATCH 092/192] Add VS2019 shortcut + include premake projects by default --- .gitignore | 2 ++ build/Build_VS2015.bat | 2 +- build/Build_VS2017.bat | 2 +- build/Build_VS2019.bat | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 build/Build_VS2019.bat diff --git a/.gitignore b/.gitignore index 92e76fa18..0395c3478 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,8 @@ build/**/*.nativecodeanalysis.all.xml build/**/*.nativecodeanalysis.xml build/**/*.VC.opendb build/**/*.VC.db* +build/**/*.json +build/**/*.sqlite # Compiled Object files build/**/*.slo diff --git a/build/Build_VS2015.bat b/build/Build_VS2015.bat index c74550817..8657a02cb 100644 --- a/build/Build_VS2015.bat +++ b/build/Build_VS2015.bat @@ -1 +1 @@ -.\premake5.exe vs2015 +.\premake5.exe --premakeproject vs2015 diff --git a/build/Build_VS2017.bat b/build/Build_VS2017.bat index 51c0417d0..c172c5a59 100644 --- a/build/Build_VS2017.bat +++ b/build/Build_VS2017.bat @@ -1 +1 @@ -.\premake5.exe vs2017 +.\premake5.exe --premakeproject vs2017 diff --git a/build/Build_VS2019.bat b/build/Build_VS2019.bat new file mode 100644 index 000000000..f9dd7c987 --- /dev/null +++ b/build/Build_VS2019.bat @@ -0,0 +1 @@ +.\premake5.exe --premakeproject vs2019 From 724972e88974cdfad1c18aad6bb9d25e35575e82 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 1 Sep 2019 11:15:02 +0200 Subject: [PATCH 093/192] Core/TypeTag: Add Type helper typedef --- ChangeLog.md | 1 + include/Nazara/Core/TypeTag.hpp | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 587e763bd..e3a07e3f0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -191,6 +191,7 @@ Nazara Engine: - Added PhysWorld2D::[RaycastQuery, RegionQuery] overloads taking a callback - Added x and y mouse position to MouseWheelEvent - Added SimpleTextDrawer::[Get|Set]MaxLineWidth (which does line wrap) +- TypeTag helper struct now includes a Type using Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/TypeTag.hpp b/include/Nazara/Core/TypeTag.hpp index 150802b01..c7f6c0f4e 100644 --- a/include/Nazara/Core/TypeTag.hpp +++ b/include/Nazara/Core/TypeTag.hpp @@ -10,7 +10,10 @@ namespace Nz { template - struct TypeTag {}; + struct TypeTag + { + using Type = T; + }; } #endif // NAZARA_TYPETAG_HPP From 8013bd5d3b675b13283b382b6b94909daec4cc4f Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 15 Mar 2016 23:02:00 +0100 Subject: [PATCH 094/192] Add current work Former-commit-id: 7f1e46e484edbbfd120a7a67ea1c36bee460e517 --- include/Nazara/Utility/RichTextDrawer.hpp | 140 ++++++++++++++++++++++ include/Nazara/Utility/RichTextDrawer.inl | 133 ++++++++++++++++++++ 2 files changed, 273 insertions(+) create mode 100644 include/Nazara/Utility/RichTextDrawer.hpp create mode 100644 include/Nazara/Utility/RichTextDrawer.inl diff --git a/include/Nazara/Utility/RichTextDrawer.hpp b/include/Nazara/Utility/RichTextDrawer.hpp new file mode 100644 index 000000000..65375c13c --- /dev/null +++ b/include/Nazara/Utility/RichTextDrawer.hpp @@ -0,0 +1,140 @@ +// Copyright (C) 2016 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_RICHTEXTDRAWER_HPP +#define NAZARA_RICHTEXTDRAWER_HPP + +#include +#include +#include +#include +#include +#include + +namespace Nz +{ + class NAZARA_UTILITY_API RichTextDrawer : public AbstractTextDrawer + { + public: + class BlockRef; + + RichTextDrawer(); + RichTextDrawer(const RichTextDrawer& drawer); + RichTextDrawer(RichTextDrawer&& drawer); + virtual ~RichTextDrawer(); + + BlockRef Append(const String& str); + + void Clear(); + + unsigned int GetBlockCharacterSize(std::size_t index) const; + const Color& GetBlockColor(std::size_t index) const; + std::size_t GetBlockCount() const; + const FontRef& GetBlockFont(std::size_t index) const; + UInt32 GetBlockStyle(std::size_t index) const; + const String& GetBlockText(std::size_t index) const; + + unsigned int GetDefaultCharacterSize() const; + const Color& GetDefaultColor() const; + const FontRef& GetDefaultFont() const; + UInt32 GetDefaultStyle() const; + + const Rectui& GetBounds() const override; + Font* GetFont(unsigned int index) const override; + unsigned int GetFontCount() const override; + const Glyph& GetGlyph(unsigned int index) const override; + unsigned int GetGlyphCount() const override; + + void MergeBlocks(); + + void RemoveBlock(std::size_t index); + + void SetBlockCharacterSize(std::size_t index, unsigned int characterSize); + void SetBlockColor(std::size_t index, const Color& color); + void SetBlockFont(std::size_t index, FontRef font); + void SetBlockStyle(std::size_t index, UInt32 style); + void SetBlockText(std::size_t index, const String& str); + + void SetDefaultCharacterSize(unsigned int characterSize); + void SetDefaultColor(const Color& color); + void SetDefaultFont(FontRef font); + void SetDefaultStyle(UInt32 style); + + RichTextDrawer& operator=(const RichTextDrawer& drawer); + RichTextDrawer& operator=(RichTextDrawer&& drawer); + + static RichTextDrawer Draw(const String& str, unsigned int characterSize, UInt32 style = TextStyle_Regular, const Color& color = Color::White); + static RichTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, UInt32 style = TextStyle_Regular, const Color& color = Color::White); + + private: + void ClearGlyphs() const; + void ConnectFontSlots(); + void DisconnectFontSlots(); + void GenerateGlyphs(const String& text) const; + void OnFontAtlasLayerChanged(const Font* font, AbstractImage* oldLayer, AbstractImage* newLayer); + void OnFontInvalidated(const Font* font); + void OnFontRelease(const Font* object); + void UpdateGlyphs() const; + + NazaraSlot(Font, OnFontAtlasChanged, m_atlasChangedSlot); + NazaraSlot(Font, OnFontAtlasLayerChanged, m_atlasLayerChangedSlot); + NazaraSlot(Font, OnFontGlyphCacheCleared, m_glyphCacheClearedSlot); + NazaraSlot(Font, OnFontRelease, m_fontReleaseSlot); + + struct Block + { + Color color; + String text; + UInt32 style; + unsigned int characterSize; + unsigned int fontIndex; + }; + + Color m_defaultColor; + FontRef m_defaultFont; + UInt32 m_defaultStyle; + unsigned int m_defaultCharacterSize; + std::unordered_map m_fonts; + mutable std::vector m_glyphs; + mutable Rectf m_workingBounds; + mutable Rectui m_bounds; + mutable Vector2ui m_drawPos; + mutable bool m_glyphUpdated; + }; + + class RichTextDrawer::BlockRef + { + public: + BlockRef(const BlockRef&) = default; + BlockRef(BlockRef&&) = default; + ~BlockRef() = default; + + inline unsigned int GetCharacterSize() const; + inline Color GetColor() const; + inline const FontRef& GetFont() const; + inline UInt32 GetStyle() const; + inline const String& GetText() const; + + inline void SetCharacterSize(unsigned int size); + inline void SetColor(Color color); + inline void SetFont(FontRef font); + inline void SetStyle(UInt32 style); + inline void SetText(const String& text); + + BlockRef& operator=(const BlockRef&) = default; + BlockRef& operator=(BlockRef&&) = default; + + private: + inline BlockRef(RichTextDrawer& drawer, std::size_t index); + + std::size_t m_blockIndex; + RichTextDrawer& m_drawer; + }; +} + +#include + +#endif // NAZARA_RICHTEXTDRAWER_HPP diff --git a/include/Nazara/Utility/RichTextDrawer.inl b/include/Nazara/Utility/RichTextDrawer.inl new file mode 100644 index 000000000..5af95ec84 --- /dev/null +++ b/include/Nazara/Utility/RichTextDrawer.inl @@ -0,0 +1,133 @@ +// Copyright (C) 2016 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include + +namespace Nz +{ + /*! + * \class Nz::RichTextDrawer::BlockRef + * \brief Helper class representing a block inside a RichTextDrawer, allowing easier access. + * + * \warning This class is meant for temporary use, moving or destroying the RichTextDrawer or one of its blocks invalidates all BlockRef + */ + + inline RichTextDrawer::BlockRef::BlockRef(RichTextDrawer& drawer, std::size_t index) : + m_blockIndex(index), + m_drawer(drawer) + { + } + + /*! + * Returns the character size used for the characters of the referenced block + * \return The referenced block character size + * + * \see GetColor, GetFont, GetStyle, GetText, SetCharacterSize + */ + inline unsigned int RichTextDrawer::BlockRef::GetCharacterSize() const + { + return m_drawer.GetBlockCharacterSize(m_blockIndex); + } + + /*! + * Returns the color used for the characters of the referenced block + * \return The referenced block color + * + * \see GetCharacterSize, GetFont, GetStyle, GetText, SetColor + */ + inline Color RichTextDrawer::BlockRef::GetColor() const + { + return m_drawer.GetBlockColor(m_blockIndex); + } + + /*! + * Returns the font used for the characters of the referenced block + * \return A reference on the referenced block font + * + * \see GetCharacterSize, GetColor, GetStyle, GetText, SetFont + */ + inline const FontRef& RichTextDrawer::BlockRef::GetFont() const + { + return m_drawer.GetBlockFont(m_blockIndex); + } + + /*! + * Returns the style flags used for the characters of the referenced block + * \return The referenced block style flags (see TextStyleFlags) + * + * \see GetCharacterSize, GetColor, GetFont, GetText, SetStyle + */ + inline UInt32 RichTextDrawer::BlockRef::GetStyle() const + { + return m_drawer.GetBlockStyle(m_blockIndex); + } + + /*! + * Returns the text of the referenced block + * \return The referenced block text + * + * \see GetCharacterSize, GetColor, GetFont, GetStyle, SetText + */ + inline const String& RichTextDrawer::BlockRef::GetText() const + { + return m_drawer.GetBlockText(m_blockIndex); + } + + /*! + * Changes the character size of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetCharacterSize, SetColor, SetFont, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetCharacterSize(unsigned int size) + { + m_drawer.SetBlockCharacterSize(m_blockIndex, size); + } + + /*! + * Changes the color of the referenced block characters + * \remark This is the only property that can be changed without forcing a glyph regeneration + * + * \see GetColor, SetCharacterSize, SetFont, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetColor(Color color) + { + m_drawer.SetBlockColor(m_blockIndex, color); + } + + /*! + * Changes the font of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetCharacterSize, SetCharacterSize, SetColor, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetFont(FontRef font) + { + m_drawer.SetBlockFont(m_blockIndex, std::move(font)); + } + + /*! + * Changes the style flags of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetStyle, SetCharacterSize, SetColor, SetFont, SetText + */ + inline void RichTextDrawer::BlockRef::SetStyle(UInt32 style) + { + m_drawer.SetBlockStyle(m_blockIndex, style); + } + + /*! + * Changes the text of the referenced block + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetText, SetCharacterSize, SetColor, SetFont, SetStyle + */ + inline void RichTextDrawer::BlockRef::SetText(const String& text) + { + m_drawer.SetBlockText(m_blockIndex, text); + } +} + +#include From 5504dd59fbd8eeae136394b2cc61fa86ca2a2338 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 1 Sep 2017 08:58:42 +0200 Subject: [PATCH 095/192] Utility/RichTextDrawer: Update header --- include/Nazara/Utility/RichTextDrawer.hpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/include/Nazara/Utility/RichTextDrawer.hpp b/include/Nazara/Utility/RichTextDrawer.hpp index 65375c13c..b3154b740 100644 --- a/include/Nazara/Utility/RichTextDrawer.hpp +++ b/include/Nazara/Utility/RichTextDrawer.hpp @@ -42,11 +42,13 @@ namespace Nz const FontRef& GetDefaultFont() const; UInt32 GetDefaultStyle() const; - const Rectui& GetBounds() const override; - Font* GetFont(unsigned int index) const override; - unsigned int GetFontCount() const override; - const Glyph& GetGlyph(unsigned int index) const override; - unsigned int GetGlyphCount() const override; + const Recti& GetBounds() const override; + Font* GetFont(std::size_t index) const override; + std::size_t GetFontCount() const override; + const Glyph& GetGlyph(std::size_t index) const override; + std::size_t GetGlyphCount() const override; + const Line& GetLine(std::size_t index) const override; + std::size_t GetLineCount() const override; void MergeBlocks(); @@ -98,6 +100,7 @@ namespace Nz UInt32 m_defaultStyle; unsigned int m_defaultCharacterSize; std::unordered_map m_fonts; + std::vector m_blocks; mutable std::vector m_glyphs; mutable Rectf m_workingBounds; mutable Rectui m_bounds; From 6bc99a6d5eb4ca3aff1933befd8b5d90b02cc10c Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Jul 2019 22:50:22 +0200 Subject: [PATCH 096/192] Utility/SimpleTextDrawer: Fix reserve --- src/Nazara/Utility/SimpleTextDrawer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 6bf0830df..aca74968d 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -452,7 +452,7 @@ namespace Nz const Font::SizeInfo& sizeInfo = m_font->GetSizeInfo(m_characterSize); - m_glyphs.reserve(m_glyphs.size() + characters.size() * (m_outlineThickness > 0.f) ? 2 : 1); + m_glyphs.reserve(m_glyphs.size() + characters.size() * ((m_outlineThickness > 0.f) ? 2 : 1)); for (char32_t character : characters) { if (m_previousCharacter != 0) From 451b3de69c1421447b033b8f326989d06c716cce Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Jul 2019 22:53:06 +0200 Subject: [PATCH 097/192] Utility: RichTextDrawer now works (WIP) --- include/Nazara/Utility/RichTextDrawer.hpp | 104 +++-- include/Nazara/Utility/RichTextDrawer.inl | 232 ++++++++++- src/Nazara/Utility/RichTextDrawer.cpp | 476 ++++++++++++++++++++++ 3 files changed, 768 insertions(+), 44 deletions(-) create mode 100644 src/Nazara/Utility/RichTextDrawer.cpp diff --git a/include/Nazara/Utility/RichTextDrawer.hpp b/include/Nazara/Utility/RichTextDrawer.hpp index b3154b740..3a681e20d 100644 --- a/include/Nazara/Utility/RichTextDrawer.hpp +++ b/include/Nazara/Utility/RichTextDrawer.hpp @@ -7,7 +7,7 @@ #ifndef NAZARA_RICHTEXTDRAWER_HPP #define NAZARA_RICHTEXTDRAWER_HPP -#include +#include #include #include #include @@ -24,23 +24,23 @@ namespace Nz RichTextDrawer(); RichTextDrawer(const RichTextDrawer& drawer); RichTextDrawer(RichTextDrawer&& drawer); - virtual ~RichTextDrawer(); + ~RichTextDrawer(); - BlockRef Append(const String& str); + BlockRef AppendText(const String& str); - void Clear(); + inline void Clear(); - unsigned int GetBlockCharacterSize(std::size_t index) const; - const Color& GetBlockColor(std::size_t index) const; - std::size_t GetBlockCount() const; - const FontRef& GetBlockFont(std::size_t index) const; - UInt32 GetBlockStyle(std::size_t index) const; - const String& GetBlockText(std::size_t index) const; + inline unsigned int GetBlockCharacterSize(std::size_t index) const; + inline const Color& GetBlockColor(std::size_t index) const; + inline std::size_t GetBlockCount() const; + inline const FontRef& GetBlockFont(std::size_t index) const; + inline TextStyleFlags GetBlockStyle(std::size_t index) const; + inline const String& GetBlockText(std::size_t index) const; - unsigned int GetDefaultCharacterSize() const; - const Color& GetDefaultColor() const; - const FontRef& GetDefaultFont() const; - UInt32 GetDefaultStyle() const; + inline unsigned int GetDefaultCharacterSize() const; + inline const Color& GetDefaultColor() const; + inline const FontRef& GetDefaultFont() const; + inline TextStyleFlags GetDefaultStyle() const; const Recti& GetBounds() const override; Font* GetFont(std::size_t index) const override; @@ -54,62 +54,82 @@ namespace Nz void RemoveBlock(std::size_t index); - void SetBlockCharacterSize(std::size_t index, unsigned int characterSize); - void SetBlockColor(std::size_t index, const Color& color); - void SetBlockFont(std::size_t index, FontRef font); - void SetBlockStyle(std::size_t index, UInt32 style); - void SetBlockText(std::size_t index, const String& str); + inline void SetBlockCharacterSize(std::size_t index, unsigned int characterSize); + inline void SetBlockColor(std::size_t index, const Color& color); + inline void SetBlockFont(std::size_t index, FontRef font); + inline void SetBlockStyle(std::size_t index, TextStyleFlags style); + inline void SetBlockText(std::size_t index, const String& str); - void SetDefaultCharacterSize(unsigned int characterSize); - void SetDefaultColor(const Color& color); - void SetDefaultFont(FontRef font); - void SetDefaultStyle(UInt32 style); + inline void SetDefaultCharacterSize(unsigned int characterSize); + inline void SetDefaultColor(const Color& color); + inline void SetDefaultFont(const FontRef& font); + inline void SetDefaultStyle(TextStyleFlags style); RichTextDrawer& operator=(const RichTextDrawer& drawer); RichTextDrawer& operator=(RichTextDrawer&& drawer); - static RichTextDrawer Draw(const String& str, unsigned int characterSize, UInt32 style = TextStyle_Regular, const Color& color = Color::White); - static RichTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, UInt32 style = TextStyle_Regular, const Color& color = Color::White); + //static RichTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); + //static RichTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); private: - void ClearGlyphs() const; - void ConnectFontSlots(); - void DisconnectFontSlots(); - void GenerateGlyphs(const String& text) const; + struct Block; + + inline void AppendNewLine(const Font* font, unsigned int characterSize) const; + inline void ClearGlyphs() const; + inline void ConnectFontSlots(); + inline void DisconnectFontSlots(); + bool GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, int renderOrder, int* advance) const; + void GenerateGlyphs(const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, const Color& outlineColor, float outlineThickness, const String& text) const; + inline std::size_t HandleFontAddition(const FontRef& font); + inline void ReleaseFont(std::size_t fontIndex); + + inline void InvalidateGlyphs(); + void OnFontAtlasLayerChanged(const Font* font, AbstractImage* oldLayer, AbstractImage* newLayer); void OnFontInvalidated(const Font* font); void OnFontRelease(const Font* object); - void UpdateGlyphs() const; - NazaraSlot(Font, OnFontAtlasChanged, m_atlasChangedSlot); - NazaraSlot(Font, OnFontAtlasLayerChanged, m_atlasLayerChangedSlot); - NazaraSlot(Font, OnFontGlyphCacheCleared, m_glyphCacheClearedSlot); - NazaraSlot(Font, OnFontRelease, m_fontReleaseSlot); + void UpdateGlyphs() const; struct Block { + std::size_t fontIndex; Color color; String text; - UInt32 style; + TextStyleFlags style; unsigned int characterSize; - unsigned int fontIndex; + }; + + struct FontData + { + FontRef font; + std::size_t useCount = 0; + + NazaraSlot(Font, OnFontAtlasChanged, atlasChangedSlot); + NazaraSlot(Font, OnFontAtlasLayerChanged, atlasLayerChangedSlot); + NazaraSlot(Font, OnFontGlyphCacheCleared, glyphCacheClearedSlot); + NazaraSlot(Font, OnFontRelease, fontReleaseSlot); }; Color m_defaultColor; + TextStyleFlags m_defaultStyle; FontRef m_defaultFont; - UInt32 m_defaultStyle; - unsigned int m_defaultCharacterSize; - std::unordered_map m_fonts; + std::unordered_map m_fontIndexes; std::vector m_blocks; + std::vector m_fonts; mutable std::vector m_glyphs; + mutable std::vector m_lines; mutable Rectf m_workingBounds; - mutable Rectui m_bounds; + mutable Recti m_bounds; mutable Vector2ui m_drawPos; mutable bool m_glyphUpdated; + unsigned int m_defaultCharacterSize; }; class RichTextDrawer::BlockRef { + friend RichTextDrawer; + public: BlockRef(const BlockRef&) = default; BlockRef(BlockRef&&) = default; @@ -118,13 +138,13 @@ namespace Nz inline unsigned int GetCharacterSize() const; inline Color GetColor() const; inline const FontRef& GetFont() const; - inline UInt32 GetStyle() const; + inline TextStyleFlags GetStyle() const; inline const String& GetText() const; inline void SetCharacterSize(unsigned int size); inline void SetColor(Color color); inline void SetFont(FontRef font); - inline void SetStyle(UInt32 style); + inline void SetStyle(TextStyleFlags style); inline void SetText(const String& text); BlockRef& operator=(const BlockRef&) = default; diff --git a/include/Nazara/Utility/RichTextDrawer.inl b/include/Nazara/Utility/RichTextDrawer.inl index 5af95ec84..c2591a20b 100644 --- a/include/Nazara/Utility/RichTextDrawer.inl +++ b/include/Nazara/Utility/RichTextDrawer.inl @@ -2,10 +2,238 @@ // This file is part of the "Nazara Engine - Utility module" // For conditions of distribution and use, see copyright notice in Config.hpp +#include #include namespace Nz { + inline void RichTextDrawer::Clear() + { + m_fontIndexes.clear(); + m_blocks.clear(); + m_fonts.clear(); + m_glyphs.clear(); + ClearGlyphs(); + } + + inline unsigned int RichTextDrawer::GetBlockCharacterSize(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].characterSize; + } + + inline const Color& RichTextDrawer::GetBlockColor(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].color; + } + + inline std::size_t RichTextDrawer::GetBlockCount() const + { + return m_blocks.size(); + } + + inline const FontRef& RichTextDrawer::GetBlockFont(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + std::size_t fontIndex = m_blocks[index].fontIndex; + assert(fontIndex < m_fonts.size()); + return m_fonts[fontIndex].font; + } + + inline TextStyleFlags RichTextDrawer::GetBlockStyle(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].style; + } + + inline const String& RichTextDrawer::GetBlockText(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].text; + } + + inline unsigned int RichTextDrawer::GetDefaultCharacterSize() const + { + return m_defaultCharacterSize; + } + + inline const Color& RichTextDrawer::GetDefaultColor() const + { + return m_defaultColor; + } + + inline const FontRef& RichTextDrawer::GetDefaultFont() const + { + return m_defaultFont; + } + + inline TextStyleFlags RichTextDrawer::GetDefaultStyle() const + { + return m_defaultStyle; + } + + inline void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize) const + { + // Ensure we're appending from last line + Line& lastLine = m_lines.back(); + + const Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); + + unsigned int previousDrawPos = m_drawPos.x; + + // Reset cursor + m_drawPos.x = 0; + m_drawPos.y += sizeInfo.lineHeight; + + m_workingBounds.ExtendTo(lastLine.bounds); + m_lines.emplace_back(Line{ Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1 }); + } + + inline void RichTextDrawer::ClearGlyphs() const + { + m_bounds.MakeZero(); + m_lines.clear(); + m_glyphs.clear(); + m_glyphUpdated = true; + m_workingBounds.MakeZero(); //< Compute bounds as float to speedup bounds computation (as casting between floats and integers is costly) + } + + inline void RichTextDrawer::ConnectFontSlots() + { + for (auto& fontData : m_fonts) + { + fontData.atlasChangedSlot.Connect(fontData.font->OnFontAtlasChanged, this, &RichTextDrawer::OnFontInvalidated); + fontData.atlasLayerChangedSlot.Connect(fontData.font->OnFontAtlasLayerChanged, this, &RichTextDrawer::OnFontAtlasLayerChanged); + fontData.fontReleaseSlot.Connect(fontData.font->OnFontDestroy, this, &RichTextDrawer::OnFontRelease); + fontData.glyphCacheClearedSlot.Connect(fontData.font->OnFontGlyphCacheCleared, this, &RichTextDrawer::OnFontInvalidated); + } + } + + inline void RichTextDrawer::DisconnectFontSlots() + { + for (auto& fontData : m_fonts) + { + fontData.atlasChangedSlot.Disconnect(); + fontData.atlasLayerChangedSlot.Disconnect(); + fontData.fontReleaseSlot.Disconnect(); + fontData.glyphCacheClearedSlot.Disconnect(); + } + } + + inline std::size_t RichTextDrawer::HandleFontAddition(const FontRef& font) + { + auto it = m_fontIndexes.find(font); + if (it == m_fontIndexes.end()) + { + std::size_t fontIndex = m_fonts.size(); + m_fonts.emplace_back(); + auto& fontData = m_fonts.back(); + fontData.font = font; + fontData.atlasChangedSlot.Connect(font->OnFontAtlasChanged, this, &RichTextDrawer::OnFontInvalidated); + fontData.atlasLayerChangedSlot.Connect(font->OnFontAtlasLayerChanged, this, &RichTextDrawer::OnFontAtlasLayerChanged); + fontData.fontReleaseSlot.Connect(font->OnFontDestroy, this, &RichTextDrawer::OnFontRelease); + fontData.glyphCacheClearedSlot.Connect(font->OnFontGlyphCacheCleared, this, &RichTextDrawer::OnFontInvalidated); + + it = m_fontIndexes.emplace(font, fontIndex).first; + } + + return it->second; + } + + inline void RichTextDrawer::ReleaseFont(std::size_t fontIndex) + { + assert(fontIndex < m_fonts.size()); + + FontData& fontData = m_fonts[fontIndex]; + assert(fontData.useCount > 0); + + if (--fontData.useCount == 0) + { + // Shift font indexes + m_fontIndexes.erase(fontData.font); + for (auto it = m_fontIndexes.begin(); it != m_fontIndexes.end(); ++it) + { + if (it->second > fontIndex) + it->second--; + } + + m_fonts.erase(m_fonts.begin() + fontIndex); + } + } + + inline void RichTextDrawer::SetBlockCharacterSize(std::size_t index, unsigned int characterSize) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].characterSize = characterSize; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockColor(std::size_t index, const Color& color) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].color = color; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockFont(std::size_t index, FontRef font) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + std::size_t fontIndex = HandleFontAddition(font); + std::size_t oldFontIndex = m_blocks[index].fontIndex; + + if (oldFontIndex != fontIndex) + { + ReleaseFont(oldFontIndex); + + m_fonts[fontIndex].useCount++; + m_blocks[index].fontIndex = fontIndex; + } + } + + inline void RichTextDrawer::SetBlockStyle(std::size_t index, TextStyleFlags style) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].style = style; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockText(std::size_t index, const String& str) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].text = str; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetDefaultCharacterSize(unsigned int characterSize) + { + m_defaultCharacterSize = characterSize; + } + + inline void RichTextDrawer::SetDefaultColor(const Color& color) + { + m_defaultColor = color; + } + + inline void RichTextDrawer::SetDefaultFont(const FontRef& font) + { + m_defaultFont = font; + } + + inline void RichTextDrawer::SetDefaultStyle(TextStyleFlags style) + { + m_defaultStyle = style; + } + + inline void RichTextDrawer::InvalidateGlyphs() + { + m_glyphUpdated = false; + } + /*! * \class Nz::RichTextDrawer::BlockRef * \brief Helper class representing a block inside a RichTextDrawer, allowing easier access. @@ -58,7 +286,7 @@ namespace Nz * * \see GetCharacterSize, GetColor, GetFont, GetText, SetStyle */ - inline UInt32 RichTextDrawer::BlockRef::GetStyle() const + inline TextStyleFlags RichTextDrawer::BlockRef::GetStyle() const { return m_drawer.GetBlockStyle(m_blockIndex); } @@ -113,7 +341,7 @@ namespace Nz * * \see GetStyle, SetCharacterSize, SetColor, SetFont, SetText */ - inline void RichTextDrawer::BlockRef::SetStyle(UInt32 style) + inline void RichTextDrawer::BlockRef::SetStyle(TextStyleFlags style) { m_drawer.SetBlockStyle(m_blockIndex, style); } diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp new file mode 100644 index 000000000..5480a5c16 --- /dev/null +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -0,0 +1,476 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include + +namespace Nz +{ + RichTextDrawer::RichTextDrawer() : + m_defaultColor(Color::White), + //m_outlineColor(Color::Black), + m_defaultStyle(TextStyle_Regular), + m_glyphUpdated(true), + //m_maxLineWidth(std::numeric_limits::infinity()), + //m_outlineThickness(0.f), + m_defaultCharacterSize(24) + { + SetDefaultFont(Font::GetDefault()); + } + + RichTextDrawer::RichTextDrawer(const RichTextDrawer& drawer) : + m_defaultColor(drawer.m_defaultColor), + m_defaultStyle(drawer.m_defaultStyle), + m_fontIndexes(drawer.m_fontIndexes), + m_blocks(drawer.m_blocks), + m_glyphUpdated(false), + //m_outlineColor(drawer.m_outlineColor), + //m_maxLineWidth(drawer.m_maxLineWidth), + //m_outlineThickness(drawer.m_outlineThickness), + m_defaultCharacterSize(drawer.m_defaultCharacterSize) + { + m_fonts.resize(drawer.m_fonts.size()); + for (std::size_t i = 0; i < m_fonts.size(); ++i) + { + m_fonts[i].font = drawer.m_fonts[i].font; + m_fonts[i].useCount = drawer.m_fonts[i].useCount; + } + + SetDefaultFont(drawer.m_defaultFont); + + ConnectFontSlots(); + } + + RichTextDrawer::RichTextDrawer(RichTextDrawer&& drawer) + { + operator=(std::move(drawer)); + } + + RichTextDrawer::~RichTextDrawer() = default; + + auto RichTextDrawer::AppendText(const String& str) -> BlockRef + { + NazaraAssert(!str.IsEmpty(), "String cannot be empty"); + + std::size_t defaultFontIndex = HandleFontAddition(m_defaultFont); + + auto HasDefaultProperties = [&](const Block& block) + { + return block.characterSize == m_defaultCharacterSize && + block.color == m_defaultColor && + block.fontIndex == defaultFontIndex && + block.style == m_defaultStyle; + }; + + // Check if last block has the same property as default, else create a new block + if (m_blocks.empty() || !HasDefaultProperties(m_blocks.back())) + { + m_blocks.emplace_back(); + Block& newBlock = m_blocks.back(); + newBlock.characterSize = m_defaultCharacterSize; + newBlock.color = m_defaultColor; + newBlock.fontIndex = defaultFontIndex; + newBlock.style = m_defaultStyle; + newBlock.text = str; + + assert(newBlock.fontIndex < m_fonts.size()); + m_fonts[newBlock.fontIndex].useCount++; + } + else + m_blocks.back().text += str; + + InvalidateGlyphs(); + + return BlockRef(*this, m_blocks.size() - 1); + } + + const Recti& RichTextDrawer::GetBounds() const + { + if (!m_glyphUpdated) + UpdateGlyphs(); + + return m_bounds; + } + + Font* RichTextDrawer::GetFont(std::size_t index) const + { + NazaraAssert(index < m_fonts.size(), "Font index out of range"); + + return m_fonts[index].font; + } + + std::size_t RichTextDrawer::GetFontCount() const + { + return m_fonts.size(); + } + + const AbstractTextDrawer::Glyph& RichTextDrawer::GetGlyph(std::size_t index) const + { + if (!m_glyphUpdated) + UpdateGlyphs(); + + return m_glyphs[index]; + } + + std::size_t RichTextDrawer::GetGlyphCount() const + { + if (!m_glyphUpdated) + UpdateGlyphs(); + + return m_glyphs.size(); + } + + const AbstractTextDrawer::Line& RichTextDrawer::GetLine(std::size_t index) const + { + if (!m_glyphUpdated) + UpdateGlyphs(); + + NazaraAssert(index < m_lines.size(), "Line index out of range"); + return m_lines[index]; + } + + std::size_t RichTextDrawer::GetLineCount() const + { + if (!m_glyphUpdated) + UpdateGlyphs(); + + return m_lines.size(); + } + + void RichTextDrawer::MergeBlocks() + { + if (m_blocks.size() < 2) + return; + + auto TestBlockProperties = [](const Block& lhs, const Block& rhs) + { + return lhs.characterSize == rhs.characterSize && + lhs.color == rhs.color && + lhs.fontIndex == rhs.fontIndex && + lhs.style == rhs.style; + }; + + auto lastBlockIt = m_blocks.begin(); + for (auto it = lastBlockIt + 1; it != m_blocks.end();) + { + if (TestBlockProperties(*lastBlockIt, *it)) + { + // Append text to previous block and erase + lastBlockIt->text += it->text; + + ReleaseFont(it->fontIndex); + it = m_blocks.erase(it); + } + else + { + lastBlockIt = it; + ++it; + } + } + } + + void RichTextDrawer::RemoveBlock(std::size_t index) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + + ReleaseFont(m_blocks[index].fontIndex); + m_blocks.erase(m_blocks.begin() + index); + } + + RichTextDrawer& RichTextDrawer::operator=(const RichTextDrawer& drawer) + { + DisconnectFontSlots(); + + m_blocks = drawer.m_blocks; + m_defaultCharacterSize = drawer.m_defaultCharacterSize; + m_defaultColor = drawer.m_defaultColor; + m_defaultFont = drawer.m_defaultFont; + m_defaultStyle = drawer.m_defaultStyle; + m_fontIndexes = drawer.m_fontIndexes; + + m_fonts.resize(drawer.m_fonts.size()); + for (std::size_t i = 0; i < m_fonts.size(); ++i) + { + m_fonts[i].font = drawer.m_fonts[i].font; + m_fonts[i].useCount = drawer.m_fonts[i].useCount; + } + + ConnectFontSlots(); + InvalidateGlyphs(); + + return *this; + } + + RichTextDrawer& RichTextDrawer::operator=(RichTextDrawer&& drawer) + { + m_blocks = std::move(drawer.m_blocks); + m_bounds = std::move(m_bounds); + m_defaultCharacterSize = std::move(drawer.m_defaultCharacterSize); + m_defaultColor = std::move(drawer.m_defaultColor); + m_defaultFont = std::move(drawer.m_defaultFont); + m_defaultStyle = std::move(drawer.m_defaultStyle); + m_drawPos = std::move(m_drawPos); + m_fontIndexes = std::move(drawer.m_fontIndexes); + m_fonts = std::move(drawer.m_fonts); + m_glyphs = std::move(m_glyphs); + m_lines = std::move(m_lines); + m_glyphUpdated = std::move(m_glyphUpdated); + m_workingBounds = std::move(m_workingBounds); + + drawer.DisconnectFontSlots(); + ConnectFontSlots(); + + return *this; + } + + bool RichTextDrawer::GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, int renderOrder, int* advance) const + { + const Font::Glyph& fontGlyph = font->GetGlyph(characterSize, style, outlineThickness, character); + if (fontGlyph.valid && fontGlyph.fauxOutlineThickness <= 0.f) + { + glyph.atlas = font->GetAtlas()->GetLayer(fontGlyph.layerIndex); + glyph.atlasRect = fontGlyph.atlasRect; + glyph.color = color; + glyph.flipped = fontGlyph.flipped; + glyph.renderOrder = renderOrder; + + glyph.bounds.Set(fontGlyph.aabb); + + //if (lineWrap && ShouldLineWrap(glyph, glyph.bounds.width)) + // AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); + + glyph.bounds.x += m_drawPos.x; + glyph.bounds.y += m_drawPos.y; + + // Faux bold and faux outline thickness are not supported + + // We "lean" the glyph to simulate italics style + float italic = (fontGlyph.requireFauxItalic) ? 0.208f : 0.f; + float italicTop = italic * glyph.bounds.y; + float italicBottom = italic * glyph.bounds.GetMaximum().y; + + glyph.corners[0].Set(glyph.bounds.x - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); + glyph.corners[1].Set(glyph.bounds.x + glyph.bounds.width - italicTop - outlineThickness, glyph.bounds.y - outlineThickness); + glyph.corners[2].Set(glyph.bounds.x - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); + glyph.corners[3].Set(glyph.bounds.x + glyph.bounds.width - italicBottom - outlineThickness, glyph.bounds.y + glyph.bounds.height - outlineThickness); + + if (advance) + *advance = fontGlyph.advance; + + return true; + } + else + return false; + }; + + void RichTextDrawer::GenerateGlyphs(const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, const Color& outlineColor, float outlineThickness, const String& text) const + { + if (text.IsEmpty()) + return; + + ///TODO: Allow iteration on Unicode characters without allocating any buffer + std::u32string characters = text.GetUtf32String(); + if (characters.empty()) + { + NazaraError("Invalid character set"); + return; + } + + char32_t previousCharacter = 0; + + const Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); + + float heightDifference = sizeInfo.lineHeight - m_lines.back().bounds.height; + if (heightDifference > 0.f) + { + for (std::size_t glyphIndex = m_lines.back().glyphIndex; glyphIndex < m_glyphs.size(); ++glyphIndex) + { + Glyph& glyph = m_glyphs[glyphIndex]; + glyph.bounds.y += heightDifference; + + for (auto& corner : glyph.corners) + corner.y += heightDifference; + } + + m_drawPos.y += heightDifference; + m_lines.back().bounds.height += heightDifference; + } + /*if (firstFont.font) + m_lines.emplace_back(Line{ Rectf(0.f, 0.f, 0.f, float(font->GetSizeInfo(firstBlock.characterSize).lineHeight)), 0 }); + else + m_lines.emplace_back(Line{ Rectf::Zero(), 0 });*/ + + m_glyphs.reserve(m_glyphs.size() + characters.size() * ((outlineThickness > 0.f) ? 2 : 1)); + for (char32_t character : characters) + { + if (previousCharacter != 0) + m_drawPos.x += font->GetKerning(characterSize, previousCharacter, character); + + previousCharacter = character; + + bool whitespace = true; + int advance = 0; + switch (character) + { + case ' ': + case '\n': + advance = sizeInfo.spaceAdvance; + break; + + case '\t': + advance = sizeInfo.spaceAdvance * 4; + break; + + default: + whitespace = false; + break; + } + + Glyph glyph; + if (!whitespace) + { + if (!GenerateGlyph(glyph, character, 0.f, true, font, color, style, characterSize, 0, &advance)) + continue; // Glyph failed to load, just skip it (can't do much) + + if (outlineThickness > 0.f) + { + Glyph outlineGlyph; + if (GenerateGlyph(outlineGlyph, character, outlineThickness, false, font, outlineColor, style, characterSize, -1, nullptr)) + { + m_glyphs.push_back(outlineGlyph); + } + } + } + else + { + float glyphAdvance = advance; + + //if (ShouldLineWrap(glyph, glyphAdvance)) + // AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); + + glyph.atlas = nullptr; + glyph.bounds.Set(float(m_drawPos.x), m_lines.back().bounds.y, glyphAdvance, float(sizeInfo.lineHeight)); + + glyph.corners[0].Set(glyph.bounds.GetCorner(RectCorner_LeftTop)); + glyph.corners[1].Set(glyph.bounds.GetCorner(RectCorner_RightTop)); + glyph.corners[2].Set(glyph.bounds.GetCorner(RectCorner_LeftBottom)); + glyph.corners[3].Set(glyph.bounds.GetCorner(RectCorner_RightBottom)); + } + + m_lines.back().bounds.ExtendTo(glyph.bounds); + + switch (character) + { + case '\n': + { + AppendNewLine(font, characterSize); + break; + } + + default: + m_drawPos.x += advance; + break; + } + + /*if (whitespace) + { + m_lastSeparatorGlyph = m_glyphs.size(); + m_lastSeparatorPosition = m_drawPos.x; + }*/ + + m_glyphs.push_back(glyph); + } + + m_workingBounds.ExtendTo(m_lines.back().bounds); + + m_bounds.Set(Rectf(std::floor(m_workingBounds.x), std::floor(m_workingBounds.y), std::ceil(m_workingBounds.width), std::ceil(m_workingBounds.height))); + + m_glyphUpdated = true; + } + + void RichTextDrawer::OnFontAtlasLayerChanged(const Font* font, AbstractImage* oldLayer, AbstractImage* newLayer) + { + NazaraUnused(font); + +#ifdef NAZARA_DEBUG + auto it = std::find_if(m_fonts.begin(), m_fonts.end(), [font](const auto& fontData) { return fontData.font == font; }); + if (it == m_fonts.end()) + { + NazaraInternalError("Not listening to " + String::Pointer(font)); + return; + } +#endif + + // Update atlas layer pointer + // Note: This can happen while updating + for (Glyph& glyph : m_glyphs) + { + if (glyph.atlas == oldLayer) + glyph.atlas = newLayer; + } + } + + void RichTextDrawer::OnFontInvalidated(const Font* font) + { + NazaraUnused(font); + +#ifdef NAZARA_DEBUG + auto it = std::find_if(m_fonts.begin(), m_fonts.end(), [font](const auto& fontData) { return fontData.font == font; }); + if (it == m_fonts.end()) + { + NazaraInternalError("Not listening to " + String::Pointer(font)); + return; + } +#endif + + m_glyphUpdated = false; + } + + void RichTextDrawer::OnFontRelease(const Font* font) + { + NazaraUnused(font); + NazaraUnused(font); + +#ifdef NAZARA_DEBUG + auto it = std::find_if(m_fonts.begin(), m_fonts.end(), [font](const auto& fontData) { return fontData.font == font; }); + if (it == m_fonts.end()) + { + NazaraInternalError("Not listening to " + String::Pointer(font)); + return; + } +#endif + + //SetFont(nullptr); + } + + void RichTextDrawer::UpdateGlyphs() const + { + ClearGlyphs(); + + if (!m_blocks.empty()) + { + const Block& firstBlock = m_blocks.front(); + + assert(firstBlock.fontIndex < m_fonts.size()); + const auto& firstFont = m_fonts[firstBlock.fontIndex]; + + if (firstFont.font) + m_lines.emplace_back(Line{ Rectf(0.f, 0.f, 0.f, float(firstFont.font->GetSizeInfo(firstBlock.characterSize).lineHeight)), 0 }); + else + m_lines.emplace_back(Line{ Rectf::Zero(), 0 }); + + m_drawPos.Set(0, firstBlock.characterSize); + + for (const Block& block : m_blocks) + { + assert(block.fontIndex < m_fonts.size()); + const auto& fontData = m_fonts[block.fontIndex]; + + GenerateGlyphs(fontData.font, block.color, block.style, block.characterSize, block.color, 0.f, block.text); + } + } + } +} From 8e4df4cadc79892a695ab0fe9802c3ef2519d882 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 22 Sep 2019 12:56:07 +0200 Subject: [PATCH 098/192] SDK: Add RichTextAreaWidget (WIP) --- ChangeLog.md | 2 + SDK/include/NDK/Console.hpp | 3 +- SDK/include/NDK/Widgets.hpp | 2 + .../NDK/Widgets/AbstractTextAreaWidget.hpp | 135 ++++ .../NDK/Widgets/AbstractTextAreaWidget.inl | 252 ++++++++ .../NDK/Widgets/RichTextAreaWidget.hpp | 58 ++ .../NDK/Widgets/RichTextAreaWidget.inl | 38 ++ SDK/include/NDK/Widgets/TextAreaWidget.hpp | 101 +-- SDK/include/NDK/Widgets/TextAreaWidget.inl | 243 -------- SDK/src/NDK/Console.cpp | 12 +- .../NDK/Widgets/AbstractTextAreaWidget.cpp | 489 +++++++++++++++ SDK/src/NDK/Widgets/RichTextAreaWidget.cpp | 156 +++++ SDK/src/NDK/Widgets/TextAreaWidget.cpp | 583 +++--------------- include/Nazara/Utility.hpp | 1 + include/Nazara/Utility/AbstractTextDrawer.hpp | 5 + include/Nazara/Utility/RichTextDrawer.hpp | 19 +- include/Nazara/Utility/RichTextDrawer.inl | 65 +- include/Nazara/Utility/SimpleTextDrawer.hpp | 2 +- src/Nazara/Utility/RichTextDrawer.cpp | 39 +- 19 files changed, 1346 insertions(+), 859 deletions(-) create mode 100644 SDK/include/NDK/Widgets/AbstractTextAreaWidget.hpp create mode 100644 SDK/include/NDK/Widgets/AbstractTextAreaWidget.inl create mode 100644 SDK/include/NDK/Widgets/RichTextAreaWidget.hpp create mode 100644 SDK/include/NDK/Widgets/RichTextAreaWidget.inl create mode 100644 SDK/src/NDK/Widgets/AbstractTextAreaWidget.cpp create mode 100644 SDK/src/NDK/Widgets/RichTextAreaWidget.cpp diff --git a/ChangeLog.md b/ChangeLog.md index e3a07e3f0..07a90646e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -283,6 +283,8 @@ Nazara Development Kit: - ⚠️ TextAreaWidget::OnTextAreaCursorMove signal now uses a Vector2ui* position as its second argument (instead of a std::size_t*) - Added TextAreaWidget::OnTextAreaSelection - ⚠️ Console class is no longer bound to a LuaState and now has a OnCommand signal +- ⚠️ Made AbstractTextAreaWidget which is inherited by TextAreaWidget +- ⚠️ Added RichTextAreaWidget # 0.4: diff --git a/SDK/include/NDK/Console.hpp b/SDK/include/NDK/Console.hpp index 32d0cd76a..796a15588 100644 --- a/SDK/include/NDK/Console.hpp +++ b/SDK/include/NDK/Console.hpp @@ -24,6 +24,7 @@ namespace Nz namespace Ndk { + class AbstractTextAreaWidget; class Console; class Entity; class ScrollAreaWidget; @@ -59,7 +60,7 @@ namespace Ndk NazaraSignal(OnCommand, Console* /*console*/, const Nz::String& /*command*/); private: - void ExecuteInput(const TextAreaWidget* textArea, bool* ignoreDefaultAction); + void ExecuteInput(const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction); void Layout() override; struct Line diff --git a/SDK/include/NDK/Widgets.hpp b/SDK/include/NDK/Widgets.hpp index 303b22519..9a36e37a2 100644 --- a/SDK/include/NDK/Widgets.hpp +++ b/SDK/include/NDK/Widgets.hpp @@ -5,6 +5,7 @@ #ifndef NDK_WIDGETS_GLOBAL_HPP #define NDK_WIDGETS_GLOBAL_HPP +#include #include #include #include @@ -12,6 +13,7 @@ #include #include #include +#include #include #include diff --git a/SDK/include/NDK/Widgets/AbstractTextAreaWidget.hpp b/SDK/include/NDK/Widgets/AbstractTextAreaWidget.hpp new file mode 100644 index 000000000..b05f65bce --- /dev/null +++ b/SDK/include/NDK/Widgets/AbstractTextAreaWidget.hpp @@ -0,0 +1,135 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#pragma once + +#ifndef NDK_WIDGETS_ABSTRACTTEXTAREAWIDGET_HPP +#define NDK_WIDGETS_ABSTRACTTEXTAREAWIDGET_HPP + +#include +#include +#include +#include +#include +#include + +namespace Ndk +{ + class NDK_API AbstractTextAreaWidget : public BaseWidget + { + public: + using CharacterFilter = std::function; + + AbstractTextAreaWidget(BaseWidget* parent); + AbstractTextAreaWidget(const AbstractTextAreaWidget&) = delete; + AbstractTextAreaWidget(AbstractTextAreaWidget&&) = default; + ~AbstractTextAreaWidget() = default; + + virtual void Clear(); + + //virtual TextAreaWidget* Clone() const = 0; + + void EnableLineWrap(bool enable = true); + inline void EnableMultiline(bool enable = true); + inline void EnableTabWriting(bool enable = true); + + inline void Erase(std::size_t glyphPosition); + virtual void Erase(std::size_t firstGlyph, std::size_t lastGlyph) = 0; + inline void EraseSelection(); + + inline const CharacterFilter& GetCharacterFilter() const; + inline const Nz::Vector2ui& GetCursorPosition() const; + inline Nz::Vector2ui GetCursorPosition(std::size_t glyphIndex) const; + inline EchoMode GetEchoMode() const; + inline std::size_t GetGlyphIndex() const; + inline std::size_t GetGlyphIndex(const Nz::Vector2ui& cursorPosition) const; + inline const Nz::String& GetText() const; + + Nz::Vector2ui GetHoveredGlyph(float x, float y) const; + + inline bool HasSelection() const; + + inline bool IsLineWrapEnabled() const; + inline bool IsMultilineEnabled() const; + inline bool IsReadOnly() const; + inline bool IsTabWritingEnabled() const; + + inline void MoveCursor(int offset); + inline void MoveCursor(const Nz::Vector2i& offset); + + inline Nz::Vector2ui NormalizeCursorPosition(Nz::Vector2ui cursorPosition) const; + + inline void SetCharacterFilter(CharacterFilter filter); + inline void SetCursorPosition(std::size_t glyphIndex); + inline void SetCursorPosition(Nz::Vector2ui cursorPosition); + inline void SetEchoMode(EchoMode echoMode); + inline void SetReadOnly(bool readOnly = true); + inline void SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition); + + inline void Write(const Nz::String& text); + inline void Write(const Nz::String& text, const Nz::Vector2ui& glyphPosition); + virtual void Write(const Nz::String& text, std::size_t glyphPosition) = 0; + + AbstractTextAreaWidget& operator=(const AbstractTextAreaWidget&) = delete; + AbstractTextAreaWidget& operator=(AbstractTextAreaWidget&&) = default; + + NazaraSignal(OnTextAreaCursorMove, const AbstractTextAreaWidget* /*textArea*/, Nz::Vector2ui* /*newCursorPosition*/); + NazaraSignal(OnTextAreaKeyBackspace, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyDown, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyEnd, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyHome, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyLeft, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyReturn, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyRight, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaKeyUp, const AbstractTextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); + NazaraSignal(OnTextAreaSelection, const AbstractTextAreaWidget* /*textArea*/, Nz::Vector2ui* /*start*/, Nz::Vector2ui* /*end*/); + + protected: + virtual Nz::AbstractTextDrawer& GetTextDrawer() = 0; + virtual const Nz::AbstractTextDrawer& GetTextDrawer() const = 0; + + void Layout() override; + + virtual void HandleIndentation(bool add) = 0; + virtual void HandleSelectionIndentation(bool add) = 0; + virtual void HandleWordCursorMove(bool left) = 0; + + bool IsFocusable() const override; + void OnFocusLost() override; + void OnFocusReceived() override; + bool OnKeyPressed(const Nz::WindowEvent::KeyEvent& key) override; + void OnKeyReleased(const Nz::WindowEvent::KeyEvent& key) override; + void OnMouseButtonPress(int /*x*/, int /*y*/, Nz::Mouse::Button button) override; + void OnMouseButtonRelease(int /*x*/, int /*y*/, Nz::Mouse::Button button) override; + void OnMouseEnter() override; + void OnMouseMoved(int x, int y, int deltaX, int deltaY) override; + void OnTextEntered(char32_t character, bool repeated) override; + + inline void SetCursorPositionInternal(std::size_t glyphIndex); + inline void SetCursorPositionInternal(Nz::Vector2ui cursorPosition); + + void RefreshCursor(); + virtual void UpdateDisplayText() = 0; + void UpdateTextSprite(); + + CharacterFilter m_characterFilter; + EchoMode m_echoMode; + EntityHandle m_cursorEntity; + EntityHandle m_textEntity; + Nz::TextSpriteRef m_textSprite; + Nz::Vector2ui m_cursorPositionBegin; + Nz::Vector2ui m_cursorPositionEnd; + Nz::Vector2ui m_selectionCursor; + std::vector m_cursorSprites; + bool m_isLineWrapEnabled; + bool m_isMouseButtonDown; + bool m_multiLineEnabled; + bool m_readOnly; + bool m_tabEnabled; // writes (Shift+)Tab character if set to true + }; +} + +#include + +#endif // NDK_WIDGETS_ABSTRACTTEXTAREAWIDGET_HPP diff --git a/SDK/include/NDK/Widgets/AbstractTextAreaWidget.inl b/SDK/include/NDK/Widgets/AbstractTextAreaWidget.inl new file mode 100644 index 000000000..ca40d278b --- /dev/null +++ b/SDK/include/NDK/Widgets/AbstractTextAreaWidget.inl @@ -0,0 +1,252 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + inline void AbstractTextAreaWidget::EnableMultiline(bool enable) + { + m_multiLineEnabled = enable; + } + + inline void AbstractTextAreaWidget::EnableTabWriting(bool enable) + { + m_tabEnabled = enable; + } + + inline void AbstractTextAreaWidget::Erase(std::size_t glyphPosition) + { + Erase(glyphPosition, glyphPosition + 1U); + } + + inline void AbstractTextAreaWidget::EraseSelection() + { + if (!HasSelection()) + return; + + Erase(GetGlyphIndex(m_cursorPositionBegin), GetGlyphIndex(m_cursorPositionEnd)); + } + + inline const AbstractTextAreaWidget::CharacterFilter& AbstractTextAreaWidget::GetCharacterFilter() const + { + return m_characterFilter; + } + + inline const Nz::Vector2ui& AbstractTextAreaWidget::GetCursorPosition() const + { + return m_cursorPositionBegin; + } + + Nz::Vector2ui AbstractTextAreaWidget::GetCursorPosition(std::size_t glyphIndex) const + { + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + glyphIndex = std::min(glyphIndex, GetTextDrawer().GetGlyphCount()); + + std::size_t lineCount = textDrawer.GetLineCount(); + std::size_t line = 0U; + for (std::size_t i = line + 1; i < lineCount; ++i) + { + if (textDrawer.GetLine(i).glyphIndex > glyphIndex) + break; + + line = i; + } + + const auto& lineInfo = textDrawer.GetLine(line); + + Nz::Vector2ui cursorPos; + cursorPos.y = static_cast(line); + cursorPos.x = static_cast(glyphIndex - lineInfo.glyphIndex); + + return cursorPos; + } + + inline EchoMode AbstractTextAreaWidget::GetEchoMode() const + { + return m_echoMode; + } + + inline std::size_t AbstractTextAreaWidget::GetGlyphIndex() const + { + return GetGlyphIndex(m_cursorPositionBegin); + } + + inline std::size_t AbstractTextAreaWidget::GetGlyphIndex(const Nz::Vector2ui& cursorPosition) const + { + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + std::size_t glyphIndex = textDrawer.GetLine(cursorPosition.y).glyphIndex + cursorPosition.x; + if (textDrawer.GetLineCount() > cursorPosition.y + 1) + glyphIndex = std::min(glyphIndex, textDrawer.GetLine(cursorPosition.y + 1).glyphIndex - 1); + else + glyphIndex = std::min(glyphIndex, textDrawer.GetGlyphCount()); + + return glyphIndex; + } + + inline bool AbstractTextAreaWidget::HasSelection() const + { + return m_cursorPositionBegin != m_cursorPositionEnd; + } + + inline bool AbstractTextAreaWidget::IsLineWrapEnabled() const + { + return m_isLineWrapEnabled; + } + + inline bool AbstractTextAreaWidget::IsMultilineEnabled() const + { + return m_multiLineEnabled; + } + + inline bool AbstractTextAreaWidget::IsTabWritingEnabled() const + { + return m_tabEnabled; + } + + inline bool AbstractTextAreaWidget::IsReadOnly() const + { + return m_readOnly; + } + + inline void AbstractTextAreaWidget::MoveCursor(int offset) + { + std::size_t cursorGlyph = GetGlyphIndex(m_cursorPositionBegin); + if (offset >= 0) + SetCursorPosition(cursorGlyph + static_cast(offset)); + else + { + std::size_t nOffset = static_cast(-offset); + if (nOffset >= cursorGlyph) + SetCursorPosition(0); + else + SetCursorPosition(cursorGlyph - nOffset); + } + } + + inline void AbstractTextAreaWidget::MoveCursor(const Nz::Vector2i& offset) + { + auto ClampOffset = [] (unsigned int cursorPosition, int cursorOffset) -> unsigned int + { + if (cursorOffset >= 0) + return cursorPosition + cursorOffset; + else + { + unsigned int nOffset = static_cast(-cursorOffset); + if (nOffset >= cursorPosition) + return 0; + else + return cursorPosition - nOffset; + } + }; + + Nz::Vector2ui cursorPosition = m_cursorPositionBegin; + cursorPosition.x = ClampOffset(static_cast(cursorPosition.x), offset.x); + cursorPosition.y = ClampOffset(static_cast(cursorPosition.y), offset.y); + + SetCursorPosition(cursorPosition); + } + + inline Nz::Vector2ui AbstractTextAreaWidget::NormalizeCursorPosition(Nz::Vector2ui cursorPosition) const + { + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + std::size_t lineCount = textDrawer.GetLineCount(); + if (cursorPosition.y >= lineCount) + cursorPosition.y = static_cast(lineCount - 1); + + const auto& lineInfo = textDrawer.GetLine(cursorPosition.y); + if (cursorPosition.y + 1 < lineCount) + { + const auto& nextLineInfo = textDrawer.GetLine(cursorPosition.y + 1); + cursorPosition.x = std::min(cursorPosition.x, static_cast(nextLineInfo.glyphIndex - lineInfo.glyphIndex - 1)); + } + + return cursorPosition; + } + + inline void AbstractTextAreaWidget::SetCharacterFilter(CharacterFilter filter) + { + m_characterFilter = std::move(filter); + } + + inline void AbstractTextAreaWidget::SetCursorPosition(std::size_t glyphIndex) + { + Nz::Vector2ui position = GetCursorPosition(glyphIndex); + Nz::Vector2ui newPosition = position; + + OnTextAreaCursorMove(this, &newPosition); + + if (position == newPosition) + SetCursorPositionInternal(position); + else + SetCursorPositionInternal(GetGlyphIndex(newPosition)); + } + + inline void AbstractTextAreaWidget::SetCursorPosition(Nz::Vector2ui cursorPosition) + { + OnTextAreaCursorMove(this, &cursorPosition); + + return SetCursorPositionInternal(NormalizeCursorPosition(cursorPosition)); + } + + inline void AbstractTextAreaWidget::SetEchoMode(EchoMode echoMode) + { + m_echoMode = echoMode; + + UpdateDisplayText(); + } + + inline void AbstractTextAreaWidget::SetReadOnly(bool readOnly) + { + m_readOnly = readOnly; + m_cursorEntity->Enable(!m_readOnly && HasFocus()); + } + + inline void AbstractTextAreaWidget::SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition) + { + // Ensure begin is before end + if (toPosition.y < fromPosition.y || (toPosition.y == fromPosition.y && toPosition.x < fromPosition.x)) + std::swap(fromPosition, toPosition); + + if (m_cursorPositionBegin != fromPosition || m_cursorPositionEnd != toPosition) + { + OnTextAreaSelection(this, &fromPosition, &toPosition); + + // Ensure begin is before end a second time (in case signal changed it) + if (toPosition.y < fromPosition.y || (toPosition.y == fromPosition.y && toPosition.x < fromPosition.x)) + std::swap(fromPosition, toPosition); + + m_cursorPositionBegin = NormalizeCursorPosition(fromPosition); + m_cursorPositionEnd = NormalizeCursorPosition(toPosition); + + RefreshCursor(); + } + } + + inline void AbstractTextAreaWidget::Write(const Nz::String& text) + { + Write(text, GetGlyphIndex(m_cursorPositionBegin)); + } + + inline void AbstractTextAreaWidget::Write(const Nz::String& text, const Nz::Vector2ui& glyphPosition) + { + Write(text, GetGlyphIndex(glyphPosition)); + } + + void AbstractTextAreaWidget::SetCursorPositionInternal(std::size_t glyphIndex) + { + return SetCursorPositionInternal(GetCursorPosition(glyphIndex)); + } + + inline void AbstractTextAreaWidget::SetCursorPositionInternal(Nz::Vector2ui cursorPosition) + { + m_cursorPositionBegin = cursorPosition; + m_cursorPositionEnd = m_cursorPositionBegin; + + RefreshCursor(); + } +} diff --git a/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp b/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp new file mode 100644 index 000000000..943bc2861 --- /dev/null +++ b/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp @@ -0,0 +1,58 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#pragma once + +#ifndef NDK_WIDGETS_RICHTEXTAREAWIDGET_HPP +#define NDK_WIDGETS_RICHTEXTAREAWIDGET_HPP + +#include +#include + +namespace Ndk +{ + class NDK_API RichTextAreaWidget : public AbstractTextAreaWidget + { + public: + RichTextAreaWidget(BaseWidget* parent); + RichTextAreaWidget(const RichTextAreaWidget&) = delete; + RichTextAreaWidget(RichTextAreaWidget&&) = default; + ~RichTextAreaWidget() = default; + + void AppendText(const Nz::String& text); + + void Clear() override; + + void Erase(std::size_t firstGlyph, std::size_t lastGlyph) override; + + inline unsigned int GetCharacterSize() const; + inline const Nz::Color& GetTextColor() const; + inline Nz::Font* GetTextFont() const; + + inline void SetCharacterSize(unsigned int characterSize); + inline void SetTextColor(const Nz::Color& color); + inline void SetTextFont(Nz::FontRef font); + + void Write(const Nz::String& text, std::size_t glyphPosition) override; + + RichTextAreaWidget& operator=(const RichTextAreaWidget&) = delete; + RichTextAreaWidget& operator=(RichTextAreaWidget&&) = default; + + private: + Nz::AbstractTextDrawer& GetTextDrawer() override; + const Nz::AbstractTextDrawer& GetTextDrawer() const override; + + void HandleIndentation(bool add) override; + void HandleSelectionIndentation(bool add) override; + void HandleWordCursorMove(bool left) override; + + void UpdateDisplayText(); + + Nz::RichTextDrawer m_drawer; + }; +} + +#include + +#endif // NDK_WIDGETS_TEXTAREAWIDGET_HPP diff --git a/SDK/include/NDK/Widgets/RichTextAreaWidget.inl b/SDK/include/NDK/Widgets/RichTextAreaWidget.inl new file mode 100644 index 000000000..2c31af9e5 --- /dev/null +++ b/SDK/include/NDK/Widgets/RichTextAreaWidget.inl @@ -0,0 +1,38 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + inline unsigned int RichTextAreaWidget::GetCharacterSize() const + { + return m_drawer.GetDefaultCharacterSize(); + } + + inline const Nz::Color& RichTextAreaWidget::GetTextColor() const + { + return m_drawer.GetDefaultColor(); + } + + inline Nz::Font* RichTextAreaWidget::GetTextFont() const + { + return m_drawer.GetDefaultFont(); + } + + inline void RichTextAreaWidget::SetCharacterSize(unsigned int characterSize) + { + m_drawer.SetDefaultCharacterSize(characterSize); + } + + inline void RichTextAreaWidget::SetTextColor(const Nz::Color& color) + { + m_drawer.SetDefaultColor(color); + } + + inline void RichTextAreaWidget::SetTextFont(Nz::FontRef font) + { + m_drawer.SetDefaultFont(std::move(font)); + } +} diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index ebce9e464..f28de9e57 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -7,20 +7,14 @@ #ifndef NDK_WIDGETS_TEXTAREAWIDGET_HPP #define NDK_WIDGETS_TEXTAREAWIDGET_HPP -#include #include -#include -#include -#include -#include +#include namespace Ndk { - class NDK_API TextAreaWidget : public BaseWidget + class NDK_API TextAreaWidget : public AbstractTextAreaWidget { public: - using CharacterFilter = std::function; - TextAreaWidget(BaseWidget* parent); TextAreaWidget(const TextAreaWidget&) = delete; TextAreaWidget(TextAreaWidget&&) = default; @@ -28,115 +22,46 @@ namespace Ndk void AppendText(const Nz::String& text); - inline void Clear(); + void Clear() override; - //virtual TextAreaWidget* Clone() const = 0; + using AbstractTextAreaWidget::Erase; + void Erase(std::size_t firstGlyph, std::size_t lastGlyph) override; - void EnableLineWrap(bool enable = true); - inline void EnableMultiline(bool enable = true); - inline void EnableTabWriting(bool enable = true); - - inline void Erase(std::size_t glyphPosition); - void Erase(std::size_t firstGlyph, std::size_t lastGlyph); - void EraseSelection(); - - inline const CharacterFilter& GetCharacterFilter() const; inline unsigned int GetCharacterSize() const; - inline const Nz::Vector2ui& GetCursorPosition() const; - inline Nz::Vector2ui GetCursorPosition(std::size_t glyphIndex) const; inline const Nz::String& GetDisplayText() const; - inline EchoMode GetEchoMode() const; - inline std::size_t GetGlyphIndex() const; - inline std::size_t GetGlyphIndex(const Nz::Vector2ui& cursorPosition) const; inline const Nz::String& GetText() const; inline const Nz::Color& GetTextColor() const; inline Nz::Font* GetTextFont() const; inline const Nz::Color& GetTextOulineColor() const; inline float GetTextOulineThickness() const; - Nz::Vector2ui GetHoveredGlyph(float x, float y) const; - - inline bool HasSelection() const; - - inline bool IsLineWrapEnabled() const; - inline bool IsMultilineEnabled() const; - inline bool IsReadOnly() const; - inline bool IsTabWritingEnabled() const; - - inline void MoveCursor(int offset); - inline void MoveCursor(const Nz::Vector2i& offset); - - inline Nz::Vector2ui NormalizeCursorPosition(Nz::Vector2ui cursorPosition) const; - - inline void SetCharacterFilter(CharacterFilter filter); void SetCharacterSize(unsigned int characterSize); - inline void SetCursorPosition(std::size_t glyphIndex); - inline void SetCursorPosition(Nz::Vector2ui cursorPosition); - inline void SetEchoMode(EchoMode echoMode); - inline void SetReadOnly(bool readOnly = true); - inline void SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition); inline void SetText(const Nz::String& text); inline void SetTextColor(const Nz::Color& text); inline void SetTextFont(Nz::FontRef font); inline void SetTextOutlineColor(const Nz::Color& color); inline void SetTextOutlineThickness(float thickness); - inline void Write(const Nz::String& text); - inline void Write(const Nz::String& text, const Nz::Vector2ui& glyphPosition); - void Write(const Nz::String& text, std::size_t glyphPosition); + using AbstractTextAreaWidget::Write; + void Write(const Nz::String& text, std::size_t glyphPosition) override; TextAreaWidget& operator=(const TextAreaWidget&) = delete; TextAreaWidget& operator=(TextAreaWidget&&) = default; - NazaraSignal(OnTextAreaCursorMove, const TextAreaWidget* /*textArea*/, Nz::Vector2ui* /*newCursorPosition*/); - NazaraSignal(OnTextAreaKeyBackspace, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyDown, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyEnd, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyHome, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyLeft, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyReturn, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyRight, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaKeyUp, const TextAreaWidget* /*textArea*/, bool* /*ignoreDefaultAction*/); - NazaraSignal(OnTextAreaSelection, const TextAreaWidget* /*textArea*/, Nz::Vector2ui* /*start*/, Nz::Vector2ui* /*end*/); - NazaraSignal(OnTextChanged, const TextAreaWidget* /*textArea*/, const Nz::String& /*text*/); + NazaraSignal(OnTextChanged, const AbstractTextAreaWidget* /*textArea*/, const Nz::String& /*text*/); private: - void Layout() override; + Nz::AbstractTextDrawer& GetTextDrawer() override; + const Nz::AbstractTextDrawer& GetTextDrawer() const override; - bool IsFocusable() const override; - void OnFocusLost() override; - void OnFocusReceived() override; - bool OnKeyPressed(const Nz::WindowEvent::KeyEvent& key) override; - void OnKeyReleased(const Nz::WindowEvent::KeyEvent& key) override; - void OnMouseButtonPress(int /*x*/, int /*y*/, Nz::Mouse::Button button) override; - void OnMouseButtonRelease(int /*x*/, int /*y*/, Nz::Mouse::Button button) override; - void OnMouseEnter() override; - void OnMouseMoved(int x, int y, int deltaX, int deltaY) override; - void OnTextEntered(char32_t character, bool repeated) override; + void HandleIndentation(bool add) override; + void HandleSelectionIndentation(bool add) override; + void HandleWordCursorMove(bool left) override; - inline void SetCursorPositionInternal(std::size_t glyphIndex); - inline void SetCursorPositionInternal(Nz::Vector2ui cursorPosition); - - void RefreshCursor(); void UpdateDisplayText(); - void UpdateTextSprite(); - CharacterFilter m_characterFilter; - EchoMode m_echoMode; - EntityHandle m_cursorEntity; - EntityHandle m_textEntity; Nz::SimpleTextDrawer m_drawer; Nz::String m_text; - Nz::TextSpriteRef m_textSprite; - Nz::Vector2ui m_cursorPositionBegin; - Nz::Vector2ui m_cursorPositionEnd; - Nz::Vector2ui m_selectionCursor; - std::vector m_cursorSprites; - bool m_isLineWrapEnabled; - bool m_isMouseButtonDown; - bool m_multiLineEnabled; - bool m_readOnly; - bool m_tabEnabled; // writes (Shift+)Tab character if set to true }; } diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index bdb95854e..aeb7f6914 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -6,98 +6,16 @@ namespace Ndk { - inline void TextAreaWidget::Clear() - { - m_cursorPositionBegin.MakeZero(); - m_cursorPositionEnd.MakeZero(); - m_drawer.Clear(); - m_text.Clear(); - m_textSprite->Update(m_drawer); - SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); - - RefreshCursor(); - OnTextChanged(this, m_text); - } - - inline void TextAreaWidget::EnableMultiline(bool enable) - { - m_multiLineEnabled = enable; - } - - inline void TextAreaWidget::EnableTabWriting(bool enable) - { - m_tabEnabled = enable; - } - - inline void TextAreaWidget::Erase(std::size_t glyphPosition) - { - Erase(glyphPosition, glyphPosition + 1U); - } - - inline const TextAreaWidget::CharacterFilter& TextAreaWidget::GetCharacterFilter() const - { - return m_characterFilter; - } - inline unsigned int TextAreaWidget::GetCharacterSize() const { return m_drawer.GetCharacterSize(); } - inline const Nz::Vector2ui& TextAreaWidget::GetCursorPosition() const - { - return m_cursorPositionBegin; - } - - Nz::Vector2ui TextAreaWidget::GetCursorPosition(std::size_t glyphIndex) const - { - glyphIndex = std::min(glyphIndex, m_drawer.GetGlyphCount()); - - std::size_t lineCount = m_drawer.GetLineCount(); - std::size_t line = 0U; - for (std::size_t i = line + 1; i < lineCount; ++i) - { - if (m_drawer.GetLine(i).glyphIndex > glyphIndex) - break; - - line = i; - } - - const auto& lineInfo = m_drawer.GetLine(line); - - Nz::Vector2ui cursorPos; - cursorPos.y = static_cast(line); - cursorPos.x = static_cast(glyphIndex - lineInfo.glyphIndex); - - return cursorPos; - } - inline const Nz::String& TextAreaWidget::GetDisplayText() const { return m_drawer.GetText(); } - inline EchoMode TextAreaWidget::GetEchoMode() const - { - return m_echoMode; - } - - inline std::size_t TextAreaWidget::GetGlyphIndex() const - { - return GetGlyphIndex(m_cursorPositionBegin); - } - - inline std::size_t TextAreaWidget::GetGlyphIndex(const Nz::Vector2ui& cursorPosition) const - { - std::size_t glyphIndex = m_drawer.GetLine(cursorPosition.y).glyphIndex + cursorPosition.x; - if (m_drawer.GetLineCount() > cursorPosition.y + 1) - glyphIndex = std::min(glyphIndex, m_drawer.GetLine(cursorPosition.y + 1).glyphIndex - 1); - else - glyphIndex = std::min(glyphIndex, m_drawer.GetGlyphCount()); - - return glyphIndex; - } - inline const Nz::String& TextAreaWidget::GetText() const { return m_text; @@ -123,144 +41,6 @@ namespace Ndk return m_drawer.GetOutlineThickness(); } - inline bool TextAreaWidget::HasSelection() const - { - return m_cursorPositionBegin != m_cursorPositionEnd; - } - - inline bool TextAreaWidget::IsLineWrapEnabled() const - { - return m_isLineWrapEnabled; - } - - inline bool TextAreaWidget::IsMultilineEnabled() const - { - return m_multiLineEnabled; - } - - inline bool TextAreaWidget::IsTabWritingEnabled() const - { - return m_tabEnabled; - } - - inline bool TextAreaWidget::IsReadOnly() const - { - return m_readOnly; - } - - inline void TextAreaWidget::MoveCursor(int offset) - { - std::size_t cursorGlyph = GetGlyphIndex(m_cursorPositionBegin); - if (offset >= 0) - SetCursorPosition(cursorGlyph + static_cast(offset)); - else - { - std::size_t nOffset = static_cast(-offset); - if (nOffset >= cursorGlyph) - SetCursorPosition(0); - else - SetCursorPosition(cursorGlyph - nOffset); - } - } - - inline void TextAreaWidget::MoveCursor(const Nz::Vector2i& offset) - { - auto ClampOffset = [] (unsigned int cursorPosition, int cursorOffset) -> unsigned int - { - if (cursorOffset >= 0) - return cursorPosition + cursorOffset; - else - { - unsigned int nOffset = static_cast(-cursorOffset); - if (nOffset >= cursorPosition) - return 0; - else - return cursorPosition - nOffset; - } - }; - - Nz::Vector2ui cursorPosition = m_cursorPositionBegin; - cursorPosition.x = ClampOffset(static_cast(cursorPosition.x), offset.x); - cursorPosition.y = ClampOffset(static_cast(cursorPosition.y), offset.y); - - SetCursorPosition(cursorPosition); - } - - inline Nz::Vector2ui TextAreaWidget::NormalizeCursorPosition(Nz::Vector2ui cursorPosition) const - { - std::size_t lineCount = m_drawer.GetLineCount(); - if (cursorPosition.y >= lineCount) - cursorPosition.y = static_cast(lineCount - 1); - - const auto& lineInfo = m_drawer.GetLine(cursorPosition.y); - if (cursorPosition.y + 1 < lineCount) - { - const auto& nextLineInfo = m_drawer.GetLine(cursorPosition.y + 1); - cursorPosition.x = std::min(cursorPosition.x, static_cast(nextLineInfo.glyphIndex - lineInfo.glyphIndex - 1)); - } - - return cursorPosition; - } - - inline void TextAreaWidget::SetCharacterFilter(CharacterFilter filter) - { - m_characterFilter = std::move(filter); - } - - inline void TextAreaWidget::SetCursorPosition(std::size_t glyphIndex) - { - Nz::Vector2ui position = GetCursorPosition(glyphIndex); - Nz::Vector2ui newPosition = position; - - OnTextAreaCursorMove(this, &newPosition); - - if (position == newPosition) - SetCursorPositionInternal(position); - else - SetCursorPositionInternal(GetGlyphIndex(newPosition)); - } - - inline void TextAreaWidget::SetCursorPosition(Nz::Vector2ui cursorPosition) - { - OnTextAreaCursorMove(this, &cursorPosition); - - return SetCursorPositionInternal(NormalizeCursorPosition(cursorPosition)); - } - - inline void TextAreaWidget::SetEchoMode(EchoMode echoMode) - { - m_echoMode = echoMode; - - UpdateDisplayText(); - } - - inline void TextAreaWidget::SetReadOnly(bool readOnly) - { - m_readOnly = readOnly; - m_cursorEntity->Enable(!m_readOnly && HasFocus()); - } - - inline void TextAreaWidget::SetSelection(Nz::Vector2ui fromPosition, Nz::Vector2ui toPosition) - { - // Ensure begin is before end - if (toPosition.y < fromPosition.y || (toPosition.y == fromPosition.y && toPosition.x < fromPosition.x)) - std::swap(fromPosition, toPosition); - - if (m_cursorPositionBegin != fromPosition || m_cursorPositionEnd != toPosition) - { - OnTextAreaSelection(this, &fromPosition, &toPosition); - - // Ensure begin is before end a second time (in case signal changed it) - if (toPosition.y < fromPosition.y || (toPosition.y == fromPosition.y && toPosition.x < fromPosition.x)) - std::swap(fromPosition, toPosition); - - m_cursorPositionBegin = NormalizeCursorPosition(fromPosition); - m_cursorPositionEnd = NormalizeCursorPosition(toPosition); - - RefreshCursor(); - } - } - inline void TextAreaWidget::SetText(const Nz::String& text) { m_text = text; @@ -296,27 +76,4 @@ namespace Ndk UpdateDisplayText(); } - - inline void TextAreaWidget::Write(const Nz::String& text) - { - Write(text, GetGlyphIndex(m_cursorPositionBegin)); - } - - inline void TextAreaWidget::Write(const Nz::String& text, const Nz::Vector2ui& glyphPosition) - { - Write(text, GetGlyphIndex(glyphPosition)); - } - - void TextAreaWidget::SetCursorPositionInternal(std::size_t glyphIndex) - { - return SetCursorPositionInternal(GetCursorPosition(glyphIndex)); - } - - inline void TextAreaWidget::SetCursorPositionInternal(Nz::Vector2ui cursorPosition) - { - m_cursorPositionBegin = cursorPosition; - m_cursorPositionEnd = m_cursorPositionBegin; - - RefreshCursor(); - } } diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index abd333bd3..292ea992c 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -61,25 +61,25 @@ namespace Ndk // Protect input prefix from erasure/selection m_input->SetCursorPosition(s_inputPrefixSize); - m_input->OnTextAreaCursorMove.Connect([](const TextAreaWidget* textArea, Nz::Vector2ui* newCursorPos) + m_input->OnTextAreaCursorMove.Connect([](const AbstractTextAreaWidget* textArea, Nz::Vector2ui* newCursorPos) { newCursorPos->x = std::max(newCursorPos->x, static_cast(s_inputPrefixSize)); }); - m_input->OnTextAreaSelection.Connect([](const TextAreaWidget* textArea, Nz::Vector2ui* start, Nz::Vector2ui* end) + m_input->OnTextAreaSelection.Connect([](const AbstractTextAreaWidget* textArea, Nz::Vector2ui* start, Nz::Vector2ui* end) { start->x = std::max(start->x, static_cast(s_inputPrefixSize)); end->x = std::max(end->x, static_cast(s_inputPrefixSize)); }); - m_input->OnTextAreaKeyBackspace.Connect([](const TextAreaWidget* textArea, bool* ignoreDefaultAction) + m_input->OnTextAreaKeyBackspace.Connect([](const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction) { if (textArea->GetGlyphIndex() <= s_inputPrefixSize) *ignoreDefaultAction = true; }); // Handle history - m_input->OnTextAreaKeyUp.Connect([&] (const TextAreaWidget* textArea, bool* ignoreDefaultAction) + m_input->OnTextAreaKeyUp.Connect([&] (const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction) { *ignoreDefaultAction = true; @@ -89,7 +89,7 @@ namespace Ndk m_input->SetText(s_inputPrefix + m_commandHistory[m_historyPosition]); }); - m_input->OnTextAreaKeyDown.Connect([&] (const TextAreaWidget* textArea, bool* ignoreDefaultAction) + m_input->OnTextAreaKeyDown.Connect([&] (const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction) { *ignoreDefaultAction = true; @@ -187,7 +187,7 @@ namespace Ndk /*! * \brief Performs this action when an input is added to the console */ - void Console::ExecuteInput(const TextAreaWidget* textArea, bool* ignoreDefaultAction) + void Console::ExecuteInput(const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction) { NazaraAssert(textArea == m_input, "Unexpected signal from an other text area"); diff --git a/SDK/src/NDK/Widgets/AbstractTextAreaWidget.cpp b/SDK/src/NDK/Widgets/AbstractTextAreaWidget.cpp new file mode 100644 index 000000000..ddb3467f5 --- /dev/null +++ b/SDK/src/NDK/Widgets/AbstractTextAreaWidget.cpp @@ -0,0 +1,489 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include +#include +#include +#include +#include + +namespace Ndk +{ + namespace + { + constexpr float paddingWidth = 5.f; + constexpr float paddingHeight = 3.f; + } + + AbstractTextAreaWidget::AbstractTextAreaWidget(BaseWidget* parent) : + BaseWidget(parent), + m_characterFilter(), + m_echoMode(EchoMode_Normal), + m_cursorPositionBegin(0U, 0U), + m_cursorPositionEnd(0U, 0U), + m_isLineWrapEnabled(false), + m_isMouseButtonDown(false), + m_multiLineEnabled(false), + m_readOnly(false), + m_tabEnabled(false) + { + m_textSprite = Nz::TextSprite::New(); + + m_textEntity = CreateEntity(); + m_textEntity->AddComponent().Attach(m_textSprite); + + auto& textNode = m_textEntity->AddComponent(); + textNode.SetParent(this); + textNode.SetPosition(paddingWidth, paddingHeight); + + m_cursorEntity = CreateEntity(); + m_cursorEntity->AddComponent(); + m_cursorEntity->AddComponent().SetParent(m_textEntity); + m_cursorEntity->GetComponent(); + m_cursorEntity->Enable(false); + + SetCursor(Nz::SystemCursor_Text); + + EnableBackground(true); + } + + void AbstractTextAreaWidget::Clear() + { + Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + m_cursorPositionBegin.MakeZero(); + m_cursorPositionEnd.MakeZero(); + textDrawer.Clear(); + m_textSprite->Update(textDrawer); + SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + + RefreshCursor(); + } + + void AbstractTextAreaWidget::EnableLineWrap(bool enable) + { + if (m_isLineWrapEnabled != enable) + { + m_isLineWrapEnabled = enable; + + Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + if (enable) + textDrawer.SetMaxLineWidth(GetWidth()); + else + textDrawer.SetMaxLineWidth(std::numeric_limits::infinity()); + + UpdateTextSprite(); + } + } + + Nz::Vector2ui AbstractTextAreaWidget::GetHoveredGlyph(float x, float y) const + { + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + auto& textNode = m_textEntity->GetComponent(); + Nz::Vector2f textPosition = Nz::Vector2f(textNode.GetPosition(Nz::CoordSys_Local)); + x -= textPosition.x; + y -= textPosition.y; + + std::size_t glyphCount = textDrawer.GetGlyphCount(); + if (glyphCount > 0) + { + std::size_t lineCount = textDrawer.GetLineCount(); + std::size_t line = 0U; + for (; line < lineCount - 1; ++line) + { + Nz::Rectf lineBounds = textDrawer.GetLine(line).bounds; + if (lineBounds.GetMaximum().y > y) + break; + } + + std::size_t upperLimit = (line != lineCount - 1) ? textDrawer.GetLine(line + 1).glyphIndex : glyphCount + 1; + + std::size_t firstLineGlyph = textDrawer.GetLine(line).glyphIndex; + std::size_t i = firstLineGlyph; + for (; i < upperLimit - 1; ++i) + { + Nz::Rectf bounds = textDrawer.GetGlyph(i).bounds; + if (x < bounds.x + bounds.width * 0.75f) + break; + } + + return Nz::Vector2ui(Nz::Vector2(i - firstLineGlyph, line)); + } + + return Nz::Vector2ui::Zero(); + } + + void AbstractTextAreaWidget::Layout() + { + BaseWidget::Layout(); + + if (m_isLineWrapEnabled) + { + Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + textDrawer.SetMaxLineWidth(GetWidth()); + UpdateTextSprite(); + } + + RefreshCursor(); + } + + bool AbstractTextAreaWidget::IsFocusable() const + { + return !m_readOnly; + } + + void AbstractTextAreaWidget::OnFocusLost() + { + m_cursorEntity->Disable(); + } + + void AbstractTextAreaWidget::OnFocusReceived() + { + if (!m_readOnly) + m_cursorEntity->Enable(true); + } + + bool AbstractTextAreaWidget::OnKeyPressed(const Nz::WindowEvent::KeyEvent& key) + { + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + switch (key.code) + { + case Nz::Keyboard::Backspace: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyBackspace(this, &ignoreDefaultAction); + + std::size_t cursorGlyphEnd = GetGlyphIndex(m_cursorPositionEnd); + + if (ignoreDefaultAction || cursorGlyphEnd == 0) + return true; + + // When a text is selected, delete key does the same as delete and leave the character behind it + if (HasSelection()) + EraseSelection(); + else + { + MoveCursor(-1); + Erase(GetGlyphIndex(m_cursorPositionBegin)); + } + + return true; + } + + case Nz::Keyboard::Delete: + { + if (HasSelection()) + EraseSelection(); + else + Erase(GetGlyphIndex(m_cursorPositionBegin)); + + return true; + } + + case Nz::Keyboard::Down: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyDown(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (HasSelection()) + SetCursorPosition(m_cursorPositionEnd); + + MoveCursor({0, 1}); + return true; + } + + case Nz::Keyboard::End: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyEnd(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + std::size_t lineCount = textDrawer.GetLineCount(); + if (key.control && lineCount > 0) + SetCursorPosition({ static_cast(textDrawer.GetLineGlyphCount(lineCount - 1)), static_cast(lineCount - 1) }); + else + SetCursorPosition({ static_cast(textDrawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); + + return true; + } + + case Nz::Keyboard::Home: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyHome(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + SetCursorPosition({ 0U, key.control ? 0U : m_cursorPositionEnd.y }); + return true; + } + + case Nz::Keyboard::Left: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyLeft(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (HasSelection()) + SetCursorPosition(m_cursorPositionBegin); + else if (key.control) + HandleWordCursorMove(true); + else + MoveCursor(-1); + + return true; + } + + case Nz::Keyboard::Return: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyReturn(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (!m_multiLineEnabled) + break; + + if (HasSelection()) + EraseSelection(); + + Write(Nz::String('\n')); + return true;; + } + + case Nz::Keyboard::Right: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyRight(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (HasSelection()) + SetCursorPosition(m_cursorPositionEnd); + else if (key.control) + HandleWordCursorMove(false); + else + MoveCursor(1); + + return true; + } + + case Nz::Keyboard::Up: + { + bool ignoreDefaultAction = false; + OnTextAreaKeyUp(this, &ignoreDefaultAction); + + if (ignoreDefaultAction) + return true; + + if (HasSelection()) + SetCursorPosition(m_cursorPositionBegin); + + MoveCursor({0, -1}); + return true; + } + + case Nz::Keyboard::Tab: + { + if (!m_tabEnabled) + return false; + + if (HasSelection()) + HandleSelectionIndentation(!key.shift); + else + HandleIndentation(!key.shift); + + return true; + } + + default: + break; + } + + return false; + } + + void AbstractTextAreaWidget::OnKeyReleased(const Nz::WindowEvent::KeyEvent& /*key*/) + { + } + + void AbstractTextAreaWidget::OnMouseButtonPress(int x, int y, Nz::Mouse::Button button) + { + if (button == Nz::Mouse::Left) + { + SetFocus(); + + Nz::Vector2ui hoveredGlyph = GetHoveredGlyph(float(x), float(y)); + + // Shift extends selection + if (Nz::Keyboard::IsKeyPressed(Nz::Keyboard::LShift) || Nz::Keyboard::IsKeyPressed(Nz::Keyboard::RShift)) + SetSelection(hoveredGlyph, m_selectionCursor); + else + { + SetCursorPosition(hoveredGlyph); + m_selectionCursor = m_cursorPositionBegin; + } + + m_isMouseButtonDown = true; + } + } + + void AbstractTextAreaWidget::OnMouseButtonRelease(int, int, Nz::Mouse::Button button) + { + if (button == Nz::Mouse::Left) + m_isMouseButtonDown = false; + } + + void AbstractTextAreaWidget::OnMouseEnter() + { + if (!Nz::Mouse::IsButtonPressed(Nz::Mouse::Left)) + m_isMouseButtonDown = false; + } + + void AbstractTextAreaWidget::OnMouseMoved(int x, int y, int deltaX, int deltaY) + { + if (m_isMouseButtonDown) + SetSelection(m_selectionCursor, GetHoveredGlyph(float(x), float(y))); + } + + void AbstractTextAreaWidget::OnTextEntered(char32_t character, bool /*repeated*/) + { + if (m_readOnly) + return; + + if (Nz::Unicode::GetCategory(character) == Nz::Unicode::Category_Other_Control || (m_characterFilter && !m_characterFilter(character))) + return; + + if (HasSelection()) + EraseSelection(); + + Write(Nz::String::Unicode(character)); + } + + void AbstractTextAreaWidget::RefreshCursor() + { + if (m_readOnly) + return; + + const Nz::AbstractTextDrawer& textDrawer = GetTextDrawer(); + + auto GetGlyph = [&](const Nz::Vector2ui& glyphPosition, std::size_t* glyphIndex) -> const Nz::AbstractTextDrawer::Glyph* + { + if (glyphPosition.y >= textDrawer.GetLineCount()) + return nullptr; + + const auto& lineInfo = textDrawer.GetLine(glyphPosition.y); + + std::size_t cursorGlyph = GetGlyphIndex({ glyphPosition.x, glyphPosition.y }); + if (glyphIndex) + *glyphIndex = cursorGlyph; + + std::size_t glyphCount = textDrawer.GetGlyphCount(); + if (glyphCount > 0 && lineInfo.glyphIndex < cursorGlyph) + { + const auto& glyph = textDrawer.GetGlyph(std::min(cursorGlyph, glyphCount - 1)); + return &glyph; + } + else + return nullptr; + }; + + // Move text so that cursor is always visible + const auto* lastGlyph = GetGlyph(m_cursorPositionEnd, nullptr); + float glyphPos = (lastGlyph) ? lastGlyph->bounds.x : 0.f; + float glyphWidth = (lastGlyph) ? lastGlyph->bounds.width : 0.f; + + auto& node = m_textEntity->GetComponent(); + float textPosition = node.GetPosition(Nz::CoordSys_Local).x - paddingWidth; + float cursorPosition = glyphPos + textPosition; + float width = GetWidth(); + + if (width <= textDrawer.GetBounds().width) + { + if (cursorPosition + glyphWidth > width) + node.Move(width - cursorPosition - glyphWidth, 0.f); + else if (cursorPosition - glyphWidth < 0.f) + node.Move(-cursorPosition + glyphWidth, 0.f); + } + else + node.Move(-textPosition, 0.f); // Reset text position if we have enough room to show everything + + // Show cursor/selection + std::size_t selectionLineCount = m_cursorPositionEnd.y - m_cursorPositionBegin.y + 1; + std::size_t oldSpriteCount = m_cursorSprites.size(); + if (m_cursorSprites.size() != selectionLineCount) + { + m_cursorSprites.resize(m_cursorPositionEnd.y - m_cursorPositionBegin.y + 1); + for (std::size_t i = oldSpriteCount; i < m_cursorSprites.size(); ++i) + { + m_cursorSprites[i] = Nz::Sprite::New(); + m_cursorSprites[i]->SetMaterial(Nz::Material::New("Translucent2D")); + } + } + + GraphicsComponent& gfxComponent = m_cursorEntity->GetComponent(); + gfxComponent.Clear(); + + for (unsigned int i = m_cursorPositionBegin.y; i <= m_cursorPositionEnd.y; ++i) + { + const auto& lineInfo = textDrawer.GetLine(i); + + Nz::SpriteRef& cursorSprite = m_cursorSprites[i - m_cursorPositionBegin.y]; + if (i == m_cursorPositionBegin.y || i == m_cursorPositionEnd.y) + { + auto GetGlyphPos = [&](const Nz::Vector2ui& glyphPosition) + { + std::size_t glyphIndex; + const auto* glyph = GetGlyph(glyphPosition, &glyphIndex); + if (glyph) + { + float position = glyph->bounds.x; + if (glyphIndex >= textDrawer.GetGlyphCount()) + position += glyph->bounds.width; + + return position; + } + else + return 0.f; + }; + + float beginX = (i == m_cursorPositionBegin.y) ? GetGlyphPos({ m_cursorPositionBegin.x, i }) : 0.f; + float endX = (i == m_cursorPositionEnd.y) ? GetGlyphPos({ m_cursorPositionEnd.x, i }) : lineInfo.bounds.width; + float spriteSize = std::max(endX - beginX, 1.f); + + cursorSprite->SetColor((m_cursorPositionBegin == m_cursorPositionEnd) ? Nz::Color::Black : Nz::Color(0, 0, 0, 50)); + cursorSprite->SetSize(spriteSize, lineInfo.bounds.height); + + gfxComponent.Attach(cursorSprite, Nz::Matrix4f::Translate({ beginX, lineInfo.bounds.y, 0.f })); + } + else + { + cursorSprite->SetColor(Nz::Color(0, 0, 0, 50)); + cursorSprite->SetSize(lineInfo.bounds.width, lineInfo.bounds.height); + + gfxComponent.Attach(cursorSprite, Nz::Matrix4f::Translate({ 0.f, lineInfo.bounds.y, 0.f })); + } + } + } + + void AbstractTextAreaWidget::UpdateTextSprite() + { + m_textSprite->Update(GetTextDrawer()); + SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + } +} diff --git a/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp b/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp new file mode 100644 index 000000000..a80c0e29d --- /dev/null +++ b/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp @@ -0,0 +1,156 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + +#include + +namespace Ndk +{ + RichTextAreaWidget::RichTextAreaWidget(BaseWidget* parent) : + AbstractTextAreaWidget(parent) + { + Layout(); + } + + void RichTextAreaWidget::AppendText(const Nz::String& text) + { + //m_text += text; + switch (m_echoMode) + { + case EchoMode_Normal: + m_drawer.AppendText(text); + break; + + case EchoMode_Password: + m_drawer.AppendText(Nz::String(text.GetLength(), '*')); + break; + + case EchoMode_PasswordExceptLast: + { + /*m_drawer.Clear(); + std::size_t textLength = m_text.GetLength(); + if (textLength >= 2) + { + std::size_t lastCharacterPosition = m_text.GetCharacterPosition(textLength - 2); + if (lastCharacterPosition != Nz::String::npos) + m_drawer.AppendText(Nz::String(textLength - 1, '*')); + } + + if (textLength >= 1) + m_drawer.AppendText(m_text.SubString(m_text.GetCharacterPosition(textLength - 1)));*/ + + break; + } + } + + UpdateTextSprite(); + + //OnTextChanged(this, m_text); + } + + void RichTextAreaWidget::Clear() + { + AbstractTextAreaWidget::Clear(); + } + + void RichTextAreaWidget::Erase(std::size_t firstGlyph, std::size_t lastGlyph) + { + if (firstGlyph > lastGlyph) + std::swap(firstGlyph, lastGlyph); + + std::size_t textLength = m_drawer.GetGlyphCount(); + if (firstGlyph > textLength) + return; + + std::size_t firstBlock = m_drawer.FindBlock(firstGlyph); + std::size_t lastBlock = m_drawer.FindBlock(lastGlyph); + if (firstBlock == lastBlock) + { + const Nz::String& blockText = m_drawer.GetBlockText(firstBlock); + std::size_t blockFirstGlyph = m_drawer.GetBlockFirstGlyphIndex(firstBlock); + + Nz::String newText; + if (firstGlyph > blockFirstGlyph) + { + std::size_t characterPosition = blockText.GetCharacterPosition(firstGlyph - blockFirstGlyph - 1); + NazaraAssert(characterPosition != Nz::String::npos, "Invalid character position"); + + newText.Append(blockText.SubString(0, characterPosition)); + } + + if (lastGlyph < textLength) + { + std::size_t characterPosition = blockText.GetCharacterPosition(lastGlyph - blockFirstGlyph); + NazaraAssert(characterPosition != Nz::String::npos, "Invalid character position"); + + newText.Append(blockText.SubString(characterPosition)); + } + + m_drawer.SetBlockText(firstBlock, newText); + } + else + { + // More complicated algorithm, yay + } + + UpdateDisplayText(); + } + + void RichTextAreaWidget::Write(const Nz::String& text, std::size_t glyphPosition) + { + auto block = m_drawer.GetBlock(m_drawer.FindBlock(glyphPosition)); + std::size_t firstGlyph = block.GetFirstGlyphIndex(); + assert(glyphPosition >= firstGlyph); + + Nz::String blockText = block.GetText(); + std::size_t characterPosition = blockText.GetCharacterPosition(glyphPosition - firstGlyph); + blockText.Insert(characterPosition, text); + + block.SetText(blockText); + SetCursorPosition(glyphPosition + text.GetLength()); + + UpdateDisplayText(); + } + + Nz::AbstractTextDrawer& RichTextAreaWidget::GetTextDrawer() + { + return m_drawer; + } + + const Nz::AbstractTextDrawer& RichTextAreaWidget::GetTextDrawer() const + { + return m_drawer; + } + + void RichTextAreaWidget::HandleIndentation(bool add) + { + } + + void RichTextAreaWidget::HandleSelectionIndentation(bool add) + { + } + + void RichTextAreaWidget::HandleWordCursorMove(bool left) + { + } + + void RichTextAreaWidget::UpdateDisplayText() + { + /*m_drawer.Clear(); + switch (m_echoMode) + { + case EchoMode_Normal: + m_drawer.AppendText(m_text); + break; + + case EchoMode_Password: + case EchoMode_PasswordExceptLast: + m_drawer.AppendText(Nz::String(m_text.GetLength(), '*')); + break; + }*/ + + UpdateTextSprite(); + + SetCursorPosition(m_cursorPositionBegin); //< Refresh cursor position (prevent it from being outside of the text) + } +} diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 03a6c30b6..6860a5139 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -10,46 +10,14 @@ namespace Ndk { - namespace - { - constexpr float paddingWidth = 5.f; - constexpr float paddingHeight = 3.f; - } - TextAreaWidget::TextAreaWidget(BaseWidget* parent) : - BaseWidget(parent), - m_characterFilter(), - m_echoMode(EchoMode_Normal), - m_cursorPositionBegin(0U, 0U), - m_cursorPositionEnd(0U, 0U), - m_isLineWrapEnabled(false), - m_isMouseButtonDown(false), - m_multiLineEnabled(false), - m_readOnly(false), - m_tabEnabled(false) + AbstractTextAreaWidget(parent) { - m_textSprite = Nz::TextSprite::New(); - - m_textEntity = CreateEntity(); - m_textEntity->AddComponent().Attach(m_textSprite); - - auto& textNode = m_textEntity->AddComponent(); - textNode.SetParent(this); - textNode.SetPosition(paddingWidth, paddingHeight); - - m_cursorEntity = CreateEntity(); - m_cursorEntity->AddComponent(); - m_cursorEntity->AddComponent().SetParent(m_textEntity); - m_cursorEntity->GetComponent(); - m_cursorEntity->Enable(false); - - SetCursor(Nz::SystemCursor_Text); SetCharacterSize(GetCharacterSize()); //< Actualize minimum / preferred size - EnableBackground(true); Layout(); } - + void TextAreaWidget::AppendText(const Nz::String& text) { m_text += text; @@ -86,21 +54,14 @@ namespace Ndk OnTextChanged(this, m_text); } - void TextAreaWidget::EnableLineWrap(bool enable) + void TextAreaWidget::Clear() { - if (m_isLineWrapEnabled != enable) - { - m_isLineWrapEnabled = enable; + AbstractTextAreaWidget::Clear(); - if (enable) - m_drawer.SetMaxLineWidth(GetWidth()); - else - m_drawer.SetMaxLineWidth(std::numeric_limits::infinity()); - - UpdateTextSprite(); - } + m_text.Clear(); + OnTextChanged(this, m_text); } - + void TextAreaWidget::Erase(std::size_t firstGlyph, std::size_t lastGlyph) { if (firstGlyph > lastGlyph) @@ -130,50 +91,6 @@ namespace Ndk SetText(newText); } - void TextAreaWidget::EraseSelection() - { - if (!HasSelection()) - return; - - Erase(GetGlyphIndex(m_cursorPositionBegin), GetGlyphIndex(m_cursorPositionEnd)); - } - - Nz::Vector2ui TextAreaWidget::GetHoveredGlyph(float x, float y) const - { - auto& textNode = m_textEntity->GetComponent(); - Nz::Vector2f textPosition = Nz::Vector2f(textNode.GetPosition(Nz::CoordSys_Local)); - x -= textPosition.x; - y -= textPosition.y; - - std::size_t glyphCount = m_drawer.GetGlyphCount(); - if (glyphCount > 0) - { - std::size_t lineCount = m_drawer.GetLineCount(); - std::size_t line = 0U; - for (; line < lineCount - 1; ++line) - { - Nz::Rectf lineBounds = m_drawer.GetLine(line).bounds; - if (lineBounds.GetMaximum().y > y) - break; - } - - std::size_t upperLimit = (line != lineCount - 1) ? m_drawer.GetLine(line + 1).glyphIndex : glyphCount + 1; - - std::size_t firstLineGlyph = m_drawer.GetLine(line).glyphIndex; - std::size_t i = firstLineGlyph; - for (; i < upperLimit - 1; ++i) - { - Nz::Rectf bounds = m_drawer.GetGlyph(i).bounds; - if (x < bounds.x + bounds.width * 0.75f) - break; - } - - return Nz::Vector2ui(Nz::Vector2(i - firstLineGlyph, line)); - } - - return Nz::Vector2ui::Zero(); - } - void TextAreaWidget::SetCharacterSize(unsigned int characterSize) { m_drawer.SetCharacterSize(characterSize); @@ -198,6 +115,7 @@ namespace Ndk { if (glyphPosition >= m_drawer.GetGlyphCount()) { + // It's faster to append than to insert in the middle AppendText(text); SetCursorPosition(m_drawer.GetGlyphCount()); } @@ -210,452 +128,109 @@ namespace Ndk } } - void TextAreaWidget::Layout() + Nz::AbstractTextDrawer& TextAreaWidget::GetTextDrawer() { - BaseWidget::Layout(); + return m_drawer; + } - if (m_isLineWrapEnabled) + const Nz::AbstractTextDrawer& TextAreaWidget::GetTextDrawer() const + { + return m_drawer; + } + + void TextAreaWidget::HandleIndentation(bool add) + { + if (add) + Write(Nz::String('\t')); + else { - m_drawer.SetMaxLineWidth(GetWidth()); - UpdateTextSprite(); - } + std::size_t currentGlyph = GetGlyphIndex(m_cursorPositionBegin); - RefreshCursor(); - } - - bool TextAreaWidget::IsFocusable() const - { - return !m_readOnly; - } - - void TextAreaWidget::OnFocusLost() - { - m_cursorEntity->Disable(); - } - - void TextAreaWidget::OnFocusReceived() - { - if (!m_readOnly) - m_cursorEntity->Enable(true); - } - - bool TextAreaWidget::OnKeyPressed(const Nz::WindowEvent::KeyEvent& key) - { - switch (key.code) - { - case Nz::Keyboard::Backspace: + if (currentGlyph > 0 && m_text[m_text.GetCharacterPosition(currentGlyph - 1U)] == '\t') // Check if previous glyph is a tab { - bool ignoreDefaultAction = false; - OnTextAreaKeyBackspace(this, &ignoreDefaultAction); + Erase(currentGlyph - 1U); - std::size_t cursorGlyphBegin = GetGlyphIndex(m_cursorPositionBegin); - std::size_t cursorGlyphEnd = GetGlyphIndex(m_cursorPositionEnd); - - if (ignoreDefaultAction || cursorGlyphEnd == 0) - return true; - - // When a text is selected, delete key does the same as delete and leave the character behind it - if (HasSelection()) - EraseSelection(); - else - { - Nz::String newText; - - if (cursorGlyphBegin > 1) - newText.Append(m_text.SubString(0, m_text.GetCharacterPosition(cursorGlyphBegin - 1) - 1)); - - if (cursorGlyphEnd < m_text.GetLength()) - newText.Append(m_text.SubString(m_text.GetCharacterPosition(cursorGlyphEnd))); - - // Move cursor before setting text (to prevent SetText to move our cursor) + if (m_cursorPositionBegin.x < static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionBegin.y))) MoveCursor(-1); - - SetText(newText); - } - - return true; } - - case Nz::Keyboard::Delete: - { - if (HasSelection()) - EraseSelection(); - else - Erase(GetGlyphIndex(m_cursorPositionBegin)); - - return true; - } - - case Nz::Keyboard::Down: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyDown(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - if (HasSelection()) - SetCursorPosition(m_cursorPositionEnd); - - MoveCursor({0, 1}); - return true; - } - - case Nz::Keyboard::End: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyEnd(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - std::size_t lineCount = m_drawer.GetLineCount(); - if (key.control && lineCount > 0) - SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(lineCount - 1)), static_cast(lineCount - 1) }); - else - SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); - - return true; - } - - case Nz::Keyboard::Home: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyHome(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - SetCursorPosition({ 0U, key.control ? 0U : m_cursorPositionEnd.y }); - return true; - } - - case Nz::Keyboard::Left: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyLeft(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - if (HasSelection()) - SetCursorPosition(m_cursorPositionBegin); - else if (key.control) - { - std::size_t index = GetGlyphIndex(m_cursorPositionBegin); - - if (index == 0) - return true; - - std::size_t spaceIndex = m_text.FindLast(' ', index - 2); - std::size_t endlIndex = m_text.FindLast('\n', index - 1); - - if ((spaceIndex > endlIndex || endlIndex == Nz::String::npos) && spaceIndex != Nz::String::npos) - SetCursorPosition(spaceIndex + 1); - else if (endlIndex != Nz::String::npos) - { - if (index == endlIndex + 1) - SetCursorPosition(endlIndex); - else - SetCursorPosition(endlIndex + 1); - } - else - SetCursorPosition({ 0U, m_cursorPositionBegin.y }); - } - else - MoveCursor(-1); - - return true; - } - - case Nz::Keyboard::Return: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyReturn(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - if (!m_multiLineEnabled) - break; - - if (HasSelection()) - EraseSelection(); - - Write(Nz::String('\n')); - return true;; - } - - case Nz::Keyboard::Right: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyRight(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - if (HasSelection()) - SetCursorPosition(m_cursorPositionEnd); - else if (key.control) - { - std::size_t index = GetGlyphIndex(m_cursorPositionEnd); - std::size_t spaceIndex = m_text.Find(' ', index); - std::size_t endlIndex = m_text.Find('\n', index); - - if (spaceIndex < endlIndex && spaceIndex != Nz::String::npos) - { - if (m_text.GetSize() > spaceIndex) - SetCursorPosition(spaceIndex + 1); - else - SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); - } - else if (endlIndex != Nz::String::npos) - { - if (index == endlIndex) - SetCursorPosition(endlIndex + 1); - else - SetCursorPosition(endlIndex); - } - else - SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); - } - else - MoveCursor(1); - - return true; - } - - case Nz::Keyboard::Up: - { - bool ignoreDefaultAction = false; - OnTextAreaKeyUp(this, &ignoreDefaultAction); - - if (ignoreDefaultAction) - return true; - - if (HasSelection()) - SetCursorPosition(m_cursorPositionBegin); - - MoveCursor({0, -1}); - return true; - } - - case Nz::Keyboard::Tab: - { - if (!m_tabEnabled) - return false; - - if (HasSelection()) - { - for(unsigned line = m_cursorPositionBegin.y; line <= m_cursorPositionEnd.y; ++line) - { - const Nz::Vector2ui cursorPositionBegin = m_cursorPositionBegin; - const Nz::Vector2ui cursorPositionEnd = m_cursorPositionEnd; - - if (key.shift) - { - if (m_drawer.GetLineGlyphCount(line) == 0) - continue; - - std::size_t firstGlyph = GetGlyphIndex({ 0U, line }); - - if (m_text[m_text.GetCharacterPosition(firstGlyph)] == '\t') - { - Erase(firstGlyph); - SetSelection(cursorPositionBegin - (cursorPositionBegin.y == line && cursorPositionBegin.x != 0U ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {}), - cursorPositionEnd - (cursorPositionEnd.y == line && cursorPositionEnd.x != 0U ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {})); - } - } - else - { - Write(Nz::String('\t'), { 0U, line }); - SetSelection(cursorPositionBegin + (cursorPositionBegin.y == line && cursorPositionBegin.x != 0U ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {}), - cursorPositionEnd + (cursorPositionEnd.y == line ? Nz::Vector2ui { 1U, 0U } : Nz::Vector2ui {})); - } - } - } - else if (key.shift) - { - std::size_t currentGlyph = GetGlyphIndex(m_cursorPositionBegin); - - if (currentGlyph > 0 && m_text[m_text.GetCharacterPosition(currentGlyph - 1U)] == '\t') // Check if previous glyph is a tab - { - Erase(currentGlyph - 1U); - - if (m_cursorPositionBegin.x < static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionBegin.y))) - MoveCursor(-1); - } - } - else - Write(Nz::String('\t')); - - return true; - } - - default: - break; } - - return false; } - void TextAreaWidget::OnKeyReleased(const Nz::WindowEvent::KeyEvent& /*key*/) + void TextAreaWidget::HandleSelectionIndentation(bool add) { - } - - void TextAreaWidget::OnMouseButtonPress(int x, int y, Nz::Mouse::Button button) - { - if (button == Nz::Mouse::Left) + for (unsigned line = m_cursorPositionBegin.y; line <= m_cursorPositionEnd.y; ++line) { - SetFocus(); + const Nz::Vector2ui cursorPositionBegin = m_cursorPositionBegin; + const Nz::Vector2ui cursorPositionEnd = m_cursorPositionEnd; - Nz::Vector2ui hoveredGlyph = GetHoveredGlyph(float(x), float(y)); - - // Shift extends selection - if (Nz::Keyboard::IsKeyPressed(Nz::Keyboard::LShift) || Nz::Keyboard::IsKeyPressed(Nz::Keyboard::RShift)) - SetSelection(hoveredGlyph, m_selectionCursor); + if (add) + { + Write(Nz::String('\t'), { 0U, line }); + SetSelection(cursorPositionBegin + (cursorPositionBegin.y == line && cursorPositionBegin.x != 0U ? Nz::Vector2ui{ 1U, 0U } : Nz::Vector2ui{}), + cursorPositionEnd + (cursorPositionEnd.y == line ? Nz::Vector2ui{ 1U, 0U } : Nz::Vector2ui{})); + } else { - SetCursorPosition(hoveredGlyph); - m_selectionCursor = m_cursorPositionBegin; - } + if (m_drawer.GetLineGlyphCount(line) == 0) + continue; - m_isMouseButtonDown = true; + std::size_t firstGlyph = GetGlyphIndex({ 0U, line }); + + if (m_text[m_text.GetCharacterPosition(firstGlyph)] == '\t') + { + Erase(firstGlyph); + SetSelection(cursorPositionBegin - (cursorPositionBegin.y == line && cursorPositionBegin.x != 0U ? Nz::Vector2ui{ 1U, 0U } : Nz::Vector2ui{}), + cursorPositionEnd - (cursorPositionEnd.y == line && cursorPositionEnd.x != 0U ? Nz::Vector2ui{ 1U, 0U } : Nz::Vector2ui{})); + } + } } } - void TextAreaWidget::OnMouseButtonRelease(int, int, Nz::Mouse::Button button) + void TextAreaWidget::HandleWordCursorMove(bool left) { - if (button == Nz::Mouse::Left) - m_isMouseButtonDown = false; - } - - void TextAreaWidget::OnMouseEnter() - { - if (!Nz::Mouse::IsButtonPressed(Nz::Mouse::Left)) - m_isMouseButtonDown = false; - } - - void TextAreaWidget::OnMouseMoved(int x, int y, int deltaX, int deltaY) - { - if (m_isMouseButtonDown) - SetSelection(m_selectionCursor, GetHoveredGlyph(float(x), float(y))); - } - - void TextAreaWidget::OnTextEntered(char32_t character, bool /*repeated*/) - { - if (m_readOnly) - return; - - if (Nz::Unicode::GetCategory(character) == Nz::Unicode::Category_Other_Control || (m_characterFilter && !m_characterFilter(character))) - return; - - if (HasSelection()) - EraseSelection(); - - Write(Nz::String::Unicode(character)); - } - - void TextAreaWidget::RefreshCursor() - { - if (m_readOnly) - return; - - auto GetGlyph = [&](const Nz::Vector2ui& glyphPosition, std::size_t* glyphIndex) -> const Nz::AbstractTextDrawer::Glyph* + if (left) { - const auto& lineInfo = m_drawer.GetLine(glyphPosition.y); + std::size_t index = GetGlyphIndex(m_cursorPositionBegin); + if (index == 0) + return; - std::size_t cursorGlyph = GetGlyphIndex({ glyphPosition.x, glyphPosition.y }); - if (glyphIndex) - *glyphIndex = cursorGlyph; + std::size_t spaceIndex = m_text.FindLast(' ', index - 2); + std::size_t endlIndex = m_text.FindLast('\n', index - 1); - std::size_t glyphCount = m_drawer.GetGlyphCount(); - if (glyphCount > 0 && lineInfo.glyphIndex < cursorGlyph) + if ((spaceIndex > endlIndex || endlIndex == Nz::String::npos) && spaceIndex != Nz::String::npos) + SetCursorPosition(spaceIndex + 1); + else if (endlIndex != Nz::String::npos) { - const auto& glyph = m_drawer.GetGlyph(std::min(cursorGlyph, glyphCount - 1)); - return &glyph; + if (index == endlIndex + 1) + SetCursorPosition(endlIndex); + else + SetCursorPosition(endlIndex + 1); } else - return nullptr; - }; - - // Move text so that cursor is always visible - const auto* lastGlyph = GetGlyph(m_cursorPositionEnd, nullptr); - float glyphPos = (lastGlyph) ? lastGlyph->bounds.x : 0.f; - float glyphWidth = (lastGlyph) ? lastGlyph->bounds.width : 0.f; - - auto& node = m_textEntity->GetComponent(); - float textPosition = node.GetPosition(Nz::CoordSys_Local).x - paddingWidth; - float cursorPosition = glyphPos + textPosition; - float width = GetWidth(); - - if (width <= m_drawer.GetBounds().width) - { - if (cursorPosition + glyphWidth > width) - node.Move(width - cursorPosition - glyphWidth, 0.f); - else if (cursorPosition - glyphWidth < 0.f) - node.Move(-cursorPosition + glyphWidth, 0.f); + SetCursorPosition({ 0U, m_cursorPositionBegin.y }); } else - node.Move(-textPosition, 0.f); // Reset text position if we have enough room to show everything - - // Show cursor/selection - std::size_t selectionLineCount = m_cursorPositionEnd.y - m_cursorPositionBegin.y + 1; - std::size_t oldSpriteCount = m_cursorSprites.size(); - if (m_cursorSprites.size() != selectionLineCount) { - m_cursorSprites.resize(m_cursorPositionEnd.y - m_cursorPositionBegin.y + 1); - for (std::size_t i = oldSpriteCount; i < m_cursorSprites.size(); ++i) + std::size_t index = GetGlyphIndex(m_cursorPositionEnd); + std::size_t spaceIndex = m_text.Find(' ', index); + std::size_t endlIndex = m_text.Find('\n', index); + + if (spaceIndex < endlIndex && spaceIndex != Nz::String::npos) { - m_cursorSprites[i] = Nz::Sprite::New(); - m_cursorSprites[i]->SetMaterial(Nz::Material::New("Translucent2D")); + if (m_text.GetSize() > spaceIndex) + SetCursorPosition(spaceIndex + 1); + else + SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); } - } - - float lineHeight = float(m_drawer.GetFont()->GetSizeInfo(m_drawer.GetCharacterSize()).lineHeight); - - GraphicsComponent& gfxComponent = m_cursorEntity->GetComponent(); - gfxComponent.Clear(); - - for (unsigned int i = m_cursorPositionBegin.y; i <= m_cursorPositionEnd.y; ++i) - { - const auto& lineInfo = m_drawer.GetLine(i); - - Nz::SpriteRef& cursorSprite = m_cursorSprites[i - m_cursorPositionBegin.y]; - if (i == m_cursorPositionBegin.y || i == m_cursorPositionEnd.y) + else if (endlIndex != Nz::String::npos) { - auto GetGlyphPos = [&](const Nz::Vector2ui& glyphPosition) - { - std::size_t glyphIndex; - const auto* glyph = GetGlyph(glyphPosition, &glyphIndex); - if (glyph) - { - float position = glyph->bounds.x; - if (glyphIndex >= m_drawer.GetGlyphCount()) - position += glyph->bounds.width; - - return position; - } - else - return 0.f; - }; - - float beginX = (i == m_cursorPositionBegin.y) ? GetGlyphPos({ m_cursorPositionBegin.x, i }) : 0.f; - float endX = (i == m_cursorPositionEnd.y) ? GetGlyphPos({ m_cursorPositionEnd.x, i }) : lineInfo.bounds.width; - float spriteSize = std::max(endX - beginX, 1.f); - - cursorSprite->SetColor((m_cursorPositionBegin == m_cursorPositionEnd) ? Nz::Color::Black : Nz::Color(0, 0, 0, 50)); - cursorSprite->SetSize(spriteSize, float(m_drawer.GetFont()->GetSizeInfo(m_drawer.GetCharacterSize()).lineHeight)); - - gfxComponent.Attach(cursorSprite, Nz::Matrix4f::Translate({ beginX, lineInfo.bounds.y, 0.f })); + if (index == endlIndex) + SetCursorPosition(endlIndex + 1); + else + SetCursorPosition(endlIndex); } else - { - cursorSprite->SetColor(Nz::Color(0, 0, 0, 50)); - cursorSprite->SetSize(lineInfo.bounds.width, float(m_drawer.GetFont()->GetSizeInfo(m_drawer.GetCharacterSize()).lineHeight)); - - gfxComponent.Attach(cursorSprite, Nz::Matrix4f::Translate({ 0.f, lineInfo.bounds.y, 0.f })); - } + SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); } } @@ -677,10 +252,4 @@ namespace Ndk SetCursorPosition(m_cursorPositionBegin); //< Refresh cursor position (prevent it from being outside of the text) } - - void TextAreaWidget::UpdateTextSprite() - { - m_textSprite->Update(m_drawer); - SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); - } } diff --git a/include/Nazara/Utility.hpp b/include/Nazara/Utility.hpp index 2ccf84080..97deaca58 100644 --- a/include/Nazara/Utility.hpp +++ b/include/Nazara/Utility.hpp @@ -54,6 +54,7 @@ #include #include #include +#include #include #include #include diff --git a/include/Nazara/Utility/AbstractTextDrawer.hpp b/include/Nazara/Utility/AbstractTextDrawer.hpp index 0b45d422d..37204897a 100644 --- a/include/Nazara/Utility/AbstractTextDrawer.hpp +++ b/include/Nazara/Utility/AbstractTextDrawer.hpp @@ -27,6 +27,8 @@ namespace Nz AbstractTextDrawer() = default; virtual ~AbstractTextDrawer(); + virtual void Clear() = 0; + virtual const Recti& GetBounds() const = 0; virtual Font* GetFont(std::size_t index) const = 0; virtual std::size_t GetFontCount() const = 0; @@ -35,6 +37,9 @@ namespace Nz virtual const Line& GetLine(std::size_t index) const = 0; virtual std::size_t GetLineCount() const = 0; inline std::size_t GetLineGlyphCount(std::size_t index) const; + virtual float GetMaxLineWidth() const = 0; + + virtual void SetMaxLineWidth(float lineWidth) = 0; struct Glyph { diff --git a/include/Nazara/Utility/RichTextDrawer.hpp b/include/Nazara/Utility/RichTextDrawer.hpp index 3a681e20d..c2d288109 100644 --- a/include/Nazara/Utility/RichTextDrawer.hpp +++ b/include/Nazara/Utility/RichTextDrawer.hpp @@ -26,29 +26,33 @@ namespace Nz RichTextDrawer(RichTextDrawer&& drawer); ~RichTextDrawer(); - BlockRef AppendText(const String& str); + BlockRef AppendText(const String& str, bool forceNewBlock = false); - inline void Clear(); + void Clear() override; + + inline std::size_t FindBlock(std::size_t glyphIndex) const; inline unsigned int GetBlockCharacterSize(std::size_t index) const; inline const Color& GetBlockColor(std::size_t index) const; inline std::size_t GetBlockCount() const; + inline std::size_t GetBlockFirstGlyphIndex(std::size_t index) const; inline const FontRef& GetBlockFont(std::size_t index) const; inline TextStyleFlags GetBlockStyle(std::size_t index) const; inline const String& GetBlockText(std::size_t index) const; + inline BlockRef GetBlock(std::size_t index); + const Recti& GetBounds() const override; inline unsigned int GetDefaultCharacterSize() const; inline const Color& GetDefaultColor() const; inline const FontRef& GetDefaultFont() const; inline TextStyleFlags GetDefaultStyle() const; - - const Recti& GetBounds() const override; Font* GetFont(std::size_t index) const override; std::size_t GetFontCount() const override; const Glyph& GetGlyph(std::size_t index) const override; std::size_t GetGlyphCount() const override; const Line& GetLine(std::size_t index) const override; std::size_t GetLineCount() const override; + float GetMaxLineWidth() const override; void MergeBlocks(); @@ -65,9 +69,13 @@ namespace Nz inline void SetDefaultFont(const FontRef& font); inline void SetDefaultStyle(TextStyleFlags style); + void SetMaxLineWidth(float lineWidth) override; + RichTextDrawer& operator=(const RichTextDrawer& drawer); RichTextDrawer& operator=(RichTextDrawer&& drawer); + static constexpr std::size_t InvalidBlockIndex = std::numeric_limits::max(); + //static RichTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); //static RichTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); @@ -94,6 +102,7 @@ namespace Nz struct Block { std::size_t fontIndex; + std::size_t glyphIndex; Color color; String text; TextStyleFlags style; @@ -123,6 +132,7 @@ namespace Nz mutable Recti m_bounds; mutable Vector2ui m_drawPos; mutable bool m_glyphUpdated; + float m_maxLineWidth; unsigned int m_defaultCharacterSize; }; @@ -137,6 +147,7 @@ namespace Nz inline unsigned int GetCharacterSize() const; inline Color GetColor() const; + inline std::size_t GetFirstGlyphIndex() const; inline const FontRef& GetFont() const; inline TextStyleFlags GetStyle() const; inline const String& GetText() const; diff --git a/include/Nazara/Utility/RichTextDrawer.inl b/include/Nazara/Utility/RichTextDrawer.inl index c2591a20b..f258d0596 100644 --- a/include/Nazara/Utility/RichTextDrawer.inl +++ b/include/Nazara/Utility/RichTextDrawer.inl @@ -7,13 +7,38 @@ namespace Nz { - inline void RichTextDrawer::Clear() + inline std::size_t RichTextDrawer::FindBlock(std::size_t glyphIndex) const { - m_fontIndexes.clear(); - m_blocks.clear(); - m_fonts.clear(); - m_glyphs.clear(); - ClearGlyphs(); + // Binary search + std::size_t count = m_blocks.size(); + std::size_t step; + + std::size_t i = InvalidBlockIndex; + std::size_t first = 0; + std::size_t last = count; + while (count > 0) + { + i = first; + step = count / 2; + + i += step; + + if (m_blocks[i].glyphIndex < glyphIndex) + { + first = i + 1; + count -= step + 1; + } + else + count = step; + } + + return i; + } + + inline auto RichTextDrawer::GetBlock(std::size_t index) -> BlockRef + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return BlockRef(*this, index); } inline unsigned int RichTextDrawer::GetBlockCharacterSize(std::size_t index) const @@ -33,6 +58,12 @@ namespace Nz return m_blocks.size(); } + inline std::size_t RichTextDrawer::GetBlockFirstGlyphIndex(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].glyphIndex; + } + inline const FontRef& RichTextDrawer::GetBlockFont(std::size_t index) const { NazaraAssert(index < m_blocks.size(), "Invalid block index"); @@ -204,8 +235,19 @@ namespace Nz inline void RichTextDrawer::SetBlockText(std::size_t index, const String& str) { NazaraAssert(index < m_blocks.size(), "Invalid block index"); + + std::size_t previousLength = m_blocks[index].text.GetLength(); + m_blocks[index].text = str; + std::size_t newLength = m_blocks[index].text.GetLength(); + if (newLength != previousLength) + { + std::size_t delta = newLength - previousLength; //< Underflow allowed + for (std::size_t i = index + 1; i < m_blocks.size(); ++i) + m_blocks[i].glyphIndex += delta; + } + InvalidateGlyphs(); } @@ -291,6 +333,17 @@ namespace Nz return m_drawer.GetBlockStyle(m_blockIndex); } + /*! + * Returns the first glyph index at which starts the referenced block + * \return The first glyph index concerned by this block + * + * \see GetText + */ + inline std::size_t RichTextDrawer::BlockRef::GetFirstGlyphIndex() const + { + return m_drawer.GetBlockFirstGlyphIndex(m_blockIndex); + } + /*! * Returns the text of the referenced block * \return The referenced block text diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index 525f49cc5..5e33ed79f 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -26,7 +26,7 @@ namespace Nz void AppendText(const String& str); - void Clear(); + void Clear() override; const Recti& GetBounds() const override; unsigned int GetCharacterSize() const; diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp index 5480a5c16..481fd35d1 100644 --- a/src/Nazara/Utility/RichTextDrawer.cpp +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -13,7 +13,7 @@ namespace Nz m_defaultColor(Color::White), //m_outlineColor(Color::Black), m_defaultStyle(TextStyle_Regular), - m_glyphUpdated(true), + m_glyphUpdated(false), //m_maxLineWidth(std::numeric_limits::infinity()), //m_outlineThickness(0.f), m_defaultCharacterSize(24) @@ -51,7 +51,7 @@ namespace Nz RichTextDrawer::~RichTextDrawer() = default; - auto RichTextDrawer::AppendText(const String& str) -> BlockRef + auto RichTextDrawer::AppendText(const String& str, bool forceNewBlock) -> BlockRef { NazaraAssert(!str.IsEmpty(), "String cannot be empty"); @@ -66,13 +66,23 @@ namespace Nz }; // Check if last block has the same property as default, else create a new block - if (m_blocks.empty() || !HasDefaultProperties(m_blocks.back())) + if (forceNewBlock || m_blocks.empty() || !HasDefaultProperties(m_blocks.back())) { + std::size_t glyphIndex; + if (!m_blocks.empty()) + { + Block& lastBlock = m_blocks.back(); + glyphIndex = lastBlock.glyphIndex + lastBlock.text.GetLength(); + } + else + glyphIndex = 0; + m_blocks.emplace_back(); Block& newBlock = m_blocks.back(); newBlock.characterSize = m_defaultCharacterSize; newBlock.color = m_defaultColor; newBlock.fontIndex = defaultFontIndex; + newBlock.glyphIndex = glyphIndex; newBlock.style = m_defaultStyle; newBlock.text = str; @@ -87,6 +97,15 @@ namespace Nz return BlockRef(*this, m_blocks.size() - 1); } + void RichTextDrawer::Clear() + { + m_fontIndexes.clear(); + m_blocks.clear(); + m_fonts.clear(); + m_glyphs.clear(); + ClearGlyphs(); + } + const Recti& RichTextDrawer::GetBounds() const { if (!m_glyphUpdated) @@ -140,6 +159,11 @@ namespace Nz return m_lines.size(); } + float RichTextDrawer::GetMaxLineWidth() const + { + return m_maxLineWidth; + } + void RichTextDrawer::MergeBlocks() { if (m_blocks.size() < 2) @@ -180,6 +204,13 @@ namespace Nz m_blocks.erase(m_blocks.begin() + index); } + void RichTextDrawer::SetMaxLineWidth(float lineWidth) + { + m_maxLineWidth = lineWidth; + + //TODO: Implement max line width + } + RichTextDrawer& RichTextDrawer::operator=(const RichTextDrawer& drawer) { DisconnectFontSlots(); @@ -472,5 +503,7 @@ namespace Nz GenerateGlyphs(fontData.font, block.color, block.style, block.characterSize, block.color, 0.f, block.text); } } + else + m_lines.emplace_back(Line{ Rectf::Zero(), 0 }); //< Ensure there's always a line } } From 1ea653ab5bf7f57764f680c429fe366935343799 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 22 Sep 2019 13:07:00 +0200 Subject: [PATCH 099/192] Console: Add support for text color --- ChangeLog.md | 1 + SDK/include/NDK/Console.hpp | 5 +++-- SDK/include/NDK/Console.inl | 2 +- SDK/src/NDK/Console.cpp | 5 ++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 07a90646e..a1f22e9e8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -285,6 +285,7 @@ Nazara Development Kit: - ⚠️ Console class is no longer bound to a LuaState and now has a OnCommand signal - ⚠️ Made AbstractTextAreaWidget which is inherited by TextAreaWidget - ⚠️ Added RichTextAreaWidget +- ⚠️ Console now supports text color in history # 0.4: diff --git a/SDK/include/NDK/Console.hpp b/SDK/include/NDK/Console.hpp index 796a15588..3b4dbbe39 100644 --- a/SDK/include/NDK/Console.hpp +++ b/SDK/include/NDK/Console.hpp @@ -27,6 +27,7 @@ namespace Ndk class AbstractTextAreaWidget; class Console; class Entity; + class RichTextAreaWidget; class ScrollAreaWidget; class TextAreaWidget; @@ -46,7 +47,7 @@ namespace Ndk void ClearFocus(); inline unsigned int GetCharacterSize() const; - inline const TextAreaWidget* GetHistory() const; + inline const RichTextAreaWidget* GetHistory() const; inline const TextAreaWidget* GetInput() const; inline const Nz::FontRef& GetTextFont() const; @@ -73,7 +74,7 @@ namespace Ndk std::vector m_commandHistory; std::vector m_historyLines; ScrollAreaWidget* m_historyArea; - TextAreaWidget* m_history; + RichTextAreaWidget* m_history; TextAreaWidget* m_input; Nz::FontRef m_defaultFont; unsigned int m_characterSize; diff --git a/SDK/include/NDK/Console.inl b/SDK/include/NDK/Console.inl index 0e5733f75..3cd318ae3 100644 --- a/SDK/include/NDK/Console.inl +++ b/SDK/include/NDK/Console.inl @@ -19,7 +19,7 @@ namespace Ndk * \return History of the console */ - inline const TextAreaWidget* Console::GetHistory() const + inline const RichTextAreaWidget* Console::GetHistory() const { return m_history; } diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 292ea992c..67f3e69b2 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -10,8 +10,6 @@ #include #include -///TODO: For now is unable to display different color in the history, it needs a RichTextDrawer to do so - namespace Ndk { namespace @@ -42,7 +40,7 @@ namespace Ndk m_maxHistoryLines(200) { // History - m_history = Add(); + m_history = Add(); m_history->EnableBackground(true); m_history->EnableLineWrap(true); m_history->SetReadOnly(true); @@ -112,6 +110,7 @@ namespace Ndk m_historyLines.erase(m_historyLines.begin()); m_historyLines.emplace_back(Line{ color, text }); + m_history->SetTextColor(color); m_history->AppendText(text + '\n'); m_history->Resize(m_history->GetPreferredSize()); m_historyArea->Resize(m_historyArea->GetSize()); From 3c7addc2629118e513028520ce48c513cecfce26 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 24 Sep 2019 18:44:12 +0200 Subject: [PATCH 100/192] Utility/RichTextDrawer: Fixes block removal not adjusting glyph indexes + Add HasBlocks method --- include/Nazara/Utility/RichTextDrawer.hpp | 4 ++- include/Nazara/Utility/RichTextDrawer.inl | 23 ++++++++++++++--- src/Nazara/Utility/RichTextDrawer.cpp | 31 ++++++++++++----------- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/include/Nazara/Utility/RichTextDrawer.hpp b/include/Nazara/Utility/RichTextDrawer.hpp index c2d288109..218c207fe 100644 --- a/include/Nazara/Utility/RichTextDrawer.hpp +++ b/include/Nazara/Utility/RichTextDrawer.hpp @@ -54,6 +54,8 @@ namespace Nz std::size_t GetLineCount() const override; float GetMaxLineWidth() const override; + inline bool HasBlocks() const; + void MergeBlocks(); void RemoveBlock(std::size_t index); @@ -62,7 +64,7 @@ namespace Nz inline void SetBlockColor(std::size_t index, const Color& color); inline void SetBlockFont(std::size_t index, FontRef font); inline void SetBlockStyle(std::size_t index, TextStyleFlags style); - inline void SetBlockText(std::size_t index, const String& str); + inline void SetBlockText(std::size_t index, String str); inline void SetDefaultCharacterSize(unsigned int characterSize); inline void SetDefaultColor(const Color& color); diff --git a/include/Nazara/Utility/RichTextDrawer.inl b/include/Nazara/Utility/RichTextDrawer.inl index f258d0596..7faaf8b90 100644 --- a/include/Nazara/Utility/RichTextDrawer.inl +++ b/include/Nazara/Utility/RichTextDrawer.inl @@ -9,6 +9,16 @@ namespace Nz { inline std::size_t RichTextDrawer::FindBlock(std::size_t glyphIndex) const { + auto it = m_blocks.begin(); + for (; it != m_blocks.end(); ++it) + { + if (it->glyphIndex > glyphIndex) + break; + } + + assert(it != m_blocks.begin()); + return std::distance(m_blocks.begin(), it) - 1; + /* // Binary search std::size_t count = m_blocks.size(); std::size_t step; @@ -25,14 +35,14 @@ namespace Nz if (m_blocks[i].glyphIndex < glyphIndex) { - first = i + 1; + first = ++i; count -= step + 1; } else count = step; } - return i; + return i;*/ } inline auto RichTextDrawer::GetBlock(std::size_t index) -> BlockRef @@ -193,6 +203,11 @@ namespace Nz } } + inline bool RichTextDrawer::HasBlocks() const + { + return !m_blocks.empty(); + } + inline void RichTextDrawer::SetBlockCharacterSize(std::size_t index, unsigned int characterSize) { NazaraAssert(index < m_blocks.size(), "Invalid block index"); @@ -232,13 +247,13 @@ namespace Nz InvalidateGlyphs(); } - inline void RichTextDrawer::SetBlockText(std::size_t index, const String& str) + inline void RichTextDrawer::SetBlockText(std::size_t index, String str) { NazaraAssert(index < m_blocks.size(), "Invalid block index"); std::size_t previousLength = m_blocks[index].text.GetLength(); - m_blocks[index].text = str; + m_blocks[index].text = std::move(str); std::size_t newLength = m_blocks[index].text.GetLength(); if (newLength != previousLength) diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp index 481fd35d1..142a4b395 100644 --- a/src/Nazara/Utility/RichTextDrawer.cpp +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -166,9 +166,6 @@ namespace Nz void RichTextDrawer::MergeBlocks() { - if (m_blocks.size() < 2) - return; - auto TestBlockProperties = [](const Block& lhs, const Block& rhs) { return lhs.characterSize == rhs.characterSize && @@ -177,22 +174,16 @@ namespace Nz lhs.style == rhs.style; }; - auto lastBlockIt = m_blocks.begin(); - for (auto it = lastBlockIt + 1; it != m_blocks.end();) + std::size_t previousBlockIndex = 0; + for (std::size_t i = 1; i < m_blocks.size(); ++i) { - if (TestBlockProperties(*lastBlockIt, *it)) + if (TestBlockProperties(m_blocks[previousBlockIndex], m_blocks[i])) { - // Append text to previous block and erase - lastBlockIt->text += it->text; - - ReleaseFont(it->fontIndex); - it = m_blocks.erase(it); + RemoveBlock(i); + --i; } else - { - lastBlockIt = it; - ++it; - } + previousBlockIndex = i; } } @@ -200,8 +191,18 @@ namespace Nz { NazaraAssert(index < m_blocks.size(), "Invalid block index"); + std::size_t textLength = m_blocks[index].text.GetLength(); + ReleaseFont(m_blocks[index].fontIndex); m_blocks.erase(m_blocks.begin() + index); + + for (std::size_t i = index; i < m_blocks.size(); ++i) + { + assert(m_blocks[i].glyphIndex > textLength); + m_blocks[i].glyphIndex -= textLength; + } + + InvalidateGlyphs(); } void RichTextDrawer::SetMaxLineWidth(float lineWidth) From 0b5bc8a65639c4098fc612f4aa8e68716d757498 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 24 Sep 2019 18:50:45 +0200 Subject: [PATCH 101/192] SDK/RichTextAreaWidget: Fix erase/write behaviors --- SDK/src/NDK/Widgets/RichTextAreaWidget.cpp | 72 +++++++++++++++++----- 1 file changed, 56 insertions(+), 16 deletions(-) diff --git a/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp b/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp index a80c0e29d..9e5ffb84d 100644 --- a/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp @@ -63,7 +63,7 @@ namespace Ndk return; std::size_t firstBlock = m_drawer.FindBlock(firstGlyph); - std::size_t lastBlock = m_drawer.FindBlock(lastGlyph); + std::size_t lastBlock = m_drawer.FindBlock((lastGlyph > 0) ? lastGlyph - 1 : lastGlyph); if (firstBlock == lastBlock) { const Nz::String& blockText = m_drawer.GetBlockText(firstBlock); @@ -79,18 +79,52 @@ namespace Ndk } if (lastGlyph < textLength) - { - std::size_t characterPosition = blockText.GetCharacterPosition(lastGlyph - blockFirstGlyph); - NazaraAssert(characterPosition != Nz::String::npos, "Invalid character position"); + newText.Append(blockText.SubString(blockText.GetCharacterPosition(lastGlyph - blockFirstGlyph))); - newText.Append(blockText.SubString(characterPosition)); - } - - m_drawer.SetBlockText(firstBlock, newText); + if (!newText.IsEmpty()) + m_drawer.SetBlockText(firstBlock, std::move(newText)); + else + m_drawer.RemoveBlock(firstBlock); } else { - // More complicated algorithm, yay + const Nz::String& lastBlockText = m_drawer.GetBlockText(lastBlock); + std::size_t lastBlockGlyphIndex = m_drawer.GetBlockFirstGlyphIndex(lastBlock); + + // First, update/delete last block + std::size_t lastCharPos = lastBlockText.GetCharacterPosition(lastGlyph - lastBlockGlyphIndex); + if (lastCharPos != Nz::String::npos) + { + Nz::String newText = lastBlockText.SubString(lastCharPos); + if (!newText.IsEmpty()) + m_drawer.SetBlockText(lastBlock, std::move(newText)); + else + m_drawer.RemoveBlock(lastBlock); + } + + // And then remove all middle blocks, remove in reverse order because of index shifting + assert(lastBlock > 0); + for (std::size_t i = lastBlock - 1; i > firstBlock; --i) + m_drawer.RemoveBlock(i); + + const Nz::String& firstBlockText = m_drawer.GetBlockText(firstBlock); + std::size_t firstBlockGlyphIndex = m_drawer.GetBlockFirstGlyphIndex(firstBlock); + + // And finally update/delete first block + if (firstGlyph > firstBlockGlyphIndex) + { + std::size_t firstCharPos = firstBlockText.GetCharacterPosition(firstGlyph - firstBlockGlyphIndex - 1); + if (firstCharPos != Nz::String::npos) + { + Nz::String newText = firstBlockText.SubString(0, firstCharPos); + if (!newText.IsEmpty()) + m_drawer.SetBlockText(firstBlock, std::move(newText)); + else + m_drawer.RemoveBlock(firstBlock); + } + } + else + m_drawer.RemoveBlock(firstBlock); } UpdateDisplayText(); @@ -98,15 +132,21 @@ namespace Ndk void RichTextAreaWidget::Write(const Nz::String& text, std::size_t glyphPosition) { - auto block = m_drawer.GetBlock(m_drawer.FindBlock(glyphPosition)); - std::size_t firstGlyph = block.GetFirstGlyphIndex(); - assert(glyphPosition >= firstGlyph); + if (m_drawer.HasBlocks()) + { + auto block = m_drawer.GetBlock(m_drawer.FindBlock((glyphPosition > 0) ? glyphPosition - 1 : glyphPosition)); + std::size_t firstGlyph = block.GetFirstGlyphIndex(); + assert(glyphPosition >= firstGlyph); - Nz::String blockText = block.GetText(); - std::size_t characterPosition = blockText.GetCharacterPosition(glyphPosition - firstGlyph); - blockText.Insert(characterPosition, text); + Nz::String blockText = block.GetText(); + std::size_t characterPosition = blockText.GetCharacterPosition(glyphPosition - firstGlyph); + blockText.Insert(characterPosition, text); + + block.SetText(blockText); + } + else + m_drawer.AppendText(text); - block.SetText(blockText); SetCursorPosition(glyphPosition + text.GetLength()); UpdateDisplayText(); From 7f4145786f9fcec1cc518af15133afadc4833921 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 25 Sep 2019 09:37:40 +0200 Subject: [PATCH 102/192] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0395c3478..133efb6f4 100644 --- a/.gitignore +++ b/.gitignore @@ -69,6 +69,7 @@ build/**/*.VC.opendb build/**/*.VC.db* build/**/*.json build/**/*.sqlite +build/**/*.FileListAbsolute.txt # Compiled Object files build/**/*.slo From acc2c072ba5f5adb44275bc2f112f85f0d39f9df Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 25 Sep 2019 16:17:07 +0200 Subject: [PATCH 103/192] Core/StackVector: Fix erase method (+ add tests) --- include/Nazara/Core/StackVector.inl | 24 ++-- tests/Engine/Core/StackVector.cpp | 203 ++++++++++++++++++++++++---- 2 files changed, 190 insertions(+), 37 deletions(-) diff --git a/include/Nazara/Core/StackVector.inl b/include/Nazara/Core/StackVector.inl index c8b71a5cb..cfe7b3d0c 100644 --- a/include/Nazara/Core/StackVector.inl +++ b/include/Nazara/Core/StackVector.inl @@ -123,14 +123,19 @@ namespace Nz assert(m_size < m_capacity); assert(pos >= begin() && pos <= end()); - std::size_t index = std::distance(begin(), pos); + std::size_t index = std::distance(cbegin(), pos); if (pos < end()) { iterator lastElement = end() - 1; PlacementNew(&m_ptr[m_size], std::move(*lastElement)); if (&m_ptr[index] < lastElement) - std::move(&m_ptr[index], lastElement, &m_ptr[index + 1]); + { + std::size_t count = m_size - index - 1; + std::move_backward(&m_ptr[index], &m_ptr[index + count], &m_ptr[m_size]); + } + + PlacementDestroy(&m_ptr[index]); } m_size++; @@ -167,8 +172,8 @@ namespace Nz typename StackVector::iterator StackVector::erase(const_iterator pos) { assert(pos < end()); - std::size_t index = std::distance(begin(), pos); - std::move(pos + 1, end(), pos); + std::size_t index = std::distance(cbegin(), pos); + std::move(begin() + index + 1, end(), begin() + index); pop_back(); return iterator(&m_ptr[index]); @@ -177,15 +182,18 @@ namespace Nz template typename StackVector::iterator StackVector::erase(const_iterator first, const_iterator last) { + std::size_t index = std::distance(cbegin(), first); + if (first == last) - return first; + return begin() + index; assert(first < last); assert(first >= begin() && last <= end()); - std::size_t index = std::distance(begin(), first); - std::move(last, end(), first); - resize(size() - (last - first)); + std::size_t count = std::distance(first, last); + + std::move(begin() + index + count, end(), begin() + index); + resize(size() - count); return iterator(&m_ptr[index]); } diff --git a/tests/Engine/Core/StackVector.cpp b/tests/Engine/Core/StackVector.cpp index ceb36da89..6a3140abc 100644 --- a/tests/Engine/Core/StackVector.cpp +++ b/tests/Engine/Core/StackVector.cpp @@ -1,14 +1,113 @@ +#include #include #include #include #include +// This is a quick way to check that checks are valid +#define USE_STD_VECTOR 0 + +class DestructionCounter +{ + public: + DestructionCounter() : + m_counter(nullptr), + m_value(0) + { + } + + DestructionCounter(std::size_t* counter, int value) : + m_counter(counter), + m_value(value) + { + if (m_counter) + (*m_counter)++; + } + + DestructionCounter(const DestructionCounter& counter) : + m_counter(counter.m_counter), + m_value(counter.m_value) + { + if (m_counter) + (*m_counter)++; + } + + DestructionCounter(DestructionCounter&& counter) : + m_counter(counter.m_counter), + m_value(counter.m_value) + { + if (m_counter) + (*m_counter)++; + } + + ~DestructionCounter() + { + if (m_counter) + { + assert(*m_counter > 0); + (*m_counter)--; + } + } + + operator int() const + { + return m_value; + } + + DestructionCounter& operator=(const DestructionCounter& counter) + { + if (m_counter) + { + assert(*m_counter > 0); + (*m_counter)--; + } + + m_counter = counter.m_counter; + m_value = counter.m_value; + + if (m_counter) + (*m_counter)++; + + return *this; + } + + DestructionCounter& operator=(DestructionCounter&& counter) + { + if (this == &counter) + return *this; + + if (m_counter) + { + assert(*m_counter > 0); + (*m_counter)--; + } + + m_counter = counter.m_counter; + m_value = counter.m_value; + + if (m_counter) + (*m_counter)++; + + return *this; + } + + private: + std::size_t* m_counter; + int m_value; +}; + SCENARIO("StackVector", "[CORE][STACKVECTOR]") { GIVEN("A StackVector to contain multiple int") { volatile std::size_t capacity = 50; - Nz::StackVector vector = NazaraStackVector(int, capacity); +#if USE_STD_VECTOR + std::vector vector; + vector.reserve(capacity); +#else + Nz::StackVector vector = NazaraStackVector(DestructionCounter, capacity); +#endif + std::size_t counter = 0; WHEN("At construction, the vector is empty but has capacity") { @@ -21,8 +120,11 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") { for (std::size_t i = 0; i < 5; ++i) { - int val = int(i); - CHECK(vector.emplace_back(val) == val); +#if USE_STD_VECTOR + vector.emplace_back(&counter, int(i)); +#else + CHECK(vector.emplace_back(&counter, int(i)) == int(i)); +#endif } CHECK(!vector.empty()); @@ -36,8 +138,12 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") { for (std::size_t i = 0; i < 3; ++i) { - int val = int(i); + DestructionCounter val(&counter, int(i)); +#if USE_STD_VECTOR + vector.push_back(val); +#else CHECK(vector.push_back(val) == val); +#endif } CHECK(!vector.empty()); @@ -76,19 +182,70 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") WHEN("We generate its content will iota") { vector.resize(10); - std::iota(vector.begin(), vector.end(), -5); + for (std::size_t i = 0; i < vector.size(); ++i) + vector[i] = DestructionCounter(&counter, -5 + int(i)); std::array expectedValues = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4 }; + CHECK(vector.size() == expectedValues.size()); CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + + AND_WHEN("We pop back some elements") + { + for (std::size_t i = 0; i < 5; ++i) + vector.pop_back(); + + std::array expectedValues = { -5, -4, -3, -2, -1 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase elements at the beginning") + { + vector.erase(vector.begin()); + vector.erase(vector.begin()); + + std::array expectedValues = { -3, -2, -1, 0, 1, 2, 3, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase elements in the middle") + { + vector.erase(vector.begin() + 2); + vector.erase(vector.begin() + 2); + vector.erase(vector.begin() + 6); + + std::array expectedValues = { -5, -4, -1, 0, 1, 2, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase elements at the end") + { + vector.erase(vector.end() - 1); + vector.erase(vector.end() - 1); + + std::array expectedValues = { -5, -4, -3, -2, -1, 0, 1, 2 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase a range") + { + vector.erase(vector.begin() + 2, vector.end() - 3); + + std::array expectedValues = { -5, -4, 2, 3, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase everything") + { + vector.erase(vector.begin(), vector.end()); + + CHECK(vector.empty()); + } } WHEN("We generate its content using emplace") { for (std::size_t i = 0; i < 5; ++i) - { - int val = int(i); - CHECK(*vector.emplace(vector.end(), val) == val); - } + CHECK(*vector.emplace(vector.end(), &counter, int(i)) == int(i)); CHECK(!vector.empty()); CHECK(vector.size() == 5); @@ -100,10 +257,7 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") WHEN("We generate its content using emplace, in reverse order") { for (std::size_t i = 0; i < 5; ++i) - { - int val = int(i); - CHECK(*vector.emplace(vector.begin(), val) == val); - } + CHECK(*vector.emplace(vector.begin(), &counter, int(i)) == int(i)); CHECK(!vector.empty()); CHECK(vector.size() == 5); @@ -115,10 +269,7 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") WHEN("We generate its content using emplace, at the middle") { for (std::size_t i = 0; i < 10; ++i) - { - int val = int(i); - CHECK(*vector.emplace(vector.begin() + i / 2, val) == val); - } + CHECK(*vector.emplace(vector.begin() + i / 2, &counter, int(i)) == int(i)); CHECK(!vector.empty()); CHECK(vector.size() == 10); @@ -130,10 +281,7 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") WHEN("We generate its content using insert") { for (std::size_t i = 0; i < 5; ++i) - { - int val = int(i); - CHECK(*vector.insert(vector.end(), val) == val); - } + CHECK(*vector.insert(vector.end(), DestructionCounter(&counter, int(i))) == int(i)); CHECK(!vector.empty()); CHECK(vector.size() == 5); @@ -145,10 +293,7 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") WHEN("We generate its content using insert, in reverse order") { for (std::size_t i = 0; i < 5; ++i) - { - int val = int(i); - CHECK(*vector.insert(vector.begin(), val) == val); - } + CHECK(*vector.insert(vector.begin(), DestructionCounter(&counter, int(i))) == int(i)); CHECK(!vector.empty()); CHECK(vector.size() == 5); @@ -160,10 +305,7 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") WHEN("We generate its content using insert, at the middle") { for (std::size_t i = 0; i < 10; ++i) - { - int val = int(i); - CHECK(*vector.insert(vector.begin() + i / 2, val) == val); - } + CHECK(*vector.insert(vector.begin() + i / 2, DestructionCounter(&counter, int(i))) == int(i)); CHECK(!vector.empty()); CHECK(vector.size() == 10); @@ -171,5 +313,8 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") std::array expectedValues = { 1, 3, 5, 7, 9, 8, 6, 4, 2, 0 }; CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } + + vector.clear(); + CHECK(counter == 0); } } From 76812510a103e17c8ae74128fd2c66c2b6659aad Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 25 Sep 2019 16:18:23 +0200 Subject: [PATCH 104/192] Core/GuillotineBinPack: Prevent heap allocation when calling Insert with multiple rectangles --- ChangeLog.md | 1 + src/Nazara/Core/GuillotineBinPack.cpp | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index a1f22e9e8..f5a1edf45 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -192,6 +192,7 @@ Nazara Engine: - Added x and y mouse position to MouseWheelEvent - Added SimpleTextDrawer::[Get|Set]MaxLineWidth (which does line wrap) - TypeTag helper struct now includes a Type using +- GuillotineBinPack::Insert overload taking multiple rectangles no longer does a heap allocation Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Core/GuillotineBinPack.cpp b/src/Nazara/Core/GuillotineBinPack.cpp index 9ebae4bbb..ef8e2f953 100644 --- a/src/Nazara/Core/GuillotineBinPack.cpp +++ b/src/Nazara/Core/GuillotineBinPack.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -302,7 +303,8 @@ namespace Nz bool GuillotineBinPack::Insert(Rectui* rects, bool* flipped, bool* inserted, unsigned int count, bool merge, FreeRectChoiceHeuristic rectChoice, GuillotineSplitHeuristic splitMethod) { - std::vector remainingRects(count); // Position of the rectangle + Nz::StackVector remainingRects = NazaraStackVector(Rectui*, count); // Position of the rectangle + remainingRects.resize(count); for (unsigned int i = 0; i < count; ++i) remainingRects[i] = &rects[i]; From 489e3e0b5e8130c8658040df9416624510c1912b Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 25 Sep 2019 16:29:48 +0200 Subject: [PATCH 105/192] StackVector: Test destruction Before this commit, only clear() was checked, destructor was not --- tests/Engine/Core/StackVector.cpp | 340 +++++++++++++++--------------- 1 file changed, 171 insertions(+), 169 deletions(-) diff --git a/tests/Engine/Core/StackVector.cpp b/tests/Engine/Core/StackVector.cpp index 6a3140abc..e40cbb613 100644 --- a/tests/Engine/Core/StackVector.cpp +++ b/tests/Engine/Core/StackVector.cpp @@ -100,221 +100,223 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") { GIVEN("A StackVector to contain multiple int") { - volatile std::size_t capacity = 50; -#if USE_STD_VECTOR - std::vector vector; - vector.reserve(capacity); -#else - Nz::StackVector vector = NazaraStackVector(DestructionCounter, capacity); -#endif std::size_t counter = 0; - - WHEN("At construction, the vector is empty but has capacity") { - CHECK(vector.capacity() == capacity); - CHECK(vector.empty()); - CHECK(vector.size() == 0); - } - - WHEN("Emplacing five elements, vector size increase accordingly") - { - for (std::size_t i = 0; i < 5; ++i) - { + volatile std::size_t capacity = 50; #if USE_STD_VECTOR - vector.emplace_back(&counter, int(i)); + std::vector vector; + vector.reserve(capacity); #else - CHECK(vector.emplace_back(&counter, int(i)) == int(i)); + Nz::StackVector vector = NazaraStackVector(DestructionCounter, capacity); #endif + + WHEN("At construction, the vector is empty but has capacity") + { + CHECK(vector.capacity() == capacity); + CHECK(vector.empty()); + CHECK(vector.size() == 0); } - CHECK(!vector.empty()); - CHECK(vector.size() == 5); - - std::array expectedValues = { 0, 1, 2, 3, 4 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("Pushing three elements, vector size increase accordingly") - { - for (std::size_t i = 0; i < 3; ++i) + WHEN("Emplacing five elements, vector size increase accordingly") { - DestructionCounter val(&counter, int(i)); + for (std::size_t i = 0; i < 5; ++i) + { #if USE_STD_VECTOR - vector.push_back(val); + vector.emplace_back(&counter, int(i)); #else - CHECK(vector.push_back(val) == val); + CHECK(vector.emplace_back(&counter, int(i)) == int(i)); #endif - } - - CHECK(!vector.empty()); - CHECK(vector.size() == 3); - - std::array expectedValues = { 0, 1, 2 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - - THEN("We resize to five") - { - vector.resize(5); + } CHECK(!vector.empty()); CHECK(vector.size() == 5); - std::array expectedValues = { 0, 1, 2, 0, 0 }; + std::array expectedValues = { 0, 1, 2, 3, 4 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + + WHEN("Pushing three elements, vector size increase accordingly") + { + for (std::size_t i = 0; i < 3; ++i) + { + DestructionCounter val(&counter, int(i)); +#if USE_STD_VECTOR + vector.push_back(val); +#else + CHECK(vector.push_back(val) == val); +#endif + } + + CHECK(!vector.empty()); + CHECK(vector.size() == 3); + + std::array expectedValues = { 0, 1, 2 }; CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - AND_THEN("We resize it back to zero") + THEN("We resize to five") { - vector.resize(0); + vector.resize(5); - CHECK(vector.empty()); - CHECK(vector.size() == 0); - } - AND_THEN("We clear it") - { - vector.clear(); + CHECK(!vector.empty()); + CHECK(vector.size() == 5); - CHECK(vector.empty()); - CHECK(vector.size() == 0); + std::array expectedValues = { 0, 1, 2, 0, 0 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + + AND_THEN("We resize it back to zero") + { + vector.resize(0); + + CHECK(vector.empty()); + CHECK(vector.size() == 0); + } + AND_THEN("We clear it") + { + vector.clear(); + + CHECK(vector.empty()); + CHECK(vector.size() == 0); + CHECK(counter == 0); + } } } - } - WHEN("We generate its content will iota") - { - vector.resize(10); - for (std::size_t i = 0; i < vector.size(); ++i) - vector[i] = DestructionCounter(&counter, -5 + int(i)); + WHEN("We generate its content will iota") + { + vector.resize(10); + for (std::size_t i = 0; i < vector.size(); ++i) + vector[i] = DestructionCounter(&counter, -5 + int(i)); - std::array expectedValues = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4 }; - CHECK(vector.size() == expectedValues.size()); - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + std::array expectedValues = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - AND_WHEN("We pop back some elements") + AND_WHEN("We pop back some elements") + { + for (std::size_t i = 0; i < 5; ++i) + vector.pop_back(); + + std::array expectedValues = { -5, -4, -3, -2, -1 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase elements at the beginning") + { + vector.erase(vector.begin()); + vector.erase(vector.begin()); + + std::array expectedValues = { -3, -2, -1, 0, 1, 2, 3, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase elements in the middle") + { + vector.erase(vector.begin() + 2); + vector.erase(vector.begin() + 2); + vector.erase(vector.begin() + 6); + + std::array expectedValues = { -5, -4, -1, 0, 1, 2, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase elements at the end") + { + vector.erase(vector.end() - 1); + vector.erase(vector.end() - 1); + + std::array expectedValues = { -5, -4, -3, -2, -1, 0, 1, 2 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase a range") + { + vector.erase(vector.begin() + 2, vector.end() - 3); + + std::array expectedValues = { -5, -4, 2, 3, 4 }; + CHECK(vector.size() == expectedValues.size()); + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); + } + AND_WHEN("We erase everything") + { + vector.erase(vector.begin(), vector.end()); + + CHECK(vector.empty()); + } + } + + WHEN("We generate its content using emplace") { for (std::size_t i = 0; i < 5; ++i) - vector.pop_back(); + CHECK(*vector.emplace(vector.end(), &counter, int(i)) == int(i)); - std::array expectedValues = { -5, -4, -3, -2, -1 }; - CHECK(vector.size() == expectedValues.size()); + CHECK(!vector.empty()); + CHECK(vector.size() == 5); + + std::array expectedValues = { 0, 1, 2, 3, 4 }; CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } - AND_WHEN("We erase elements at the beginning") - { - vector.erase(vector.begin()); - vector.erase(vector.begin()); - std::array expectedValues = { -3, -2, -1, 0, 1, 2, 3, 4 }; - CHECK(vector.size() == expectedValues.size()); + WHEN("We generate its content using emplace, in reverse order") + { + for (std::size_t i = 0; i < 5; ++i) + CHECK(*vector.emplace(vector.begin(), &counter, int(i)) == int(i)); + + CHECK(!vector.empty()); + CHECK(vector.size() == 5); + + std::array expectedValues = { 4, 3, 2, 1, 0 }; CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } - AND_WHEN("We erase elements in the middle") - { - vector.erase(vector.begin() + 2); - vector.erase(vector.begin() + 2); - vector.erase(vector.begin() + 6); - std::array expectedValues = { -5, -4, -1, 0, 1, 2, 4 }; - CHECK(vector.size() == expectedValues.size()); + WHEN("We generate its content using emplace, at the middle") + { + for (std::size_t i = 0; i < 10; ++i) + CHECK(*vector.emplace(vector.begin() + i / 2, &counter, int(i)) == int(i)); + + CHECK(!vector.empty()); + CHECK(vector.size() == 10); + + std::array expectedValues = { 1, 3, 5, 7, 9, 8, 6, 4, 2, 0 }; CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } - AND_WHEN("We erase elements at the end") - { - vector.erase(vector.end() - 1); - vector.erase(vector.end() - 1); - std::array expectedValues = { -5, -4, -3, -2, -1, 0, 1, 2 }; - CHECK(vector.size() == expectedValues.size()); + WHEN("We generate its content using insert") + { + for (std::size_t i = 0; i < 5; ++i) + CHECK(*vector.insert(vector.end(), DestructionCounter(&counter, int(i))) == int(i)); + + CHECK(!vector.empty()); + CHECK(vector.size() == 5); + + std::array expectedValues = { 0, 1, 2, 3, 4 }; CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } - AND_WHEN("We erase a range") - { - vector.erase(vector.begin() + 2, vector.end() - 3); - std::array expectedValues = { -5, -4, 2, 3, 4 }; - CHECK(vector.size() == expectedValues.size()); + WHEN("We generate its content using insert, in reverse order") + { + for (std::size_t i = 0; i < 5; ++i) + CHECK(*vector.insert(vector.begin(), DestructionCounter(&counter, int(i))) == int(i)); + + CHECK(!vector.empty()); + CHECK(vector.size() == 5); + + std::array expectedValues = { 4, 3, 2, 1, 0 }; CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } - AND_WHEN("We erase everything") - { - vector.erase(vector.begin(), vector.end()); - CHECK(vector.empty()); + WHEN("We generate its content using insert, at the middle") + { + for (std::size_t i = 0; i < 10; ++i) + CHECK(*vector.insert(vector.begin() + i / 2, DestructionCounter(&counter, int(i))) == int(i)); + + CHECK(!vector.empty()); + CHECK(vector.size() == 10); + + std::array expectedValues = { 1, 3, 5, 7, 9, 8, 6, 4, 2, 0 }; + CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); } } - WHEN("We generate its content using emplace") - { - for (std::size_t i = 0; i < 5; ++i) - CHECK(*vector.emplace(vector.end(), &counter, int(i)) == int(i)); - - CHECK(!vector.empty()); - CHECK(vector.size() == 5); - - std::array expectedValues = { 0, 1, 2, 3, 4 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using emplace, in reverse order") - { - for (std::size_t i = 0; i < 5; ++i) - CHECK(*vector.emplace(vector.begin(), &counter, int(i)) == int(i)); - - CHECK(!vector.empty()); - CHECK(vector.size() == 5); - - std::array expectedValues = { 4, 3, 2, 1, 0 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using emplace, at the middle") - { - for (std::size_t i = 0; i < 10; ++i) - CHECK(*vector.emplace(vector.begin() + i / 2, &counter, int(i)) == int(i)); - - CHECK(!vector.empty()); - CHECK(vector.size() == 10); - - std::array expectedValues = { 1, 3, 5, 7, 9, 8, 6, 4, 2, 0 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using insert") - { - for (std::size_t i = 0; i < 5; ++i) - CHECK(*vector.insert(vector.end(), DestructionCounter(&counter, int(i))) == int(i)); - - CHECK(!vector.empty()); - CHECK(vector.size() == 5); - - std::array expectedValues = { 0, 1, 2, 3, 4 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using insert, in reverse order") - { - for (std::size_t i = 0; i < 5; ++i) - CHECK(*vector.insert(vector.begin(), DestructionCounter(&counter, int(i))) == int(i)); - - CHECK(!vector.empty()); - CHECK(vector.size() == 5); - - std::array expectedValues = { 4, 3, 2, 1, 0 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - WHEN("We generate its content using insert, at the middle") - { - for (std::size_t i = 0; i < 10; ++i) - CHECK(*vector.insert(vector.begin() + i / 2, DestructionCounter(&counter, int(i))) == int(i)); - - CHECK(!vector.empty()); - CHECK(vector.size() == 10); - - std::array expectedValues = { 1, 3, 5, 7, 9, 8, 6, 4, 2, 0 }; - CHECK(std::equal(vector.begin(), vector.end(), expectedValues.begin(), expectedValues.end())); - } - - vector.clear(); CHECK(counter == 0); } } From 89243a39b54498bce1610cdc4d59e1f846fce17f Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 28 Sep 2019 16:55:11 +0200 Subject: [PATCH 106/192] Holy shit i'm stupid --- include/Nazara/Core/StackVector.inl | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/include/Nazara/Core/StackVector.inl b/include/Nazara/Core/StackVector.inl index cfe7b3d0c..618a81e8d 100644 --- a/include/Nazara/Core/StackVector.inl +++ b/include/Nazara/Core/StackVector.inl @@ -130,10 +130,7 @@ namespace Nz PlacementNew(&m_ptr[m_size], std::move(*lastElement)); if (&m_ptr[index] < lastElement) - { - std::size_t count = m_size - index - 1; - std::move_backward(&m_ptr[index], &m_ptr[index + count], &m_ptr[m_size]); - } + std::move_backward(&m_ptr[index], &m_ptr[m_size - 1], &m_ptr[m_size]); PlacementDestroy(&m_ptr[index]); } From 5fce345b3e31b3671c79138ec70cd15c0effb803 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 28 Sep 2019 17:36:19 +0200 Subject: [PATCH 107/192] Core/StackVector: Fix resize check --- include/Nazara/Core/StackVector.inl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Nazara/Core/StackVector.inl b/include/Nazara/Core/StackVector.inl index 618a81e8d..72c51afc2 100644 --- a/include/Nazara/Core/StackVector.inl +++ b/include/Nazara/Core/StackVector.inl @@ -249,7 +249,7 @@ namespace Nz template void StackVector::resize(size_type count) { - assert(count < m_capacity); + assert(count <= m_capacity); if (count > m_size) { for (std::size_t i = m_size; i < count; ++i) @@ -269,7 +269,7 @@ namespace Nz template void StackVector::resize(size_type count, const value_type& value) { - assert(count < m_capacity); + assert(count <= m_capacity); if (count > m_size) { for (std::size_t i = m_size; i < count; ++i) From 31e6bfe43a0e313a6fddd4fa49312abf5db6ed07 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 29 Sep 2019 16:41:26 +0200 Subject: [PATCH 108/192] Core/Stack[Array|Vector]: Are now default-initializable and movable --- ChangeLog.md | 4 +++- include/Nazara/Core/StackArray.hpp | 8 +++++++- include/Nazara/Core/StackArray.inl | 8 ++++++++ include/Nazara/Core/StackVector.hpp | 9 ++++++++- include/Nazara/Core/StackVector.inl | 8 ++++++++ 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f5a1edf45..79425fab0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -169,7 +169,7 @@ Nazara Engine: - Fixed TileMap not rendering the right materials if it had no tile using some materials in-between - Added Vector[2|3|4](u)i64 typedefs - Fixed missing static Vector4::DotProduct implementation -- ⚠ **By default, Nazara computes the mass center of all 2D physics object when calling SetGeom** +- ⚠ **By default, Nazara now computes the mass center of all 2D physics object when calling SetGeom** - ⚠ Added Collider2D::ComputeCenterOfMass - Signal now implement a copy constructor and copy assignation operator for convenience - Fixed ENet UnreliableFragment packets sent as Unreliable (and such being incomplete upon reception) @@ -193,6 +193,8 @@ Nazara Engine: - Added SimpleTextDrawer::[Get|Set]MaxLineWidth (which does line wrap) - TypeTag helper struct now includes a Type using - GuillotineBinPack::Insert overload taking multiple rectangles no longer does a heap allocation +- StackArray and StackVector now have a default constructor initializing them with no size/capacity +- StackArray and StackVector are now movable Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/StackArray.hpp b/include/Nazara/Core/StackArray.hpp index 1bed2b16c..bf58f1a46 100644 --- a/include/Nazara/Core/StackArray.hpp +++ b/include/Nazara/Core/StackArray.hpp @@ -40,8 +40,11 @@ namespace Nz using reverse_iterator = std::reverse_iterator; using size_type = std::size_t; + StackArray(); StackArray(T* stackMemory, std::size_t size); StackArray(T* stackMemory, std::size_t size, NoInitTag); + StackArray(const StackArray&) = delete; + StackArray(StackArray&&) = default; ~StackArray(); reference back(); @@ -81,9 +84,12 @@ namespace Nz reference operator[](size_type pos); const_reference operator[](size_type pos) const; + StackArray& operator=(const StackArray&) = delete; + StackArray& operator=(StackArray&&) = default; + private: std::size_t m_size; - T* m_ptr; + MovablePtr m_ptr; }; } diff --git a/include/Nazara/Core/StackArray.inl b/include/Nazara/Core/StackArray.inl index 989ffdf88..7e46afc64 100644 --- a/include/Nazara/Core/StackArray.inl +++ b/include/Nazara/Core/StackArray.inl @@ -24,6 +24,14 @@ namespace Nz * \class Nz::StackArray * \brief Core class that represents a stack-allocated (if alloca is present) array */ + + template + StackArray::StackArray() : + m_size(0), + m_ptr(nullptr) + { + } + template StackArray::StackArray(T* stackMemory, std::size_t size) : m_size(size), diff --git a/include/Nazara/Core/StackVector.hpp b/include/Nazara/Core/StackVector.hpp index 18d7e7437..6d01d8589 100644 --- a/include/Nazara/Core/StackVector.hpp +++ b/include/Nazara/Core/StackVector.hpp @@ -8,6 +8,7 @@ #define NAZARA_STACKVECTOR_HPP #include +#include #ifdef NAZARA_ALLOCA_SUPPORT #define NazaraStackVector(T, capacity) Nz::StackVector(static_cast(NAZARA_ALLOCA((capacity) * sizeof(T))), capacity) @@ -37,7 +38,10 @@ namespace Nz using reverse_iterator = std::reverse_iterator; using size_type = std::size_t; + StackVector(); StackVector(T* stackMemory, std::size_t capacity); + StackVector(const StackVector&) = delete; + StackVector(StackVector&&) = default; ~StackVector(); reference back(); @@ -99,10 +103,13 @@ namespace Nz reference operator[](size_type pos); const_reference operator[](size_type pos) const; + StackVector& operator=(const StackVector&) = delete; + StackVector& operator=(StackVector&&) = default; + private: std::size_t m_capacity; std::size_t m_size; - T* m_ptr; + MovablePtr m_ptr; }; } diff --git a/include/Nazara/Core/StackVector.inl b/include/Nazara/Core/StackVector.inl index 72c51afc2..580ade499 100644 --- a/include/Nazara/Core/StackVector.inl +++ b/include/Nazara/Core/StackVector.inl @@ -24,6 +24,14 @@ namespace Nz * \class Nz::StackVector * \brief Core class that represents a stack-allocated (if alloca is present) vector, that is with a capacity different from its size */ + template + StackVector::StackVector() : + m_capacity(0), + m_size(0), + m_ptr(nullptr) + { + } + template StackVector::StackVector(T* stackMemory, std::size_t capacity) : m_capacity(capacity), From 7b9dad59fef3c1656533b068343dc390ecc04d83 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 29 Sep 2019 16:43:56 +0200 Subject: [PATCH 109/192] Oopsie --- include/Nazara/Core/StackArray.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/Nazara/Core/StackArray.hpp b/include/Nazara/Core/StackArray.hpp index bf58f1a46..0a9f23faa 100644 --- a/include/Nazara/Core/StackArray.hpp +++ b/include/Nazara/Core/StackArray.hpp @@ -8,6 +8,7 @@ #define NAZARA_STACKARRAY_HPP #include +#include #ifdef NAZARA_ALLOCA_SUPPORT #define NazaraStackArray(T, size) Nz::StackArray(static_cast(NAZARA_ALLOCA((size) * sizeof(T))), size) From 4e6eda40fb3caba9f79d524dc06812a1f32f6ade Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 30 Sep 2019 18:35:24 +0200 Subject: [PATCH 110/192] Core/StackVector: Add unit tests --- tests/Engine/Core/StackVector.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/Engine/Core/StackVector.cpp b/tests/Engine/Core/StackVector.cpp index e40cbb613..c1c2d2b46 100644 --- a/tests/Engine/Core/StackVector.cpp +++ b/tests/Engine/Core/StackVector.cpp @@ -115,6 +115,29 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") CHECK(vector.capacity() == capacity); CHECK(vector.empty()); CHECK(vector.size() == 0); + CHECK(vector.max_size() == capacity); + } + + WHEN("Resizing it changes its size and create/destroy elements") + { + vector.resize(vector.capacity()); + CHECK(vector.size() == vector.capacity()); + CHECK(counter == 0); + vector.resize(0); + CHECK(vector.empty()); + CHECK(vector.size() == 0); + CHECK(counter == 0); + } + + WHEN("Resizing it allocates elements") + { + vector.resize(vector.capacity(), DestructionCounter(&counter, 0)); + CHECK(vector.size() == vector.capacity()); + CHECK(counter == capacity); + vector.resize(0); + CHECK(vector.empty()); + CHECK(vector.size() == 0); + CHECK(counter == 0); } WHEN("Emplacing five elements, vector size increase accordingly") From aee9a38f762b7848c014a6c1e4f47aea87f22e16 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 30 Sep 2019 18:41:06 +0200 Subject: [PATCH 111/192] Tests/StackVector: Disable max_size() check when using std::vector --- tests/Engine/Core/StackVector.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Engine/Core/StackVector.cpp b/tests/Engine/Core/StackVector.cpp index c1c2d2b46..62e67404b 100644 --- a/tests/Engine/Core/StackVector.cpp +++ b/tests/Engine/Core/StackVector.cpp @@ -115,7 +115,9 @@ SCENARIO("StackVector", "[CORE][STACKVECTOR]") CHECK(vector.capacity() == capacity); CHECK(vector.empty()); CHECK(vector.size() == 0); +#if !USE_STD_VECTOR CHECK(vector.max_size() == capacity); +#endif } WHEN("Resizing it changes its size and create/destroy elements") From f6bbe396fafbe6cacded064455d96fb8e348c2e4 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 15 Oct 2019 09:32:30 +0200 Subject: [PATCH 112/192] Sdk/World: Add CloneEntity(const EntityHandle&) overload --- ChangeLog.md | 1 + SDK/include/NDK/World.hpp | 1 + SDK/src/NDK/World.cpp | 18 ++++++++++++++---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 79425fab0..90403a1b5 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -289,6 +289,7 @@ Nazara Development Kit: - ⚠️ Made AbstractTextAreaWidget which is inherited by TextAreaWidget - ⚠️ Added RichTextAreaWidget - ⚠️ Console now supports text color in history +- Added World::CloneEntity overload taking an EntityHandle const reference, allowing to copy entities from other worlds # 0.4: diff --git a/SDK/include/NDK/World.hpp b/SDK/include/NDK/World.hpp index 891c3df11..ca6e917b7 100644 --- a/SDK/include/NDK/World.hpp +++ b/SDK/include/NDK/World.hpp @@ -46,6 +46,7 @@ namespace Ndk void Clear() noexcept; const EntityHandle& CloneEntity(EntityId id); + const EntityHandle& CloneEntity(const EntityHandle& entity); inline void DisableProfiler(); inline void EnableProfiler(bool enable = true); diff --git a/SDK/src/NDK/World.cpp b/SDK/src/NDK/World.cpp index d8a1ec0e3..dc848625a 100644 --- a/SDK/src/NDK/World.cpp +++ b/SDK/src/NDK/World.cpp @@ -157,16 +157,26 @@ namespace Ndk return EntityHandle::InvalidHandle; } + return CloneEntity(original); + } + + /*! + * \brief Clones the entity + * \return The clone newly created + * + * \param original Entity handle + * + * \remark Cloning a disabled entity will produce an enabled clone + */ + const EntityHandle& World::CloneEntity(const EntityHandle& original) + { const EntityHandle& clone = CreateEntity(); if (!original->IsEnabled()) clone->Disable(); const Nz::Bitset<>& componentBits = original->GetComponentBits(); for (std::size_t i = componentBits.FindFirst(); i != componentBits.npos; i = componentBits.FindNext(i)) - { - std::unique_ptr component(original->GetComponent(ComponentIndex(i)).Clone()); - clone->AddComponent(std::move(component)); - } + clone->AddComponent(original->GetComponent(ComponentIndex(i)).Clone()); clone->Enable(); From 8004c846631f4328e91b5f14e1d84079a3612df8 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 15 Oct 2019 09:33:35 +0200 Subject: [PATCH 113/192] Sdk/PhysicsComponent2D: Fix copy --- ChangeLog.md | 1 + .../NDK/Components/PhysicsComponent2D.hpp | 23 +++++++++ .../NDK/Components/PhysicsComponent2D.inl | 49 ++++++++++++++++++- SDK/src/NDK/Components/PhysicsComponent2D.cpp | 9 +++- 4 files changed, 79 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 90403a1b5..353910cb0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -290,6 +290,7 @@ Nazara Development Kit: - ⚠️ Added RichTextAreaWidget - ⚠️ Console now supports text color in history - Added World::CloneEntity overload taking an EntityHandle const reference, allowing to copy entities from other worlds +- Fixed PhysicsComponent2D copy not copying physics attributes # 0.4: diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index 93383d707..e12d36ebc 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -86,7 +86,10 @@ namespace Ndk static ComponentIndex componentIndex; private: + inline void ApplyPhysicsState(Nz::RigidBody2D& rigidBody) const; + inline void CopyPhysicsState(const Nz::RigidBody2D& rigidBody); Nz::RigidBody2D* GetRigidBody(); + const Nz::RigidBody2D* GetRigidBody() const; void OnAttached() override; void OnComponentAttached(BaseComponent& component) override; @@ -94,7 +97,27 @@ namespace Ndk void OnDetached() override; void OnEntityDestruction() override; + struct PendingPhysObjectStates + { + struct ShapeStates + { + Nz::Vector2f surfaceVelocity; + float elasticity; + float friction; + }; + + VelocityFunc velocityFunc; + std::vector shapes; + Nz::RadianAnglef angularVelocity; + Nz::Vector2f massCenter; + Nz::Vector2f velocity; + bool valid = false; + float mass; + float momentOfInertia; + }; + std::unique_ptr m_object; + PendingPhysObjectStates m_pendingStates; bool m_nodeSynchronizationEnabled; }; } diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index f30dd8618..911751a42 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -22,8 +22,7 @@ namespace Ndk */ inline PhysicsComponent2D::PhysicsComponent2D(const PhysicsComponent2D& physics) { - // No copy of physical object (because we only create it when attached to an entity) - NazaraUnused(physics); + CopyPhysicsState(*physics.GetRigidBody()); } /*! @@ -649,6 +648,47 @@ namespace Ndk m_object->UpdateVelocity(gravity, damping, deltaTime); } + inline void PhysicsComponent2D::ApplyPhysicsState(Nz::RigidBody2D& rigidBody) const + { + assert(m_pendingStates.valid); + + rigidBody.SetAngularVelocity(m_pendingStates.angularVelocity); + rigidBody.SetMass(m_pendingStates.mass); + rigidBody.SetMassCenter(m_pendingStates.massCenter); + rigidBody.SetMomentOfInertia(m_pendingStates.momentOfInertia); + rigidBody.SetVelocity(m_pendingStates.velocity); + rigidBody.SetVelocityFunction(m_pendingStates.velocityFunc); + + for (std::size_t i = 0; i < m_pendingStates.shapes.size(); ++i) + { + auto& shapeData = m_pendingStates.shapes[i]; + rigidBody.SetElasticity(i, shapeData.elasticity); + rigidBody.SetFriction(i, shapeData.friction); + rigidBody.SetSurfaceVelocity(i, shapeData.surfaceVelocity); + } + } + + inline void PhysicsComponent2D::CopyPhysicsState(const Nz::RigidBody2D& rigidBody) + { + m_pendingStates.valid = true; + + m_pendingStates.angularVelocity = rigidBody.GetAngularVelocity(); + m_pendingStates.mass = rigidBody.GetMass(); + m_pendingStates.massCenter = rigidBody.GetMassCenter(); + m_pendingStates.momentOfInertia = rigidBody.GetMomentOfInertia(); + m_pendingStates.velocity = rigidBody.GetVelocity(); + m_pendingStates.velocityFunc = rigidBody.GetVelocityFunction(); + + m_pendingStates.shapes.resize(rigidBody.GetShapeCount()); + for (std::size_t i = 0; i < m_pendingStates.shapes.size(); ++i) + { + auto& shapeData = m_pendingStates.shapes[i]; + shapeData.elasticity = rigidBody.GetElasticity(i); + shapeData.friction = rigidBody.GetFriction(i); + shapeData.surfaceVelocity = rigidBody.GetSurfaceVelocity(i); + } + } + /*! * \brief Gets the underlying physics object * \return A reference to the physics object @@ -657,4 +697,9 @@ namespace Ndk { return m_object.get(); } + + inline const Nz::RigidBody2D* PhysicsComponent2D::GetRigidBody() const + { + return m_object.get(); + } } diff --git a/SDK/src/NDK/Components/PhysicsComponent2D.cpp b/SDK/src/NDK/Components/PhysicsComponent2D.cpp index f9feaff6e..871fa762e 100644 --- a/SDK/src/NDK/Components/PhysicsComponent2D.cpp +++ b/SDK/src/NDK/Components/PhysicsComponent2D.cpp @@ -53,6 +53,9 @@ namespace Ndk m_object->SetPositionOffset(positionOffset); m_object->SetPosition(Nz::Vector2f(matrix.GetTranslation())); m_object->SetUserdata(reinterpret_cast(static_cast(m_entity->GetId()))); + + if (m_pendingStates.valid) + ApplyPhysicsState(*m_object); } /*! @@ -95,7 +98,11 @@ namespace Ndk void PhysicsComponent2D::OnDetached() { - m_object.reset(); + if (m_object) + { + CopyPhysicsState(*m_object); + m_object.reset(); + } } void PhysicsComponent2D::OnEntityDestruction() From 62023c6af7740806050e117c6ff510dde6ea2818 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 15 Oct 2019 09:34:55 +0200 Subject: [PATCH 114/192] Physics2D/RigidBody2D: Fix body type not being copied --- ChangeLog.md | 1 + src/Nazara/Physics2D/RigidBody2D.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 353910cb0..0665bcc5c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -195,6 +195,7 @@ Nazara Engine: - GuillotineBinPack::Insert overload taking multiple rectangles no longer does a heap allocation - StackArray and StackVector now have a default constructor initializing them with no size/capacity - StackArray and StackVector are now movable +- Fixed RigidBody2D::Copy not copying kinematic/dynamic/static status Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index e4c29b19a..e1e98759a 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -673,6 +673,8 @@ namespace Nz cpBodySetPosition(to, cpBodyGetPosition(from)); cpBodySetTorque(to, cpBodyGetTorque(from)); cpBodySetVelocity(to, cpBodyGetVelocity(from)); + + cpBodySetType(to, cpBodyGetType(from)); } void RigidBody2D::CopyShapeData(cpShape* from, cpShape* to) From 9576e2794d4d44a968bc2652eff5d100cb6c828c Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 15 Oct 2019 18:09:34 +0200 Subject: [PATCH 115/192] Core/Flags: Fix bitfield type selection --- include/Nazara/Core/Flags.hpp | 6 +++--- include/Nazara/Core/Flags.inl | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/Nazara/Core/Flags.hpp b/include/Nazara/Core/Flags.hpp index 92c97de9e..84c201775 100644 --- a/include/Nazara/Core/Flags.hpp +++ b/include/Nazara/Core/Flags.hpp @@ -39,11 +39,11 @@ namespace Nz static constexpr std::size_t MaxValue = static_cast(EnumAsFlags::max); - using BitField16 = std::conditional_t<(MaxValue > 8), UInt16, UInt8>; - using BitField32 = std::conditional_t<(MaxValue > 16), UInt32, BitField16>; + using BitField16 = std::conditional_t<(MaxValue >= 8), UInt16, UInt8>; + using BitField32 = std::conditional_t<(MaxValue >= 16), UInt32, BitField16>; public: - using BitField = std::conditional_t<(MaxValue > 32), UInt64, BitField32>; + using BitField = std::conditional_t<(MaxValue >= 32), UInt64, BitField32>; constexpr Flags(BitField value = 0); constexpr Flags(E enumVal); diff --git a/include/Nazara/Core/Flags.inl b/include/Nazara/Core/Flags.inl index 2b57a59a8..6a27f6923 100644 --- a/include/Nazara/Core/Flags.inl +++ b/include/Nazara/Core/Flags.inl @@ -218,6 +218,7 @@ namespace Nz template constexpr typename Flags::BitField Flags::GetFlagValue(E enumValue) { + assert(enumValue < sizeof(BitField) * CHAR_BIT); return 1U << static_cast(enumValue); } From 9161886cc8051921ee04fbcc294407fa072adc9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 15 Oct 2019 22:12:31 +0200 Subject: [PATCH 116/192] Update Flags.inl --- include/Nazara/Core/Flags.inl | 1 - 1 file changed, 1 deletion(-) diff --git a/include/Nazara/Core/Flags.inl b/include/Nazara/Core/Flags.inl index 6a27f6923..2b57a59a8 100644 --- a/include/Nazara/Core/Flags.inl +++ b/include/Nazara/Core/Flags.inl @@ -218,7 +218,6 @@ namespace Nz template constexpr typename Flags::BitField Flags::GetFlagValue(E enumValue) { - assert(enumValue < sizeof(BitField) * CHAR_BIT); return 1U << static_cast(enumValue); } From dac4f7806a944a1f92f5865d3c9c08aff8242209 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 21 Oct 2019 19:04:55 +0200 Subject: [PATCH 117/192] Sdk/Entity: Add DropComponent method --- ChangeLog.md | 1 + SDK/include/NDK/Entity.hpp | 6 ++-- SDK/include/NDK/Entity.inl | 9 ++++++ SDK/src/NDK/Entity.cpp | 58 ++++++++++++++++++++------------------ SDK/src/NDK/World.cpp | 3 +- 5 files changed, 45 insertions(+), 32 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 0665bcc5c..8f11dacba 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -292,6 +292,7 @@ Nazara Development Kit: - ⚠️ Console now supports text color in history - Added World::CloneEntity overload taking an EntityHandle const reference, allowing to copy entities from other worlds - Fixed PhysicsComponent2D copy not copying physics attributes +- Added Entity::DropComponent which detaches a component without necessarily destroying it # 0.4: diff --git a/SDK/include/NDK/Entity.hpp b/SDK/include/NDK/Entity.hpp index e09f4eac4..85e43da19 100644 --- a/SDK/include/NDK/Entity.hpp +++ b/SDK/include/NDK/Entity.hpp @@ -43,6 +43,10 @@ namespace Ndk const EntityHandle& Clone() const; inline void Disable(); + + std::unique_ptr DropComponent(ComponentIndex index); + template std::unique_ptr DropComponent(); + void Enable(bool enable = true); inline BaseComponent& GetComponent(ComponentIndex index); @@ -83,8 +87,6 @@ namespace Ndk void Create(); void Destroy(); - void DestroyComponent(ComponentIndex index); - inline Nz::Bitset<>& GetRemovedComponentBits(); inline void RegisterEntityList(EntityList* list); diff --git a/SDK/include/NDK/Entity.inl b/SDK/include/NDK/Entity.inl index 7b8fa5736..799384182 100644 --- a/SDK/include/NDK/Entity.inl +++ b/SDK/include/NDK/Entity.inl @@ -64,6 +64,15 @@ namespace Ndk * \remark Produces a NazaraAssert if component is not available in this entity */ + template + std::unique_ptr Entity::DropComponent() + { + static_assert(std::is_base_of::value, "ComponentType is not a component"); + + ComponentIndex index = GetComponentIndex(); + return DropComponent(index); + } + template ComponentType& Entity::GetComponent() { diff --git a/SDK/src/NDK/Entity.cpp b/SDK/src/NDK/Entity.cpp index 4e211f0db..8086e5905 100644 --- a/SDK/src/NDK/Entity.cpp +++ b/SDK/src/NDK/Entity.cpp @@ -97,6 +97,36 @@ namespace Ndk return m_world->CloneEntity(m_id); } + /*! + * \brief Detaches a component from the entity + * \return An owning pointer to the component + * + * Instantly detaches a component from the entity and returns it, allowing to attach it to another entity + * + * \remark Unlike RemoveComponent, this function instantly removes the component + */ + std::unique_ptr Entity::DropComponent(ComponentIndex index) + { + if (!HasComponent(index)) + return nullptr; + + // We get the component and we alert existing components of the deleted one + std::unique_ptr component = std::move(m_components[index]); + m_components[index].reset(); + + for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i)) + { + if (i != index) + m_components[i]->OnComponentDetached(*component); + } + m_componentBits.Reset(index); + m_removedComponentBits.UnboundedReset(index); + + component->SetEntity(nullptr); + + return component; + } + /*! * \brief Enables the entity * @@ -208,32 +238,4 @@ namespace Ndk m_valid = false; } - - /*! - * \brief Destroys a component by index - * - * \param index Index of the component - * - * \remark If component is not available, no action is performed - */ - - void Entity::DestroyComponent(ComponentIndex index) - { - if (HasComponent(index)) - { - // We get the component and we alert existing components of the deleted one - BaseComponent& component = *m_components[index].get(); - for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i)) - { - if (i != index) - m_components[i]->OnComponentDetached(component); - } - - component.SetEntity(nullptr); - - m_components[index].reset(); - m_componentBits.Reset(index); - } - } - } diff --git a/SDK/src/NDK/World.cpp b/SDK/src/NDK/World.cpp index dc848625a..ef59463bc 100644 --- a/SDK/src/NDK/World.cpp +++ b/SDK/src/NDK/World.cpp @@ -249,8 +249,7 @@ namespace Ndk Nz::Bitset<>& removedComponents = entity->GetRemovedComponentBits(); for (std::size_t j = removedComponents.FindFirst(); j != m_dirtyEntities.back.npos; j = removedComponents.FindNext(j)) - entity->DestroyComponent(static_cast(j)); - removedComponents.Reset(); + entity->DropComponent(static_cast(j)); for (auto& system : m_orderedSystems) { From c668d02747313e456b1d9b77aa952e9d9ad20e02 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 22 Oct 2019 14:29:29 +0200 Subject: [PATCH 118/192] Nazara/Lua: Fix my dumb ass --- ChangeLog.md | 1 + src/Nazara/Lua/LuaInstance.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8f11dacba..938757cd1 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -196,6 +196,7 @@ Nazara Engine: - StackArray and StackVector now have a default constructor initializing them with no size/capacity - StackArray and StackVector are now movable - Fixed RigidBody2D::Copy not copying kinematic/dynamic/static status +- Fixed out-of-bounds access in LuaInstance::LoadLibraries Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Lua/LuaInstance.cpp b/src/Nazara/Lua/LuaInstance.cpp index 85567df81..eb9e4e48f 100644 --- a/src/Nazara/Lua/LuaInstance.cpp +++ b/src/Nazara/Lua/LuaInstance.cpp @@ -63,7 +63,7 @@ namespace Nz void LuaInstance::LoadLibraries(LuaLibFlags libFlags) { // From luaL_openlibs - std::array libs; + std::array libs; std::size_t libCount = 0; libs[libCount++] = { "_G", luaopen_base }; From a4bff0968b578da385933f79c58b420eb15da4e1 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 9 Nov 2019 13:37:40 +0100 Subject: [PATCH 119/192] Core/Flags: Add Clear methods --- ChangeLog.md | 2 ++ include/Nazara/Core/Flags.hpp | 3 +++ include/Nazara/Core/Flags.inl | 26 ++++++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 938757cd1..186e1be04 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -197,6 +197,8 @@ Nazara Engine: - StackArray and StackVector are now movable - Fixed RigidBody2D::Copy not copying kinematic/dynamic/static status - Fixed out-of-bounds access in LuaInstance::LoadLibraries +- Add Flags::Clear(Flags) helper method, to clear one or more flags. +- Add Flags::Clear() helper method, to reset flags Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/Flags.hpp b/include/Nazara/Core/Flags.hpp index 84c201775..c2e2dc8db 100644 --- a/include/Nazara/Core/Flags.hpp +++ b/include/Nazara/Core/Flags.hpp @@ -48,6 +48,9 @@ namespace Nz constexpr Flags(BitField value = 0); constexpr Flags(E enumVal); + void Clear(); + void Clear(const Flags& flags); + constexpr bool Test(const Flags& flags) const; explicit constexpr operator bool() const; diff --git a/include/Nazara/Core/Flags.inl b/include/Nazara/Core/Flags.inl index 2b57a59a8..b3db17e47 100644 --- a/include/Nazara/Core/Flags.inl +++ b/include/Nazara/Core/Flags.inl @@ -39,9 +39,35 @@ namespace Nz { } + /*! + * \brief Clear all flags + * + * \see Test + */ + template + void Flags::Clear() + { + m_value = 0; + } + + /*! + * \brief Clear some flags + * + * \param flags Flags to be cleared + * + * \see Test + */ + template + void Flags::Clear(const Flags& flags) + { + m_value &= ~flags; + } + /*! * \brief Tests if all flags from a Flags object are enabled * \return True if all tested flags are enabled. + * + * \see Clear */ template constexpr bool Flags::Test(const Flags& flags) const From 57958056d6f79ac276d0f432e39fa9f98b574531 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 9 Nov 2019 13:53:29 +0100 Subject: [PATCH 120/192] Core/Flags: Add Set method --- ChangeLog.md | 1 + include/Nazara/Core/Flags.hpp | 2 ++ include/Nazara/Core/Flags.inl | 14 ++++++++++++++ 3 files changed, 17 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 186e1be04..c378f942c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -199,6 +199,7 @@ Nazara Engine: - Fixed out-of-bounds access in LuaInstance::LoadLibraries - Add Flags::Clear(Flags) helper method, to clear one or more flags. - Add Flags::Clear() helper method, to reset flags +- Add Flags::Set(Flags) helper method, to enable flags Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/Flags.hpp b/include/Nazara/Core/Flags.hpp index c2e2dc8db..3fa7d2741 100644 --- a/include/Nazara/Core/Flags.hpp +++ b/include/Nazara/Core/Flags.hpp @@ -51,6 +51,8 @@ namespace Nz void Clear(); void Clear(const Flags& flags); + void Set(const Flags& flags); + constexpr bool Test(const Flags& flags) const; explicit constexpr operator bool() const; diff --git a/include/Nazara/Core/Flags.inl b/include/Nazara/Core/Flags.inl index b3db17e47..856c14f63 100644 --- a/include/Nazara/Core/Flags.inl +++ b/include/Nazara/Core/Flags.inl @@ -63,6 +63,20 @@ namespace Nz m_value &= ~flags; } + /*! + * \brief Enable some flags + * + * \param flags Flags to be enabled + * + * \see Clear + * \see Test + */ + template + void Flags::Set(const Flags& flags) + { + m_value |= flags; + } + /*! * \brief Tests if all flags from a Flags object are enabled * \return True if all tested flags are enabled. From ae996ae09d0ce292923f5fc0cc1173e0a915267c Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 9 Nov 2019 15:34:25 +0100 Subject: [PATCH 121/192] Oopsie --- include/Nazara/Core/Flags.inl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Nazara/Core/Flags.inl b/include/Nazara/Core/Flags.inl index 856c14f63..2e1800ff8 100644 --- a/include/Nazara/Core/Flags.inl +++ b/include/Nazara/Core/Flags.inl @@ -60,7 +60,7 @@ namespace Nz template void Flags::Clear(const Flags& flags) { - m_value &= ~flags; + m_value &= ~flags.m_value; } /*! @@ -74,7 +74,7 @@ namespace Nz template void Flags::Set(const Flags& flags) { - m_value |= flags; + m_value |= flags.m_value; } /*! From 960eb5f4759f26743d2e00d05b621cf12a307914 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 30 Nov 2019 15:32:23 +0100 Subject: [PATCH 122/192] SDK/DebugSystem: Add EnableDepthBuffer --- SDK/include/NDK/Systems/DebugSystem.hpp | 8 +- SDK/include/NDK/Systems/DebugSystem.inl | 7 + SDK/src/NDK/Systems/DebugSystem.cpp | 288 +++++++++++++----------- 3 files changed, 166 insertions(+), 137 deletions(-) diff --git a/SDK/include/NDK/Systems/DebugSystem.hpp b/SDK/include/NDK/Systems/DebugSystem.hpp index 362b59f32..1d468ea41 100644 --- a/SDK/include/NDK/Systems/DebugSystem.hpp +++ b/SDK/include/NDK/Systems/DebugSystem.hpp @@ -22,6 +22,10 @@ namespace Ndk DebugSystem(); ~DebugSystem() = default; + void EnableDepthBuffer(bool enable); + + inline bool IsDepthBufferEnabled() const; + static SystemIndex systemIndex; private: @@ -29,14 +33,13 @@ namespace Ndk Nz::InstancedRenderableRef GenerateCollision2DMesh(Entity* entity, Nz::Vector3f* offset); Nz::InstancedRenderableRef GenerateCollision3DMesh(Entity* entity); + std::pair GetBoxMesh(); Nz::MaterialRef GetCollisionMaterial(); Nz::MaterialRef GetGlobalAABBMaterial(); Nz::MaterialRef GetLocalAABBMaterial(); Nz::MaterialRef GetOBBMaterial(); - std::pair GetBoxMesh(); void OnEntityValidation(Entity* entity, bool justAdded) override; - void OnUpdate(float elapsedTime) override; Nz::MaterialRef m_globalAabbMaterial; @@ -45,6 +48,7 @@ namespace Ndk Nz::MaterialRef m_obbMaterial; Nz::IndexBufferRef m_boxMeshIndexBuffer; Nz::VertexBufferRef m_boxMeshVertexBuffer; + bool m_isDepthBufferEnabled; }; } diff --git a/SDK/include/NDK/Systems/DebugSystem.inl b/SDK/include/NDK/Systems/DebugSystem.inl index b7439fc12..b72b87f3f 100644 --- a/SDK/include/NDK/Systems/DebugSystem.inl +++ b/SDK/include/NDK/Systems/DebugSystem.inl @@ -4,3 +4,10 @@ #include +namespace Ndk +{ + inline bool DebugSystem::IsDepthBufferEnabled() const + { + return m_isDepthBufferEnabled; + } +} diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index d8c61b9bc..5b8bb7aa6 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -153,151 +153,28 @@ namespace Ndk /*! * \brief Constructs an DebugSystem object by default */ - DebugSystem::DebugSystem() + DebugSystem::DebugSystem() : + m_isDepthBufferEnabled(true) { Requires(); SetUpdateOrder(1000); //< Update last } - std::pair DebugSystem::GetBoxMesh() + void DebugSystem::EnableDepthBuffer(bool enable) { - if (!m_boxMeshIndexBuffer) - { - std::array indices = { - { - 0, 1, - 1, 2, - 2, 3, - 3, 0, + m_isDepthBufferEnabled = enable; - 4, 5, - 5, 6, - 6, 7, - 7, 4, + if (m_collisionMaterial) + m_collisionMaterial->EnableDepthBuffer(enable); - 0, 4, - 1, 5, - 2, 6, - 3, 7 - } - }; + if (m_globalAabbMaterial) + m_globalAabbMaterial->EnableDepthBuffer(enable); - m_boxMeshIndexBuffer = Nz::IndexBuffer::New(false, Nz::UInt32(indices.size()), Nz::DataStorage_Hardware, 0); - m_boxMeshIndexBuffer->Fill(indices.data(), 0, Nz::UInt32(indices.size())); - } + if (m_localAabbMaterial) + m_localAabbMaterial->EnableDepthBuffer(enable); - if (!m_boxMeshVertexBuffer) - { - Nz::Boxf box(-0.5f, -0.5f, -0.5f, 1.f, 1.f, 1.f); - - std::array positions = { - { - box.GetCorner(Nz::BoxCorner_FarLeftBottom), - box.GetCorner(Nz::BoxCorner_NearLeftBottom), - box.GetCorner(Nz::BoxCorner_NearRightBottom), - box.GetCorner(Nz::BoxCorner_FarRightBottom), - box.GetCorner(Nz::BoxCorner_FarLeftTop), - box.GetCorner(Nz::BoxCorner_NearLeftTop), - box.GetCorner(Nz::BoxCorner_NearRightTop), - box.GetCorner(Nz::BoxCorner_FarRightTop) - } - }; - - m_boxMeshVertexBuffer = Nz::VertexBuffer::New(Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ), Nz::UInt32(positions.size()), Nz::DataStorage_Hardware, 0); - m_boxMeshVertexBuffer->Fill(positions.data(), 0, Nz::UInt32(positions.size())); - } - - return { m_boxMeshIndexBuffer, m_boxMeshVertexBuffer }; - } - - void DebugSystem::OnEntityValidation(Entity* entity, bool /*justAdded*/) - { - static constexpr int DebugDrawOrder = 1'000; - - DebugComponent& entityDebug = entity->GetComponent(); - GraphicsComponent& entityGfx = entity->GetComponent(); - NodeComponent& entityNode = entity->GetComponent(); - - DebugDrawFlags enabledFlags = entityDebug.GetEnabledFlags(); - DebugDrawFlags flags = entityDebug.GetFlags(); - - DebugDrawFlags flagsToEnable = flags & ~enabledFlags; - for (std::size_t i = 0; i <= static_cast(DebugDraw::Max); ++i) - { - DebugDraw option = static_cast(i); - if (flagsToEnable & option) - { - switch (option) - { - case DebugDraw::Collider2D: - { - Nz::Vector3f offset; - Nz::InstancedRenderableRef renderable = GenerateCollision2DMesh(entity, &offset); - if (renderable) - entityGfx.Attach(renderable, Nz::Matrix4f::Translate(offset), DebugDrawOrder); - - entityDebug.UpdateDebugRenderable(option, std::move(renderable)); - break; - } - - case DebugDraw::Collider3D: - { - const Nz::Boxf& obb = entityGfx.GetAABB(); - - Nz::InstancedRenderableRef renderable = GenerateCollision3DMesh(entity); - if (renderable) - entityGfx.Attach(renderable, Nz::Matrix4f::Translate(obb.GetCenter() - entityNode.GetPosition()), DebugDrawOrder); - - entityDebug.UpdateDebugRenderable(option, std::move(renderable)); - break; - } - - case DebugDraw::GraphicsAABB: - { - auto indexVertexBuffers = GetBoxMesh(); - - Nz::InstancedRenderableRef renderable = new AABBDebugRenderable(entity, GetGlobalAABBMaterial(), GetLocalAABBMaterial(), indexVertexBuffers.first, indexVertexBuffers.second); - renderable->SetPersistent(false); - - entityGfx.Attach(renderable, Nz::Matrix4f::Identity(), DebugDrawOrder); - - entityDebug.UpdateDebugRenderable(option, std::move(renderable)); - break; - } - - case DebugDraw::GraphicsOBB: - { - auto indexVertexBuffers = GetBoxMesh(); - - Nz::InstancedRenderableRef renderable = new OBBDebugRenderable(entity, GetOBBMaterial(), indexVertexBuffers.first, indexVertexBuffers.second); - renderable->SetPersistent(false); - - entityGfx.Attach(renderable, Nz::Matrix4f::Identity(), DebugDrawOrder); - - entityDebug.UpdateDebugRenderable(option, std::move(renderable)); - break; - } - - default: - break; - } - } - } - - DebugDrawFlags flagsToDisable = enabledFlags & ~flags; - for (std::size_t i = 0; i <= static_cast(DebugDraw::Max); ++i) - { - DebugDraw option = static_cast(i); - if (flagsToDisable & option) - entityGfx.Detach(entityDebug.GetDebugRenderable(option)); - } - - entityDebug.UpdateEnabledFlags(flags); - } - - void DebugSystem::OnUpdate(float elapsedTime) - { - // Nothing to do + if (m_obbMaterial) + m_obbMaterial->EnableDepthBuffer(enable); } Nz::InstancedRenderableRef DebugSystem::GenerateBox(Nz::Boxf box) @@ -444,6 +321,57 @@ namespace Ndk return nullptr; } + std::pair DebugSystem::GetBoxMesh() + { + if (!m_boxMeshIndexBuffer) + { + std::array indices = { + { + 0, 1, + 1, 2, + 2, 3, + 3, 0, + + 4, 5, + 5, 6, + 6, 7, + 7, 4, + + 0, 4, + 1, 5, + 2, 6, + 3, 7 + } + }; + + m_boxMeshIndexBuffer = Nz::IndexBuffer::New(false, Nz::UInt32(indices.size()), Nz::DataStorage_Hardware, 0); + m_boxMeshIndexBuffer->Fill(indices.data(), 0, Nz::UInt32(indices.size())); + } + + if (!m_boxMeshVertexBuffer) + { + Nz::Boxf box(-0.5f, -0.5f, -0.5f, 1.f, 1.f, 1.f); + + std::array positions = { + { + box.GetCorner(Nz::BoxCorner_FarLeftBottom), + box.GetCorner(Nz::BoxCorner_NearLeftBottom), + box.GetCorner(Nz::BoxCorner_NearRightBottom), + box.GetCorner(Nz::BoxCorner_FarRightBottom), + box.GetCorner(Nz::BoxCorner_FarLeftTop), + box.GetCorner(Nz::BoxCorner_NearLeftTop), + box.GetCorner(Nz::BoxCorner_NearRightTop), + box.GetCorner(Nz::BoxCorner_FarRightTop) + } + }; + + m_boxMeshVertexBuffer = Nz::VertexBuffer::New(Nz::VertexDeclaration::Get(Nz::VertexLayout_XYZ), Nz::UInt32(positions.size()), Nz::DataStorage_Hardware, 0); + m_boxMeshVertexBuffer->Fill(positions.data(), 0, Nz::UInt32(positions.size())); + } + + return { m_boxMeshIndexBuffer, m_boxMeshVertexBuffer }; + } + Nz::MaterialRef DebugSystem::GetGlobalAABBMaterial() { if (!m_globalAabbMaterial) @@ -503,6 +431,96 @@ namespace Ndk return m_obbMaterial; } + + void DebugSystem::OnEntityValidation(Entity* entity, bool /*justAdded*/) + { + static constexpr int DebugDrawOrder = 1'000; + + DebugComponent& entityDebug = entity->GetComponent(); + GraphicsComponent& entityGfx = entity->GetComponent(); + NodeComponent& entityNode = entity->GetComponent(); + + DebugDrawFlags enabledFlags = entityDebug.GetEnabledFlags(); + DebugDrawFlags flags = entityDebug.GetFlags(); + + DebugDrawFlags flagsToEnable = flags & ~enabledFlags; + for (std::size_t i = 0; i <= static_cast(DebugDraw::Max); ++i) + { + DebugDraw option = static_cast(i); + if (flagsToEnable & option) + { + switch (option) + { + case DebugDraw::Collider2D: + { + Nz::Vector3f offset; + Nz::InstancedRenderableRef renderable = GenerateCollision2DMesh(entity, &offset); + if (renderable) + entityGfx.Attach(renderable, Nz::Matrix4f::Translate(offset), DebugDrawOrder); + + entityDebug.UpdateDebugRenderable(option, std::move(renderable)); + break; + } + + case DebugDraw::Collider3D: + { + const Nz::Boxf& obb = entityGfx.GetAABB(); + + Nz::InstancedRenderableRef renderable = GenerateCollision3DMesh(entity); + if (renderable) + entityGfx.Attach(renderable, Nz::Matrix4f::Translate(obb.GetCenter() - entityNode.GetPosition()), DebugDrawOrder); + + entityDebug.UpdateDebugRenderable(option, std::move(renderable)); + break; + } + + case DebugDraw::GraphicsAABB: + { + auto indexVertexBuffers = GetBoxMesh(); + + Nz::InstancedRenderableRef renderable = new AABBDebugRenderable(entity, GetGlobalAABBMaterial(), GetLocalAABBMaterial(), indexVertexBuffers.first, indexVertexBuffers.second); + renderable->SetPersistent(false); + + entityGfx.Attach(renderable, Nz::Matrix4f::Identity(), DebugDrawOrder); + + entityDebug.UpdateDebugRenderable(option, std::move(renderable)); + break; + } + + case DebugDraw::GraphicsOBB: + { + auto indexVertexBuffers = GetBoxMesh(); + + Nz::InstancedRenderableRef renderable = new OBBDebugRenderable(entity, GetOBBMaterial(), indexVertexBuffers.first, indexVertexBuffers.second); + renderable->SetPersistent(false); + + entityGfx.Attach(renderable, Nz::Matrix4f::Identity(), DebugDrawOrder); + + entityDebug.UpdateDebugRenderable(option, std::move(renderable)); + break; + } + + default: + break; + } + } + } + + DebugDrawFlags flagsToDisable = enabledFlags & ~flags; + for (std::size_t i = 0; i <= static_cast(DebugDraw::Max); ++i) + { + DebugDraw option = static_cast(i); + if (flagsToDisable & option) + entityGfx.Detach(entityDebug.GetDebugRenderable(option)); + } + + entityDebug.UpdateEnabledFlags(flags); + } + + void DebugSystem::OnUpdate(float elapsedTime) + { + // Nothing to do + } SystemIndex DebugSystem::systemIndex; } From 164633e5182275351f14fa5b046e4bf6e1d25141 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 1 Dec 2019 11:08:06 +0100 Subject: [PATCH 123/192] SDK/DebugComponent: Fix crash when removing the debug component while active --- SDK/include/NDK/Components/DebugComponent.hpp | 7 ++++++ SDK/src/NDK/Components/DebugComponent.cpp | 25 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/SDK/include/NDK/Components/DebugComponent.hpp b/SDK/include/NDK/Components/DebugComponent.hpp index 0777a9812..e0993d26d 100644 --- a/SDK/include/NDK/Components/DebugComponent.hpp +++ b/SDK/include/NDK/Components/DebugComponent.hpp @@ -41,6 +41,7 @@ namespace Ndk constexpr DebugDrawFlags DebugDraw_None = 0; class DebugComponent; + class GraphicsComponent; using DebugComponentHandle = Nz::ObjectHandle; @@ -65,8 +66,14 @@ namespace Ndk static ComponentIndex componentIndex; private: + void DetachDebugRenderables(GraphicsComponent& gfxComponent); + inline const Nz::InstancedRenderableRef& GetDebugRenderable(DebugDraw option) const; inline DebugDrawFlags GetEnabledFlags() const; + + void OnComponentDetached(BaseComponent& component) override; + void OnDetached() override; + inline void UpdateDebugRenderable(DebugDraw option, Nz::InstancedRenderableRef renderable); inline void UpdateEnabledFlags(DebugDrawFlags flags); diff --git a/SDK/src/NDK/Components/DebugComponent.cpp b/SDK/src/NDK/Components/DebugComponent.cpp index 6c8ab9f1c..604e1d143 100644 --- a/SDK/src/NDK/Components/DebugComponent.cpp +++ b/SDK/src/NDK/Components/DebugComponent.cpp @@ -3,8 +3,33 @@ // For conditions of distribution and use, see copyright notice in Prerequisites.hpp #include +#include namespace Ndk { + void DebugComponent::DetachDebugRenderables(GraphicsComponent& gfxComponent) + { + for (auto& renderable : m_debugRenderables) + { + if (renderable) + { + gfxComponent.Detach(renderable); + renderable.Reset(); + } + } + } + + void DebugComponent::OnComponentDetached(BaseComponent& component) + { + if (IsComponent(component)) + DetachDebugRenderables(static_cast(component)); + } + + void DebugComponent::OnDetached() + { + if (m_entity->HasComponent()) + DetachDebugRenderables(m_entity->GetComponent()); + } + ComponentIndex DebugComponent::componentIndex; } From ef030ddaac9d7c05c9744276b6268e1c23499243 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 8 Dec 2019 18:56:21 +0100 Subject: [PATCH 124/192] Rework constraint2D --- ChangeLog.md | 2 + .../NDK/Components/ConstraintComponent2D.hpp | 25 ++++-- .../NDK/Components/ConstraintComponent2D.inl | 23 +++++- .../NDK/Components/ConstraintComponent2D.cpp | 17 ++++ include/Nazara/Core/ObjectRef.inl | 6 +- include/Nazara/Physics2D/Constraint2D.hpp | 55 ++++--------- include/Nazara/Physics2D/Constraint2D.inl | 80 ------------------- 7 files changed, 74 insertions(+), 134 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index c378f942c..b2f87f16a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -200,6 +200,7 @@ Nazara Engine: - Add Flags::Clear(Flags) helper method, to clear one or more flags. - Add Flags::Clear() helper method, to reset flags - Add Flags::Set(Flags) helper method, to enable flags +- ⚠ Constraint2D are no longer managed by references and are now handled objects Nazara Development Kit: - Added ImageWidget (#139) @@ -297,6 +298,7 @@ Nazara Development Kit: - Added World::CloneEntity overload taking an EntityHandle const reference, allowing to copy entities from other worlds - Fixed PhysicsComponent2D copy not copying physics attributes - Added Entity::DropComponent which detaches a component without necessarily destroying it +- ⚠ ConstraintComponent2D has been reworked to handle entity destruction and remove constraints at will # 0.4: diff --git a/SDK/include/NDK/Components/ConstraintComponent2D.hpp b/SDK/include/NDK/Components/ConstraintComponent2D.hpp index 23fcfe4c8..652559481 100644 --- a/SDK/include/NDK/Components/ConstraintComponent2D.hpp +++ b/SDK/include/NDK/Components/ConstraintComponent2D.hpp @@ -1,13 +1,18 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + #pragma once #ifndef NDK_COMPONENTS_CONSTRAINTCOMPONENT2D_HPP #define NDK_COMPONENTS_CONSTRAINTCOMPONENT2D_HPP -#include #include #include -#include +#include +#include #include +#include namespace Ndk { @@ -19,16 +24,24 @@ namespace Ndk { public: ConstraintComponent2D() = default; - ConstraintComponent2D(const ConstraintComponent2D& joint) = default; + ConstraintComponent2D(const ConstraintComponent2D& joint); ConstraintComponent2D(ConstraintComponent2D&& joint) = default; - template inline Nz::ObjectRef CreateConstraint(const Ndk::EntityHandle& first, const Ndk::EntityHandle& second, Args&&... args); - + template T* CreateConstraint(const Ndk::EntityHandle& first, const Ndk::EntityHandle& second, Args&&... args); + bool RemoveConstraint(Nz::Constraint2D* constraint); + static ComponentIndex componentIndex; private: + struct ConstraintData + { + std::unique_ptr constraint; - std::vector m_constraints; + NazaraSlot(Ndk::Entity, OnEntityDestruction, onBodyADestruction); + NazaraSlot(Ndk::Entity, OnEntityDestruction, onBodyBDestruction); + }; + + std::vector m_constraints; }; } diff --git a/SDK/include/NDK/Components/ConstraintComponent2D.inl b/SDK/include/NDK/Components/ConstraintComponent2D.inl index 51e64ba6e..5db943439 100644 --- a/SDK/include/NDK/Components/ConstraintComponent2D.inl +++ b/SDK/include/NDK/Components/ConstraintComponent2D.inl @@ -1,3 +1,7 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + #include #include #include @@ -5,7 +9,7 @@ namespace Ndk { template - Nz::ObjectRef ConstraintComponent2D::CreateConstraint(const Ndk::EntityHandle& first, const Ndk::EntityHandle& second, Args && ...args) + T* ConstraintComponent2D::CreateConstraint(const Ndk::EntityHandle& first, const Ndk::EntityHandle& second, Args&& ...args) { auto FetchBody = [](const Ndk::EntityHandle& entity) -> Nz::RigidBody2D* { @@ -23,9 +27,20 @@ namespace Ndk Nz::RigidBody2D* secondBody = FetchBody(second); NazaraAssert(secondBody, "Second entity has no CollisionComponent2D nor PhysicsComponent2D component"); - Nz::ObjectRef constraint = T::New(*firstBody, *secondBody, std::forward(args)...); - m_constraints.push_back(constraint); + m_constraints.emplace_back(); + auto& constraintData = m_constraints.back(); + constraintData.constraint = std::make_unique(*firstBody, *secondBody, std::forward(args)...); - return constraint; + constraintData.onBodyADestruction.Connect(first->OnEntityDestruction, [this, constraint = constraintData.constraint.get()](const Ndk::Entity* /*entity*/) + { + RemoveConstraint(constraint); + }); + + constraintData.onBodyBDestruction.Connect(second->OnEntityDestruction, [this, constraint = constraintData.constraint.get()](const Ndk::Entity* /*entity*/) + { + RemoveConstraint(constraint); + }); + + return static_cast(constraintData.constraint.get()); } } diff --git a/SDK/src/NDK/Components/ConstraintComponent2D.cpp b/SDK/src/NDK/Components/ConstraintComponent2D.cpp index ef841c210..6c75f39ee 100644 --- a/SDK/src/NDK/Components/ConstraintComponent2D.cpp +++ b/SDK/src/NDK/Components/ConstraintComponent2D.cpp @@ -1,6 +1,23 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequisites.hpp + #include namespace Ndk { + ConstraintComponent2D::ConstraintComponent2D(const ConstraintComponent2D& /*joint*/) + { + } + + bool ConstraintComponent2D::RemoveConstraint(Nz::Constraint2D* constraintPtr) + { + auto it = std::find_if(m_constraints.begin(), m_constraints.end(), [constraintPtr](const ConstraintData& constraintData) { return constraintData.constraint.get() == constraintPtr; }); + if (it != m_constraints.end()) + m_constraints.erase(it); + + return !m_constraints.empty(); + } + ComponentIndex ConstraintComponent2D::componentIndex; } diff --git a/include/Nazara/Core/ObjectRef.inl b/include/Nazara/Core/ObjectRef.inl index f592fd501..25ff82a95 100644 --- a/include/Nazara/Core/ObjectRef.inl +++ b/include/Nazara/Core/ObjectRef.inl @@ -335,7 +335,7 @@ namespace Nz template bool operator<(const ObjectRef& lhs, const ObjectRef& rhs) { - return lhs.m_object < rhs.m_object; + return lhs.Get() < rhs.Get(); } /*! @@ -348,7 +348,7 @@ namespace Nz template bool operator<(const T& lhs, const ObjectRef& rhs) { - return &lhs < rhs.m_object; + return &lhs < rhs.Get(); } /*! @@ -361,7 +361,7 @@ namespace Nz template bool operator<(const ObjectRef& lhs, const T& rhs) { - return lhs.m_object < &rhs; + return lhs.Get() < &rhs; } /*! diff --git a/include/Nazara/Physics2D/Constraint2D.hpp b/include/Nazara/Physics2D/Constraint2D.hpp index 74cded64d..13ee68c86 100644 --- a/include/Nazara/Physics2D/Constraint2D.hpp +++ b/include/Nazara/Physics2D/Constraint2D.hpp @@ -8,7 +8,9 @@ #define NAZARA_CONSTRAINT2D_HPP #include +#include #include +#include #include #include #include @@ -21,11 +23,9 @@ namespace Nz { class Constraint2D; - using Constraint2DConstRef = ObjectRef; - using Constraint2DLibrary = ObjectLibrary; - using Constraint2DRef = ObjectRef; + using Constraint2DHandle = ObjectHandle; - class NAZARA_PHYSICS2D_API Constraint2D : public RefCounted + class NAZARA_PHYSICS2D_API Constraint2D : public HandledObject { public: Constraint2D(const Constraint2D&) = delete; @@ -57,16 +57,12 @@ namespace Nz Constraint2D(Nz::PhysWorld2D* world, cpConstraint* constraint); MovablePtr m_constraint; - - private: - static Constraint2DLibrary s_library; }; class DampedSpringConstraint2D; - using DampedSpringConstraint2DConstRef = ObjectRef; - using DampedSpringConstraint2DRef = ObjectRef; - + using DampedSpringConstraint2DHandle = ObjectHandle; + class NAZARA_PHYSICS2D_API DampedSpringConstraint2D : public Constraint2D { public: @@ -84,14 +80,11 @@ namespace Nz void SetRestLength(float newLength); void SetSecondAnchor(const Vector2f& firstAnchor); void SetStiffness(float newStiffness); - - template static DampedSpringConstraint2DRef New(Args&&... args); }; class DampedRotarySpringConstraint2D; - using DampedRotarySpringConstraint2DConstRef = ObjectRef; - using DampedRotarySpringConstraint2DRef = ObjectRef; + using DampedRotarySpringConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API DampedRotarySpringConstraint2D : public Constraint2D { @@ -106,13 +99,11 @@ namespace Nz void SetDamping(float newDamping); void SetRestAngle(const RadianAnglef& newAngle); void SetStiffness(float newStiffness); - - template static DampedRotarySpringConstraint2DRef New(Args&&... args); }; class GearConstraint2D; - using GearConstraint2DConstRef = ObjectRef; + using GearConstraint2DHandle = ObjectHandle; using GearConstraint2DRef = ObjectRef; class NAZARA_PHYSICS2D_API GearConstraint2D : public Constraint2D @@ -132,8 +123,7 @@ namespace Nz class MotorConstraint2D; - using MotorConstraint2DConstRef = ObjectRef; - using MotorConstraint2DRef = ObjectRef; + using MotorConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API MotorConstraint2D : public Constraint2D { @@ -143,14 +133,11 @@ namespace Nz float GetRate() const; void SetRate(float rate); - - template static MotorConstraint2DRef New(Args&&... args); }; class PinConstraint2D; - using PinConstraint2DConstRef = ObjectRef; - using PinConstraint2DRef = ObjectRef; + using PinConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API PinConstraint2D : public Constraint2D { @@ -165,14 +152,11 @@ namespace Nz void SetDistance(float newDistance); void SetFirstAnchor(const Vector2f& firstAnchor); void SetSecondAnchor(const Vector2f& firstAnchor); - - template static PinConstraint2DRef New(Args&&... args); }; class PivotConstraint2D; - using PivotConstraint2DConstRef = ObjectRef; - using PivotConstraint2DRef = ObjectRef; + using PivotConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API PivotConstraint2D : public Constraint2D { @@ -186,14 +170,11 @@ namespace Nz void SetFirstAnchor(const Vector2f& firstAnchor); void SetSecondAnchor(const Vector2f& firstAnchor); - - template static PivotConstraint2DRef New(Args&&... args); }; class RatchetConstraint2D; - using RatchetConstraint2DConstRef = ObjectRef; - using RatchetConstraint2DRef = ObjectRef; + using RatchetConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API RatchetConstraint2D : public Constraint2D { @@ -208,14 +189,11 @@ namespace Nz void SetAngle(const RadianAnglef& angle); void SetPhase(float phase); void SetRatchet(float ratchet); - - template static RatchetConstraint2DRef New(Args&&... args); }; class RotaryLimitConstraint2D; - using RotaryLimitConstraint2DConstRef = ObjectRef; - using RotaryLimitConstraint2DRef = ObjectRef; + using RotaryLimitConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API RotaryLimitConstraint2D : public Constraint2D { @@ -228,14 +206,11 @@ namespace Nz void SetMaxAngle(const RadianAnglef& maxAngle); void SetMinAngle(const RadianAnglef& minAngle); - - template static RotaryLimitConstraint2DRef New(Args&&... args); }; class SlideConstraint2D; - using SlideConstraint2DConstRef = ObjectRef; - using SlideConstraint2DRef = ObjectRef; + using SlideConstraint2DHandle = ObjectHandle; class NAZARA_PHYSICS2D_API SlideConstraint2D : public Constraint2D { @@ -252,8 +227,6 @@ namespace Nz void SetMaxDistance(float newMaxDistance); void SetMinDistance(float newMinDistance); void SetSecondAnchor(const Vector2f& firstAnchor); - - template static SlideConstraint2DRef New(Args&&... args); }; } diff --git a/include/Nazara/Physics2D/Constraint2D.inl b/include/Nazara/Physics2D/Constraint2D.inl index 9bdb1d3ad..2ed7744f3 100644 --- a/include/Nazara/Physics2D/Constraint2D.inl +++ b/include/Nazara/Physics2D/Constraint2D.inl @@ -8,86 +8,6 @@ namespace Nz { - template - DampedSpringConstraint2DRef DampedSpringConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new DampedSpringConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - DampedRotarySpringConstraint2DRef DampedRotarySpringConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new DampedRotarySpringConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - GearConstraint2DRef GearConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new GearConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - MotorConstraint2DRef MotorConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new MotorConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - PinConstraint2DRef PinConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new PinConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - PivotConstraint2DRef PivotConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new PivotConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - RatchetConstraint2DRef RatchetConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new RatchetConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - RotaryLimitConstraint2DRef RotaryLimitConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new RotaryLimitConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - SlideConstraint2DRef SlideConstraint2D::New(Args&&... args) - { - std::unique_ptr object(new SlideConstraint2D(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } } #include From be8e89b2285843ae327634744b0aeb8d0021b575 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 10 Dec 2019 09:49:40 +0100 Subject: [PATCH 125/192] Math: Remove all Set(class) methods --- ChangeLog.md | 1 + SDK/include/NDK/LuaAPI.inl | 4 +-- SDK/src/NDK/Lua/LuaBinding_Math.cpp | 4 +-- include/Nazara/Math/Box.hpp | 1 - include/Nazara/Math/Box.inl | 15 ---------- include/Nazara/Math/EulerAngles.hpp | 1 - include/Nazara/Math/EulerAngles.inl | 14 ---------- include/Nazara/Math/Frustum.hpp | 1 - include/Nazara/Math/Frustum.inl | 15 ---------- include/Nazara/Math/Matrix4.hpp | 2 -- include/Nazara/Math/Matrix4.inl | 42 +++++----------------------- include/Nazara/Math/OrientedBox.hpp | 1 - include/Nazara/Math/OrientedBox.inl | 15 ---------- include/Nazara/Math/Plane.hpp | 1 - include/Nazara/Math/Plane.inl | 15 ---------- include/Nazara/Math/Quaternion.hpp | 1 - include/Nazara/Math/Quaternion.inl | 15 ---------- include/Nazara/Math/Ray.hpp | 1 - include/Nazara/Math/Ray.inl | 15 ---------- include/Nazara/Math/Rect.hpp | 1 - include/Nazara/Math/Rect.inl | 15 ---------- include/Nazara/Math/Sphere.hpp | 1 - include/Nazara/Math/Sphere.inl | 15 ---------- include/Nazara/Math/Vector2.hpp | 1 - include/Nazara/Math/Vector2.inl | 18 ++---------- include/Nazara/Math/Vector3.hpp | 1 - include/Nazara/Math/Vector3.inl | 14 ---------- include/Nazara/Math/Vector4.hpp | 1 - include/Nazara/Math/Vector4.inl | 20 +++---------- src/Nazara/Physics3D/RigidBody3D.cpp | 2 +- 30 files changed, 19 insertions(+), 234 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index b2f87f16a..5a7a81ea1 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -201,6 +201,7 @@ Nazara Engine: - Add Flags::Clear() helper method, to reset flags - Add Flags::Set(Flags) helper method, to enable flags - ⚠ Constraint2D are no longer managed by references and are now handled objects +- ⚠ Removed all Set methods from math classes taking their own type (e.g. Box::Set(Box)) Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/include/NDK/LuaAPI.inl b/SDK/include/NDK/LuaAPI.inl index e2b1095dc..01c797e89 100644 --- a/SDK/include/NDK/LuaAPI.inl +++ b/SDK/include/NDK/LuaAPI.inl @@ -125,14 +125,14 @@ namespace Nz state.Pop(); } - mat->Set(values); + *mat = Matrix4d(values); return 1; } default: { if (state.IsOfType(index, "Matrix4")) - mat->Set(*static_cast(state.ToUserdata(index))); + *mat = *static_cast(state.ToUserdata(index)); return 1; } diff --git a/SDK/src/NDK/Lua/LuaBinding_Math.cpp b/SDK/src/NDK/Lua/LuaBinding_Math.cpp index c218c2a66..15deebfab 100644 --- a/SDK/src/NDK/Lua/LuaBinding_Math.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_Math.cpp @@ -282,7 +282,7 @@ namespace Ndk { case 1: if (lua.IsOfType(argIndex, "Matrix4")) - instance.Set(*static_cast(lua.ToUserdata(argIndex))); + instance = *static_cast(lua.ToUserdata(argIndex)); break; case 16: @@ -291,7 +291,7 @@ namespace Ndk for (std::size_t i = 0; i < 16; ++i) values[i] = lua.CheckNumber(argIndex++); - instance.Set(values); + instance = Nz::Matrix4d(values); return 0; } diff --git a/include/Nazara/Math/Box.hpp b/include/Nazara/Math/Box.hpp index 555e10130..e9e57c8f0 100644 --- a/include/Nazara/Math/Box.hpp +++ b/include/Nazara/Math/Box.hpp @@ -63,7 +63,6 @@ namespace Nz Box& Set(T Width, T Height, T Depth); Box& Set(T X, T Y, T Z, T Width, T Height, T Depth); Box& Set(const T box[6]); - Box& Set(const Box& box); Box& Set(const Rect& rect); Box& Set(const Vector3& lengths); Box& Set(const Vector3& vec1, const Vector3& vec2); diff --git a/include/Nazara/Math/Box.inl b/include/Nazara/Math/Box.inl index 6b0ed9112..6055b3444 100644 --- a/include/Nazara/Math/Box.inl +++ b/include/Nazara/Math/Box.inl @@ -585,21 +585,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the box with components from another - * \return A reference to this box - * - * \param box The other box - */ - - template - Box& Box::Set(const Box& box) - { - std::memcpy(this, &box, sizeof(Box)); - - return *this; - } - /*! * \brief Sets the components of the box with components from a Rect * \return A reference to this box diff --git a/include/Nazara/Math/EulerAngles.hpp b/include/Nazara/Math/EulerAngles.hpp index 0079d2f6a..503a0fb94 100644 --- a/include/Nazara/Math/EulerAngles.hpp +++ b/include/Nazara/Math/EulerAngles.hpp @@ -37,7 +37,6 @@ namespace Nz EulerAngles& Set(T P, T Y, T R); EulerAngles& Set(const T angles[3]); template EulerAngles& Set(const Angle& angles); - EulerAngles& Set(const EulerAngles& angles); //EulerAngles& Set(const Matrix3& mat); EulerAngles& Set(const Quaternion& quat); template EulerAngles& Set(const EulerAngles& angles); diff --git a/include/Nazara/Math/EulerAngles.inl b/include/Nazara/Math/EulerAngles.inl index 52c2e4b41..00f78bf27 100644 --- a/include/Nazara/Math/EulerAngles.inl +++ b/include/Nazara/Math/EulerAngles.inl @@ -169,20 +169,6 @@ namespace Nz return Set(angle.ToEulerAngles()); } - /*! - * \brief Sets the components of the euler angle from another euler angle - * \return A reference to this euler angle - * - * \param angles The other euler angle - */ - template - EulerAngles& EulerAngles::Set(const EulerAngles& angles) - { - std::memcpy(this, &angles, sizeof(EulerAngles)); - - return *this; - } - /*! * \brief Sets the components of the euler angle from a quaternion * \return A reference to this euler angle diff --git a/include/Nazara/Math/Frustum.hpp b/include/Nazara/Math/Frustum.hpp index 042d55cee..f1b37811a 100644 --- a/include/Nazara/Math/Frustum.hpp +++ b/include/Nazara/Math/Frustum.hpp @@ -52,7 +52,6 @@ namespace Nz Frustum& operator=(const Frustum& other) = default; - Frustum& Set(const Frustum& frustum); template Frustum& Set(const Frustum& frustum); String ToString() const; diff --git a/include/Nazara/Math/Frustum.inl b/include/Nazara/Math/Frustum.inl index 6d6d38500..36a13a316 100644 --- a/include/Nazara/Math/Frustum.inl +++ b/include/Nazara/Math/Frustum.inl @@ -623,21 +623,6 @@ namespace Nz return (c == 6) ? IntersectionSide_Inside : IntersectionSide_Intersecting; } - /*! - * \brief Sets the components of the frustum from another frustum - * \return A reference to this frustum - * - * \param frustum The other frustum - */ - - template - Frustum& Frustum::Set(const Frustum& frustum) - { - std::memcpy(this, &frustum, sizeof(Frustum)); - - return *this; - } - /*! * \brief Sets the components of the frustum from another type of Frustum * \return A reference to this frustum diff --git a/include/Nazara/Math/Matrix4.hpp b/include/Nazara/Math/Matrix4.hpp index cb8667036..5a0e1808f 100644 --- a/include/Nazara/Math/Matrix4.hpp +++ b/include/Nazara/Math/Matrix4.hpp @@ -82,9 +82,7 @@ namespace Nz T r21, T r22, T r23, T r24, T r31, T r32, T r33, T r34, T r41, T r42, T r43, T r44); - Matrix4& Set(const T matrix[16]); //Matrix4(const Matrix3& matrix); - Matrix4& Set(const Matrix4& matrix); template Matrix4& Set(const Matrix4& matrix); Matrix4& SetRotation(const Quaternion& rotation); Matrix4& SetScale(const Vector3& scale); diff --git a/include/Nazara/Math/Matrix4.inl b/include/Nazara/Math/Matrix4.inl index 297edf8a8..48d99f21e 100644 --- a/include/Nazara/Math/Matrix4.inl +++ b/include/Nazara/Math/Matrix4.inl @@ -55,9 +55,12 @@ namespace Nz */ template - Matrix4::Matrix4(const T matrix[16]) + Matrix4::Matrix4(const T matrix[16]) : + Matrix4(matrix[ 0], matrix[ 1], matrix[ 2], matrix[ 3], + matrix[ 4], matrix[ 5], matrix[ 6], matrix[ 7], + matrix[ 8], matrix[ 9], matrix[10], matrix[11], + matrix[12], matrix[13], matrix[14], matrix[15]) { - Set(matrix); } /*! @@ -448,7 +451,7 @@ namespace Nz for (unsigned int i = 0; i < 16; ++i) inv[i] *= invDet; - dest->Set(inv); + *dest = inv; return true; } else @@ -550,7 +553,7 @@ namespace Nz inv[15] = F(1.0); - dest->Set(inv); + *dest = inv; return true; } else @@ -1097,37 +1100,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the matrix from an array of sixteen elements - * \return A reference to this matrix - * - * \param matrix[16] Matrix components - */ - - template - Matrix4& Matrix4::Set(const T matrix[16]) - { - // Here we are confident of the continuity of memory elements - std::memcpy(&m11, matrix, 16 * sizeof(T)); - - return *this; - } - - /*! - * \brief Sets the components of the matrix from another matrix - * \return A reference to this matrix - * - * \param matrix The other matrix - */ - - template - Matrix4& Matrix4::Set(const Matrix4& matrix) - { - std::memcpy(this, &matrix, sizeof(Matrix4)); - - return *this; - } - /*! * \brief Sets the components of the matrix from another type of Matrix4 * \return A reference to this matrix diff --git a/include/Nazara/Math/OrientedBox.hpp b/include/Nazara/Math/OrientedBox.hpp index ab136a530..dbc1820c5 100644 --- a/include/Nazara/Math/OrientedBox.hpp +++ b/include/Nazara/Math/OrientedBox.hpp @@ -36,7 +36,6 @@ namespace Nz OrientedBox& Set(T X, T Y, T Z, T Width, T Height, T Depth); OrientedBox& Set(const Box& box); - OrientedBox& Set(const OrientedBox& orientedBox); OrientedBox& Set(const Vector3& vec1, const Vector3& vec2); template OrientedBox& Set(const OrientedBox& orientedBox); diff --git a/include/Nazara/Math/OrientedBox.inl b/include/Nazara/Math/OrientedBox.inl index df864fe26..7e561eb41 100644 --- a/include/Nazara/Math/OrientedBox.inl +++ b/include/Nazara/Math/OrientedBox.inl @@ -164,21 +164,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the oriented box with components from another - * \return A reference to this oriented box - * - * \param orientedBox The other OrientedBox - */ - - template - OrientedBox& OrientedBox::Set(const OrientedBox& orientedBox) - { - std::memcpy(this, &orientedBox, sizeof(OrientedBox)); - - return *this; - } - /*! * \brief Sets a OrientedBox object from two vectors representing point of the space * (X, Y, Z) will be the components minimum of the two vectors and the (width, height, depth) will be the components maximum - minimum diff --git a/include/Nazara/Math/Plane.hpp b/include/Nazara/Math/Plane.hpp index d5384b3fe..0f0dbd5f0 100644 --- a/include/Nazara/Math/Plane.hpp +++ b/include/Nazara/Math/Plane.hpp @@ -37,7 +37,6 @@ namespace Nz Plane& Set(T normalX, T normalY, T normalZ, T Distance); Plane& Set(const T plane[4]); - Plane& Set(const Plane& plane); Plane& Set(const Vector3& Normal, T Distance); Plane& Set(const Vector3& Normal, const Vector3& point); Plane& Set(const Vector3& point1, const Vector3& point2, const Vector3& point3); diff --git a/include/Nazara/Math/Plane.inl b/include/Nazara/Math/Plane.inl index 4c2adc90c..7430b4dca 100644 --- a/include/Nazara/Math/Plane.inl +++ b/include/Nazara/Math/Plane.inl @@ -212,21 +212,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the plane from another plane - * \return A reference to this plane - * - * \param plane The other plane - */ - - template - Plane& Plane::Set(const Plane& plane) - { - std::memcpy(this, &plane, sizeof(Plane)); - - return *this; - } - /*! * \brief Sets the components of the plane from a normal and a distance * \return A reference to this plane diff --git a/include/Nazara/Math/Quaternion.hpp b/include/Nazara/Math/Quaternion.hpp index 16e88b8ef..991b23b94 100644 --- a/include/Nazara/Math/Quaternion.hpp +++ b/include/Nazara/Math/Quaternion.hpp @@ -56,7 +56,6 @@ namespace Nz Quaternion& Set(T angle, const Vector3& normalizedAxis); Quaternion& Set(const T quat[4]); //Quaternion& Set(const Matrix3& mat); - Quaternion& Set(const Quaternion& quat); template Quaternion& Set(const Quaternion& quat); T SquaredMagnitude() const; diff --git a/include/Nazara/Math/Quaternion.inl b/include/Nazara/Math/Quaternion.inl index f253d7d6b..6d8937566 100644 --- a/include/Nazara/Math/Quaternion.inl +++ b/include/Nazara/Math/Quaternion.inl @@ -430,21 +430,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the quaternion from another quaternion - * \return A reference to this quaternion - * - * \param quat The other quaternion - */ - - template - Quaternion& Quaternion::Set(const Quaternion& quat) - { - std::memcpy(this, &quat, sizeof(Quaternion)); - - return *this; - } - /*! * \brief Sets the components of the quaternion from another type of Quaternion * \return A reference to this quaternion diff --git a/include/Nazara/Math/Ray.hpp b/include/Nazara/Math/Ray.hpp index 677bf50b9..8429e7dc8 100644 --- a/include/Nazara/Math/Ray.hpp +++ b/include/Nazara/Math/Ray.hpp @@ -54,7 +54,6 @@ namespace Nz Ray& Set(const Vector3& origin, const Vector3& direction); Ray& Set(const T origin[3], const T direction[3]); Ray& Set(const Plane& planeOne, const Plane& planeTwo); - Ray& Set(const Ray& ray); template Ray& Set(const Ray& ray); template Ray& Set(const Vector3& origin, const Vector3& direction); diff --git a/include/Nazara/Math/Ray.inl b/include/Nazara/Math/Ray.inl index 673dca796..f2248baca 100644 --- a/include/Nazara/Math/Ray.inl +++ b/include/Nazara/Math/Ray.inl @@ -593,21 +593,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the ray with components from another - * \return A reference to this ray - * - * \param ray The other ray - */ - - template - Ray& Ray::Set(const Ray& ray) - { - std::memcpy(this, &ray, sizeof(Ray)); - - return *this; - } - /*! * \brief Sets the components of the ray from another type of Ray * \return A reference to this ray diff --git a/include/Nazara/Math/Rect.hpp b/include/Nazara/Math/Rect.hpp index db7ee15f0..edad69493 100644 --- a/include/Nazara/Math/Rect.hpp +++ b/include/Nazara/Math/Rect.hpp @@ -55,7 +55,6 @@ namespace Nz Rect& Set(T Width, T Height); Rect& Set(T X, T Y, T Width, T Height); Rect& Set(const T rect[4]); - Rect& Set(const Rect& rect); Rect& Set(const Vector2& lengths); Rect& Set(const Vector2& vec1, const Vector2& vec2); template Rect& Set(const Rect& rect); diff --git a/include/Nazara/Math/Rect.inl b/include/Nazara/Math/Rect.inl index 93b6e6d79..20181a763 100644 --- a/include/Nazara/Math/Rect.inl +++ b/include/Nazara/Math/Rect.inl @@ -475,21 +475,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the rectangle with components from another - * \return A reference to this rectangle - * - * \param rect The other Rect - */ - - template - Rect& Rect::Set(const Rect& rect) - { - std::memcpy(this, &rect, sizeof(Rect)); - - return *this; - } - /*! * \brief Sets the components of the rectange from a vector representing width and height * \return A reference to this rectangle diff --git a/include/Nazara/Math/Sphere.hpp b/include/Nazara/Math/Sphere.hpp index 0c9880287..762a276dc 100644 --- a/include/Nazara/Math/Sphere.hpp +++ b/include/Nazara/Math/Sphere.hpp @@ -53,7 +53,6 @@ namespace Nz Sphere& Set(T X, T Y, T Z, T Radius); //Sphere& Set(const Circle& rect); - Sphere& Set(const Sphere& sphere); Sphere& Set(const Vector3& center, T Radius); Sphere& Set(const T sphere[4]); template Sphere& Set(const Sphere& sphere); diff --git a/include/Nazara/Math/Sphere.inl b/include/Nazara/Math/Sphere.inl index 643fcee82..c9ac33414 100644 --- a/include/Nazara/Math/Sphere.inl +++ b/include/Nazara/Math/Sphere.inl @@ -397,21 +397,6 @@ namespace Nz } */ - /*! - * \brief Sets the components of the sphere with center and radius from another - * \return A reference to this sphere - * - * \param sphere The other sphere - */ - - template - Sphere& Sphere::Set(const Sphere& sphere) - { - std::memcpy(this, &sphere, sizeof(Sphere)); - - return *this; - } - /*! * \brief Sets the components of the sphere from an array of four elements * \return A reference to this sphere diff --git a/include/Nazara/Math/Vector2.hpp b/include/Nazara/Math/Vector2.hpp index d8a53eb47..fa41597a1 100644 --- a/include/Nazara/Math/Vector2.hpp +++ b/include/Nazara/Math/Vector2.hpp @@ -55,7 +55,6 @@ namespace Nz Vector2& Set(T X, T Y); Vector2& Set(T scale); Vector2& Set(const T vec[2]); - Vector2& Set(const Vector2& vec); Vector2& Set(const Vector3& vec); Vector2& Set(const Vector4& vec); template Vector2& Set(const Vector2& vec); diff --git a/include/Nazara/Math/Vector2.inl b/include/Nazara/Math/Vector2.inl index 15739b024..d1724f838 100644 --- a/include/Nazara/Math/Vector2.inl +++ b/include/Nazara/Math/Vector2.inl @@ -367,22 +367,8 @@ namespace Nz template Vector2& Vector2::Set(const T vec[2]) { - std::memcpy(&x, vec, 2*sizeof(T)); - - return *this; - } - - /*! - * \brief Sets the components of the vector from another vector - * \return A reference to this vector - * - * \param vec The other vector - */ - - template - Vector2& Vector2::Set(const Vector2& vec) - { - std::memcpy(this, &vec, sizeof(Vector2)); + x = vec[0]; + y = vec[1]; return *this; } diff --git a/include/Nazara/Math/Vector3.hpp b/include/Nazara/Math/Vector3.hpp index b46f2e40b..99e3696df 100644 --- a/include/Nazara/Math/Vector3.hpp +++ b/include/Nazara/Math/Vector3.hpp @@ -67,7 +67,6 @@ namespace Nz Vector3& Set(T scale); Vector3& Set(const T vec[3]); Vector3& Set(const Vector2& vec, T Z = 0.0); - Vector3& Set(const Vector3& vec); template Vector3& Set(const Vector3& vec); Vector3& Set(const Vector4& vec); diff --git a/include/Nazara/Math/Vector3.inl b/include/Nazara/Math/Vector3.inl index 5a77c8e05..1dcf48fe7 100644 --- a/include/Nazara/Math/Vector3.inl +++ b/include/Nazara/Math/Vector3.inl @@ -523,20 +523,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the vector from another vector - * \return A reference to this vector - * - * \param vec The other vector - */ - template - Vector3& Vector3::Set(const Vector3& vec) - { - std::memcpy(this, &vec, sizeof(Vector3)); - - return *this; - } - /*! * \brief Sets the components of the vector from another type of Vector3 * \return A reference to this vector diff --git a/include/Nazara/Math/Vector4.hpp b/include/Nazara/Math/Vector4.hpp index 7a34a6d11..2938df3bb 100644 --- a/include/Nazara/Math/Vector4.hpp +++ b/include/Nazara/Math/Vector4.hpp @@ -57,7 +57,6 @@ namespace Nz Vector4& Set(const T vec[4]); Vector4& Set(const Vector2& vec, T Z = 0.0, T W = 1.0); Vector4& Set(const Vector3& vec, T W = 1.0); - Vector4& Set(const Vector4& vec); template Vector4& Set(const Vector4& vec); String ToString() const; diff --git a/include/Nazara/Math/Vector4.inl b/include/Nazara/Math/Vector4.inl index 8c602d214..6deadf5f5 100644 --- a/include/Nazara/Math/Vector4.inl +++ b/include/Nazara/Math/Vector4.inl @@ -417,7 +417,10 @@ namespace Nz template Vector4& Vector4::Set(const T vec[4]) { - std::memcpy(&x, vec, 4*sizeof(T)); + x = vec[0]; + y = vec[1]; + z = vec[2]; + w = vec[3]; return *this; } @@ -459,21 +462,6 @@ namespace Nz return *this; } - /*! - * \brief Sets the components of the vector from another vector - * \return A reference to this vector - * - * \param vec The other vector - */ - - template - Vector4& Vector4::Set(const Vector4& vec) - { - std::memcpy(this, &vec, sizeof(Vector4)); - - return *this; - } - /*! * \brief Sets the components of the vector from another type of Vector4 * \return A reference to this vector diff --git a/src/Nazara/Physics3D/RigidBody3D.cpp b/src/Nazara/Physics3D/RigidBody3D.cpp index ea6e58621..c18055f56 100644 --- a/src/Nazara/Physics3D/RigidBody3D.cpp +++ b/src/Nazara/Physics3D/RigidBody3D.cpp @@ -444,6 +444,6 @@ namespace Nz NazaraUnused(threadIndex); RigidBody3D* me = static_cast(NewtonBodyGetUserData(body)); - me->m_matrix.Set(matrix); + me->m_matrix = matrix; } } From bcc10a1ee29e0767745979e03b913574b4eda769 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 10 Dec 2019 09:49:52 +0100 Subject: [PATCH 126/192] Math/Matrix4: Add Decompose --- ChangeLog.md | 1 + include/Nazara/Math/Matrix4.hpp | 2 ++ include/Nazara/Math/Matrix4.inl | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 5a7a81ea1..fe438cc97 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -202,6 +202,7 @@ Nazara Engine: - Add Flags::Set(Flags) helper method, to enable flags - ⚠ Constraint2D are no longer managed by references and are now handled objects - ⚠ Removed all Set methods from math classes taking their own type (e.g. Box::Set(Box)) +- Added Matrix4::Decompose Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Math/Matrix4.hpp b/include/Nazara/Math/Matrix4.hpp index 5a0e1808f..3ed2cd717 100644 --- a/include/Nazara/Math/Matrix4.hpp +++ b/include/Nazara/Math/Matrix4.hpp @@ -44,6 +44,8 @@ namespace Nz Matrix4& Concatenate(const Matrix4& matrix); Matrix4& ConcatenateAffine(const Matrix4& matrix); + void Decompose(Vector3& translation, Quaternion& rotation, Vector3& scale); + Vector4 GetColumn(unsigned int column) const; T GetDeterminant() const; T GetDeterminantAffine() const; diff --git a/include/Nazara/Math/Matrix4.inl b/include/Nazara/Math/Matrix4.inl index 48d99f21e..1f2f58a17 100644 --- a/include/Nazara/Math/Matrix4.inl +++ b/include/Nazara/Math/Matrix4.inl @@ -220,6 +220,25 @@ namespace Nz F(1.0)); } + template + void Matrix4::Decompose(Vector3& translation, Quaternion& rotation, Vector3& scale) + { + Matrix4f localMat(*this); + + translation = localMat.GetTranslation(); + scale = localMat.GetScale(); + + Vector3 invScale; + invScale.x = T(1) / scale.x; + invScale.y = T(1) / scale.y; + invScale.z = T(1) / scale.z; + + localMat.ApplyScale(invScale); + + rotation = localMat.GetRotation(); + } + + /*! * \brief Gets the ith column of the matrix * \return Vector4 which is the transformation of this axis From 1dbe71474d7ae41c44a92f5a93bc32d2abd20993 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 12 Dec 2019 09:56:43 +0100 Subject: [PATCH 127/192] Utility/Node: Get[Position|Rotation|Scale) now defaults to local space --- ChangeLog.md | 1 + SDK/include/NDK/Canvas.inl | 2 +- SDK/src/NDK/BaseWidget.cpp | 2 +- include/Nazara/Utility/Node.hpp | 6 +++--- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index fe438cc97..e123b59cb 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -203,6 +203,7 @@ Nazara Engine: - ⚠ Constraint2D are no longer managed by references and are now handled objects - ⚠ Removed all Set methods from math classes taking their own type (e.g. Box::Set(Box)) - Added Matrix4::Decompose +- ⚠ Node::Get[Position|Rotation|Scale] now defaults to local space Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/include/NDK/Canvas.inl b/SDK/include/NDK/Canvas.inl index 75b642328..0e1cb38f5 100644 --- a/SDK/include/NDK/Canvas.inl +++ b/SDK/include/NDK/Canvas.inl @@ -59,7 +59,7 @@ namespace Ndk { WidgetEntry& entry = m_widgetEntries[index]; - Nz::Vector3f pos = entry.widget->GetPosition(); + Nz::Vector3f pos = entry.widget->GetPosition(Nz::CoordSys_Global); Nz::Vector2f size = entry.widget->GetSize(); entry.box.Set(pos.x, pos.y, pos.z, size.x, size.y, 1.f); diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index be7049938..c887f9402 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -336,7 +336,7 @@ namespace Ndk if (IsRegisteredToCanvas()) m_canvas->NotifyWidgetBoxUpdate(m_canvasIndex); - Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition()); + Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition(Nz::CoordSys_Global)); Nz::Vector2f widgetSize = GetSize(); Nz::Rectf widgetRect(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y); diff --git a/include/Nazara/Utility/Node.hpp b/include/Nazara/Utility/Node.hpp index 6065d1e04..e4cb3cfb2 100644 --- a/include/Nazara/Utility/Node.hpp +++ b/include/Nazara/Utility/Node.hpp @@ -41,10 +41,10 @@ namespace Nz virtual Vector3f GetLeft() const; virtual NodeType GetNodeType() const; const Node* GetParent() const; - Vector3f GetPosition(CoordSys coordSys = CoordSys_Global) const; + Vector3f GetPosition(CoordSys coordSys = CoordSys_Local) const; virtual Vector3f GetRight() const; - Quaternionf GetRotation(CoordSys coordSys = CoordSys_Global) const; - Vector3f GetScale(CoordSys coordSys = CoordSys_Global) const; + Quaternionf GetRotation(CoordSys coordSys = CoordSys_Local) const; + Vector3f GetScale(CoordSys coordSys = CoordSys_Local) const; const Matrix4f& GetTransformMatrix() const; virtual Vector3f GetUp() const; From 0cedd108a11ab470e31690c20edd7cf9e71c9327 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 12 Dec 2019 09:57:01 +0100 Subject: [PATCH 128/192] Add ReleaseWithDebug --- build/config.lua | 2 +- build/scripts/common.lua | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build/config.lua b/build/config.lua index 571bf6dc9..16bf08d33 100644 --- a/build/config.lua +++ b/build/config.lua @@ -11,7 +11,7 @@ BuildDependencies = true BuildExamples = true -- Setup configurations array (valid values: Debug, Release, ReleaseWithDebug) -Configurations = "Debug,Release" -- "Debug,Release,ReleaseWithDebug" +Configurations = "Debug,Release,ReleaseWithDebug" -- "Debug,Release,ReleaseWithDebug" -- Setup additionnals install directories, separated by a semi-colon ; (library binaries will be copied there) --InstallDir = "/usr/local/lib64" diff --git a/build/scripts/common.lua b/build/scripts/common.lua index 4270fb6dd..7ca78b9af 100644 --- a/build/scripts/common.lua +++ b/build/scripts/common.lua @@ -839,6 +839,7 @@ function NazaraBuild:PrepareGeneric() targetsuffix("-d") filter("configurations:*Debug*") + optimize("Debug") symbols("On") filter("configurations:not *Debug*") From c10b0c22ed87b4ecde68151da40e6cbe97389ef2 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 12 Dec 2019 09:58:37 +0100 Subject: [PATCH 129/192] Update ChangeLog.md --- ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog.md b/ChangeLog.md index e123b59cb..f00da9c5f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -20,6 +20,7 @@ Miscellaneous: - Fixed .dll copy when building Nazara occuring on Linux when targeting Windows (MinGW) - ⚠ Appveyor nightlies are now compiled with VS2017 - Set libraries' rpath to current folder (.) +- Add ReleaseWithDebug target Nazara Engine: - VertexMapper:GetComponentPtr no longer throw an error if component is disabled or incompatible with template type, instead a null pointer is returned. From 3760c8b5c4c22ec04266daededa0560d4c8a9349 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 13 Dec 2019 17:23:01 +0100 Subject: [PATCH 130/192] Utility/Node: Fix negative scaling not affecting rotation --- ChangeLog.md | 1 + include/Nazara/Utility/Node.hpp | 2 ++ src/Nazara/Utility/Node.cpp | 35 +++++++++++++++++++++++++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f00da9c5f..00f8b937a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -205,6 +205,7 @@ Nazara Engine: - ⚠ Removed all Set methods from math classes taking their own type (e.g. Box::Set(Box)) - Added Matrix4::Decompose - ⚠ Node::Get[Position|Rotation|Scale] now defaults to local space +- Fixed Node rotation when using a negative scale Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Utility/Node.hpp b/include/Nazara/Utility/Node.hpp index e4cb3cfb2..da36997ec 100644 --- a/include/Nazara/Utility/Node.hpp +++ b/include/Nazara/Utility/Node.hpp @@ -105,6 +105,8 @@ namespace Nz virtual void UpdateDerived() const; virtual void UpdateTransformMatrix() const; + static Quaternionf ScaleQuaternion(const Vector3f& scale, Quaternionf quaternion); + mutable std::vector m_childs; mutable Matrix4f m_transformMatrix; mutable Quaternionf m_derivedRotation; diff --git a/src/Nazara/Utility/Node.cpp b/src/Nazara/Utility/Node.cpp index 2832df42d..c14c81d13 100644 --- a/src/Nazara/Utility/Node.cpp +++ b/src/Nazara/Utility/Node.cpp @@ -574,7 +574,7 @@ namespace Nz if (!m_derivedUpdated) UpdateDerived(); - return m_derivedPosition + (m_derivedScale * (m_derivedRotation * localPosition)); + return m_derivedPosition + (m_derivedScale * (ScaleQuaternion(m_derivedScale, m_derivedRotation) * localPosition)); } Quaternionf Node::ToGlobalRotation(const Quaternionf& localRotation) const @@ -582,7 +582,7 @@ namespace Nz if (!m_derivedUpdated) UpdateDerived(); - return m_derivedRotation * localRotation; + return ScaleQuaternion(m_derivedScale, m_derivedRotation) * localRotation; } Vector3f Node::ToGlobalScale(const Vector3f& localScale) const @@ -598,7 +598,7 @@ namespace Nz if (!m_derivedUpdated) UpdateDerived(); - return (m_derivedRotation.GetConjugate()*(globalPosition - m_derivedPosition))/m_derivedScale; + return (m_derivedScale, m_derivedRotation.GetConjugate()*(globalPosition - m_derivedPosition))/m_derivedScale; } Quaternionf Node::ToLocalRotation(const Quaternionf& globalRotation) const @@ -688,7 +688,11 @@ namespace Nz if (m_inheritRotation) { - m_derivedRotation = m_parent->m_derivedRotation * m_initialRotation * m_rotation; + Quaternionf rotation = m_initialRotation * m_rotation; + if (m_inheritScale) + rotation = ScaleQuaternion(m_parent->m_derivedScale, rotation); + + m_derivedRotation = m_parent->m_derivedRotation * rotation; m_derivedRotation.Normalize(); } else @@ -716,4 +720,27 @@ namespace Nz m_transformMatrix.MakeTransform(m_derivedPosition, m_derivedRotation, m_derivedScale); m_transformMatrixUpdated = true; } + + Quaternionf Node::ScaleQuaternion(const Vector3f& scale, Quaternionf quaternion) + { + if (std::signbit(scale.x)) + { + quaternion.z = -quaternion.z; + quaternion.y = -quaternion.y; + } + + if (std::signbit(scale.y)) + { + quaternion.x = -quaternion.x; + quaternion.z = -quaternion.z; + } + + if (std::signbit(scale.z)) + { + quaternion.x = -quaternion.x; + quaternion.y = -quaternion.y; + } + + return quaternion; + } } From 7e6dcdf740912d516096e7c74d6993aa1ba6f208 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 13 Dec 2019 17:25:00 +0100 Subject: [PATCH 131/192] Wait wat --- src/Nazara/Utility/Node.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Utility/Node.cpp b/src/Nazara/Utility/Node.cpp index c14c81d13..a302300c6 100644 --- a/src/Nazara/Utility/Node.cpp +++ b/src/Nazara/Utility/Node.cpp @@ -598,7 +598,7 @@ namespace Nz if (!m_derivedUpdated) UpdateDerived(); - return (m_derivedScale, m_derivedRotation.GetConjugate()*(globalPosition - m_derivedPosition))/m_derivedScale; + return m_derivedRotation.GetConjugate()*(globalPosition - m_derivedPosition)/m_derivedScale; } Quaternionf Node::ToLocalRotation(const Quaternionf& globalRotation) const From 437f60dbd4b12cd45ced391561d09cd5b0e780dc Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 15 Dec 2019 11:50:02 +0100 Subject: [PATCH 132/192] NDK/Console: Fix crash on empty history --- ChangeLog.md | 1 + SDK/src/NDK/Console.cpp | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 00f8b937a..60301df41 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -304,6 +304,7 @@ Nazara Development Kit: - Fixed PhysicsComponent2D copy not copying physics attributes - Added Entity::DropComponent which detaches a component without necessarily destroying it - ⚠ ConstraintComponent2D has been reworked to handle entity destruction and remove constraints at will +- Fixed crash when pressing up/down key with no history in the console # 0.4: diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 67f3e69b2..20a004f25 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -81,6 +81,9 @@ namespace Ndk { *ignoreDefaultAction = true; + if (m_commandHistory.empty()) + return; + if (m_historyPosition > 0) m_historyPosition--; @@ -91,6 +94,9 @@ namespace Ndk { *ignoreDefaultAction = true; + if (m_commandHistory.empty()) + return; + if (++m_historyPosition >= m_commandHistory.size()) m_historyPosition = 0; From ec0eed9eff2b958b107afe64b284546086fb93e2 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 15 Dec 2019 15:41:41 +0100 Subject: [PATCH 133/192] Core/HandledObject: Add OnHandledObjectDestruction signal --- ChangeLog.md | 1 + include/Nazara/Core/HandledObject.hpp | 3 +++ include/Nazara/Core/HandledObject.inl | 2 ++ 3 files changed, 6 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 60301df41..1dabe076a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -206,6 +206,7 @@ Nazara Engine: - Added Matrix4::Decompose - ⚠ Node::Get[Position|Rotation|Scale] now defaults to local space - Fixed Node rotation when using a negative scale +- Added HandledObject::OnHandledObjectDestruction signal Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/HandledObject.hpp b/include/Nazara/Core/HandledObject.hpp index 27c8646b3..390a4e612 100644 --- a/include/Nazara/Core/HandledObject.hpp +++ b/include/Nazara/Core/HandledObject.hpp @@ -8,6 +8,7 @@ #define NAZARA_OBJECTHANDLER_HPP #include +#include #include #include @@ -41,6 +42,8 @@ namespace Nz HandledObject& operator=(const HandledObject& object); HandledObject& operator=(HandledObject&& object) noexcept; + NazaraSignal(OnHandledObjectDestruction, HandledObject* /*emitter*/); + protected: void UnregisterAllHandles() noexcept; diff --git a/include/Nazara/Core/HandledObject.inl b/include/Nazara/Core/HandledObject.inl index bc11ec645..ed0115f5b 100644 --- a/include/Nazara/Core/HandledObject.inl +++ b/include/Nazara/Core/HandledObject.inl @@ -105,6 +105,8 @@ namespace Nz { if (m_handleData) { + OnHandledObjectDestruction(this); + m_handleData->object = nullptr; m_handleData.reset(); } From 86fbae554c872f8fd432bf3cb52aa047d7e2c20e Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 15 Dec 2019 15:42:33 +0100 Subject: [PATCH 134/192] Fix broken physics after 0155b1d --- SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 2 +- SDK/src/NDK/Systems/PhysicsSystem3D.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index 891b5b8a3..4b6386c74 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -196,7 +196,7 @@ namespace Ndk auto& node = entity->GetComponent(); Nz::RigidBody2D* physObj = collision.GetStaticBody(); - physObj->SetPosition(Nz::Vector2f(node.GetPosition())); + physObj->SetPosition(Nz::Vector2f(node.GetPosition(Nz::CoordSys_Global))); //physObj->SetRotation(node.GetRotation()); } } diff --git a/SDK/src/NDK/Systems/PhysicsSystem3D.cpp b/SDK/src/NDK/Systems/PhysicsSystem3D.cpp index d0256a416..4e905a64c 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem3D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem3D.cpp @@ -69,8 +69,8 @@ namespace Ndk auto& node = entity->GetComponent(); Nz::RigidBody3D* physObj = collision.GetStaticBody(); - physObj->SetPosition(node.GetPosition()); - physObj->SetRotation(node.GetRotation()); + physObj->SetPosition(node.GetPosition(Nz::CoordSys_Global)); + physObj->SetRotation(node.GetRotation(Nz::CoordSys_Global)); } } From 3b43f571922f01d7d4d88fc3aa5f06c141462b08 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 19 Dec 2019 21:33:56 +0100 Subject: [PATCH 135/192] Added physics function to control sleeping behavior --- ChangeLog.md | 1 + .../NDK/Components/PhysicsComponent2D.hpp | 3 +++ .../NDK/Components/PhysicsComponent2D.inl | 20 +++++++++++++++++++ SDK/include/NDK/Systems/PhysicsSystem2D.hpp | 1 + SDK/include/NDK/Systems/PhysicsSystem2D.inl | 7 +++++++ include/Nazara/Physics2D/PhysWorld2D.hpp | 1 + include/Nazara/Physics2D/RigidBody2D.hpp | 3 +++ src/Nazara/Physics2D/PhysWorld2D.cpp | 8 ++++++++ src/Nazara/Physics2D/RigidBody2D.cpp | 20 +++++++++++++++++++ 9 files changed, 64 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 1dabe076a..50fce9813 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -207,6 +207,7 @@ Nazara Engine: - ⚠ Node::Get[Position|Rotation|Scale] now defaults to local space - Fixed Node rotation when using a negative scale - Added HandledObject::OnHandledObjectDestruction signal +- Added physics function to control sleeping behavior Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index e12d36ebc..3983c26a5 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -40,6 +40,7 @@ namespace Ndk inline void EnableNodeSynchronization(bool nodeSynchronization); + inline void ForceSleep(); inline void ForEachArbiter(const std::function& callback); inline Nz::Rectf GetAABB() const; @@ -83,6 +84,8 @@ namespace Ndk inline void UpdateVelocity(const Nz::Vector2f& gravity, float damping, float deltaTime); + inline void Wakeup(); + static ComponentIndex componentIndex; private: diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index 911751a42..6e0b0b10f 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -137,6 +137,16 @@ namespace Ndk m_entity->Invalidate(); } + /*! + TODO + */ + inline void PhysicsComponent2D::ForceSleep() + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->ForceSleep(); + } + /*! TODO */ @@ -648,6 +658,16 @@ namespace Ndk m_object->UpdateVelocity(gravity, damping, deltaTime); } + /*! + TODO + */ + inline void PhysicsComponent2D::Wakeup() + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->Wakeup(); + } + inline void PhysicsComponent2D::ApplyPhysicsState(Nz::RigidBody2D& rigidBody) const { assert(m_pendingStates.valid); diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp index 35579862a..dd10fcd57 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp @@ -65,6 +65,7 @@ namespace Ndk inline void SetGravity(const Nz::Vector2f& gravity); inline void SetIterationCount(std::size_t iterationCount); inline void SetMaxStepCount(std::size_t maxStepCount); + inline void SetSleepTime(float sleepTime); inline void SetStepSize(float stepSize); inline void UseSpatialHash(float cellSize, std::size_t entityCount); diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.inl b/SDK/include/NDK/Systems/PhysicsSystem2D.inl index b8e7c61a2..64870c092 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.inl +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.inl @@ -2,6 +2,8 @@ // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequisites.hpp +#include + namespace Ndk { inline float PhysicsSystem2D::GetDamping() const @@ -49,6 +51,11 @@ namespace Ndk GetPhysWorld().SetMaxStepCount(maxStepCount); } + inline void PhysicsSystem2D::SetSleepTime(float sleepTime) + { + GetPhysWorld().SetSleepTime(sleepTime); + } + inline void PhysicsSystem2D::SetStepSize(float stepSize) { GetPhysWorld().SetStepSize(stepSize); diff --git a/include/Nazara/Physics2D/PhysWorld2D.hpp b/include/Nazara/Physics2D/PhysWorld2D.hpp index 8d3afe07c..e6521b37a 100644 --- a/include/Nazara/Physics2D/PhysWorld2D.hpp +++ b/include/Nazara/Physics2D/PhysWorld2D.hpp @@ -78,6 +78,7 @@ namespace Nz void SetGravity(const Vector2f& gravity); void SetIterationCount(std::size_t iterationCount); void SetMaxStepCount(std::size_t maxStepCount); + void SetSleepTime(float sleepTime); void SetStepSize(float stepSize); void Step(float timestep); diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index bc40ef9c0..f80c0c8cf 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -46,6 +46,7 @@ namespace Nz void EnableSimulation(bool simulation); void ForEachArbiter(std::function callback); + void ForceSleep(); Rectf GetAABB() const; inline float GetAngularDamping() const; @@ -99,6 +100,8 @@ namespace Nz void UpdateVelocity(const Nz::Vector2f& gravity, float damping, float deltaTime); + void Wakeup(); + RigidBody2D& operator=(const RigidBody2D& object); RigidBody2D& operator=(RigidBody2D&& object); diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp index 6e0c9c22a..0296558ec 100644 --- a/src/Nazara/Physics2D/PhysWorld2D.cpp +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -338,6 +338,14 @@ namespace Nz m_maxStepCount = maxStepCount; } + void PhysWorld2D::SetSleepTime(float sleepTime) + { + if (sleepTime > 0) + cpSpaceSetSleepTimeThreshold(m_handle, cpFloat(sleepTime)); + else + cpSpaceSetSleepTimeThreshold(m_handle, std::numeric_limits::infinity()); + } + void PhysWorld2D::SetStepSize(float stepSize) { m_stepSize = stepSize; diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index e1e98759a..1e3835bdd 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -194,6 +194,15 @@ namespace Nz cpBodyEachArbiter(m_handle, RealCallback, &callback); } + void RigidBody2D::ForceSleep() + { + m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) + { + if (cpBodyGetType(body->GetHandle()) == CP_BODY_TYPE_DYNAMIC) + cpBodySleep(body->GetHandle()); + }); + } + Rectf RigidBody2D::GetAABB() const { if (m_shapes.empty()) @@ -564,6 +573,17 @@ namespace Nz cpBodyUpdateVelocity(m_handle, cpv(gravity.x, gravity.y), damping, deltaTime); } + void RigidBody2D::Wakeup() + { + m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) + { + if (cpBodyGetType(body->GetHandle()) != CP_BODY_TYPE_STATIC) + cpBodyActivate(body->GetHandle()); + else + cpBodyActivateStatic(body->GetHandle(), nullptr); + }); + } + RigidBody2D& RigidBody2D::operator=(const RigidBody2D& object) { RigidBody2D physObj(object); From dba9bb8b473c01210e5973b6bf65e91ca6ab5645 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 22 Dec 2019 17:00:48 +0100 Subject: [PATCH 136/192] Math: Add Rect(u)i64 using --- include/Nazara/Math/Rect.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/Nazara/Math/Rect.hpp b/include/Nazara/Math/Rect.hpp index edad69493..58e6ed677 100644 --- a/include/Nazara/Math/Rect.hpp +++ b/include/Nazara/Math/Rect.hpp @@ -91,7 +91,9 @@ namespace Nz using Recti = Rect; using Rectui = Rect; using Recti32 = Rect; + using Recti64 = Rect; using Rectui32 = Rect; + using Rectui64 = Rect; template bool Serialize(SerializationContext& context, const Rect& rect, TypeTag>); template bool Unserialize(SerializationContext& context, Rect* rect, TypeTag>); From e282b842b4bdf8ca074fbc737828221441107063 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 22 Dec 2019 17:01:05 +0100 Subject: [PATCH 137/192] Add Node::SetScale(Vector2) to prevent a bug --- include/Nazara/Utility/Node.hpp | 1 + src/Nazara/Utility/Node.cpp | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/include/Nazara/Utility/Node.hpp b/include/Nazara/Utility/Node.hpp index da36997ec..df931a7ba 100644 --- a/include/Nazara/Utility/Node.hpp +++ b/include/Nazara/Utility/Node.hpp @@ -75,6 +75,7 @@ namespace Nz void SetPosition(const Vector3f& translation, CoordSys coordSys = CoordSys_Local); void SetPosition(float translationX, float translationY, float translationZ = 0.f, CoordSys coordSys = CoordSys_Local); void SetRotation(const Quaternionf& quat, CoordSys coordSys = CoordSys_Local); + void SetScale(const Vector2f& scale, CoordSys coordSys = CoordSys_Local); void SetScale(const Vector3f& scale, CoordSys coordSys = CoordSys_Local); void SetScale(float scale, CoordSys coordSys = CoordSys_Local); void SetScale(float scaleX, float scaleY, float scaleZ = 1.f, CoordSys coordSys = CoordSys_Local); diff --git a/src/Nazara/Utility/Node.cpp b/src/Nazara/Utility/Node.cpp index a302300c6..e18e81244 100644 --- a/src/Nazara/Utility/Node.cpp +++ b/src/Nazara/Utility/Node.cpp @@ -530,6 +530,12 @@ namespace Nz InvalidateNode(); } + void Node::SetScale(const Vector2f& scale, CoordSys coordSys) + { + // Prevent Z scale at zero (can happen when using SetScale with a Vec2) + SetScale(scale.x, scale.y, 1.f, coordSys); + } + void Node::SetScale(const Vector3f& scale, CoordSys coordSys) { switch (coordSys) From 2a7ffffd841dcb6db3cb920b02a6bd9ce2095fa9 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 22 Dec 2019 17:01:46 +0100 Subject: [PATCH 138/192] Fix warning --- include/Nazara/Utility/RichTextDrawer.inl | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/Nazara/Utility/RichTextDrawer.inl b/include/Nazara/Utility/RichTextDrawer.inl index 7faaf8b90..78dddaeaf 100644 --- a/include/Nazara/Utility/RichTextDrawer.inl +++ b/include/Nazara/Utility/RichTextDrawer.inl @@ -121,8 +121,6 @@ namespace Nz const Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); - unsigned int previousDrawPos = m_drawPos.x; - // Reset cursor m_drawPos.x = 0; m_drawPos.y += sizeInfo.lineHeight; From e6c0f864f348b754d9f9040c9fe7d216d6a24a18 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 22 Dec 2019 22:12:41 +0100 Subject: [PATCH 139/192] Fix reorder warning --- include/Nazara/Physics2D/Collider2D.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Nazara/Physics2D/Collider2D.inl b/include/Nazara/Physics2D/Collider2D.inl index 2142ba47e..d347ee361 100644 --- a/include/Nazara/Physics2D/Collider2D.inl +++ b/include/Nazara/Physics2D/Collider2D.inl @@ -12,10 +12,10 @@ namespace Nz m_categoryMask(0xFFFFFFFF), m_collisionGroup(0), m_collisionMask(0xFFFFFFFF), + m_surfaceVelocity(Vector2f::Zero()), m_trigger(false), m_elasticity(0.f), m_friction(0.f), - m_surfaceVelocity(Vector2f::Zero()), m_collisionId(0) { } From dec857d807ad93e5ba0ccdc0ab921d911543bcc9 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 23 Dec 2019 18:43:21 +0100 Subject: [PATCH 140/192] TextAreaWidget: Fix erase handling with unicode characters --- SDK/src/NDK/Widgets/RichTextAreaWidget.cpp | 4 ++-- SDK/src/NDK/Widgets/TextAreaWidget.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp b/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp index 9e5ffb84d..35abb6e06 100644 --- a/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/RichTextAreaWidget.cpp @@ -72,10 +72,10 @@ namespace Ndk Nz::String newText; if (firstGlyph > blockFirstGlyph) { - std::size_t characterPosition = blockText.GetCharacterPosition(firstGlyph - blockFirstGlyph - 1); + std::size_t characterPosition = blockText.GetCharacterPosition(firstGlyph - blockFirstGlyph); NazaraAssert(characterPosition != Nz::String::npos, "Invalid character position"); - newText.Append(blockText.SubString(0, characterPosition)); + newText.Append(blockText.SubString(0, characterPosition - 1)); } if (lastGlyph < textLength) diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 6860a5139..b3068d0a3 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -74,10 +74,10 @@ namespace Ndk Nz::String newText; if (firstGlyph > 0) { - std::size_t characterPosition = m_text.GetCharacterPosition(firstGlyph - 1); + std::size_t characterPosition = m_text.GetCharacterPosition(firstGlyph); NazaraAssert(characterPosition != Nz::String::npos, "Invalid character position"); - newText.Append(m_text.SubString(0, characterPosition)); + newText.Append(m_text.SubString(0, characterPosition - 1)); } if (lastGlyph < textLength) From f2959641c08769bc46ff3dbe7bf3ce34060cedeb Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 23 Dec 2019 18:44:19 +0100 Subject: [PATCH 141/192] SDK/Console: Fix selection erase --- SDK/src/NDK/Console.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDK/src/NDK/Console.cpp b/SDK/src/NDK/Console.cpp index 20a004f25..e98ad90ec 100644 --- a/SDK/src/NDK/Console.cpp +++ b/SDK/src/NDK/Console.cpp @@ -72,7 +72,7 @@ namespace Ndk m_input->OnTextAreaKeyBackspace.Connect([](const AbstractTextAreaWidget* textArea, bool* ignoreDefaultAction) { - if (textArea->GetGlyphIndex() <= s_inputPrefixSize) + if (textArea->GetGlyphIndex() < s_inputPrefixSize) *ignoreDefaultAction = true; }); From 6920c7c3f7a1126cefc565e2776f4ce81b75b76d Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 23 Dec 2019 19:45:52 +0100 Subject: [PATCH 142/192] Fix skybox background looking like crap --- src/Nazara/Graphics/SkyboxBackground.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Nazara/Graphics/SkyboxBackground.cpp b/src/Nazara/Graphics/SkyboxBackground.cpp index 8d5723ab9..411f3d0c1 100644 --- a/src/Nazara/Graphics/SkyboxBackground.cpp +++ b/src/Nazara/Graphics/SkyboxBackground.cpp @@ -56,8 +56,6 @@ namespace Nz const Nz::RenderTarget* target = viewer->GetTarget(); Nz::Vector2ui targetSize = target->GetSize(); - Matrix4f projectionMatrix = Nz::Matrix4f::Perspective(45.f, float(targetSize.x) / targetSize.y, viewer->GetZNear(), viewer->GetZFar()); - Matrix4f skyboxMatrix(viewer->GetViewMatrix()); skyboxMatrix.SetTranslation(Vector3f::Zero()); @@ -77,7 +75,7 @@ namespace Nz world.SetTranslation(offset); Renderer::SetIndexBuffer(s_indexBuffer); - Renderer::SetMatrix(MatrixType_Projection, projectionMatrix); + Renderer::SetMatrix(MatrixType_Projection, viewer->GetProjectionMatrix()); Renderer::SetMatrix(MatrixType_View, skyboxMatrix); Renderer::SetMatrix(MatrixType_World, world); Renderer::SetRenderStates(s_renderStates); From 0bfe1679c14cdfadf4dc75a8ce248f266ad4f055 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 24 Dec 2019 18:20:33 +0100 Subject: [PATCH 143/192] Fix reorder warning --- SDK/include/NDK/BaseWidget.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDK/include/NDK/BaseWidget.inl b/SDK/include/NDK/BaseWidget.inl index 605220774..edff81436 100644 --- a/SDK/include/NDK/BaseWidget.inl +++ b/SDK/include/NDK/BaseWidget.inl @@ -15,10 +15,10 @@ namespace Ndk m_backgroundColor(Nz::Color(230, 230, 230, 255)), m_renderingRect(-std::numeric_limits::infinity(), -std::numeric_limits::infinity(), std::numeric_limits::infinity(), std::numeric_limits::infinity()), m_cursor(Nz::SystemCursor_Default), - m_size(50.f, 50.f), m_maximumSize(std::numeric_limits::infinity()), m_minimumSize(0.f), m_preferredSize(-1), + m_size(50.f, 50.f), m_widgetParent(nullptr), m_visible(true) { From a69d7a2e896a7b5190ae8d613eaf51f808781331 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 25 Dec 2019 16:26:53 +0100 Subject: [PATCH 144/192] Make String::Number locale-independent --- src/Nazara/Core/String.cpp | 4 ++++ src/Nazara/Renderer/GlslWriter.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Nazara/Core/String.cpp b/src/Nazara/Core/String.cpp index 351b1c91d..438565449 100644 --- a/src/Nazara/Core/String.cpp +++ b/src/Nazara/Core/String.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -5121,6 +5122,7 @@ namespace Nz String String::Number(float number) { std::ostringstream oss; + oss.imbue(std::locale::classic()); oss.precision(NAZARA_CORE_DECIMAL_DIGITS); oss << number; @@ -5137,6 +5139,7 @@ namespace Nz String String::Number(double number) { std::ostringstream oss; + oss.imbue(std::locale::classic()); oss.precision(NAZARA_CORE_DECIMAL_DIGITS); oss << number; @@ -5153,6 +5156,7 @@ namespace Nz String String::Number(long double number) { std::ostringstream oss; + oss.imbue(std::locale::classic()); oss.precision(NAZARA_CORE_DECIMAL_DIGITS); oss << number; diff --git a/src/Nazara/Renderer/GlslWriter.cpp b/src/Nazara/Renderer/GlslWriter.cpp index 06ebc251d..3d023993c 100644 --- a/src/Nazara/Renderer/GlslWriter.cpp +++ b/src/Nazara/Renderer/GlslWriter.cpp @@ -233,19 +233,19 @@ namespace Nz break; case ShaderAst::ExpressionType::Float1: - Append(String::Format("%F", node.values.vec1)); + Append(String::Number(node.values.vec1)); break; case ShaderAst::ExpressionType::Float2: - Append(String::Format("vec2(%F, %F)", node.values.vec2.x, node.values.vec2.y)); + Append("vec2(" + String::Number(node.values.vec2.x) + ", " + String::Number(node.values.vec2.y) + ")"); break; case ShaderAst::ExpressionType::Float3: - Append(String::Format("vec3(%F, %F, %F)", node.values.vec3.x, node.values.vec3.y, node.values.vec3.z)); + Append("vec3(" + String::Number(node.values.vec3.x) + ", " + String::Number(node.values.vec3.y) + ", " + String::Number(node.values.vec3.z) + ")"); break; case ShaderAst::ExpressionType::Float4: - Append(String::Format("vec4(%F, %F, %F, %F)", node.values.vec4.x, node.values.vec4.y, node.values.vec4.z, node.values.vec4.w)); + Append("vec4(" + String::Number(node.values.vec4.x) + ", " + String::Number(node.values.vec4.y) + ", " + String::Number(node.values.vec4.z) + ", " + String::Number(node.values.vec4.z) + ")"); break; default: From 988641b34b68cf9f43565efebad5a2727ace1459 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 25 Dec 2019 16:46:33 +0100 Subject: [PATCH 145/192] Update ChangeLog.md --- ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog.md b/ChangeLog.md index 50fce9813..92f0fa8da 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -208,6 +208,7 @@ Nazara Engine: - Fixed Node rotation when using a negative scale - Added HandledObject::OnHandledObjectDestruction signal - Added physics function to control sleeping behavior +- String::Number is now locale-independent Nazara Development Kit: - Added ImageWidget (#139) From 97418bfe04563a1ab162ba6cff36d0407c6a189b Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 28 Dec 2019 11:43:48 +0100 Subject: [PATCH 146/192] RichText: Add support for outline color/thickness --- .../NDK/Widgets/RichTextAreaWidget.hpp | 4 + .../NDK/Widgets/RichTextAreaWidget.inl | 20 ++++ include/Nazara/Utility/RichTextDrawer.hpp | 16 ++++ include/Nazara/Utility/RichTextDrawer.inl | 94 +++++++++++++++++++ src/Nazara/Utility/RichTextDrawer.cpp | 32 ++++--- 5 files changed, 155 insertions(+), 11 deletions(-) diff --git a/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp b/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp index 943bc2861..74a6d187e 100644 --- a/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp @@ -29,10 +29,14 @@ namespace Ndk inline unsigned int GetCharacterSize() const; inline const Nz::Color& GetTextColor() const; inline Nz::Font* GetTextFont() const; + inline const Nz::Color& GetTextOutlineColor() const; + inline float GetTextOutlineThickness() const; inline void SetCharacterSize(unsigned int characterSize); inline void SetTextColor(const Nz::Color& color); inline void SetTextFont(Nz::FontRef font); + inline void SetTextOutlineColor(const Nz::Color& color); + inline void SetTextOutlineThickness(float thickness); void Write(const Nz::String& text, std::size_t glyphPosition) override; diff --git a/SDK/include/NDK/Widgets/RichTextAreaWidget.inl b/SDK/include/NDK/Widgets/RichTextAreaWidget.inl index 2c31af9e5..9d9e2650c 100644 --- a/SDK/include/NDK/Widgets/RichTextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/RichTextAreaWidget.inl @@ -21,6 +21,16 @@ namespace Ndk return m_drawer.GetDefaultFont(); } + inline const Nz::Color& RichTextAreaWidget::GetTextOutlineColor() const + { + return m_drawer.GetDefaultOutlineColor(); + } + + inline float RichTextAreaWidget::GetTextOutlineThickness() const + { + return m_drawer.GetDefaultOutlineThickness(); + } + inline void RichTextAreaWidget::SetCharacterSize(unsigned int characterSize) { m_drawer.SetDefaultCharacterSize(characterSize); @@ -35,4 +45,14 @@ namespace Ndk { m_drawer.SetDefaultFont(std::move(font)); } + + inline void RichTextAreaWidget::SetTextOutlineColor(const Nz::Color& color) + { + m_drawer.SetDefaultOutlineColor(color); + } + + inline void RichTextAreaWidget::SetTextOutlineThickness(float thickness) + { + m_drawer.SetDefaultOutlineThickness(thickness); + } } diff --git a/include/Nazara/Utility/RichTextDrawer.hpp b/include/Nazara/Utility/RichTextDrawer.hpp index 218c207fe..c8b59ffe2 100644 --- a/include/Nazara/Utility/RichTextDrawer.hpp +++ b/include/Nazara/Utility/RichTextDrawer.hpp @@ -37,6 +37,8 @@ namespace Nz inline std::size_t GetBlockCount() const; inline std::size_t GetBlockFirstGlyphIndex(std::size_t index) const; inline const FontRef& GetBlockFont(std::size_t index) const; + inline const Color& GetBlockOutlineColor(std::size_t index) const; + inline float GetBlockOutlineThickness(std::size_t index) const; inline TextStyleFlags GetBlockStyle(std::size_t index) const; inline const String& GetBlockText(std::size_t index) const; @@ -45,6 +47,8 @@ namespace Nz inline unsigned int GetDefaultCharacterSize() const; inline const Color& GetDefaultColor() const; inline const FontRef& GetDefaultFont() const; + inline const Color& GetDefaultOutlineColor() const; + inline float GetDefaultOutlineThickness() const; inline TextStyleFlags GetDefaultStyle() const; Font* GetFont(std::size_t index) const override; std::size_t GetFontCount() const override; @@ -63,12 +67,16 @@ namespace Nz inline void SetBlockCharacterSize(std::size_t index, unsigned int characterSize); inline void SetBlockColor(std::size_t index, const Color& color); inline void SetBlockFont(std::size_t index, FontRef font); + inline void SetBlockOutlineColor(std::size_t index, const Color& color); + inline void SetBlockOutlineThickness(std::size_t index, float thickness); inline void SetBlockStyle(std::size_t index, TextStyleFlags style); inline void SetBlockText(std::size_t index, String str); inline void SetDefaultCharacterSize(unsigned int characterSize); inline void SetDefaultColor(const Color& color); inline void SetDefaultFont(const FontRef& font); + inline void SetDefaultOutlineColor(const Color& color); + inline void SetDefaultOutlineThickness(float thickness); inline void SetDefaultStyle(TextStyleFlags style); void SetMaxLineWidth(float lineWidth) override; @@ -106,8 +114,10 @@ namespace Nz std::size_t fontIndex; std::size_t glyphIndex; Color color; + Color outlineColor; String text; TextStyleFlags style; + float outlineThickness; unsigned int characterSize; }; @@ -123,6 +133,7 @@ namespace Nz }; Color m_defaultColor; + Color m_defaultOutlineColor; TextStyleFlags m_defaultStyle; FontRef m_defaultFont; std::unordered_map m_fontIndexes; @@ -134,6 +145,7 @@ namespace Nz mutable Recti m_bounds; mutable Vector2ui m_drawPos; mutable bool m_glyphUpdated; + float m_defaultOutlineThickness; float m_maxLineWidth; unsigned int m_defaultCharacterSize; }; @@ -151,12 +163,16 @@ namespace Nz inline Color GetColor() const; inline std::size_t GetFirstGlyphIndex() const; inline const FontRef& GetFont() const; + inline Color GetOutlineColor() const; + inline float GetOutlineThickness() const; inline TextStyleFlags GetStyle() const; inline const String& GetText() const; inline void SetCharacterSize(unsigned int size); inline void SetColor(Color color); inline void SetFont(FontRef font); + inline void SetOutlineColor(Color color); + inline void SetOutlineThickness(float thickness); inline void SetStyle(TextStyleFlags style); inline void SetText(const String& text); diff --git a/include/Nazara/Utility/RichTextDrawer.inl b/include/Nazara/Utility/RichTextDrawer.inl index 78dddaeaf..d17db9ae1 100644 --- a/include/Nazara/Utility/RichTextDrawer.inl +++ b/include/Nazara/Utility/RichTextDrawer.inl @@ -82,6 +82,18 @@ namespace Nz return m_fonts[fontIndex].font; } + inline const Color& RichTextDrawer::GetBlockOutlineColor(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].outlineColor; + } + + inline float RichTextDrawer::GetBlockOutlineThickness(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].outlineThickness; + } + inline TextStyleFlags RichTextDrawer::GetBlockStyle(std::size_t index) const { NazaraAssert(index < m_blocks.size(), "Invalid block index"); @@ -109,6 +121,16 @@ namespace Nz return m_defaultFont; } + inline const Color& RichTextDrawer::GetDefaultOutlineColor() const + { + return m_defaultOutlineColor; + } + + inline float RichTextDrawer::GetDefaultOutlineThickness() const + { + return m_defaultOutlineThickness; + } + inline TextStyleFlags RichTextDrawer::GetDefaultStyle() const { return m_defaultStyle; @@ -235,6 +257,24 @@ namespace Nz m_fonts[fontIndex].useCount++; m_blocks[index].fontIndex = fontIndex; } + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockOutlineColor(std::size_t index, const Color& color) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].outlineColor = color; + + InvalidateGlyphs(); + } + + inline void RichTextDrawer::SetBlockOutlineThickness(std::size_t index, float thickness) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].outlineThickness = thickness; + + InvalidateGlyphs(); } inline void RichTextDrawer::SetBlockStyle(std::size_t index, TextStyleFlags style) @@ -279,6 +319,16 @@ namespace Nz m_defaultFont = font; } + inline void RichTextDrawer::SetDefaultOutlineColor(const Color& color) + { + m_defaultOutlineColor = color; + } + + inline void RichTextDrawer::SetDefaultOutlineThickness(float thickness) + { + m_defaultOutlineThickness = thickness; + } + inline void RichTextDrawer::SetDefaultStyle(TextStyleFlags style) { m_defaultStyle = style; @@ -335,6 +385,28 @@ namespace Nz return m_drawer.GetBlockFont(m_blockIndex); } + /*! + * Returns the outline color used for the characters of the referenced block + * \return The referenced block outline color + * + * \see GetCharacterSize, GetColor, GetStyle, GetText, SetFont + */ + inline Color RichTextDrawer::BlockRef::GetOutlineColor() const + { + return m_drawer.GetBlockOutlineColor(m_blockIndex); + } + + /*! + * Returns the outline thickness used for the characters of the referenced block + * \return The referenced block outline thickness + * + * \see GetCharacterSize, GetColor, GetStyle, GetText, SetFont + */ + inline float RichTextDrawer::BlockRef::GetOutlineThickness() const + { + return m_drawer.GetBlockOutlineThickness(m_blockIndex); + } + /*! * Returns the style flags used for the characters of the referenced block * \return The referenced block style flags (see TextStyleFlags) @@ -401,6 +473,28 @@ namespace Nz m_drawer.SetBlockFont(m_blockIndex, std::move(font)); } + /*! + * Changes the outline color of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetCharacterSize, SetCharacterSize, SetColor, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetOutlineColor(Color color) + { + m_drawer.SetBlockOutlineColor(m_blockIndex, std::move(color)); + } + + /*! + * Changes the outline thickness of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetCharacterSize, SetCharacterSize, SetColor, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetOutlineThickness(float thickness) + { + m_drawer.SetBlockOutlineThickness(m_blockIndex, thickness); + } + /*! * Changes the style flags of the referenced block characters * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp index 142a4b395..6e9e514cc 100644 --- a/src/Nazara/Utility/RichTextDrawer.cpp +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -11,11 +11,11 @@ namespace Nz { RichTextDrawer::RichTextDrawer() : m_defaultColor(Color::White), - //m_outlineColor(Color::Black), + m_defaultOutlineColor(Color::Black), m_defaultStyle(TextStyle_Regular), m_glyphUpdated(false), - //m_maxLineWidth(std::numeric_limits::infinity()), - //m_outlineThickness(0.f), + m_maxLineWidth(std::numeric_limits::infinity()), + m_defaultOutlineThickness(0.f), m_defaultCharacterSize(24) { SetDefaultFont(Font::GetDefault()); @@ -27,9 +27,9 @@ namespace Nz m_fontIndexes(drawer.m_fontIndexes), m_blocks(drawer.m_blocks), m_glyphUpdated(false), - //m_outlineColor(drawer.m_outlineColor), - //m_maxLineWidth(drawer.m_maxLineWidth), - //m_outlineThickness(drawer.m_outlineThickness), + m_defaultOutlineColor(drawer.m_defaultOutlineColor), + m_maxLineWidth(drawer.m_maxLineWidth), + m_defaultOutlineThickness(drawer.m_defaultOutlineThickness), m_defaultCharacterSize(drawer.m_defaultCharacterSize) { m_fonts.resize(drawer.m_fonts.size()); @@ -59,10 +59,12 @@ namespace Nz auto HasDefaultProperties = [&](const Block& block) { - return block.characterSize == m_defaultCharacterSize && - block.color == m_defaultColor && - block.fontIndex == defaultFontIndex && - block.style == m_defaultStyle; + return block.characterSize == m_defaultCharacterSize && + block.color == m_defaultColor && + block.fontIndex == defaultFontIndex && + block.outlineColor == m_defaultOutlineColor && + block.outlineThickness == m_defaultOutlineThickness && + block.style == m_defaultStyle; }; // Check if last block has the same property as default, else create a new block @@ -83,6 +85,8 @@ namespace Nz newBlock.color = m_defaultColor; newBlock.fontIndex = defaultFontIndex; newBlock.glyphIndex = glyphIndex; + newBlock.outlineColor = m_defaultOutlineColor; + newBlock.outlineThickness = m_defaultOutlineThickness; newBlock.style = m_defaultStyle; newBlock.text = str; @@ -171,6 +175,8 @@ namespace Nz return lhs.characterSize == rhs.characterSize && lhs.color == rhs.color && lhs.fontIndex == rhs.fontIndex && + lhs.outlineColor == rhs.outlineColor && + lhs.outlineThickness == rhs.outlineThickness && lhs.style == rhs.style; }; @@ -220,6 +226,8 @@ namespace Nz m_defaultCharacterSize = drawer.m_defaultCharacterSize; m_defaultColor = drawer.m_defaultColor; m_defaultFont = drawer.m_defaultFont; + m_defaultOutlineColor = drawer.m_defaultOutlineColor; + m_defaultOutlineThickness = drawer.m_defaultOutlineThickness; m_defaultStyle = drawer.m_defaultStyle; m_fontIndexes = drawer.m_fontIndexes; @@ -243,6 +251,8 @@ namespace Nz m_defaultCharacterSize = std::move(drawer.m_defaultCharacterSize); m_defaultColor = std::move(drawer.m_defaultColor); m_defaultFont = std::move(drawer.m_defaultFont); + m_defaultOutlineColor = std::move(drawer.m_defaultOutlineColor); + m_defaultOutlineThickness = std::move(drawer.m_defaultOutlineThickness); m_defaultStyle = std::move(drawer.m_defaultStyle); m_drawPos = std::move(m_drawPos); m_fontIndexes = std::move(drawer.m_fontIndexes); @@ -501,7 +511,7 @@ namespace Nz assert(block.fontIndex < m_fonts.size()); const auto& fontData = m_fonts[block.fontIndex]; - GenerateGlyphs(fontData.font, block.color, block.style, block.characterSize, block.color, 0.f, block.text); + GenerateGlyphs(fontData.font, block.color, block.style, block.characterSize, block.outlineColor, block.outlineThickness, block.text); } } else From ba405aaa5f4281bc84a9141658a626200a967339 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 28 Dec 2019 11:44:13 +0100 Subject: [PATCH 147/192] Fix some missing override --- SDK/include/NDK/Widgets/TextAreaWidget.hpp | 2 +- include/Nazara/Utility/SimpleTextDrawer.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index f28de9e57..bd81ec8e6 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -58,7 +58,7 @@ namespace Ndk void HandleSelectionIndentation(bool add) override; void HandleWordCursorMove(bool left) override; - void UpdateDisplayText(); + void UpdateDisplayText() override; Nz::SimpleTextDrawer m_drawer; Nz::String m_text; diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index 5e33ed79f..8e6fa8f4b 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -38,7 +38,7 @@ namespace Nz std::size_t GetGlyphCount() const override; const Line& GetLine(std::size_t index) const override; std::size_t GetLineCount() const override; - float GetMaxLineWidth() const; + float GetMaxLineWidth() const override; const Color& GetOutlineColor() const; float GetOutlineThickness() const; TextStyleFlags GetStyle() const; @@ -47,7 +47,7 @@ namespace Nz void SetCharacterSize(unsigned int characterSize); void SetColor(const Color& color); void SetFont(Font* font); - void SetMaxLineWidth(float lineWidth); + void SetMaxLineWidth(float lineWidth) override; void SetOutlineColor(const Color& color); void SetOutlineThickness(float thickness); void SetStyle(TextStyleFlags style); From 453c7a7e77dbc9c5cc40255f737ff06e1a3f9500 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 28 Dec 2019 11:47:34 +0100 Subject: [PATCH 148/192] SDK: (Rich)TextAreaWidget now have alterable text styles --- ChangeLog.md | 1 + SDK/include/NDK/Widgets/RichTextAreaWidget.hpp | 2 ++ SDK/include/NDK/Widgets/RichTextAreaWidget.inl | 10 ++++++++++ SDK/include/NDK/Widgets/TextAreaWidget.hpp | 2 ++ SDK/include/NDK/Widgets/TextAreaWidget.inl | 12 ++++++++++++ 5 files changed, 27 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 92f0fa8da..a0bd88f53 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -308,6 +308,7 @@ Nazara Development Kit: - Added Entity::DropComponent which detaches a component without necessarily destroying it - ⚠ ConstraintComponent2D has been reworked to handle entity destruction and remove constraints at will - Fixed crash when pressing up/down key with no history in the console +- (Rich)TextAreaWidget text style is now alterable # 0.4: diff --git a/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp b/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp index 74a6d187e..280ed9651 100644 --- a/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp @@ -31,12 +31,14 @@ namespace Ndk inline Nz::Font* GetTextFont() const; inline const Nz::Color& GetTextOutlineColor() const; inline float GetTextOutlineThickness() const; + inline Nz::TextStyleFlags GetTextStyle() const; inline void SetCharacterSize(unsigned int characterSize); inline void SetTextColor(const Nz::Color& color); inline void SetTextFont(Nz::FontRef font); inline void SetTextOutlineColor(const Nz::Color& color); inline void SetTextOutlineThickness(float thickness); + inline void SetTextStyle(Nz::TextStyleFlags style); void Write(const Nz::String& text, std::size_t glyphPosition) override; diff --git a/SDK/include/NDK/Widgets/RichTextAreaWidget.inl b/SDK/include/NDK/Widgets/RichTextAreaWidget.inl index 9d9e2650c..01f2dd7a3 100644 --- a/SDK/include/NDK/Widgets/RichTextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/RichTextAreaWidget.inl @@ -31,6 +31,11 @@ namespace Ndk return m_drawer.GetDefaultOutlineThickness(); } + inline Nz::TextStyleFlags RichTextAreaWidget::GetTextStyle() const + { + return m_drawer.GetDefaultStyle(); + } + inline void RichTextAreaWidget::SetCharacterSize(unsigned int characterSize) { m_drawer.SetDefaultCharacterSize(characterSize); @@ -55,4 +60,9 @@ namespace Ndk { m_drawer.SetDefaultOutlineThickness(thickness); } + + inline void RichTextAreaWidget::SetTextStyle(Nz::TextStyleFlags style) + { + m_drawer.SetDefaultStyle(style); + } } diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index bd81ec8e6..dbbac6dad 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -34,6 +34,7 @@ namespace Ndk inline Nz::Font* GetTextFont() const; inline const Nz::Color& GetTextOulineColor() const; inline float GetTextOulineThickness() const; + inline Nz::TextStyleFlags GetTextStyle() const; void SetCharacterSize(unsigned int characterSize); inline void SetText(const Nz::String& text); @@ -41,6 +42,7 @@ namespace Ndk inline void SetTextFont(Nz::FontRef font); inline void SetTextOutlineColor(const Nz::Color& color); inline void SetTextOutlineThickness(float thickness); + inline void SetTextStyle(Nz::TextStyleFlags style); using AbstractTextAreaWidget::Write; void Write(const Nz::String& text, std::size_t glyphPosition) override; diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index aeb7f6914..008cb77fa 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -41,6 +41,11 @@ namespace Ndk return m_drawer.GetOutlineThickness(); } + inline Nz::TextStyleFlags TextAreaWidget::GetTextStyle() const + { + return m_drawer.GetStyle(); + } + inline void TextAreaWidget::SetText(const Nz::String& text) { m_text = text; @@ -76,4 +81,11 @@ namespace Ndk UpdateDisplayText(); } + + inline void TextAreaWidget::SetTextStyle(Nz::TextStyleFlags style) + { + m_drawer.SetStyle(style); + + UpdateDisplayText(); + } } From fcfcc94c4943cd4b867bd155a851dc615e66500c Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 28 Dec 2019 12:03:41 +0100 Subject: [PATCH 149/192] Fix RichTextDrawer ignoring max line width --- include/Nazara/Utility/RichTextDrawer.hpp | 9 ++- include/Nazara/Utility/RichTextDrawer.inl | 21 ++++--- include/Nazara/Utility/SimpleTextDrawer.hpp | 2 +- src/Nazara/Utility/RichTextDrawer.cpp | 65 ++++++++++++++++++--- src/Nazara/Utility/SimpleTextDrawer.cpp | 12 ++-- 5 files changed, 81 insertions(+), 28 deletions(-) diff --git a/include/Nazara/Utility/RichTextDrawer.hpp b/include/Nazara/Utility/RichTextDrawer.hpp index c8b59ffe2..2a1709d8c 100644 --- a/include/Nazara/Utility/RichTextDrawer.hpp +++ b/include/Nazara/Utility/RichTextDrawer.hpp @@ -93,15 +93,16 @@ namespace Nz struct Block; inline void AppendNewLine(const Font* font, unsigned int characterSize) const; + void AppendNewLine(const Font* font, unsigned int characterSize, std::size_t glyphIndex, unsigned int glyphPosition) const; inline void ClearGlyphs() const; inline void ConnectFontSlots(); inline void DisconnectFontSlots(); bool GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, int renderOrder, int* advance) const; void GenerateGlyphs(const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, const Color& outlineColor, float outlineThickness, const String& text) const; inline std::size_t HandleFontAddition(const FontRef& font); - inline void ReleaseFont(std::size_t fontIndex); - inline void InvalidateGlyphs(); + inline void ReleaseFont(std::size_t fontIndex); + inline bool ShouldLineWrap(float size) const; void OnFontAtlasLayerChanged(const Font* font, AbstractImage* oldLayer, AbstractImage* newLayer); void OnFontInvalidated(const Font* font); @@ -109,6 +110,8 @@ namespace Nz void UpdateGlyphs() const; + static constexpr std::size_t InvalidGlyph = std::numeric_limits::max(); + struct Block { std::size_t fontIndex; @@ -136,6 +139,7 @@ namespace Nz Color m_defaultOutlineColor; TextStyleFlags m_defaultStyle; FontRef m_defaultFont; + mutable std::size_t m_lastSeparatorGlyph; std::unordered_map m_fontIndexes; std::vector m_blocks; std::vector m_fonts; @@ -148,6 +152,7 @@ namespace Nz float m_defaultOutlineThickness; float m_maxLineWidth; unsigned int m_defaultCharacterSize; + mutable unsigned int m_lastSeparatorPosition; }; class RichTextDrawer::BlockRef diff --git a/include/Nazara/Utility/RichTextDrawer.inl b/include/Nazara/Utility/RichTextDrawer.inl index d17db9ae1..e2916d475 100644 --- a/include/Nazara/Utility/RichTextDrawer.inl +++ b/include/Nazara/Utility/RichTextDrawer.inl @@ -138,22 +138,13 @@ namespace Nz inline void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize) const { - // Ensure we're appending from last line - Line& lastLine = m_lines.back(); - - const Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); - - // Reset cursor - m_drawPos.x = 0; - m_drawPos.y += sizeInfo.lineHeight; - - m_workingBounds.ExtendTo(lastLine.bounds); - m_lines.emplace_back(Line{ Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1 }); + AppendNewLine(font, characterSize, InvalidGlyph, 0); } inline void RichTextDrawer::ClearGlyphs() const { m_bounds.MakeZero(); + m_lastSeparatorGlyph = InvalidGlyph; m_lines.clear(); m_glyphs.clear(); m_glyphUpdated = true; @@ -223,6 +214,14 @@ namespace Nz } } + inline bool RichTextDrawer::ShouldLineWrap(float size) const + { + if (m_lines.back().glyphIndex > m_glyphs.size()) + return false; + + return m_lines.back().bounds.GetMaximum().x + size > m_maxLineWidth; + } + inline bool RichTextDrawer::HasBlocks() const { return !m_blocks.empty(); diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index 8e6fa8f4b..7533cfd23 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -72,7 +72,7 @@ namespace Nz void OnFontAtlasLayerChanged(const Font* font, AbstractImage* oldLayer, AbstractImage* newLayer); void OnFontInvalidated(const Font* font); void OnFontRelease(const Font* object); - bool ShouldLineWrap(Glyph& glyph, float size, bool checkFirstGlyph = true) const; + bool ShouldLineWrap(float size) const; void UpdateGlyphColor() const; void UpdateGlyphs() const; diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp index 6e9e514cc..98c145474 100644 --- a/src/Nazara/Utility/RichTextDrawer.cpp +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -268,6 +268,55 @@ namespace Nz return *this; } + void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize, std::size_t glyphIndex, unsigned int glyphPosition) const + { + // Ensure we're appending from last line + Line& lastLine = m_lines.back(); + + const Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); + + unsigned int previousDrawPos = m_drawPos.x; + + // Reset cursor + m_drawPos.x = 0; + m_drawPos.y += sizeInfo.lineHeight; + m_lastSeparatorGlyph = InvalidGlyph; + + m_workingBounds.ExtendTo(lastLine.bounds); + m_lines.emplace_back(Line{ Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1 }); + + if (glyphIndex != InvalidGlyph && glyphIndex > lastLine.glyphIndex) + { + Line& newLine = m_lines.back(); + newLine.glyphIndex = glyphIndex; + + for (std::size_t i = glyphIndex; i < m_glyphs.size(); ++i) + { + Glyph& glyph = m_glyphs[i]; + glyph.bounds.x -= glyphPosition; + glyph.bounds.y += sizeInfo.lineHeight; + + for (auto& corner : glyph.corners) + { + corner.x -= glyphPosition; + corner.y += sizeInfo.lineHeight; + } + + newLine.bounds.ExtendTo(glyph.bounds); + } + + assert(previousDrawPos >= glyphPosition); + m_drawPos.x += previousDrawPos - glyphPosition; + + lastLine.bounds.width -= lastLine.bounds.GetMaximum().x - glyphPosition; + + // Regenerate working bounds + m_workingBounds.MakeZero(); + for (std::size_t i = 0; i < m_lines.size(); ++i) + m_workingBounds.ExtendTo(m_lines[i].bounds); + } + } + bool RichTextDrawer::GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, int renderOrder, int* advance) const { const Font::Glyph& fontGlyph = font->GetGlyph(characterSize, style, outlineThickness, character); @@ -281,8 +330,8 @@ namespace Nz glyph.bounds.Set(fontGlyph.aabb); - //if (lineWrap && ShouldLineWrap(glyph, glyph.bounds.width)) - // AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); + if (lineWrap && ShouldLineWrap(glyph.bounds.width)) + AppendNewLine(font, characterSize, m_lastSeparatorGlyph, m_lastSeparatorPosition); glyph.bounds.x += m_drawPos.x; glyph.bounds.y += m_drawPos.y; @@ -337,7 +386,7 @@ namespace Nz corner.y += heightDifference; } - m_drawPos.y += heightDifference; + m_drawPos.y += static_cast(heightDifference); m_lines.back().bounds.height += heightDifference; } /*if (firstFont.font) @@ -388,10 +437,10 @@ namespace Nz } else { - float glyphAdvance = advance; + float glyphAdvance = float(advance); - //if (ShouldLineWrap(glyph, glyphAdvance)) - // AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); + if (ShouldLineWrap(glyphAdvance)) + AppendNewLine(font, characterSize, m_lastSeparatorGlyph, m_lastSeparatorPosition); glyph.atlas = nullptr; glyph.bounds.Set(float(m_drawPos.x), m_lines.back().bounds.y, glyphAdvance, float(sizeInfo.lineHeight)); @@ -417,11 +466,11 @@ namespace Nz break; } - /*if (whitespace) + if (whitespace) { m_lastSeparatorGlyph = m_glyphs.size(); m_lastSeparatorPosition = m_drawPos.x; - }*/ + } m_glyphs.push_back(glyph); } diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index aca74968d..5f5357dbc 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -311,7 +311,7 @@ namespace Nz void SimpleTextDrawer::AppendNewLine() const { - AppendNewLine(InvalidGlyph, 0.f); + AppendNewLine(InvalidGlyph, 0); } void SimpleTextDrawer::AppendNewLine(std::size_t glyphIndex, unsigned int glyphPosition) const @@ -354,7 +354,7 @@ namespace Nz assert(previousDrawPos >= glyphPosition); m_drawPos.x += previousDrawPos - glyphPosition; - lastLine.bounds.width -= lastLine.bounds.GetMaximum().x - m_lastSeparatorPosition; + lastLine.bounds.width -= lastLine.bounds.GetMaximum().x - glyphPosition; // Regenerate working bounds m_workingBounds.MakeZero(); @@ -410,7 +410,7 @@ namespace Nz glyph.bounds.Set(fontGlyph.aabb); - if (lineWrap && ShouldLineWrap(glyph, glyph.bounds.width)) + if (lineWrap && ShouldLineWrap(glyph.bounds.width)) AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); glyph.bounds.x += m_drawPos.x; @@ -497,7 +497,7 @@ namespace Nz { float glyphAdvance = advance; - if (ShouldLineWrap(glyph, glyphAdvance)) + if (ShouldLineWrap(glyphAdvance)) AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); glyph.atlas = nullptr; @@ -593,9 +593,9 @@ namespace Nz SetFont(nullptr); } - bool SimpleTextDrawer::ShouldLineWrap(Glyph& glyph, float size, bool checkFirstGlyph) const + bool SimpleTextDrawer::ShouldLineWrap(float size) const { - if (checkFirstGlyph && m_lines.back().glyphIndex > m_glyphs.size()) + if (m_lines.back().glyphIndex > m_glyphs.size()) return false; return m_lines.back().bounds.GetMaximum().x + size > m_maxLineWidth; From 57b37c3d2c0d8cdf2e947ab02229c34f377b019b Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 28 Dec 2019 15:06:31 +0100 Subject: [PATCH 150/192] Minor fixes --- include/Nazara/Core/String.inl | 2 +- src/Nazara/Network/ENetHost.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/include/Nazara/Core/String.inl b/include/Nazara/Core/String.inl index 57c781f9e..eed2269d0 100644 --- a/include/Nazara/Core/String.inl +++ b/include/Nazara/Core/String.inl @@ -41,7 +41,7 @@ namespace Nz inline void String::ReleaseString() { - m_sharedString = std::move(GetEmptyString()); + m_sharedString = GetEmptyString(); } /*! diff --git a/src/Nazara/Network/ENetHost.cpp b/src/Nazara/Network/ENetHost.cpp index c5c599b5b..9b4e70fec 100644 --- a/src/Nazara/Network/ENetHost.cpp +++ b/src/Nazara/Network/ENetHost.cpp @@ -886,6 +886,7 @@ namespace Nz canPing = false; + assert(outgoingCommand->command.header.command < ENetProtocolCommand_Count); std::size_t commandSize = s_commandSizes[outgoingCommand->command.header.command & ENetProtocolCommand_Mask]; if (m_commandCount >= m_commands.size() || m_bufferCount + 1 >= m_buffers.size() || peer->GetMtu() - m_packetSize < commandSize || (outgoingCommand->packet && UInt16(peer->GetMtu() - m_packetSize) < UInt16(commandSize + outgoingCommand->fragmentLength))) @@ -1138,6 +1139,7 @@ namespace Nz { auto outgoingCommand = currentCommand; + assert(outgoingCommand->command.header.command < ENetProtocolCommand_Count); std::size_t commandSize = s_commandSizes[outgoingCommand->command.header.command & ENetProtocolCommand_Mask]; if (m_commandCount >= m_commands.size() || m_bufferCount + 1 >= m_buffers.size() || peer->m_mtu - m_packetSize < commandSize || @@ -1351,6 +1353,7 @@ namespace Nz std::size_t ENetHost::GetCommandSize(UInt8 commandNumber) { + assert(commandNumber < ENetProtocolCommand_Count); return s_commandSizes[commandNumber & ENetProtocolCommand_Mask]; } From 9f8e83087af7b02fb102d1da1b467be89bf1402d Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 28 Dec 2019 17:19:40 +0100 Subject: [PATCH 151/192] Oops --- src/Nazara/Network/ENetHost.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Nazara/Network/ENetHost.cpp b/src/Nazara/Network/ENetHost.cpp index 9b4e70fec..f1008fec3 100644 --- a/src/Nazara/Network/ENetHost.cpp +++ b/src/Nazara/Network/ENetHost.cpp @@ -886,7 +886,7 @@ namespace Nz canPing = false; - assert(outgoingCommand->command.header.command < ENetProtocolCommand_Count); + assert(outgoingCommand->command.header.command & ENetProtocolCommand_Mask < ENetProtocolCommand_Count); std::size_t commandSize = s_commandSizes[outgoingCommand->command.header.command & ENetProtocolCommand_Mask]; if (m_commandCount >= m_commands.size() || m_bufferCount + 1 >= m_buffers.size() || peer->GetMtu() - m_packetSize < commandSize || (outgoingCommand->packet && UInt16(peer->GetMtu() - m_packetSize) < UInt16(commandSize + outgoingCommand->fragmentLength))) @@ -1139,7 +1139,7 @@ namespace Nz { auto outgoingCommand = currentCommand; - assert(outgoingCommand->command.header.command < ENetProtocolCommand_Count); + assert(outgoingCommand->command.header.command & ENetProtocolCommand_Mask < ENetProtocolCommand_Count); std::size_t commandSize = s_commandSizes[outgoingCommand->command.header.command & ENetProtocolCommand_Mask]; if (m_commandCount >= m_commands.size() || m_bufferCount + 1 >= m_buffers.size() || peer->m_mtu - m_packetSize < commandSize || @@ -1353,7 +1353,7 @@ namespace Nz std::size_t ENetHost::GetCommandSize(UInt8 commandNumber) { - assert(commandNumber < ENetProtocolCommand_Count); + assert(commandNumber & ENetProtocolCommand_Mask < ENetProtocolCommand_Count); return s_commandSizes[commandNumber & ENetProtocolCommand_Mask]; } From 56243f5a12e0d8c6a0ae29de945e04a9271b00a7 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 28 Dec 2019 17:31:21 +0100 Subject: [PATCH 152/192] Nazara/Network: Add GetTotalByte[Received|Sent] --- ChangeLog.md | 1 + include/Nazara/Network/ENetPeer.hpp | 4 ++++ include/Nazara/Network/ENetPeer.inl | 10 ++++++++++ src/Nazara/Network/ENetHost.cpp | 1 + src/Nazara/Network/ENetPeer.cpp | 8 +++++++- 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index a0bd88f53..ad8ee9527 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -209,6 +209,7 @@ Nazara Engine: - Added HandledObject::OnHandledObjectDestruction signal - Added physics function to control sleeping behavior - String::Number is now locale-independent +- Added ENetPeer::GetTotalByte[Received|Sent] Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Network/ENetPeer.hpp b/include/Nazara/Network/ENetPeer.hpp index 634f22402..7669bc142 100644 --- a/include/Nazara/Network/ENetPeer.hpp +++ b/include/Nazara/Network/ENetPeer.hpp @@ -56,6 +56,8 @@ namespace Nz inline UInt16 GetPeerId() const; inline UInt32 GetRoundTripTime() const; inline ENetPeerState GetState() const; + inline UInt64 GetTotalByteReceived() const; + inline UInt64 GetTotalByteSent() const; inline UInt64 GetTotalPacketLost() const; inline UInt64 GetTotalPacketSent() const; @@ -237,6 +239,8 @@ namespace Nz UInt32 m_timeoutMaximum; UInt32 m_timeoutMinimum; UInt32 m_windowSize; + UInt64 m_totalByteReceived; + UInt64 m_totalByteSent; UInt64 m_totalPacketLost; UInt64 m_totalPacketSent; bool m_isSimulationEnabled; diff --git a/include/Nazara/Network/ENetPeer.inl b/include/Nazara/Network/ENetPeer.inl index 7820620ca..660614944 100644 --- a/include/Nazara/Network/ENetPeer.inl +++ b/include/Nazara/Network/ENetPeer.inl @@ -62,6 +62,16 @@ namespace Nz return m_state; } + inline UInt64 ENetPeer::GetTotalByteReceived() const + { + return m_totalByteReceived; + } + + inline UInt64 ENetPeer::GetTotalByteSent() const + { + return m_totalByteSent; + } + inline UInt64 ENetPeer::GetTotalPacketLost() const { return m_totalPacketLost; diff --git a/src/Nazara/Network/ENetHost.cpp b/src/Nazara/Network/ENetHost.cpp index f1008fec3..62bbf5684 100644 --- a/src/Nazara/Network/ENetHost.cpp +++ b/src/Nazara/Network/ENetHost.cpp @@ -541,6 +541,7 @@ namespace Nz { peer->m_address = m_receivedAddress; peer->m_incomingDataTotal += UInt32(m_receivedDataLength); + peer->m_totalByteReceived += UInt32(m_receivedDataLength); } auto commandError = [&]() -> bool diff --git a/src/Nazara/Network/ENetPeer.cpp b/src/Nazara/Network/ENetPeer.cpp index 823eaaf18..c897f4790 100644 --- a/src/Nazara/Network/ENetPeer.cpp +++ b/src/Nazara/Network/ENetPeer.cpp @@ -163,6 +163,8 @@ namespace Nz m_incomingUnsequencedGroup = 0; m_outgoingUnsequencedGroup = 0; m_eventData = 0; + m_totalByteReceived = 0; + m_totalByteSent = 0; m_totalPacketLost = 0; m_totalPacketSent = 0; m_totalWaitingData = 0; @@ -1085,6 +1087,7 @@ namespace Nz acknowledgment.sentTime = sentTime; m_outgoingDataTotal += sizeof(Acknowledgement); + m_totalByteSent += sizeof(Acknowledgement); m_acknowledgements.emplace_back(acknowledgment); @@ -1265,7 +1268,10 @@ namespace Nz void ENetPeer::SetupOutgoingCommand(OutgoingCommand& outgoingCommand) { - m_outgoingDataTotal += static_cast(ENetHost::GetCommandSize(outgoingCommand.command.header.command) + outgoingCommand.fragmentLength); + UInt32 commandSize = static_cast(ENetHost::GetCommandSize(outgoingCommand.command.header.command) + outgoingCommand.fragmentLength); + + m_outgoingDataTotal += commandSize; + m_totalByteSent += commandSize; if (outgoingCommand.command.header.channelID == 0xFF) { From 2dcf1545538aa8abc73de5beb69a43eb48fbbc35 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 28 Dec 2019 17:32:37 +0100 Subject: [PATCH 153/192] =?UTF-8?q?Oops=C2=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Nazara/Network/ENetHost.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Nazara/Network/ENetHost.cpp b/src/Nazara/Network/ENetHost.cpp index 62bbf5684..4966a9042 100644 --- a/src/Nazara/Network/ENetHost.cpp +++ b/src/Nazara/Network/ENetHost.cpp @@ -887,7 +887,7 @@ namespace Nz canPing = false; - assert(outgoingCommand->command.header.command & ENetProtocolCommand_Mask < ENetProtocolCommand_Count); + assert((outgoingCommand->command.header.command & ENetProtocolCommand_Mask) < ENetProtocolCommand_Count); std::size_t commandSize = s_commandSizes[outgoingCommand->command.header.command & ENetProtocolCommand_Mask]; if (m_commandCount >= m_commands.size() || m_bufferCount + 1 >= m_buffers.size() || peer->GetMtu() - m_packetSize < commandSize || (outgoingCommand->packet && UInt16(peer->GetMtu() - m_packetSize) < UInt16(commandSize + outgoingCommand->fragmentLength))) @@ -1140,7 +1140,7 @@ namespace Nz { auto outgoingCommand = currentCommand; - assert(outgoingCommand->command.header.command & ENetProtocolCommand_Mask < ENetProtocolCommand_Count); + assert((outgoingCommand->command.header.command & ENetProtocolCommand_Mask) < ENetProtocolCommand_Count); std::size_t commandSize = s_commandSizes[outgoingCommand->command.header.command & ENetProtocolCommand_Mask]; if (m_commandCount >= m_commands.size() || m_bufferCount + 1 >= m_buffers.size() || peer->m_mtu - m_packetSize < commandSize || @@ -1354,7 +1354,7 @@ namespace Nz std::size_t ENetHost::GetCommandSize(UInt8 commandNumber) { - assert(commandNumber & ENetProtocolCommand_Mask < ENetProtocolCommand_Count); + assert((commandNumber & ENetProtocolCommand_Mask) < ENetProtocolCommand_Count); return s_commandSizes[commandNumber & ENetProtocolCommand_Mask]; } From 24cb8f684574f5105ea396c8a72fae202b49bf25 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 29 Dec 2019 11:54:00 +0100 Subject: [PATCH 154/192] Add ENet::GetTotalPacketReceived --- ChangeLog.md | 1 + include/Nazara/Network/ENetPeer.hpp | 2 ++ include/Nazara/Network/ENetPeer.inl | 5 +++++ src/Nazara/Network/ENetHost.cpp | 3 +++ src/Nazara/Network/ENetPeer.cpp | 1 + 5 files changed, 12 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index ad8ee9527..c9ca47f68 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -210,6 +210,7 @@ Nazara Engine: - Added physics function to control sleeping behavior - String::Number is now locale-independent - Added ENetPeer::GetTotalByte[Received|Sent] +- Added ENetPeer::GetTotalPacketSent Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Network/ENetPeer.hpp b/include/Nazara/Network/ENetPeer.hpp index 7669bc142..7675855d4 100644 --- a/include/Nazara/Network/ENetPeer.hpp +++ b/include/Nazara/Network/ENetPeer.hpp @@ -58,6 +58,7 @@ namespace Nz inline ENetPeerState GetState() const; inline UInt64 GetTotalByteReceived() const; inline UInt64 GetTotalByteSent() const; + inline UInt64 GetTotalPacketReceived() const; inline UInt64 GetTotalPacketLost() const; inline UInt64 GetTotalPacketSent() const; @@ -241,6 +242,7 @@ namespace Nz UInt32 m_windowSize; UInt64 m_totalByteReceived; UInt64 m_totalByteSent; + UInt64 m_totalPacketReceived; UInt64 m_totalPacketLost; UInt64 m_totalPacketSent; bool m_isSimulationEnabled; diff --git a/include/Nazara/Network/ENetPeer.inl b/include/Nazara/Network/ENetPeer.inl index 660614944..8b2d0f21a 100644 --- a/include/Nazara/Network/ENetPeer.inl +++ b/include/Nazara/Network/ENetPeer.inl @@ -72,6 +72,11 @@ namespace Nz return m_totalByteSent; } + inline UInt64 ENetPeer::GetTotalPacketReceived() const + { + return m_totalPacketReceived; + } + inline UInt64 ENetPeer::GetTotalPacketLost() const { return m_totalPacketLost; diff --git a/src/Nazara/Network/ENetHost.cpp b/src/Nazara/Network/ENetHost.cpp index 4966a9042..54e508641 100644 --- a/src/Nazara/Network/ENetHost.cpp +++ b/src/Nazara/Network/ENetHost.cpp @@ -658,6 +658,9 @@ namespace Nz return commandError(); } + if (peer) + peer->m_totalPacketReceived++; + if (peer && (command->header.command & ENetProtocolFlag_Acknowledge) != 0) { UInt16 sentTime; diff --git a/src/Nazara/Network/ENetPeer.cpp b/src/Nazara/Network/ENetPeer.cpp index c897f4790..294585631 100644 --- a/src/Nazara/Network/ENetPeer.cpp +++ b/src/Nazara/Network/ENetPeer.cpp @@ -165,6 +165,7 @@ namespace Nz m_eventData = 0; m_totalByteReceived = 0; m_totalByteSent = 0; + m_totalPacketReceived = 0; m_totalPacketLost = 0; m_totalPacketSent = 0; m_totalWaitingData = 0; From 0bcd8769fe863c86d32fc5061076702ff25f3184 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 29 Dec 2019 11:55:07 +0100 Subject: [PATCH 155/192] Nazara/Network: ENetHost::GetTotalReceivedPackets now returns the number of commands received --- ChangeLog.md | 1 + src/Nazara/Network/ENetHost.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index c9ca47f68..0aa103f4f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -211,6 +211,7 @@ Nazara Engine: - String::Number is now locale-independent - Added ENetPeer::GetTotalByte[Received|Sent] - Added ENetPeer::GetTotalPacketSent +- ⚠ ENetHost::GetTotalReceivedPackets now returns the number of commands received (instead of the number of UDP packets received) Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Network/ENetHost.cpp b/src/Nazara/Network/ENetHost.cpp index 54e508641..04119a330 100644 --- a/src/Nazara/Network/ENetHost.cpp +++ b/src/Nazara/Network/ENetHost.cpp @@ -658,6 +658,7 @@ namespace Nz return commandError(); } + m_totalReceivedPackets++; if (peer) peer->m_totalPacketReceived++; @@ -754,7 +755,6 @@ namespace Nz m_receivedDataLength = receivedLength; m_totalReceivedData += receivedLength; - m_totalReceivedPackets++; // Intercept From 0b825680de2a54cc7b83346a729420854e515814 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 29 Dec 2019 11:56:13 +0100 Subject: [PATCH 156/192] Network/ENetPeer: Reduce memory usage --- include/Nazara/Network/ENetPeer.hpp | 12 ++++++------ include/Nazara/Network/ENetPeer.inl | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/Nazara/Network/ENetPeer.hpp b/include/Nazara/Network/ENetPeer.hpp index 7675855d4..812b644cd 100644 --- a/include/Nazara/Network/ENetPeer.hpp +++ b/include/Nazara/Network/ENetPeer.hpp @@ -58,9 +58,9 @@ namespace Nz inline ENetPeerState GetState() const; inline UInt64 GetTotalByteReceived() const; inline UInt64 GetTotalByteSent() const; - inline UInt64 GetTotalPacketReceived() const; - inline UInt64 GetTotalPacketLost() const; - inline UInt64 GetTotalPacketSent() const; + inline UInt32 GetTotalPacketReceived() const; + inline UInt32 GetTotalPacketLost() const; + inline UInt32 GetTotalPacketSent() const; inline bool HasPendingCommands(); @@ -239,12 +239,12 @@ namespace Nz UInt32 m_timeoutLimit; UInt32 m_timeoutMaximum; UInt32 m_timeoutMinimum; + UInt32 m_totalPacketReceived; + UInt32 m_totalPacketLost; + UInt32 m_totalPacketSent; UInt32 m_windowSize; UInt64 m_totalByteReceived; UInt64 m_totalByteSent; - UInt64 m_totalPacketReceived; - UInt64 m_totalPacketLost; - UInt64 m_totalPacketSent; bool m_isSimulationEnabled; }; } diff --git a/include/Nazara/Network/ENetPeer.inl b/include/Nazara/Network/ENetPeer.inl index 8b2d0f21a..0d7a96104 100644 --- a/include/Nazara/Network/ENetPeer.inl +++ b/include/Nazara/Network/ENetPeer.inl @@ -72,17 +72,17 @@ namespace Nz return m_totalByteSent; } - inline UInt64 ENetPeer::GetTotalPacketReceived() const + inline UInt32 ENetPeer::GetTotalPacketReceived() const { return m_totalPacketReceived; } - inline UInt64 ENetPeer::GetTotalPacketLost() const + inline UInt32 ENetPeer::GetTotalPacketLost() const { return m_totalPacketLost; } - inline UInt64 ENetPeer::GetTotalPacketSent() const + inline UInt32 ENetPeer::GetTotalPacketSent() const { return m_totalPacketSent; } From ea8b71407ef56822a4dc0e5f5f6bdb994fda1e76 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 29 Dec 2019 16:24:38 +0100 Subject: [PATCH 157/192] Minor improvement --- SDK/include/NDK/Widgets/LabelWidget.inl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SDK/include/NDK/Widgets/LabelWidget.inl b/SDK/include/NDK/Widgets/LabelWidget.inl index db3d10a52..cf14ea7d0 100644 --- a/SDK/include/NDK/Widgets/LabelWidget.inl +++ b/SDK/include/NDK/Widgets/LabelWidget.inl @@ -10,7 +10,8 @@ namespace Ndk { m_textSprite->Update(drawer); - SetMinimumSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); - SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + Nz::Vector2f size = Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths()); + SetMinimumSize(size); + SetPreferredSize(size); } } From 35cf05e3bc9c3ac65b7f5a0063a5cb5a455c073b Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 29 Dec 2019 16:25:40 +0100 Subject: [PATCH 158/192] Core: Add EmptyStream class --- ChangeLog.md | 1 + include/Nazara/Core/EmptyStream.hpp | 46 ++++++++++++++ include/Nazara/Core/EmptyStream.inl | 22 +++++++ src/Nazara/Core/EmptyStream.cpp | 99 +++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 include/Nazara/Core/EmptyStream.hpp create mode 100644 include/Nazara/Core/EmptyStream.inl create mode 100644 src/Nazara/Core/EmptyStream.cpp diff --git a/ChangeLog.md b/ChangeLog.md index 0aa103f4f..656dc699c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -212,6 +212,7 @@ Nazara Engine: - Added ENetPeer::GetTotalByte[Received|Sent] - Added ENetPeer::GetTotalPacketSent - ⚠ ENetHost::GetTotalReceivedPackets now returns the number of commands received (instead of the number of UDP packets received) +- Added EmptyStream class, useful to measure how many bytes some writing operations will take Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/EmptyStream.hpp b/include/Nazara/Core/EmptyStream.hpp new file mode 100644 index 000000000..da66ca329 --- /dev/null +++ b/include/Nazara/Core/EmptyStream.hpp @@ -0,0 +1,46 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_EMPTYSTREAM_HPP +#define NAZARA_EMPTYSTREAM_HPP + +#include +#include + +namespace Nz +{ + class NAZARA_CORE_API EmptyStream : public Stream + { + public: + inline EmptyStream(); + EmptyStream(const EmptyStream&) = default; + EmptyStream(EmptyStream&&) noexcept = default; + ~EmptyStream() = default; + + void Clear(); + + bool EndOfStream() const override; + + UInt64 GetCursorPos() const override; + UInt64 GetSize() const override; + + bool SetCursorPos(UInt64 offset) override; + + EmptyStream& operator=(const EmptyStream&) = default; + EmptyStream& operator=(EmptyStream&&) noexcept = default; + + private: + void FlushStream() override; + std::size_t ReadBlock(void* buffer, std::size_t size) override; + std::size_t WriteBlock(const void* buffer, std::size_t size) override; + + UInt64 m_size; + }; +} + +#include + +#endif // NAZARA_EMPTYSTREAM_HPP diff --git a/include/Nazara/Core/EmptyStream.inl b/include/Nazara/Core/EmptyStream.inl new file mode 100644 index 000000000..9691760a7 --- /dev/null +++ b/include/Nazara/Core/EmptyStream.inl @@ -0,0 +1,22 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + /*! + * \ingroup core + * \class Nz::EmptyStream + * \brief Constructs an EmptyStream object by default + */ + inline EmptyStream::EmptyStream() : + m_size(0) + { + } + +} + +#include diff --git a/src/Nazara/Core/EmptyStream.cpp b/src/Nazara/Core/EmptyStream.cpp new file mode 100644 index 000000000..5cba8af35 --- /dev/null +++ b/src/Nazara/Core/EmptyStream.cpp @@ -0,0 +1,99 @@ +// Copyright (C) 2019 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include + +namespace Nz +{ + /*! + * \ingroup core + * \class Nz::EmptyStream + * \brief Core class that simulate an empty buffer (discarding all content) which can be used to measure size + */ + + /*! + * \brief Resets the stream size to zero + */ + void EmptyStream::Clear() + { + m_size = 0; + } + + /*! + * \brief Checks whether the stream reached the end of the stream + * \return Always false + */ + bool EmptyStream::EndOfStream() const + { + return false; + } + + /*! + * \brief Gets the position of the cursor (which is always zero) + * \return Always zero + */ + UInt64 EmptyStream::GetCursorPos() const + { + return 0; + } + + /*! + * \brief Gets the size of the raw memory (how many bytes would have been written on a regular stream) + * \return Size occupied until now + */ + UInt64 EmptyStream::GetSize() const + { + return m_size; + } + + /*! + * \brief Does nothing + * \return true + * + * \param offset Offset according to the beginning of the stream + */ + bool EmptyStream::SetCursorPos(UInt64 offset) + { + return true; + } + + /*! + * \brief Flushes the stream (does nothing) + */ + void EmptyStream::FlushStream() + { + // Nothing to flush + } + + /*! + * \brief Reads data + * \return Number of byte read (always zero) + * + * Reading from an empty stream does nothing and will always returns zero + * + * \param buffer Preallocated buffer to contain information read + * \param size Size of the read and thus of the buffer + */ + std::size_t EmptyStream::ReadBlock(void* buffer, std::size_t size) + { + return 0; + } + + /*! + * \brief Writes data + * \return size + * + * \param buffer Dummy parameter + * \param size How many bytes will be "written" + */ + std::size_t EmptyStream::WriteBlock(const void* /*buffer*/, std::size_t size) + { + m_size += size; + + return size; + } +} From f371cbb386a6dbd80b8e873c449d70d912b32857 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 29 Dec 2019 16:36:23 +0100 Subject: [PATCH 159/192] Fix EmptyStream open mode --- include/Nazara/Core/EmptyStream.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Nazara/Core/EmptyStream.inl b/include/Nazara/Core/EmptyStream.inl index 9691760a7..4da4db08d 100644 --- a/include/Nazara/Core/EmptyStream.inl +++ b/include/Nazara/Core/EmptyStream.inl @@ -15,8 +15,8 @@ namespace Nz inline EmptyStream::EmptyStream() : m_size(0) { + m_openMode = Nz::OpenMode_ReadWrite; } - } #include From df2a029f30cf87c25f0e67deab3e7f2a39c2b293 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 1 Jan 2020 17:25:22 +0100 Subject: [PATCH 160/192] Physics2D/Collider2D: Add support for neighbors vertices --- ChangeLog.md | 1 + include/Nazara/Physics2D/Collider2D.hpp | 5 +++++ include/Nazara/Physics2D/Collider2D.inl | 17 +++++++++++++++++ src/Nazara/Physics2D/Collider2D.cpp | 5 ++++- 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 656dc699c..8c74a6428 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -213,6 +213,7 @@ Nazara Engine: - Added ENetPeer::GetTotalPacketSent - ⚠ ENetHost::GetTotalReceivedPackets now returns the number of commands received (instead of the number of UDP packets received) - Added EmptyStream class, useful to measure how many bytes some writing operations will take +- SegmentCollider2D: Add support for neighbors (aka "ghost vertices"), allowing to prevent seams collisions Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index e817457b8..d0f7fd608 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -230,13 +230,16 @@ namespace Nz { public: inline SegmentCollider2D(const Vector2f& first, const Vector2f& second, float thickness = 1.f); + inline SegmentCollider2D(const Vector2f& first, const Vector2f& firstNeighbor, const Vector2f& second, const Vector2f& secondNeighbor, float thickness = 1.f); Nz::Vector2f ComputeCenterOfMass() const override; float ComputeMomentOfInertia(float mass) const override; inline const Vector2f& GetFirstPoint() const; + inline const Vector2f& GetFirstPointNeighbor() const; inline float GetLength() const; inline const Vector2f& GetSecondPoint() const; + inline const Vector2f& GetSecondPointNeighbor() const; inline float GetThickness() const; ColliderType2D GetType() const override; @@ -246,7 +249,9 @@ namespace Nz std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; Vector2f m_first; + Vector2f m_firstNeighbor; Vector2f m_second; + Vector2f m_secondNeighbor; float m_thickness; }; } diff --git a/include/Nazara/Physics2D/Collider2D.inl b/include/Nazara/Physics2D/Collider2D.inl index d347ee361..75696ce50 100644 --- a/include/Nazara/Physics2D/Collider2D.inl +++ b/include/Nazara/Physics2D/Collider2D.inl @@ -191,8 +191,15 @@ namespace Nz } SegmentCollider2D::SegmentCollider2D(const Vector2f& first, const Vector2f& second, float thickness) : + SegmentCollider2D(first, first, second, second, thickness) + { + } + + inline SegmentCollider2D::SegmentCollider2D(const Vector2f& first, const Vector2f& firstNeighbor, const Vector2f& second, const Vector2f& secondNeighbor, float thickness) : m_first(first), + m_firstNeighbor(firstNeighbor), m_second(second), + m_secondNeighbor(secondNeighbor), m_thickness(thickness) { } @@ -202,6 +209,11 @@ namespace Nz return m_first; } + inline const Vector2f& SegmentCollider2D::GetFirstPointNeighbor() const + { + return m_firstNeighbor; + } + inline float SegmentCollider2D::GetLength() const { return m_first.Distance(m_second); @@ -212,6 +224,11 @@ namespace Nz return m_second; } + inline const Vector2f& SegmentCollider2D::GetSecondPointNeighbor() const + { + return m_secondNeighbor; + } + inline float SegmentCollider2D::GetThickness() const { return m_thickness; diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index 3a67797bd..16587a092 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -298,7 +298,10 @@ namespace Nz std::size_t SegmentCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { - shapes->push_back(cpSegmentShapeNew(body->GetHandle(), cpv(m_first.x, m_first.y), cpv(m_second.x, m_second.y), m_thickness)); + cpShape* segment = cpSegmentShapeNew(body->GetHandle(), cpv(m_first.x, m_first.y), cpv(m_second.x, m_second.y), m_thickness); + cpSegmentShapeSetNeighbors(segment, cpv(m_firstNeighbor.x, m_firstNeighbor.y), cpv(m_secondNeighbor.x, m_secondNeighbor.y)); + + shapes->push_back(segment); return 1; } } From b3af14f65acf2e6ff3465d5bdd6ea7193ed43ea9 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 4 Jan 2020 12:15:54 +0100 Subject: [PATCH 161/192] Utility/OBJLoader: Fix OBJ uvs --- ChangeLog.md | 1 + examples/FirstScene/main.cpp | 4 ---- src/Nazara/Utility/Formats/OBJLoader.cpp | 2 ++ 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8c74a6428..db55478ac 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -214,6 +214,7 @@ Nazara Engine: - ⚠ ENetHost::GetTotalReceivedPackets now returns the number of commands received (instead of the number of UDP packets received) - Added EmptyStream class, useful to measure how many bytes some writing operations will take - SegmentCollider2D: Add support for neighbors (aka "ghost vertices"), allowing to prevent seams collisions +- ⚠ OBJLoader flips UV by default, fixing a lot of models UV Nazara Development Kit: - Added ImageWidget (#139) diff --git a/examples/FirstScene/main.cpp b/examples/FirstScene/main.cpp index 0e3f8f8a2..06e9fd97c 100644 --- a/examples/FirstScene/main.cpp +++ b/examples/FirstScene/main.cpp @@ -92,10 +92,6 @@ int main() // Ce paramètre sert à indiquer la mise à l'échelle désirée lors du chargement du modèle. params.mesh.matrix.MakeScale(Nz::Vector3f(0.01f)); // Un centième de la taille originelle - // Les UVs de ce fichier sont retournées (repère OpenGL, origine coin bas-gauche) par rapport à ce que le moteur attend (haut-gauche) - // Nous devons donc indiquer au moteur de les retourner lors du chargement - params.mesh.texCoordScale.Set(1.f, -1.f); - // Nazara va par défaut optimiser les modèles pour un rendu plus rapide, cela peut prendre du temps et n'est pas nécessaire ici params.mesh.optimizeIndexBuffers = false; diff --git a/src/Nazara/Utility/Formats/OBJLoader.cpp b/src/Nazara/Utility/Formats/OBJLoader.cpp index b8ff362f1..58b2d8e0a 100644 --- a/src/Nazara/Utility/Formats/OBJLoader.cpp +++ b/src/Nazara/Utility/Formats/OBJLoader.cpp @@ -306,6 +306,8 @@ namespace Nz if (vertexIndices.texCoord > 0) { Vector2f uv = Vector2f(texCoords[vertexIndices.texCoord - 1]); + uv.y = 1.f - uv.y; //< OBJ model texcoords seems to majority start from bottom left + uvPtr[index] = Vector2f(parameters.texCoordOffset + uv * parameters.texCoordScale); } else From 380c5eb9ae3ae40eaaa3f477b85d06c396aae94c Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 4 Jan 2020 12:16:19 +0100 Subject: [PATCH 162/192] Fix SpacebattleDemo --- examples/Particles/SpacebattleDemo.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/Particles/SpacebattleDemo.cpp b/examples/Particles/SpacebattleDemo.cpp index 65336ad13..b799c6237 100644 --- a/examples/Particles/SpacebattleDemo.cpp +++ b/examples/Particles/SpacebattleDemo.cpp @@ -230,6 +230,8 @@ ParticleDemo("Space battle", sharedData) Ndk::InitializeSystem(); Nz::ModelParameters parameters; + parameters.mesh.texCoordOffset.Set(0.f, 1.f); + parameters.mesh.texCoordScale.Set(1.f, -1.f); parameters.mesh.optimizeIndexBuffers = false; Nz::Color grey(100, 100, 100); @@ -266,7 +268,8 @@ ParticleDemo("Space battle", sharedData) m_turret.cannonModel->GetMaterial(0)->SetNormalMap("resources/Turret/198_norm.jpg"); parameters.mesh.matrix.MakeIdentity(); - parameters.mesh.texCoordScale.Set(1.f, 1.f); + parameters.mesh.texCoordOffset.Set(0.f, 1.f); + parameters.mesh.texCoordScale.Set(1.f, -1.f); parameters.mesh.center = true; m_spacestationModel = Nz::Model::LoadFromFile("resources/SpaceStation/space_station.obj", parameters); @@ -275,7 +278,8 @@ ParticleDemo("Space battle", sharedData) m_spacestationModel->GetMesh()->GenerateNormalsAndTangents(); - parameters.mesh.texCoordScale.Set(1.f, -1.f); + parameters.mesh.texCoordOffset.Set(0.f, 0.f); + parameters.mesh.texCoordScale.Set(1.f, 1.f); parameters.mesh.matrix.MakeRotation(Nz::EulerAnglesf(0.f, -90.f, 0.f)); m_spaceshipModel = Nz::Model::LoadFromFile("resources/space_frigate_6/space_frigate_6.obj", parameters); From c378ad26a99b1689e62e042ba8223548f2cfb7fe Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 5 Jan 2020 14:35:31 +0100 Subject: [PATCH 163/192] SDK/CameraComponent: Add projection scale --- ChangeLog.md | 1 + SDK/include/NDK/Components/CameraComponent.hpp | 3 +++ SDK/include/NDK/Components/CameraComponent.inl | 12 +++++++++++- SDK/src/NDK/Components/CameraComponent.cpp | 18 +++++++++++++++--- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index db55478ac..b5c69575d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -315,6 +315,7 @@ Nazara Development Kit: - ⚠ ConstraintComponent2D has been reworked to handle entity destruction and remove constraints at will - Fixed crash when pressing up/down key with no history in the console - (Rich)TextAreaWidget text style is now alterable +- Added CameraComponent::SetProjectionScale # 0.4: diff --git a/SDK/include/NDK/Components/CameraComponent.hpp b/SDK/include/NDK/Components/CameraComponent.hpp index 92fab2e0e..cf835704a 100644 --- a/SDK/include/NDK/Components/CameraComponent.hpp +++ b/SDK/include/NDK/Components/CameraComponent.hpp @@ -43,6 +43,7 @@ namespace Ndk const Nz::Frustumf& GetFrustum() const override; inline unsigned int GetLayer() const; const Nz::Matrix4f& GetProjectionMatrix() const override; + inline const Nz::Vector3f& GetProjectionScale() const; Nz::ProjectionType GetProjectionType() const override; inline const Nz::Vector2f& GetSize() const; const Nz::RenderTarget* GetTarget() const override; @@ -54,6 +55,7 @@ namespace Ndk inline void SetFOV(float fov); void SetLayer(unsigned int layer); + inline void SetProjectionScale(const Nz::Vector3f& scale); inline void SetProjectionType(Nz::ProjectionType projection); inline void SetSize(const Nz::Vector2f& size); inline void SetSize(float width, float height); @@ -99,6 +101,7 @@ namespace Ndk mutable Nz::Recti m_viewport; const Nz::RenderTarget* m_target; Nz::Vector2f m_size; + Nz::Vector3f m_projectionScale; mutable bool m_frustumUpdated; mutable bool m_projectionMatrixUpdated; mutable bool m_viewMatrixUpdated; diff --git a/SDK/include/NDK/Components/CameraComponent.inl b/SDK/include/NDK/Components/CameraComponent.inl index df6d5a2b3..c8b9226f2 100644 --- a/SDK/include/NDK/Components/CameraComponent.inl +++ b/SDK/include/NDK/Components/CameraComponent.inl @@ -17,6 +17,7 @@ namespace Ndk m_targetRegion(0.f, 0.f, 1.f, 1.f), m_target(nullptr), m_size(0.f), + m_projectionScale(1.f, 1.f, 1.f), m_frustumUpdated(false), m_projectionMatrixUpdated(false), m_viewMatrixUpdated(false), @@ -43,6 +44,7 @@ namespace Ndk m_targetRegion(camera.m_targetRegion), m_target(nullptr), m_size(camera.m_size), + m_projectionScale(camera.m_projectionScale), m_frustumUpdated(false), m_projectionMatrixUpdated(false), m_viewMatrixUpdated(false), @@ -115,11 +117,19 @@ namespace Ndk return m_layer; } + /*! + * \brief Gets the projection scale of the camera + * \return Projection scale + */ + const Nz::Vector3f& CameraComponent::GetProjectionScale() const + { + return m_projectionScale; + } + /*! * \brief Gets the size of the camera * \return Size of the camera */ - inline const Nz::Vector2f & CameraComponent::GetSize() const { return m_size; diff --git a/SDK/src/NDK/Components/CameraComponent.cpp b/SDK/src/NDK/Components/CameraComponent.cpp index a688a0ca5..31dde3ae2 100644 --- a/SDK/src/NDK/Components/CameraComponent.cpp +++ b/SDK/src/NDK/Components/CameraComponent.cpp @@ -154,11 +154,10 @@ namespace Ndk } /*! - * \brief Sets the layer of the camera in case of multiples fields + * \brief Sets the layer of the camera in case of multiples layers * * \param layer Layer of the camera */ - void CameraComponent::SetLayer(unsigned int layer) { m_layer = layer; @@ -166,10 +165,21 @@ namespace Ndk m_entity->Invalidate(); // Invalidate the entity to make it passes through RenderSystem validation } + /*! + * \brief Sets the camera projection scale + * + * \param scale New projection scale + */ + inline void CameraComponent::SetProjectionScale(const Nz::Vector3f& scale) + { + m_projectionScale = scale; + + InvalidateProjectionMatrix(); + } + /*! * \brief Operation to perform when component is attached to an entity */ - void CameraComponent::OnAttached() { if (m_entity->HasComponent()) @@ -304,6 +314,8 @@ namespace Ndk break; } + m_projectionMatrix *= Nz::Matrix4f::Scale(m_projectionScale); + m_projectionMatrixUpdated = true; } From c73d08af9b7c7755bdfbba76fa9998d5e8cec372 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 6 Jan 2020 15:35:48 +0100 Subject: [PATCH 164/192] Core/Thread: Make use of SetThreadDescription if possible (win32) --- ChangeLog.md | 1 + src/Nazara/Core/Win32/ThreadImpl.cpp | 36 ++++++++++++++++++++-------- src/Nazara/Core/Win32/ThreadImpl.hpp | 3 ++- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index b5c69575d..ad7c63e81 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -215,6 +215,7 @@ Nazara Engine: - Added EmptyStream class, useful to measure how many bytes some writing operations will take - SegmentCollider2D: Add support for neighbors (aka "ghost vertices"), allowing to prevent seams collisions - ⚠ OBJLoader flips UV by default, fixing a lot of models UV +- On Windows, Thread::Set(Current)Name now uses `SetThreadDescription` Win32 function if possible instead of triggering a debugger exception. MinGW builds will use this if available too. Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Core/Win32/ThreadImpl.cpp b/src/Nazara/Core/Win32/ThreadImpl.cpp index 4dd557536..0ad2293cc 100644 --- a/src/Nazara/Core/Win32/ThreadImpl.cpp +++ b/src/Nazara/Core/Win32/ThreadImpl.cpp @@ -11,6 +11,9 @@ namespace Nz { + // Windows 10, version 1607 brought SetThreadDescription in order to name a thread + using SetThreadDescriptionFunc = HRESULT(WINAPI*)(HANDLE hThread, PCWSTR lpThreadDescription); + #ifdef NAZARA_COMPILER_MSVC namespace { @@ -50,12 +53,12 @@ namespace Nz void ThreadImpl::SetName(const Nz::String& name) { - SetThreadName(m_threadId, name.GetConstBuffer()); + SetThreadName(m_handle, name); } void ThreadImpl::SetCurrentName(const Nz::String& name) { - SetThreadName(::GetCurrentThreadId(), name.GetConstBuffer()); + SetThreadName(::GetCurrentThread(), name); } void ThreadImpl::Sleep(UInt32 time) @@ -63,9 +66,12 @@ namespace Nz ::Sleep(time); } - void ThreadImpl::SetThreadName(DWORD threadId, const char* threadName) + void ThreadImpl::RaiseThreadNameException(DWORD threadId, const char* threadName) { - #ifdef NAZARA_COMPILER_MSVC +#ifdef NAZARA_COMPILER_MSVC + if (!::IsDebuggerPresent()) + return; + // https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx constexpr DWORD MS_VC_EXCEPTION = 0x406D1388; @@ -75,8 +81,8 @@ namespace Nz info.dwThreadID = threadId; info.dwFlags = 0; - #pragma warning(push) - #pragma warning(disable: 6320 6322) +#pragma warning(push) +#pragma warning(disable: 6320 6322) __try { RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), reinterpret_cast(&info)); @@ -84,10 +90,20 @@ namespace Nz __except (EXCEPTION_EXECUTE_HANDLER) { } - #pragma warning(pop) - #else - NazaraWarning("SetThreadName on Windows is only supported with MSVC for now"); - #endif +#pragma warning(pop) +#else + NazaraWarning("SetThreadDescription is not supported and threadname exception is only supported with MSVC"); +#endif + } + + void ThreadImpl::SetThreadName(HANDLE threadHandle, const Nz::String& name) + { + // Try to use SetThreadDescription if available + static SetThreadDescriptionFunc SetThreadDescription = reinterpret_cast(::GetProcAddress(::GetModuleHandleW(L"Kernel32.dll"), "SetThreadDescription")); + if (SetThreadDescription) + SetThreadDescription(threadHandle, name.GetWideString().data()); + else + RaiseThreadNameException(::GetThreadId(threadHandle), name.GetConstBuffer()); } unsigned int __stdcall ThreadImpl::ThreadProc(void* userdata) diff --git a/src/Nazara/Core/Win32/ThreadImpl.hpp b/src/Nazara/Core/Win32/ThreadImpl.hpp index 8bc25930d..c12697611 100644 --- a/src/Nazara/Core/Win32/ThreadImpl.hpp +++ b/src/Nazara/Core/Win32/ThreadImpl.hpp @@ -30,7 +30,8 @@ namespace Nz static void Sleep(UInt32 time); private: - static void SetThreadName(DWORD threadId, const char* threadName); + static void RaiseThreadNameException(DWORD threadId, const char* threadName); + static void SetThreadName(HANDLE threadHandle, const Nz::String& name); static unsigned int __stdcall ThreadProc(void* userdata); DWORD m_threadId; From 16d034550265837b491331494f4a14be87d579d8 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 6 Jan 2020 18:26:39 +0100 Subject: [PATCH 165/192] Update default font (Cabin => Sansation) --- ChangeLog.md | 1 + src/Nazara/Utility/Font.cpp | 6 +++--- .../Utility/Resources/Fonts/Cabin-Regular.ttf | Bin 188320 -> 0 bytes .../Resources/Fonts/Cabin-Regular.ttf.h | 1 - .../Resources/Fonts/Sansation_Regular.ttf | Bin 0 -> 78464 bytes .../Resources/Fonts/Sansation_Regular.ttf.h | 1 + 6 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf delete mode 100644 src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf.h create mode 100644 src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf create mode 100644 src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf.h diff --git a/ChangeLog.md b/ChangeLog.md index ad7c63e81..5777c2052 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -21,6 +21,7 @@ Miscellaneous: - ⚠ Appveyor nightlies are now compiled with VS2017 - Set libraries' rpath to current folder (.) - Add ReleaseWithDebug target +- ⚠ **Default font has been changed from Cabin to Sansation** Nazara Engine: - VertexMapper:GetComponentPtr no longer throw an error if component is disabled or incompatible with template type, instead a null pointer is returned. diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index c0868c346..7526e71bf 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -13,8 +13,8 @@ namespace Nz { namespace { - const UInt8 r_cabinRegular[] = { - #include + const UInt8 r_sansationRegular[] = { + #include }; } @@ -336,7 +336,7 @@ namespace Nz if (!s_defaultFont) { - s_defaultFont = Font::OpenFromMemory(r_cabinRegular, sizeof(r_cabinRegular)); + s_defaultFont = Font::OpenFromMemory(r_sansationRegular, sizeof(r_sansationRegular)); if (!s_defaultFont) NazaraError("Failed to open default font"); } diff --git a/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf b/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf deleted file mode 100644 index 7c57306e7934854251fde05ba725444db47c63b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188320 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 UOHOBI|4UB)OHTj)M@~2XUs1*s&;S4c diff --git a/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf.h b/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf.h deleted file mode 100644 index d4e6b4702..000000000 --- a/src/Nazara/Utility/Resources/Fonts/Cabin-Regular.ttf.h +++ /dev/null @@ -1 +0,0 @@ -0,1,0,0,0,20,1,0,0,4,0,64,71,80,79,83,151,54,140,15,0,0,1,76,0,0,80,136,71,83,85,66,106,170,88,44,0,0,81,212,0,0,0,226,76,84,83,72,238,121,138,113,0,2,166,40,0,0,1,17,79,83,47,50,107,102,16,29,0,0,82,184,0,0,0,96,86,68,77,88,244,48,222,91,0,2,211,228,0,0,11,186,99,109,97,112,219,189,238,36,0,0,83,24,0,0,3,214,99,118,116,32,10,218,1,14,0,0,86,240,0,0,0,40,102,112,103,109,6,89,156,55,0,0,87,24,0,0,1,115,103,97,115,112,0,7,0,7,0,0,88,140,0,0,0,12,103,108,121,102,165,131,172,68,0,0,88,152,0,1,62,120,104,100,109,120,89,143,73,52,0,2,167,60,0,0,44,168,104,101,97,100,249,107,226,196,0,1,151,16,0,0,0,54,104,104,101,97,8,46,4,154,0,1,151,72,0,0,0,36,104,109,116,120,14,254,41,164,0,1,151,108,0,0,4,52,107,101,114,110,78,121,118,225,0,1,155,160,0,0,248,4,108,111,99,97,52,140,127,38,0,2,147,164,0,0,2,28,109,97,120,112,3,38,4,200,0,2,149,192,0,0,0,32,110,97,109,101,249,131,24,59,0,2,149,224,0,0,11,113,112,111,115,116,73,171,162,27,0,2,161,84,0,0,3,158,112,114,101,112,203,107,102,228,0,2,164,244,0,0,1,52,0,1,0,0,0,10,0,30,0,44,0,1,108,97,116,110,0,8,0,4,0,0,0,0,255,255,0,1,0,0,0,1,107,101,114,110,0,8,0,0,0,1,0,0,0,1,0,4,0,2,0,0,0,2,0,10,21,92,0,1,74,236,0,4,0,0,0,104,0,218,0,224,1,26,1,32,1,130,1,188,1,206,1,216,2,22,2,100,2,162,2,172,2,182,2,188,2,238,2,248,3,46,3,164,3,178,3,216,3,226,4,4,4,22,4,140,4,162,4,184,4,202,5,84,5,126,5,176,5,254,6,104,6,198,7,16,7,70,7,76,8,10,8,28,8,170,9,36,9,110,9,164,9,198,10,108,10,178,10,228,11,34,11,84,11,130,11,188,11,242,12,64,12,106,12,160,12,254,13,48,13,110,13,200,14,30,14,100,14,162,14,208,15,82,15,96,15,134,15,144,15,226,16,40,16,78,16,88,16,106,16,116,16,126,16,144,16,194,16,220,17,6,17,12,17,62,17,68,17,94,17,100,17,122,17,200,17,218,18,44,18,50,18,104,18,138,18,172,18,190,18,252,19,70,19,132,19,174,19,216,20,10,20,64,20,114,20,160,20,174,20,232,20,250,21,64,0,1,0,173,0,29,0,14,0,53,255,202,0,55,255,217,0,56,255,233,0,71,255,242,0,77,255,251,0,85,255,235,0,87,255,243,0,88,255,247,0,158,255,243,0,210,255,210,1,4,255,214,1,6,255,242,1,7,255,247,1,9,255,222,0,1,0,173,0,29,0,24,0,17,255,230,0,21,255,234,0,23,255,229,0,25,255,237,0,26,255,245,0,43,0,22,0,46,255,239,0,71,255,239,0,72,255,232,0,84,255,233,0,85,255,231,0,87,255,231,0,88,255,232,0,158,255,236,0,175,255,232,0,197,255,244,0,244,255,235,0,252,255,237,1,3,255,236,1,4,255,241,1,5,255,230,1,6,255,245,1,7,255,242,1,9,255,248,0,14,0,46,255,238,0,53,0,11,0,55,0,16,0,56,0,9,0,72,255,238,0,133,255,203,0,171,0,16,0,172,0,12,0,173,0,65,0,174,0,43,0,175,255,232,0,251,255,220,0,252,255,238,0,255,255,217,0,4,0,18,255,229,0,19,255,218,0,20,255,238,0,24,255,216,0,2,0,17,255,239,0,18,255,242,0,15,0,17,255,239,0,18,255,242,0,53,255,214,0,55,255,213,0,56,255,226,0,71,255,241,0,85,255,239,0,87,255,227,0,88,255,236,0,158,255,243,1,4,255,222,1,5,255,248,1,6,255,223,1,7,255,232,1,9,255,221,0,19,0,16,255,197,0,17,255,246,0,21,255,217,0,23,255,228,0,46,255,237,0,72,255,218,0,84,255,221,0,133,255,202,0,173,0,13,0,174,0,14,0,175,255,234,0,197,255,231,0,244,255,243,0,249,255,243,0,251,255,200,0,252,255,223,0,255,255,197,1,3,255,235,1,5,255,246,0,15,0,10,255,230,0,13,255,238,0,15,255,238,0,16,255,243,0,24,255,245,0,34,255,246,0,53,255,236,0,55,255,246,0,57,255,246,0,58,255,233,0,59,255,241,0,61,255,248,0,62,255,237,0,94,255,240,0,251,255,245,0,2,0,10,255,245,0,12,255,248,0,2,0,12,255,239,255,255,255,242,0,1,0,10,255,239,0,12,0,10,255,235,0,13,255,240,0,15,255,241,0,53,255,238,0,55,255,244,0,56,255,245,0,58,255,242,0,59,255,248,0,61,255,247,0,91,255,247,0,111,255,245,1,4,255,248,0,2,1,4,255,239,1,9,255,244,0,13,0,10,255,239,0,18,255,248,0,24,255,248,0,53,255,231,0,55,255,240,0,56,255,244,0,58,255,235,0,61,255,244,0,90,255,247,0,111,255,245,1,4,255,225,1,6,255,244,1,9,255,227,0,29,0,4,255,228,0,12,255,220,0,13,255,217,0,15,255,217,0,16,255,200,0,17,255,247,0,21,255,221,0,23,255,232,0,34,255,210,0,46,255,236,0,53,0,17,0,55,0,30,0,56,0,19,0,57,0,22,0,58,0,33,0,62,0,25,0,66,255,223,0,72,255,222,0,84,255,224,0,86,255,233,0,91,255,245,0,94,0,28,0,244,255,245,0,249,255,245,0,251,255,204,0,252,255,226,1,3,255,240,1,5,255,248,255,255,255,238,0,3,0,10,255,238,0,53,255,248,0,58,255,246,0,9,0,10,255,236,0,13,255,234,0,15,255,234,0,16,255,225,0,34,255,232,0,46,255,246,0,59,255,246,0,251,255,229,0,252,255,246,0,2,0,19,255,246,0,24,255,238,0,8,0,53,255,203,0,55,255,227,0,56,255,236,0,57,255,240,0,58,255,211,0,59,255,236,0,210,255,236,1,9,255,241,0,4,0,18,255,239,0,26,255,242,0,158,255,242,0,175,255,250,0,29,0,10,255,231,0,11,255,247,0,19,255,247,0,24,255,243,0,32,255,240,0,53,255,228,0,55,255,240,0,56,255,245,0,57,255,241,0,61,255,241,0,62,255,227,0,71,255,242,0,72,255,249,0,77,255,250,0,85,255,239,0,87,255,239,0,88,255,243,0,89,255,234,0,94,255,231,0,133,255,248,0,158,255,242,0,240,255,244,0,255,255,247,1,4,255,242,1,6,255,248,1,7,255,249,1,8,255,242,1,9,255,243,1,10,255,251,0,5,0,21,255,207,0,158,255,250,0,173,0,31,0,174,0,12,0,175,255,249,0,5,0,20,255,248,0,24,255,240,0,158,255,250,0,175,255,249,0,255,255,226,0,4,0,21,255,220,0,158,255,243,0,173,0,21,0,175,255,246,0,34,0,7,255,245,0,11,0,11,0,13,255,186,0,16,255,199,0,21,255,223,0,23,255,243,0,27,255,243,0,28,255,243,0,33,255,222,0,46,255,239,0,53,0,5,0,62,0,16,0,71,255,244,0,72,255,216,0,85,255,247,0,87,255,247,0,88,255,248,0,89,255,239,0,94,0,19,0,133,255,155,0,158,255,241,0,162,255,206,0,173,0,52,0,174,0,28,0,175,255,222,0,240,0,16,0,244,255,240,0,249,255,240,0,251,255,187,0,252,255,219,0,255,255,146,1,3,255,239,1,5,255,244,1,10,255,250,0,10,0,10,255,248,0,53,255,251,0,71,255,246,0,72,255,250,0,77,255,250,0,85,255,244,0,87,255,244,0,88,255,247,0,158,255,244,1,4,255,251,0,12,0,10,255,246,0,46,255,251,0,71,255,247,0,72,255,241,0,77,255,246,0,85,255,247,0,87,255,247,0,88,255,248,0,158,255,244,0,175,255,243,0,252,255,250,1,5,255,251,0,19,0,7,255,247,0,11,0,9,0,62,0,33,0,71,255,246,0,72,255,238,0,85,255,229,0,87,255,201,0,88,255,211,0,94,0,33,0,110,255,238,0,158,255,245,0,171,0,10,0,173,0,24,0,174,0,41,0,175,255,239,0,240,0,27,1,4,255,247,1,5,255,241,1,7,255,251,0,26,0,11,255,166,0,17,255,243,0,18,255,236,0,21,255,194,0,26,255,227,0,32,255,231,0,53,255,189,0,55,255,154,0,56,255,203,0,61,255,187,0,62,255,240,0,71,255,241,0,72,255,249,0,85,255,232,0,87,255,199,0,88,255,212,0,94,255,241,0,110,255,220,0,158,255,243,0,240,255,166,1,4,255,199,1,5,255,247,1,6,255,194,1,7,255,213,1,9,255,186,255,255,255,198,0,23,0,10,255,242,0,11,255,238,0,18,255,247,0,32,255,242,0,43,255,251,0,53,255,231,0,55,255,236,0,56,255,238,0,61,255,239,0,71,255,240,0,72,255,243,0,77,255,245,0,85,255,236,0,87,255,234,0,88,255,236,0,158,255,238,0,175,255,247,0,240,255,237,1,4,255,240,1,5,255,250,1,6,255,244,1,7,255,243,1,9,255,243,0,18,0,7,255,250,0,10,255,241,0,13,255,175,0,16,255,210,0,20,255,248,0,21,255,242,0,33,255,241,0,46,255,246,0,57,255,242,0,72,255,246,0,77,255,251,0,133,255,187,0,173,0,25,0,174,0,4,0,175,255,234,0,251,255,214,0,252,255,242,0,255,255,182,0,13,0,21,255,234,0,53,255,243,0,55,255,251,0,62,255,240,0,71,255,249,0,72,255,243,0,77,255,248,0,85,255,248,0,87,255,248,0,88,255,250,0,94,255,247,0,158,255,247,0,175,255,242,0,1,0,158,255,244,0,47,0,7,255,241,0,11,0,12,0,13,255,213,0,16,255,205,0,17,255,235,0,21,255,211,0,23,255,218,0,25,255,248,0,27,255,222,0,28,255,222,0,33,255,197,0,46,255,230,0,62,0,18,0,71,255,231,0,72,255,175,0,77,255,250,0,84,255,197,0,85,255,230,0,87,255,173,0,88,255,182,0,89,255,170,0,94,0,21,0,110,255,232,0,133,255,183,0,158,255,227,0,162,255,203,0,171,255,254,0,172,255,254,0,173,0,52,0,174,0,30,0,175,255,215,0,189,255,208,0,197,255,216,0,240,0,16,0,244,255,207,0,249,255,207,0,251,255,186,0,252,255,201,0,255,255,166,1,3,255,225,1,4,255,211,1,5,255,202,1,6,255,213,1,7,255,213,1,8,255,209,1,9,255,214,1,10,255,229,0,4,0,158,255,248,0,173,255,251,0,175,255,242,0,255,255,232,0,35,0,7,255,243,0,11,0,16,0,13,255,213,0,16,255,201,0,17,255,246,0,21,255,220,0,23,255,230,0,28,255,248,0,33,255,213,0,46,255,235,0,62,0,29,0,71,255,244,0,72,255,203,0,84,255,217,0,85,255,239,0,87,255,242,0,88,255,241,0,89,255,243,0,94,0,29,0,110,255,245,0,133,255,196,0,158,255,242,0,171,0,9,0,173,0,44,0,174,0,40,0,175,255,216,0,197,255,227,0,240,0,26,0,244,255,241,0,249,255,241,0,251,255,199,0,252,255,218,0,255,255,186,1,3,255,237,1,5,255,244,0,30,0,7,255,247,0,11,0,17,0,13,255,225,0,16,255,215,0,21,255,233,0,23,255,241,0,33,255,223,0,46,255,239,0,62,0,26,0,71,255,247,0,72,255,216,0,85,255,243,0,87,255,247,0,88,255,247,0,89,255,249,0,94,0,28,0,133,255,209,0,158,255,245,0,171,0,4,0,173,0,44,0,174,0,36,0,175,255,222,0,240,0,23,0,244,255,246,0,249,255,246,0,251,255,215,0,252,255,228,0,255,255,209,1,3,255,245,1,5,255,249,0,18,0,7,255,246,0,62,0,31,0,71,255,245,0,72,255,238,0,85,255,228,0,87,255,207,0,88,255,213,0,94,0,31,0,110,255,238,0,158,255,243,0,171,0,7,0,173,0,23,0,174,0,38,0,175,255,239,0,240,0,24,1,4,255,248,1,5,255,240,1,7,255,251,0,13,0,17,255,233,0,21,255,206,0,23,255,218,0,25,255,246,0,33,255,198,0,158,255,230,0,171,0,16,0,173,0,38,0,174,0,47,0,175,255,216,0,189,255,225,0,197,255,234,0,255,255,174,0,8,0,17,255,243,0,21,255,199,0,23,255,247,0,158,255,239,0,171,0,6,0,173,0,29,0,174,0,37,0,175,255,235,0,41,0,17,255,232,0,21,255,228,0,23,255,229,0,25,255,248,0,43,0,49,0,46,255,244,0,53,0,22,0,55,0,31,0,56,0,27,0,57,0,28,0,75,0,7,0,81,255,223,0,84,255,218,0,85,255,224,0,87,255,216,0,88,255,218,0,89,255,226,0,91,255,219,0,133,255,243,0,158,255,244,0,162,255,228,0,171,0,15,0,173,0,34,0,174,0,45,0,175,255,231,0,189,255,252,0,197,255,232,0,200,255,246,0,244,255,215,0,249,0,32,0,251,255,225,0,252,255,216,0,255,255,236,1,3,255,222,1,4,255,219,1,5,255,215,1,6,255,219,1,7,255,218,1,8,255,228,1,9,255,220,1,10,255,223,0,17,0,17,255,244,0,18,255,241,0,26,255,242,0,43,0,16,0,53,255,205,0,55,255,201,0,56,255,216,0,85,255,240,0,87,255,222,0,88,255,231,0,210,255,214,0,249,0,14,1,4,255,220,1,5,255,243,1,6,255,217,1,7,255,226,1,9,255,215,0,12,0,18,255,234,0,26,255,247,0,38,255,240,0,43,255,240,0,46,255,248,0,52,255,250,0,53,255,173,0,54,255,227,0,55,255,193,0,56,255,210,0,58,255,165,0,158,255,249,0,15,0,18,255,235,0,19,255,232,0,24,255,226,0,38,255,237,0,43,255,237,0,46,255,239,0,52,255,237,0,53,255,171,0,54,255,238,0,55,255,193,0,56,255,212,0,57,255,217,0,58,255,167,0,59,255,227,0,158,255,248,0,12,0,21,255,231,0,24,255,245,0,38,255,247,0,43,255,247,0,46,255,251,0,52,255,244,0,53,255,190,0,54,255,243,0,55,255,236,0,56,255,241,0,58,255,218,0,175,255,251,0,11,0,7,255,244,0,38,255,242,0,43,255,242,0,46,255,240,0,52,255,246,0,53,255,245,0,54,255,240,0,55,255,250,0,56,255,248,0,58,255,251,0,59,255,245,0,14,0,18,255,235,0,19,255,245,0,24,255,230,0,38,255,241,0,43,255,241,0,46,255,243,0,52,255,241,0,53,255,187,0,54,255,240,0,55,255,209,0,56,255,213,0,57,255,243,0,58,255,174,0,59,255,243,0,13,0,7,255,235,0,13,255,229,0,16,255,234,0,21,255,244,0,33,255,239,0,38,255,244,0,43,255,244,0,46,255,229,0,54,255,247,0,59,255,243,0,72,255,252,0,94,0,8,0,175,255,224,0,19,0,7,255,244,0,10,0,5,0,16,0,14,0,24,255,225,0,32,255,217,0,38,255,245,0,43,0,45,0,46,255,242,0,53,255,208,0,54,255,246,0,55,255,247,0,56,255,250,0,57,255,250,0,58,255,238,0,59,255,245,0,62,0,25,0,75,0,19,0,94,0,29,0,175,255,250,0,10,0,7,255,242,0,32,255,237,0,53,255,166,0,54,255,251,0,55,255,245,0,56,255,251,0,58,255,217,0,62,255,239,0,72,255,238,0,175,255,230,0,13,0,7,255,244,0,11,255,246,0,38,255,240,0,43,255,240,0,46,255,248,0,53,255,234,0,54,255,228,0,55,255,239,0,56,255,237,0,58,255,241,0,85,255,251,0,87,255,249,0,88,255,251,0,23,0,7,255,237,0,10,255,232,0,13,255,227,0,16,255,225,0,20,255,231,0,21,255,238,0,24,255,200,0,32,255,202,0,33,255,232,0,38,255,243,0,43,255,243,0,46,255,230,0,53,255,163,0,54,255,247,0,55,255,243,0,56,255,247,0,57,255,214,0,58,255,225,0,59,255,227,0,62,255,217,0,72,255,250,0,94,255,228,0,175,255,218,0,12,0,24,255,234,0,38,255,241,0,43,255,241,0,46,255,245,0,52,255,248,0,53,255,202,0,54,255,238,0,55,255,216,0,56,255,224,0,57,255,244,0,58,255,209,0,59,255,245,0,15,0,7,255,246,0,21,255,234,0,24,255,246,0,32,255,229,0,38,255,248,0,43,255,248,0,46,255,248,0,53,255,209,0,54,255,246,0,55,255,237,0,56,255,243,0,58,255,211,0,62,255,230,0,94,255,242,0,175,255,251,0,22,0,7,255,238,0,10,255,231,0,13,255,227,0,16,255,223,0,20,255,231,0,24,255,200,0,32,255,206,0,33,255,240,0,38,255,242,0,43,255,242,0,46,255,229,0,53,255,170,0,54,255,245,0,55,255,237,0,56,255,242,0,57,255,208,0,58,255,210,0,59,255,224,0,62,255,214,0,72,255,250,0,94,255,227,0,175,255,238,0,21,0,7,255,240,0,10,255,232,0,13,255,235,0,16,255,231,0,20,255,240,0,24,255,207,0,32,255,211,0,33,255,247,0,38,255,243,0,43,255,243,0,46,255,232,0,53,255,178,0,54,255,246,0,55,255,236,0,56,255,242,0,57,255,213,0,58,255,211,0,59,255,228,0,62,255,218,0,94,255,229,0,175,255,246,0,17,0,7,255,238,0,32,255,227,0,38,255,247,0,43,255,247,0,46,255,250,0,52,255,248,0,53,255,167,0,54,255,244,0,55,255,236,0,56,255,242,0,58,255,208,0,61,255,247,0,62,255,230,0,72,255,247,0,94,255,237,0,175,255,240,0,240,255,248,0,15,0,19,255,227,0,20,255,230,0,24,255,198,0,33,255,238,0,38,255,243,0,43,255,243,0,46,255,229,0,53,255,168,0,54,255,245,0,55,255,238,0,56,255,242,0,57,255,208,0,58,255,211,0,59,255,225,0,175,255,236,0,11,0,21,255,225,0,24,255,244,0,38,255,242,0,43,255,242,0,46,255,245,0,53,255,203,0,54,255,239,0,55,255,240,0,56,255,243,0,58,255,227,0,175,255,247,0,32,0,17,255,238,0,21,255,238,0,23,255,235,0,43,0,47,0,46,255,247,0,53,0,21,0,55,0,29,0,56,0,25,0,57,0,28,0,85,255,231,0,87,255,227,0,88,255,228,0,89,255,238,0,158,255,247,0,171,0,12,0,173,0,33,0,174,0,44,0,175,255,234,0,189,255,249,0,244,255,233,0,249,0,30,0,251,255,236,0,252,255,228,0,255,255,247,1,3,255,232,1,4,255,230,1,5,255,225,1,6,255,231,1,7,255,229,1,8,255,246,1,9,255,232,1,10,255,238,0,3,0,53,255,200,0,55,255,236,0,56,255,244,0,9,0,46,255,247,0,53,255,230,0,55,255,243,0,56,255,248,0,57,255,236,0,133,255,236,0,251,255,236,0,252,255,248,0,255,255,235,0,2,0,21,255,229,0,23,255,239,0,20,0,43,0,19,0,46,255,238,0,53,255,192,0,55,255,233,0,56,255,241,0,57,255,231,0,72,255,243,0,75,0,20,0,77,255,247,0,89,255,248,0,133,255,235,0,175,255,240,0,244,255,246,0,251,255,227,0,252,255,233,0,255,255,231,1,5,255,244,1,8,255,243,1,9,255,246,1,10,255,240,0,17,0,10,255,228,0,13,255,177,0,16,255,221,0,32,255,223,0,46,255,251,0,53,255,202,0,55,255,248,0,57,255,205,0,61,255,247,0,62,255,214,0,66,255,247,0,89,255,250,0,94,255,226,0,133,255,201,0,251,255,233,0,252,255,251,1,8,255,250,0,9,0,10,255,239,0,11,255,241,0,71,255,250,0,85,255,247,0,87,255,245,0,88,255,248,0,89,255,251,0,90,255,245,0,240,255,242,0,2,0,62,255,246,0,94,255,248,0,4,0,61,255,220,0,94,255,248,0,210,255,195,0,213,255,195,0,2,0,62,255,245,0,94,255,248,0,2,0,11,0,30,0,240,0,28,0,4,0,11,0,18,0,62,0,9,0,94,0,14,0,240,0,18,0,12,0,3,0,29,0,8,0,29,0,11,0,76,0,32,0,39,0,61,0,13,0,62,0,44,0,94,0,33,0,209,0,37,0,210,0,24,0,212,0,37,0,213,0,24,0,240,0,81,0,6,0,11,0,43,0,32,0,27,0,61,0,14,0,62,0,39,0,94,0,44,0,240,0,48,0,10,0,7,255,247,0,10,255,232,0,11,255,240,0,13,255,247,0,32,255,242,0,61,255,246,0,62,255,240,0,89,255,248,0,94,255,243,0,240,255,241,0,1,0,173,0,37,0,12,0,7,255,239,0,11,0,5,0,16,255,209,0,33,255,210,0,110,255,245,0,161,255,187,0,169,255,174,0,173,0,44,0,174,0,28,0,189,255,224,0,197,255,232,0,240,0,9,0,1,0,173,0,37,0,6,0,161,255,187,0,169,255,174,0,173,0,44,0,174,0,28,0,189,255,224,0,197,255,232,0,1,0,143,0,6,0,5,0,133,255,228,0,143,0,10,0,173,0,11,0,251,255,236,0,255,255,235,0,19,0,2,255,247,0,10,255,228,0,11,255,241,0,18,255,242,0,19,255,240,0,24,255,229,0,26,255,248,0,32,255,221,0,61,255,220,0,62,255,214,0,94,255,224,0,240,255,235,0,255,255,247,1,4,255,238,1,6,255,244,1,7,255,246,1,8,255,243,1,9,255,233,1,10,255,250,0,4,0,21,255,221,0,32,255,242,0,62,255,238,0,94,255,246,0,20,0,10,255,224,0,11,255,244,0,16,255,246,0,18,255,241,0,19,255,229,0,24,255,222,0,32,255,223,0,61,255,222,0,62,255,213,0,94,255,222,0,240,255,240,0,251,255,247,0,252,255,251,0,255,255,231,1,4,255,242,1,6,255,247,1,7,255,249,1,8,255,232,1,9,255,234,1,10,255,242,0,1,0,21,255,241,0,13,0,10,255,240,0,13,255,199,0,16,255,217,0,20,255,245,0,21,255,247,0,24,255,218,0,32,255,218,0,33,255,242,0,62,255,215,0,94,255,228,0,251,255,213,0,252,255,243,0,255,255,188,0,8,0,10,255,239,0,11,255,244,0,24,255,247,0,32,255,236,0,61,255,240,0,62,255,226,0,94,255,232,0,240,255,239,0,8,0,10,255,235,0,24,255,244,0,32,255,237,0,61,255,243,0,62,255,217,0,94,255,233,0,240,255,243,0,252,255,252,0,4,0,21,255,247,0,62,255,234,0,94,255,248,1,3,255,252,0,15,0,11,255,221,0,17,255,246,0,18,255,232,0,26,255,237,0,32,255,232,0,61,255,201,0,62,255,231,0,94,255,236,0,110,255,236,0,240,255,220,1,4,255,210,1,5,255,243,1,6,255,219,1,7,255,227,1,9,255,205,0,18,0,10,255,237,0,11,255,238,0,18,255,241,0,24,255,243,0,26,255,247,0,32,255,229,0,61,255,223,0,62,255,220,0,94,255,228,0,110,255,248,0,240,255,234,0,244,255,252,0,249,255,252,1,4,255,238,1,5,255,249,1,6,255,240,1,7,255,241,1,9,255,236,0,15,0,10,255,227,0,13,255,188,0,16,255,223,0,19,255,245,0,20,255,234,0,24,255,215,0,32,255,223,0,61,255,243,0,62,255,213,0,94,255,224,0,251,255,227,0,252,255,248,0,255,255,199,1,8,255,243,1,10,255,251,0,10,0,21,255,242,0,24,255,244,0,32,255,226,0,61,255,228,0,62,255,224,0,94,255,232,0,240,255,243,1,4,255,249,1,6,255,252,1,9,255,246,0,10,0,10,255,233,0,11,255,245,0,24,255,244,0,32,255,232,0,61,255,239,0,62,255,223,0,94,255,230,0,240,255,238,0,255,255,250,1,8,255,252,0,12,0,10,255,241,0,13,255,222,0,16,255,220,0,21,255,230,0,24,255,219,0,32,255,216,0,33,255,223,0,62,255,218,0,94,255,230,0,251,255,210,0,252,255,238,0,255,255,195,0,13,0,10,255,230,0,13,255,248,0,16,255,243,0,24,255,240,0,32,255,236,0,61,255,246,0,62,255,215,0,94,255,225,0,240,255,245,0,251,255,244,0,252,255,249,0,255,255,247,1,10,255,252,0,12,0,10,255,245,0,13,255,223,0,16,255,217,0,21,255,243,0,24,255,223,0,32,255,222,0,33,255,230,0,62,255,217,0,94,255,230,0,251,255,219,0,252,255,240,0,255,255,213,0,11,0,10,255,243,0,13,255,231,0,16,255,226,0,24,255,223,0,32,255,222,0,33,255,239,0,62,255,218,0,94,255,230,0,251,255,227,0,252,255,242,0,255,255,221,0,3,0,21,255,247,0,62,255,233,0,94,255,247,0,14,0,10,255,248,0,13,255,221,0,16,255,215,0,21,255,226,0,23,255,247,0,24,255,225,0,32,255,222,0,33,255,219,0,62,255,218,0,94,255,232,0,251,255,205,0,252,255,236,0,255,255,198,1,3,255,252,0,4,0,21,255,220,0,32,255,227,0,62,255,222,0,94,255,236,0,17,0,11,255,197,0,17,255,241,0,18,255,231,0,21,255,199,0,26,255,228,0,32,255,228,0,61,255,186,0,62,255,227,0,94,255,233,0,110,255,221,0,240,255,192,1,4,255,207,1,5,255,245,1,6,255,186,1,7,255,210,1,9,255,176,255,255,255,208,0,4,0,19,255,239,0,20,255,246,0,24,255,235,0,18,255,240,0,2,54,70,0,4,0,0,54,206,56,224,0,89,0,77,0,0,255,248,255,146,255,220,255,237,255,245,255,234,255,238,255,241,255,203,255,237,255,223,255,218,255,243,255,234,255,146,255,213,255,243,255,236,255,244,255,241,255,146,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,210,255,203,255,250,255,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,231,255,224,0,0,0,0,0,0,255,224,0,0,0,0,255,227,255,231,255,243,255,229,255,243,255,245,255,243,255,233,255,247,255,235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,124,255,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,234,255,222,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,255,231,0,0,0,0,255,193,255,216,255,238,255,248,255,242,255,237,255,247,255,248,255,247,255,248,255,225,255,243,255,238,255,236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,146,255,215,0,0,255,222,0,0,255,242,0,0,0,0,255,243,0,0,0,0,0,0,255,124,255,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,208,255,218,255,214,0,0,0,0,0,0,255,222,0,0,0,7,255,230,0,0,0,0,255,243,0,0,0,0,0,0,255,228,255,241,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,218,0,0,0,0,0,0,255,226,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,255,232,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,255,247,0,0,255,250,255,213,255,192,255,244,255,217,0,0,255,245,0,0,0,0,255,240,0,0,0,0,0,0,255,205,255,204,255,202,255,207,255,219,0,0,0,0,255,241,255,229,0,0,0,0,255,214,0,0,255,213,0,0,255,212,255,239,255,208,255,249,255,221,255,228,255,246,255,241,255,212,255,246,255,223,255,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,255,229,255,251,255,236,0,0,0,0,0,0,255,251,0,0,255,250,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,0,0,0,0,0,0,255,195,0,0,0,0,0,0,255,242,0,0,255,226,0,0,255,246,0,0,0,0,255,241,255,249,0,0,255,242,0,0,0,0,0,0,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,249,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,249,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,237,0,0,0,0,0,0,255,250,255,250,255,226,0,0,255,240,0,0,255,249,0,0,255,242,255,244,255,248,255,250,255,250,0,0,255,241,0,0,0,0,255,227,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,249,255,250,0,0,0,0,255,247,255,228,255,243,255,248,255,225,255,235,0,0,0,0,255,244,0,0,0,0,255,245,0,0,255,251,0,0,255,237,255,244,255,249,0,0,0,0,255,229,0,0,255,246,0,0,0,0,0,0,255,249,255,249,255,228,255,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,0,0,0,0,0,0,255,244,0,0,0,0,0,0,255,240,255,251,255,235,0,0,255,246,0,0,0,0,255,238,255,240,0,0,255,245,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,243,0,0,255,248,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,186,255,203,255,199,255,212,255,217,255,236,255,186,255,234,0,0,0,0,255,217,255,248,0,0,255,248,0,0,0,0,0,0,255,211,255,236,255,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,249,0,0,0,0,255,217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,255,249,255,242,0,0,0,0,0,0,0,0,0,0,255,250,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,241,0,0,255,243,0,0,0,0,255,250,0,0,0,0,0,0,255,246,255,242,255,246,0,0,0,0,0,0,0,0,0,0,255,245,255,247,0,0,0,0,0,0,0,0,0,0,255,247,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,247,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,255,247,255,248,0,0,0,0,0,0,255,251,0,0,0,0,255,247,255,247,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,255,242,255,246,0,0,0,0,0,0,0,0,0,0,255,245,255,247,0,0,0,0,0,0,0,0,0,0,255,247,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,0,0,0,0,0,0,255,222,0,0,255,227,0,0,255,224,0,0,0,0,255,232,255,199,0,0,255,228,0,0,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,196,0,0,0,0,0,0,255,246,0,0,255,222,0,0,255,249,255,166,255,158,255,249,255,181,0,0,255,232,0,0,0,0,255,238,0,0,0,0,0,0,255,167,255,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,244,255,250,0,0,0,0,255,251,255,238,255,233,255,244,255,233,255,251,255,251,255,251,0,0,255,248,255,246,255,249,0,0,255,236,255,236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,242,255,239,0,0,0,0,0,0,255,251,255,250,255,229,255,250,255,242,255,228,255,250,0,0,255,242,255,245,255,247,255,250,255,250,0,0,255,242,0,0,0,0,255,230,255,251,0,0,0,0,0,0,0,0,0,0,0,0,255,249,255,250,0,0,0,0,255,247,255,232,255,244,255,248,255,229,255,238,0,0,0,0,255,245,255,251,0,0,255,246,0,0,0,0,0,0,255,240,255,245,255,250,0,0,0,0,255,231,0,0,255,246,0,0,0,0,0,0,255,250,255,249,255,229,255,227,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,175,255,216,255,242,255,243,255,248,0,0,255,175,0,0,0,0,0,0,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,237,0,0,255,242,0,0,255,248,0,0,255,245,255,244,255,248,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,255,250,255,240,0,0,0,0,0,0,0,0,0,0,255,250,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,255,243,255,241,255,242,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,241,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,250,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,216,255,214,255,202,255,195,255,177,0,0,255,195,255,213,255,197,0,0,0,0,255,169,255,171,0,0,255,232,0,0,0,0,0,0,255,168,255,208,255,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,255,247,0,0,0,0,255,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,255,234,0,0,0,0,0,0,255,248,255,242,255,240,0,0,255,233,0,0,255,245,0,0,255,243,255,240,255,242,255,243,255,243,0,0,255,243,0,0,0,0,0,0,255,242,255,250,0,0,0,0,0,0,0,0,0,0,255,240,255,244,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,250,255,249,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,255,250,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,245,255,243,255,245,0,0,0,0,0,0,255,250,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,238,255,213,255,207,255,216,255,196,0,0,255,220,255,213,255,214,0,0,0,0,255,220,255,243,0,0,255,244,0,0,0,0,0,0,255,220,255,243,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,255,226,255,219,255,216,255,217,255,219,255,230,255,225,255,230,0,0,0,0,255,227,255,248,0,0,255,249,0,0,0,0,0,0,255,224,255,247,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,255,223,0,0,255,226,0,0,255,224,0,0,0,0,255,232,255,206,0,0,255,229,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,237,255,215,255,201,0,0,0,0,0,0,255,232,255,180,255,180,0,0,255,181,0,0,255,197,255,222,255,215,255,192,255,189,255,171,255,186,255,198,255,215,255,193,0,0,0,0,255,190,255,217,0,0,255,230,0,0,0,0,0,0,255,187,255,229,255,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,237,255,221,255,214,0,0,0,0,0,0,0,0,255,248,0,13,0,13,0,7,0,0,255,215,255,216,0,33,255,230,0,33,255,228,0,0,0,0,0,0,0,0,0,0,0,31,255,225,0,0,255,223,255,223,255,235,255,235,255,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,229,0,0,0,0,0,0,0,0,255,251,255,217,0,0,0,0,255,246,255,227,255,245,255,214,0,0,255,234,0,0,0,0,255,224,255,242,0,0,255,238,0,0,0,0,0,0,255,235,255,248,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,241,0,23,255,233,0,24,255,237,0,0,0,0,0,0,255,250,0,0,0,23,0,0,0,0,255,246,255,246,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,227,255,218,255,213,0,0,0,0,0,0,255,214,0,0,0,36,255,215,255,216,0,0,255,226,0,0,0,0,0,0,255,214,0,0,255,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,220,255,201,0,0,255,219,0,0,255,236,0,0,0,0,255,234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,234,0,0,0,0,255,236,255,240,255,237,0,0,0,0,0,0,0,0,0,0,0,0,255,186,255,183,0,0,0,0,0,0,0,0,0,0,255,251,255,246,0,0,0,0,0,0,0,0,0,0,0,0,255,231,255,229,255,210,0,0,255,238,255,243,255,231,255,248,255,230,0,0,0,0,0,0,0,0,0,0,255,246,255,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,240,0,0,0,0,0,0,0,0,255,246,0,0,255,234,0,0,0,0,255,245,255,237,255,246,0,0,0,0,0,0,0,0,255,246,0,0,255,181,255,178,0,0,0,0,0,0,0,0,0,0,255,251,255,250,255,238,0,0,0,0,0,0,0,0,0,0,255,232,255,224,255,217,0,0,255,247,255,251,255,226,0,0,255,234,0,0,0,0,0,0,0,0,0,0,255,227,255,217,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,219,0,0,0,0,0,0,255,249,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,216,255,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,228,255,240,0,0,0,0,0,0,255,239,0,0,255,245,0,0,0,0,0,0,0,0,0,0,255,244,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,242,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,255,251,255,241,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,189,255,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,255,238,255,223,255,220,0,0,255,252,0,0,255,227,0,0,255,237,0,0,0,0,0,0,0,0,0,0,255,230,255,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,232,255,229,255,211,255,251,255,246,0,0,255,239,255,229,0,0,0,0,0,0,0,0,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,223,255,221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,238,255,163,0,0,255,242,255,238,255,243,255,238,255,241,255,231,0,0,0,0,0,0,255,187,255,184,255,162,255,198,255,214,255,249,255,245,255,251,255,248,0,0,255,248,0,0,0,0,0,0,0,0,255,235,255,224,255,214,0,0,255,243,255,248,255,225,0,0,255,235,0,0,0,0,0,0,0,0,0,0,255,232,255,216,0,0,255,233,0,0,0,0,0,0,0,0,0,0,255,248,255,231,255,238,0,0,0,0,255,244,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,255,242,255,244,255,242,255,244,255,238,0,0,0,0,0,0,0,0,0,0,255,242,255,247,255,246,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,255,251,255,234,0,0,255,238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,234,0,0,0,0,0,0,0,0,0,0,0,0,255,229,255,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,255,247,0,0,0,0,255,247,0,0,0,0,255,249,255,240,255,237,0,0,0,0,0,0,0,0,0,0,0,0,255,245,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,0,0,0,0,255,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,240,0,0,0,0,0,0,0,0,0,0,0,0,255,236,255,167,0,0,255,245,255,237,255,246,255,237,255,238,255,238,0,0,255,246,0,0,255,182,255,179,255,173,255,192,255,212,255,218,255,227,255,251,255,249,255,237,255,248,0,0,0,0,0,0,0,0,255,234,255,222,255,214,0,0,255,247,255,251,255,222,0,0,255,236,0,0,0,0,0,0,0,0,0,0,255,224,255,213,255,247,255,223,0,0,0,0,0,0,0,0,0,0,0,0,255,230,255,237,255,229,0,0,255,244,0,0,0,0,0,0,0,0,0,0,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,183,0,0,0,0,255,242,255,244,255,242,255,243,255,235,0,0,0,0,0,0,255,211,255,209,255,164,255,216,255,218,255,246,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,255,223,255,228,0,0,0,0,0,0,255,226,0,0,255,239,0,0,0,0,0,0,0,0,0,0,255,233,255,215,0,0,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,234,255,227,255,211,255,249,255,243,0,0,255,237,255,227,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,233,255,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,203,255,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,224,255,225,0,0,0,0,0,0,255,229,0,0,255,235,0,0,0,0,0,0,0,0,0,0,255,231,255,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,252,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,234,255,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,227,255,216,255,250,255,247,255,252,0,0,255,227,0,0,0,0,0,0,0,0,0,0,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,226,255,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,236,255,223,255,252,255,251,0,0,0,0,255,235,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,227,255,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,255,252,255,238,0,0,255,236,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,240,0,0,0,0,0,0,0,0,0,0,0,0,255,224,255,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,238,255,225,255,220,0,0,0,0,0,0,0,0,255,250,0,0,0,0,0,0,0,0,0,0,0,0,255,225,255,214,255,250,255,246,255,252,0,0,255,225,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,227,255,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,205,0,0,0,0,0,0,0,0,255,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,231,255,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,255,251,0,0,0,0,0,0,0,0,0,0,255,240,0,0,0,0,0,0,255,245,0,0,255,232,0,0,0,0,0,0,0,0,0,0,0,0,255,242,255,244,0,0,0,0,0,0,0,0,0,0,0,0,255,219,255,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,221,255,242,0,0,0,0,0,0,255,232,0,0,255,242,0,0,0,0,0,0,0,0,0,0,255,246,255,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,244,255,229,255,222,255,229,0,0,0,0,255,223,0,0,0,34,255,225,255,227,0,0,255,231,0,0,0,0,0,0,255,227,255,232,255,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,0,0,255,248,0,0,255,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,229,255,197,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,0,0,255,240,255,238,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,255,241,255,198,0,0,255,248,0,0,0,0,0,0,255,234,0,0,0,0,255,233,0,0,0,0,255,204,255,195,255,220,255,230,255,224,255,223,0,0,255,247,255,236,255,248,255,226,255,227,255,223,255,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,240,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,233,255,241,255,243,255,241,0,0,0,0,255,246,0,0,255,219,255,243,0,0,255,247,0,0,255,247,0,0,255,245,255,241,255,241,255,246,0,0,0,0,0,0,0,0,0,0,0,0,255,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,255,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,177,255,235,0,0,0,0,0,0,0,0,255,177,0,0,0,0,255,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,255,247,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,236,255,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,123,0,0,0,0,0,0,0,0,255,236,255,189,255,190,255,235,255,217,255,209,255,241,0,0,255,124,255,205,255,194,255,182,255,193,0,0,0,0,255,228,0,0,0,0,255,213,255,227,0,0,0,0,0,0,0,0,0,0,255,211,255,217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,255,248,255,225,255,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,226,255,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,245,0,0,0,0,0,0,0,0,0,0,0,0,255,110,0,0,0,0,0,0,0,0,255,234,255,174,255,184,255,237,255,210,255,203,255,234,255,181,255,110,255,200,255,179,255,167,255,178,255,192,255,110,255,223,0,0,0,6,255,200,255,215,0,0,255,234,0,0,0,0,0,0,255,198,255,204,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,255,244,255,213,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,214,255,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,220,0,0,255,248,255,248,0,0,0,0,255,234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,146,255,215,0,0,255,222,0,0,255,242,0,0,0,0,255,243,0,0,0,0,0,0,0,0,255,121,255,214,255,213,255,226,0,0,0,0,255,241,255,239,0,0,255,242,255,222,0,0,255,221,0,0,0,0,0,0,0,0,0,0,255,227,255,236,0,0,0,0,0,0,255,248,255,223,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,240,0,0,255,248,255,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,217,255,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,240,255,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,197,0,0,0,0,0,0,0,0,0,0,255,233,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,227,255,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,199,0,0,0,0,0,0,0,0,0,0,255,199,255,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,237,255,243,0,0,0,0,0,0,255,233,0,0,255,243,0,0,0,0,0,0,0,0,0,0,255,235,255,217,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,255,227,0,0,255,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,208,0,0,0,0,0,0,0,0,0,0,255,221,0,0,255,244,255,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,203,255,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,252,255,241,255,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,255,232,255,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,228,255,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,255,234,255,235,255,244,255,244,255,223,255,222,0,0,0,0,0,0,255,223,0,0,255,240,0,0,255,247,255,250,0,0,0,0,255,224,255,214,255,248,255,223,0,0,0,0,0,0,0,0,0,0,0,0,255,242,0,0,255,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,188,0,0,0,0,0,0,0,0,0,0,255,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,225,255,222,0,0,0,0,0,0,0,0,255,226,255,222,255,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,223,0,0,0,0,0,0,0,0,255,240,255,223,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,232,0,0,0,0,0,0,0,0,255,247,255,231,255,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,243,0,0,0,0,0,0,0,0,0,0,255,227,0,0,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,238,255,221,0,0,0,0,0,0,0,0,255,223,255,221,255,235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,236,0,0,0,0,0,0,0,0,0,0,255,226,0,0,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,28,0,3,0,3,0,0,0,7,0,9,0,1,0,11,0,13,0,4,0,15,0,26,0,7,0,30,0,30,0,19,0,33,0,40,0,20,0,43,0,46,0,28,0,49,0,49,0,32,0,51,0,61,0,33,0,66,0,72,0,44,0,76,0,77,0,51,0,83,0,85,0,53,0,87,0,92,0,56,0,97,0,97,0,62,0,110,0,111,0,63,0,126,0,126,0,65,0,157,0,158,0,66,0,161,0,163,0,68,0,171,0,175,0,71,0,209,0,210,0,76,0,212,0,213,0,78,0,221,0,221,0,80,0,240,0,246,0,81,0,249,0,252,0,88,1,0,1,0,0,92,1,2,1,10,0,93,1,12,1,12,0,102,255,255,255,255,0,103,0,2,0,22,0,3,0,3,0,0,0,7,0,7,0,1,0,9,0,9,0,2,0,13,0,16,0,3,0,21,0,21,0,7,0,24,0,24,0,8,0,33,0,61,0,9,0,66,0,92,0,38,0,97,0,97,0,65,0,107,0,107,0,66,0,110,0,110,0,67,0,122,0,122,0,68,0,126,0,149,0,69,0,151,0,181,0,93,0,183,0,190,0,124,0,193,0,200,0,132,0,207,0,214,0,140,0,220,0,221,0,148,0,240,0,245,0,150,0,247,0,248,0,156,0,250,1,2,0,158,1,4,1,12,0,167,0,1,0,7,1,6,0,1,0,0,0,2,0,0,0,0,0,0,0,3,0,4,0,5,0,6,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,17,0,18,0,19,0,20,0,21,0,17,0,22,0,23,0,22,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,0,0,0,0,0,0,0,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,43,0,44,0,45,0,42,0,42,0,46,0,46,0,47,0,48,0,49,0,50,0,47,0,51,0,52,0,53,0,54,0,55,0,56,0,0,0,0,0,0,0,0,0,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,0,0,0,0,0,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,0,0,0,0,0,0,0,61,0,10,0,10,0,10,0,10,0,10,0,10,0,14,0,12,0,14,0,14,0,14,0,14,0,17,0,17,0,17,0,17,0,13,0,17,0,22,0,22,0,22,0,22,0,22,0,0,0,22,0,27,0,27,0,27,0,27,0,31,0,62,0,63,0,35,0,35,0,35,0,35,0,35,0,35,0,39,0,37,0,39,0,39,0,39,0,39,0,43,0,43,0,43,0,43,0,64,0,42,0,46,0,46,0,46,0,46,0,46,0,0,0,46,0,47,0,47,0,47,0,47,0,54,0,36,0,54,0,0,0,0,0,43,0,14,0,39,0,25,0,49,0,31,0,32,0,55,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,65,0,66,0,67,0,65,0,66,0,67,0,0,0,0,0,0,0,0,0,0,0,58,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,71,0,72,0,73,0,70,0,74,0,0,0,75,0,75,0,0,0,76,0,69,0,78,0,75,0,79,0,70,0,80,0,79,0,81,0,0,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,70,0,77,0,1,0,2,1,11,0,73,0,23,0,0,0,0,0,0,0,1,0,23,0,0,0,64,0,50,0,0,0,2,0,14,0,15,0,3,0,0,0,74,0,76,0,0,0,4,0,0,0,5,0,67,0,0,0,0,0,70,0,71,0,0,0,0,0,0,0,51,0,6,0,16,0,27,0,28,0,27,0,29,0,27,0,28,0,27,0,27,0,75,0,27,0,27,0,7,0,27,0,28,0,27,0,28,0,27,0,30,0,37,0,31,0,38,0,39,0,40,0,24,0,41,0,0,0,52,0,65,0,0,0,0,0,0,0,17,0,62,0,18,0,18,0,18,0,42,0,8,0,62,0,63,0,63,0,62,0,53,0,32,0,32,0,18,0,32,0,18,0,32,0,19,0,43,0,25,0,54,0,55,0,44,0,26,0,33,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0,16,0,16,0,16,0,16,0,16,0,16,0,9,0,28,0,29,0,29,0,29,0,29,0,27,0,27,0,27,0,27,0,27,0,27,0,28,0,28,0,28,0,28,0,28,0,0,0,28,0,31,0,31,0,31,0,31,0,24,0,27,0,45,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,18,0,18,0,18,0,18,0,18,0,63,0,63,0,63,0,63,0,10,0,32,0,18,0,18,0,18,0,18,0,18,0,0,0,18,0,25,0,25,0,25,0,25,0,26,0,32,0,26,0,0,0,0,0,63,0,28,0,18,0,30,0,19,0,24,0,41,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,14,0,35,0,36,0,21,0,35,0,36,0,21,0,0,0,0,0,0,0,15,0,0,0,20,0,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,0,34,0,22,0,34,0,68,0,34,0,22,0,34,0,34,0,69,0,34,0,11,0,13,0,34,0,22,0,12,0,34,0,22,0,34,0,72,0,46,0,59,0,60,0,61,0,47,0,48,0,49,0,22,0,34,0,1,0,0,0,10,0,32,0,58,0,1,108,97,116,110,0,8,0,4,0,0,0,0,255,255,0,2,0,0,0,1,0,2,97,97,108,116,0,14,115,109,99,112,0,20,0,0,0,1,0,0,0,0,0,1,0,1,0,2,0,6,0,14,0,1,0,0,0,1,0,78,0,1,0,0,0,1,0,8,0,2,0,124,0,28,0,251,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,1,12,0,252,0,253,0,254,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,0,255,1,11,0,2,0,62,0,28,0,251,0,241,0,242,0,243,0,244,0,245,0,246,0,247,0,248,0,249,0,250,1,12,0,252,0,253,0,254,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,0,255,1,11,0,2,0,3,0,66,0,91,0,0,0,165,0,165,0,26,0,195,0,195,0,27,0,0,0,3,1,245,1,144,0,5,0,0,2,188,2,138,0,0,0,140,2,188,2,138,0,0,1,221,0,50,0,250,8,2,2,11,8,3,5,2,2,2,0,4,128,0,0,47,0,0,0,11,0,0,0,0,0,0,0,0,80,89,82,83,0,64,0,32,33,34,3,197,255,6,0,0,3,197,0,250,0,0,0,1,0,0,0,0,1,234,2,188,0,0,0,32,0,2,0,0,0,3,0,0,0,3,0,0,2,222,0,1,0,0,0,0,0,28,0,3,0,1,0,0,1,230,0,6,1,202,0,0,0,32,0,224,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,0,0,239,0,0,0,211,0,201,0,214,0,218,0,215,0,216,0,203,0,219,0,196,0,220,0,194,0,0,0,199,0,0,0,0,0,209,0,210,0,212,0,213,0,217,0,207,0,208,0,206,0,240,0,197,0,221,0,195,0,0,0,200,0,198,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,0,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,143,0,144,0,145,0,146,0,147,0,148,0,149,0,150,0,151,0,152,0,153,0,154,0,155,0,156,0,157,0,158,0,159,0,160,0,161,0,162,0,163,0,164,0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0,176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188,0,189,0,190,0,4,0,248,0,0,0,58,0,32,0,4,0,26,0,126,0,142,0,158,0,174,0,255,1,13,1,49,1,83,1,97,1,120,1,126,1,146,2,55,2,199,2,218,2,220,32,20,32,26,32,30,32,34,32,38,32,48,32,58,32,112,32,121,32,137,32,172,33,34,255,255,0,0,0,32,0,142,0,158,0,160,0,176,1,12,1,49,1,82,1,96,1,120,1,125,1,146,2,55,2,198,2,218,2,220,32,19,32,24,32,28,32,32,32,38,32,48,32,57,32,112,32,116,32,128,32,172,33,34,255,255,255,225,0,57,0,42,255,192,255,191,255,179,255,144,255,112,255,100,255,78,255,74,255,55,254,147,254,5,253,243,253,242,224,188,224,185,224,184,224,183,224,180,224,171,224,163,224,110,224,107,224,101,224,67,223,206,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,248,0,0,0,58,0,32,0,4,0,26,0,126,0,142,0,158,0,174,0,255,1,13,1,49,1,83,1,97,1,120,1,126,1,146,2,55,2,199,2,218,2,220,32,20,32,26,32,30,32,34,32,38,32,48,32,58,32,112,32,121,32,137,32,172,33,34,255,255,0,0,0,32,0,142,0,158,0,160,0,176,1,12,1,49,1,82,1,96,1,120,1,125,1,146,2,55,2,198,2,218,2,220,32,19,32,24,32,28,32,32,32,38,32,48,32,57,32,112,32,116,32,128,32,172,33,34,255,255,255,225,0,57,0,42,255,192,255,191,255,179,255,144,255,112,255,100,255,78,255,74,255,55,254,147,254,5,253,243,253,242,224,188,224,185,224,184,224,183,224,180,224,171,224,163,224,110,224,107,224,101,224,67,223,206,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,70,0,84,0,58,0,96,0,72,0,0,0,14,255,14,0,8,1,64,0,8,1,234,0,10,2,188,0,14,2,48,0,11,2,238,0,5,184,0,0,44,75,184,0,9,80,88,177,1,1,142,89,184,1,255,133,184,0,68,29,185,0,9,0,3,95,94,45,184,0,1,44,32,32,69,105,68,176,1,96,45,184,0,2,44,184,0,1,42,33,45,184,0,3,44,32,70,176,3,37,70,82,88,35,89,32,138,32,138,73,100,138,32,70,32,104,97,100,176,4,37,70,32,104,97,100,82,88,35,101,138,89,47,32,176,0,83,88,105,32,176,0,84,88,33,176,64,89,27,105,32,176,0,84,88,33,176,64,101,89,89,58,45,184,0,4,44,32,70,176,4,37,70,82,88,35,138,89,32,70,32,106,97,100,176,4,37,70,32,106,97,100,82,88,35,138,89,47,253,45,184,0,5,44,75,32,176,3,38,80,88,81,88,176,128,68,27,176,64,68,89,27,33,33,32,69,176,192,80,88,176,192,68,27,33,89,89,45,184,0,6,44,32,32,69,105,68,176,1,96,32,32,69,125,105,24,68,176,1,96,45,184,0,7,44,184,0,6,42,45,184,0,8,44,75,32,176,3,38,83,88,176,64,27,176,0,89,138,138,32,176,3,38,83,88,35,33,176,128,138,138,27,138,35,89,32,176,3,38,83,88,35,33,184,0,192,138,138,27,138,35,89,32,176,3,38,83,88,35,33,184,1,0,138,138,27,138,35,89,32,176,3,38,83,88,35,33,184,1,64,138,138,27,138,35,89,32,184,0,3,38,83,88,176,3,37,69,184,1,128,80,88,35,33,184,1,128,35,33,27,176,3,37,69,35,33,35,33,89,27,33,89,68,45,184,0,9,44,75,83,88,69,68,27,33,33,89,45,0,0,0,0,2,0,8,0,2,255,255,0,3,0,1,0,72,0,250,0,162,1,104,0,3,0,28,184,0,2,47,65,3,0,0,0,2,0,1,93,184,0,3,220,0,184,0,1,47,184,0,2,220,48,49,55,35,53,51,162,90,90,250,110,0,0,2,0,59,0,0,0,183,2,238,0,3,0,7,0,164,187,0,7,0,4,0,6,0,4,43,65,5,0,0,0,7,0,16,0,7,0,2,93,184,0,7,16,184,0,0,208,65,13,0,6,0,0,0,22,0,0,0,38,0,0,0,54,0,0,0,70,0,0,0,86,0,0,0,6,113,65,5,0,0,0,6,0,16,0,6,0,2,93,184,0,6,16,184,0,3,208,65,13,0,9,0,3,0,25,0,3,0,41,0,3,0,57,0,3,0,73,0,3,0,89,0,3,0,6,113,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,18,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,7,220,65,3,0,63,0,7,0,1,113,184,0,1,220,48,49,19,3,35,3,19,35,53,51,183,30,64,30,104,84,84,2,238,253,218,2,38,253,18,86,0,2,0,40,1,194,1,106,2,238,0,3,0,7,0,60,184,0,7,47,184,0,3,220,185,0,0,0,4,244,184,0,7,16,185,0,4,0,4,244,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,18,62,89,184,0,6,220,184,0,2,208,184,0,7,16,184,0,3,208,48,49,1,3,35,3,35,3,35,3,1,106,20,52,20,136,20,54,20,2,238,254,212,1,44,254,212,1,44,0,0,2,0,33,255,245,2,160,2,188,0,27,0,31,1,239,184,0,12,47,65,3,0,137,0,12,0,1,93,65,5,0,0,0,12,0,16,0,12,0,2,93,184,0,8,220,184,0,7,220,184,0,26,208,65,3,0,71,0,26,0,1,93,186,0,27,0,26,0,7,17,18,57,184,0,27,16,184,0,0,208,184,0,0,47,186,0,2,0,26,0,7,17,18,57,186,0,3,0,26,0,7,17,18,57,184,0,3,16,184,0,4,208,184,0,4,47,186,0,6,0,7,0,26,17,18,57,184,0,8,16,184,0,25,208,65,3,0,71,0,25,0,1,93,186,0,9,0,8,0,25,17,18,57,184,0,12,16,184,0,11,220,184,0,22,208,65,3,0,71,0,22,0,1,93,186,0,10,0,11,0,22,17,18,57,184,0,12,16,184,0,21,208,65,3,0,71,0,21,0,1,93,186,0,13,0,12,0,21,17,18,57,184,0,13,16,184,0,14,208,184,0,14,47,186,0,16,0,12,0,21,17,18,57,186,0,17,0,21,0,12,17,18,57,184,0,17,16,184,0,18,208,184,0,18,47,186,0,20,0,21,0,12,17,18,57,186,0,23,0,22,0,11,17,18,57,186,0,24,0,25,0,8,17,18,57,186,0,28,0,25,0,8,17,18,57,186,0,29,0,22,0,11,17,18,57,186,0,30,0,11,0,22,17,18,57,186,0,31,0,8,0,25,17,18,57,0,184,0,0,69,88,184,0,22,47,27,185,0,22,0,14,62,89,184,0,0,69,88,184,0,11,47,27,185,0,11,0,6,62,89,186,0,23,0,22,0,11,17,18,57,184,0,23,47,65,3,0,15,0,23,0,1,93,185,0,29,0,2,244,65,3,0,159,0,29,0,1,93,184,0,2,208,186,0,30,0,11,0,22,17,18,57,184,0,30,47,65,3,0,144,0,30,0,1,93,184,0,3,208,184,0,30,16,185,0,10,0,2,244,65,3,0,159,0,10,0,1,93,184,0,6,208,184,0,11,16,184,0,8,208,184,0,10,16,184,0,13,208,184,0,30,16,184,0,16,208,184,0,29,16,184,0,17,208,184,0,23,16,184,0,20,208,184,0,22,16,184,0,25,208,184,0,23,16,184,0,27,208,48,49,1,7,35,7,51,7,35,7,35,55,35,7,35,55,35,55,51,55,35,55,51,55,51,7,51,55,51,15,1,35,7,51,2,160,29,116,48,128,38,122,87,80,87,133,87,80,86,120,37,115,48,126,29,129,74,80,74,133,75,80,74,113,132,48,132,1,251,84,123,84,227,227,227,227,84,123,84,193,193,193,193,84,123,0,0,0,1,0,42,255,224,1,222,2,236,0,43,2,240,186,0,39,0,17,0,3,43,65,3,0,16,0,39,0,1,93,65,3,0,208,0,39,0,1,93,65,3,0,144,0,39,0,1,93,65,3,0,176,0,39,0,1,93,65,3,0,111,0,17,0,1,93,65,3,0,79,0,17,0,1,93,65,3,0,16,0,17,0,1,93,186,0,2,0,39,0,17,17,18,57,184,0,2,47,185,0,1,0,4,244,186,0,0,0,1,0,2,17,18,57,186,0,3,0,2,0,1,17,18,57,186,0,5,0,17,0,39,17,18,57,184,0,5,47,184,0,39,16,184,0,10,220,65,11,0,79,0,10,0,95,0,10,0,111,0,10,0,127,0,10,0,143,0,10,0,5,93,65,3,0,223,0,10,0,1,93,184,0,3,16,184,0,22,208,184,0,2,16,184,0,23,208,184,0,1,16,184,0,24,208,184,0,0,16,184,0,25,208,186,0,27,0,39,0,17,17,18,57,184,0,27,47,184,0,17,16,184,0,32,220,65,3,0,239,0,32,0,1,93,65,9,0,80,0,32,0,96,0,32,0,112,0,32,0,128,0,32,0,4,93,0,184,0,2,47,184,0,0,69,88,184,0,23,47,27,185,0,23,0,18,62,89,65,5,0,80,0,2,0,96,0,2,0,2,93,186,0,3,0,2,0,23,17,18,57,184,0,3,47,184,0,0,208,184,0,3,16,184,0,6,220,65,3,0,128,0,6,0,1,93,65,3,0,32,0,6,0,1,93,184,0,3,16,185,0,8,0,2,244,186,0,22,0,23,0,2,17,18,57,184,0,22,47,186,0,13,0,3,0,22,17,18,57,65,9,0,90,0,13,0,106,0,13,0,122,0,13,0,138,0,13,0,4,93,184,0,25,208,184,0,22,16,184,0,28,220,184,0,22,16,185,0,30,0,2,244,186,0,35,0,22,0,3,17,18,57,48,49,1,65,3,0,135,0,5,0,1,93,65,3,0,25,0,15,0,1,93,65,3,0,27,0,16,0,1,93,65,3,0,139,0,16,0,1,93,65,3,0,8,0,20,0,1,93,65,11,0,53,0,34,0,69,0,34,0,85,0,34,0,101,0,34,0,117,0,34,0,5,93,65,3,0,21,0,37,0,1,93,65,3,0,117,0,37,0,1,93,65,3,0,38,0,37,0,1,93,65,7,0,71,0,37,0,87,0,37,0,103,0,37,0,3,93,65,3,0,118,0,38,0,1,93,65,3,0,22,0,42,0,1,93,65,3,0,7,0,42,0,1,93,0,65,3,0,139,0,4,0,1,93,65,11,0,60,0,4,0,76,0,4,0,92,0,4,0,108,0,4,0,124,0,4,0,5,93,65,3,0,139,0,5,0,1,93,65,3,0,137,0,12,0,1,93,65,3,0,24,0,15,0,1,93,65,3,0,41,0,15,0,1,93,65,3,0,6,0,20,0,1,93,65,3,0,131,0,26,0,1,93,65,11,0,52,0,26,0,68,0,26,0,84,0,26,0,100,0,26,0,116,0,26,0,5,93,65,11,0,55,0,34,0,71,0,34,0,87,0,34,0,103,0,34,0,119,0,34,0,5,93,65,3,0,69,0,37,0,1,93,65,5,0,22,0,37,0,38,0,37,0,2,93,65,7,0,86,0,37,0,102,0,37,0,118,0,37,0,3,93,65,5,0,9,0,42,0,25,0,42,0,2,93,37,23,35,55,38,39,55,22,51,50,53,52,46,4,53,52,62,2,55,39,51,7,22,23,7,38,35,34,21,20,30,4,21,20,14,2,1,29,15,89,17,117,59,12,70,116,110,47,71,82,71,47,21,45,71,49,17,90,16,108,53,9,102,65,121,49,73,85,73,49,14,42,76,82,114,113,6,32,109,58,63,29,36,26,24,34,52,42,28,53,41,28,5,117,117,6,31,96,48,58,27,32,23,24,38,61,49,22,49,43,33,0,0,0,0,5,0,35,255,242,3,37,2,193,0,3,0,21,0,37,0,55,0,71,2,46,184,0,7,47,184,0,41,47,65,7,0,0,0,41,0,16,0,41,0,32,0,41,0,3,93,184,0,51,220,186,0,1,0,7,0,51,17,18,57,184,0,1,47,184,0,0,220,184,0,1,16,184,0,3,220,184,0,2,220,184,0,7,16,184,0,17,220,184,0,7,16,184,0,27,220,65,3,0,31,0,27,0,1,113,184,0,17,16,184,0,33,220,65,3,0,16,0,33,0,1,113,184,0,41,16,184,0,61,220,65,3,0,31,0,61,0,1,113,184,0,51,16,184,0,67,220,65,3,0,16,0,67,0,1,113,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,14,62,89,184,0,0,69,88,184,0,38,47,27,185,0,38,0,6,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,12,16,184,0,4,220,184,0,12,16,184,0,22,220,184,0,4,16,184,0,30,220,184,0,38,16,184,0,46,220,184,0,56,220,184,0,38,16,184,0,64,220,48,49,1,65,3,0,87,0,0,0,1,93,65,7,0,10,0,6,0,26,0,6,0,42,0,6,0,3,93,65,7,0,10,0,9,0,26,0,9,0,42,0,9,0,3,93,65,3,0,200,0,10,0,1,93,65,3,0,199,0,14,0,1,93,65,7,0,5,0,15,0,21,0,15,0,37,0,15,0,3,93,65,7,0,5,0,19,0,21,0,19,0,37,0,19,0,3,93,65,3,0,199,0,20,0,1,93,65,5,0,118,0,24,0,134,0,24,0,2,93,65,3,0,201,0,39,0,1,93,65,7,0,10,0,40,0,26,0,40,0,42,0,40,0,3,93,65,7,0,10,0,43,0,26,0,43,0,42,0,43,0,3,93,65,3,0,200,0,44,0,1,93,65,3,0,199,0,48,0,1,93,65,7,0,5,0,49,0,21,0,49,0,37,0,49,0,3,93,65,7,0,5,0,53,0,21,0,53,0,37,0,53,0,3,93,65,3,0,199,0,54,0,1,93,65,5,0,118,0,58,0,134,0,58,0,2,93,0,65,3,0,203,0,5,0,1,93,65,3,0,197,0,10,0,1,93,65,3,0,195,0,14,0,1,93,65,3,0,202,0,20,0,1,93,65,3,0,201,0,39,0,1,93,65,3,0,199,0,44,0,1,93,65,3,0,198,0,48,0,1,93,65,3,0,202,0,54,0,1,93,23,35,1,51,1,34,38,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,1,34,38,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,237,75,1,165,74,254,36,64,82,24,42,55,30,31,53,39,23,23,40,55,29,19,34,26,15,54,37,40,54,14,26,33,1,195,64,82,24,42,55,30,31,53,39,23,23,40,55,29,19,34,26,15,54,37,40,54,14,26,33,12,2,200,254,145,94,88,46,71,48,25,24,46,67,44,46,71,49,25,1,64,19,36,52,31,60,70,75,64,29,48,34,18,253,101,94,88,46,71,48,25,24,46,67,44,46,71,49,25,1,64,19,36,52,31,60,70,75,64,29,48,34,18,0,3,0,36,255,233,2,81,2,191,0,30,0,43,0,51,3,97,186,0,28,0,10,0,3,43,65,3,0,127,0,10,0,1,93,65,3,0,16,0,10,0,1,93,184,0,10,16,185,0,47,0,4,244,65,3,0,16,0,28,0,1,93,184,0,28,16,185,0,27,0,5,244,186,0,44,0,47,0,27,17,18,57,65,3,0,105,0,44,0,1,93,186,0,30,0,28,0,10,17,18,57,65,3,0,103,0,30,0,1,93,186,0,2,0,44,0,30,17,18,57,186,0,14,0,10,0,28,17,18,57,184,0,14,47,184,0,22,220,65,3,0,128,0,22,0,1,93,186,0,12,0,14,0,22,17,18,57,65,3,0,25,0,12,0,1,93,65,3,0,8,0,12,0,1,93,186,0,24,0,22,0,14,17,18,57,65,3,0,135,0,24,0,1,93,65,3,0,10,0,24,0,1,93,65,3,0,153,0,24,0,1,93,65,3,0,102,0,24,0,1,93,65,3,0,117,0,24,0,1,93,186,0,25,0,44,0,30,17,18,57,65,3,0,136,0,25,0,1,93,184,0,14,16,184,0,34,220,65,3,0,159,0,34,0,1,93,65,7,0,63,0,34,0,79,0,34,0,95,0,34,0,3,113,186,0,36,0,12,0,24,17,18,57,184,0,22,16,184,0,41,220,65,3,0,161,0,41,0,1,93,65,3,0,144,0,41,0,1,93,186,0,45,0,12,0,24,17,18,57,0,184,0,0,69,88,184,0,19,47,27,185,0,19,0,14,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,27,0,19,0,5,17,18,57,184,0,27,47,186,0,2,0,5,0,27,17,18,57,186,0,36,0,19,0,5,17,18,57,65,3,0,101,0,36,0,1,93,65,3,0,133,0,36,0,1,93,186,0,45,0,19,0,5,17,18,57,65,3,0,105,0,45,0,1,93,186,0,12,0,36,0,45,17,18,57,186,0,24,0,36,0,45,17,18,57,186,0,25,0,27,0,5,17,18,57,65,7,0,101,0,25,0,117,0,25,0,133,0,25,0,3,93,186,0,30,0,25,0,2,17,18,57,184,0,19,16,185,0,31,0,1,244,186,0,44,0,25,0,2,17,18,57,65,3,0,103,0,44,0,1,93,184,0,5,16,185,0,50,0,1,244,48,49,1,65,3,0,22,0,3,0,1,93,65,7,0,88,0,7,0,104,0,7,0,120,0,7,0,3,93,65,3,0,105,0,8,0,1,93,65,3,0,137,0,8,0,1,93,65,3,0,10,0,8,0,1,93,65,3,0,90,0,8,0,1,93,65,3,0,122,0,8,0,1,93,65,3,0,89,0,9,0,1,93,65,3,0,9,0,16,0,1,93,65,3,0,27,0,16,0,1,93,65,5,0,6,0,20,0,22,0,20,0,2,93,65,3,0,4,0,21,0,1,93,65,5,0,38,0,21,0,54,0,21,0,2,93,65,3,0,88,0,25,0,1,93,0,65,3,0,25,0,3,0,1,93,65,3,0,89,0,3,0,1,93,65,3,0,122,0,3,0,1,93,65,7,0,89,0,7,0,105,0,7,0,121,0,7,0,3,93,65,3,0,88,0,8,0,1,93,65,3,0,120,0,8,0,1,93,65,3,0,9,0,8,0,1,93,65,3,0,105,0,8,0,1,93,65,3,0,88,0,9,0,1,93,65,3,0,21,0,16,0,1,93,65,3,0,6,0,16,0,1,93,65,3,0,20,0,20,0,1,93,65,3,0,68,0,20,0,1,93,65,3,0,5,0,20,0,1,93,65,3,0,37,0,20,0,1,93,65,3,0,54,0,20,0,1,93,65,3,0,86,0,20,0,1,93,65,3,0,85,0,25,0,1,93,65,3,0,71,0,25,0,1,93,65,3,0,137,0,45,0,1,93,33,35,39,14,1,35,34,46,2,53,52,55,38,53,52,62,2,51,50,22,21,20,7,23,54,55,51,6,7,3,34,6,21,20,23,63,1,62,1,53,52,38,19,39,6,21,20,22,51,50,2,81,92,44,44,86,58,60,87,58,28,126,75,31,53,71,40,72,71,164,190,32,7,81,4,61,236,43,59,55,53,20,29,24,43,106,208,81,75,73,88,46,38,31,27,49,68,41,115,89,91,79,39,61,44,23,69,57,119,102,195,41,149,156,95,2,22,52,48,61,67,41,17,25,44,26,36,39,253,239,208,57,87,55,69,0,0,0,1,0,41,1,194,0,141,2,238,0,3,0,34,184,0,3,47,185,0,0,0,4,244,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,18,62,89,184,0,2,220,48,49,19,3,35,3,141,18,64,18,2,238,254,212,1,44,0,0,0,1,0,42,255,120,0,237,2,238,0,15,0,150,184,0,6,47,184,0,12,220,184,0,0,208,184,0,12,16,184,0,11,220,184,0,1,208,184,0,6,16,185,0,14,0,5,244,65,3,0,15,0,17,0,1,93,0,184,0,0,47,184,0,0,69,88,184,0,12,47,27,185,0,12,0,18,62,89,48,49,1,65,3,0,134,0,13,0,1,93,65,3,0,55,0,13,0,1,93,65,3,0,151,0,13,0,1,93,65,3,0,134,0,15,0,1,93,65,3,0,151,0,15,0,1,93,0,65,3,0,152,0,13,0,1,93,65,3,0,137,0,13,0,1,93,65,3,0,150,0,15,0,1,93,65,3,0,135,0,15,0,1,93,23,35,46,3,53,52,62,2,55,51,6,21,20,237,79,30,44,28,14,14,29,44,29,79,123,136,45,93,106,124,75,76,124,106,92,45,200,243,244,0,0,1,0,24,255,120,0,219,2,238,0,15,0,149,184,0,11,47,65,3,0,48,0,11,0,1,93,65,3,0,112,0,11,0,1,93,184,0,5,220,184,0,6,220,184,0,0,208,184,0,5,16,184,0,1,208,184,0,11,16,185,0,3,0,5,244,65,3,0,15,0,17,0,1,93,0,184,0,0,47,184,0,0,69,88,184,0,6,47,27,185,0,6,0,18,62,89,48,49,1,65,3,0,152,0,2,0,1,93,65,3,0,137,0,2,0,1,93,65,3,0,56,0,4,0,1,93,65,5,0,137,0,4,0,153,0,4,0,2,93,0,65,3,0,151,0,2,0,1,93,65,5,0,136,0,4,0,152,0,4,0,2,93,23,35,54,53,52,39,51,30,3,21,20,14,2,103,79,123,123,79,29,44,29,14,14,29,43,136,199,244,243,200,45,92,106,124,76,75,124,106,93,0,0,0,1,0,33,1,168,1,137,2,237,0,14,0,193,186,0,9,0,8,0,3,43,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,18,62,89,184,0,2,220,65,3,0,64,0,2,0,1,93,65,3,0,64,0,2,0,1,113,184,0,0,208,184,0,0,47,48,49,1,65,5,0,40,0,3,0,56,0,3,0,2,113,65,3,0,56,0,4,0,1,113,65,3,0,228,0,5,0,1,93,65,3,0,121,0,5,0,1,93,65,5,0,137,0,11,0,153,0,11,0,2,93,65,3,0,55,0,14,0,1,113,65,3,0,73,0,14,0,1,93,0,65,3,0,7,0,0,0,1,113,65,3,0,53,0,1,0,1,93,65,3,0,167,0,1,0,1,93,65,3,0,230,0,5,0,1,93,65,3,0,231,0,6,0,1,93,65,7,0,184,0,11,0,200,0,11,0,216,0,11,0,3,93,1,39,7,39,55,39,55,23,39,51,7,55,23,7,23,1,59,102,100,32,108,156,23,148,13,46,16,149,23,158,113,1,171,133,136,32,117,65,41,86,156,156,86,42,63,115,0,0,0,0,1,0,46,0,102,1,160,1,196,0,11,0,177,184,0,4,47,65,3,0,143,0,4,0,1,93,65,3,0,160,0,4,0,1,93,65,3,0,0,0,4,0,1,93,184,0,1,220,65,3,0,159,0,1,0,1,93,184,0,0,220,65,3,0,144,0,0,0,1,93,184,0,4,16,184,0,5,220,65,3,0,159,0,5,0,1,93,184,0,4,16,184,0,7,208,184,0,1,16,184,0,10,208,0,184,0,4,47,184,0,1,208,184,0,4,16,184,0,3,220,184,0,4,16,184,0,7,220,65,7,0,64,0,7,0,80,0,7,0,96,0,7,0,3,113,184,0,8,220,65,3,0,47,0,8,0,1,93,65,5,0,31,0,8,0,47,0,8,0,2,113,65,3,0,175,0,8,0,1,93,184,0,7,16,184,0,10,208,48,49,37,35,21,35,53,35,53,51,53,51,21,51,1,160,145,80,145,145,80,145,238,136,136,86,128,128,0,0,0,0,1,0,57,255,147,0,158,0,86,0,6,0,95,187,0,6,0,4,0,5,0,4,43,65,3,0,16,0,5,0,1,93,184,0,5,16,184,0,2,208,65,3,0,16,0,6,0,1,93,186,0,3,0,5,0,6,17,18,57,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,0,208,184,0,4,16,184,0,1,220,184,0,4,16,184,0,5,220,65,3,0,63,0,5,0,1,113,48,49,51,7,39,55,39,53,51,158,78,23,35,34,100,109,13,87,9,86,0,0,1,0,57,0,238,1,111,1,68,0,3,0,37,184,0,1,47,65,3,0,0,0,1,0,1,93,184,0,0,220,65,3,0,96,0,0,0,1,93,0,184,0,1,47,184,0,2,220,48,49,37,33,53,33,1,111,254,202,1,54,238,86,0,0,1,0,57,0,0,0,147,0,86,0,3,0,61,187,0,0,0,4,0,1,0,4,43,65,3,0,16,0,0,0,1,93,65,3,0,16,0,1,0,1,93,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,2,220,65,3,0,63,0,2,0,1,113,48,49,51,35,53,51,147,90,90,86,0,0,1,0,19,255,171,1,241,2,188,0,3,0,61,184,0,2,47,184,0,0,220,65,3,0,128,0,0,0,1,93,184,0,2,16,185,0,1,0,4,244,184,0,0,16,185,0,3,0,4,244,0,184,0,1,47,184,0,0,69,88,184,0,3,47,27,185,0,3,0,14,62,89,48,49,9,1,35,1,1,241,254,134,100,1,122,2,188,252,239,3,17,0,2,0,63,255,242,2,139,2,202,0,19,0,35,2,48,186,0,15,0,5,0,3,43,65,3,0,15,0,5,0,1,113,65,3,0,143,0,5,0,1,93,65,3,0,239,0,5,0,1,93,65,5,0,0,0,5,0,16,0,5,0,2,93,65,3,0,32,0,15,0,1,113,65,3,0,80,0,15,0,1,113,65,3,0,64,0,15,0,1,93,65,5,0,0,0,15,0,16,0,15,0,2,93,184,0,5,16,185,0,25,0,4,244,184,0,15,16,185,0,31,0,4,244,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,185,0,20,0,2,244,184,0,0,16,185,0,28,0,2,244,48,49,1,65,3,0,25,0,2,0,1,93,65,7,0,105,0,2,0,121,0,2,0,137,0,2,0,3,93,65,3,0,42,0,2,0,1,93,65,3,0,24,0,3,0,1,93,65,7,0,89,0,3,0,105,0,3,0,121,0,3,0,3,93,65,3,0,104,0,8,0,1,93,65,3,0,25,0,8,0,1,93,65,3,0,121,0,8,0,1,93,65,5,0,22,0,12,0,38,0,12,0,2,93,65,3,0,102,0,12,0,1,93,65,3,0,22,0,13,0,1,93,65,7,0,102,0,13,0,118,0,13,0,134,0,13,0,3,93,65,3,0,87,0,13,0,1,93,65,3,0,86,0,17,0,1,93,65,3,0,38,0,18,0,1,93,65,3,0,23,0,18,0,1,93,65,7,0,103,0,18,0,119,0,18,0,135,0,18,0,3,93,65,3,0,89,0,26,0,1,93,0,65,3,0,137,0,1,0,1,93,65,3,0,40,0,2,0,1,93,65,3,0,25,0,2,0,1,93,65,7,0,105,0,2,0,121,0,2,0,137,0,2,0,3,93,65,3,0,24,0,3,0,1,93,65,3,0,104,0,3,0,1,93,65,3,0,121,0,3,0,1,93,65,3,0,22,0,8,0,1,93,65,3,0,118,0,8,0,1,93,65,3,0,103,0,8,0,1,93,65,7,0,103,0,12,0,119,0,12,0,135,0,12,0,3,93,65,3,0,117,0,13,0,1,93,65,3,0,23,0,13,0,1,93,65,3,0,103,0,13,0,1,93,65,3,0,88,0,17,0,1,93,65,5,0,25,0,18,0,41,0,18,0,2,93,65,5,0,105,0,18,0,121,0,18,0,2,93,65,3,0,138,0,18,0,1,93,65,3,0,87,0,26,0,1,93,5,34,46,2,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,1,95,65,106,75,42,46,81,110,63,62,106,77,43,43,79,111,57,41,72,53,31,102,87,91,108,29,51,70,14,50,92,130,80,83,139,99,55,53,94,132,78,84,137,97,53,2,130,39,74,108,69,132,134,143,142,64,101,69,37,0,0,0,1,0,34,0,0,0,254,2,188,0,11,0,150,187,0,0,0,4,0,1,0,4,43,65,3,0,16,0,0,0,1,93,65,3,0,16,0,1,0,1,93,184,0,1,16,184,0,5,220,186,0,10,0,1,0,0,17,18,57,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,10,16,184,0,4,220,186,0,2,0,10,0,4,17,18,57,65,5,0,235,0,2,0,251,0,2,0,2,93,65,7,0,11,0,2,0,27,0,2,0,43,0,2,0,3,113,65,5,0,202,0,2,0,218,0,2,0,2,93,185,0,5,0,2,244,48,49,51,35,17,6,7,39,62,3,55,51,254,100,54,50,16,21,43,39,33,11,73,2,51,45,16,89,7,23,29,33,17,0,0,1,0,50,0,0,1,214,2,202,0,28,1,188,186,0,22,0,12,0,3,43,65,3,0,95,0,12,0,1,93,184,0,12,16,184,0,1,208,65,3,0,42,0,1,0,1,113,65,3,0,67,0,1,0,1,113,184,0,22,16,185,0,6,0,4,244,184,0,1,16,184,0,27,208,65,3,0,114,0,27,0,1,93,65,3,0,19,0,27,0,1,113,65,3,0,69,0,27,0,1,93,65,3,0,245,0,27,0,1,93,65,3,0,5,0,27,0,1,113,65,5,0,83,0,27,0,99,0,27,0,2,93,65,5,0,67,0,27,0,83,0,27,0,2,113,65,3,0,33,0,27,0,1,113,65,3,0,128,0,27,0,1,93,184,0,22,16,184,0,28,208,184,0,28,47,0,184,0,0,69,88,184,0,17,47,27,185,0,17,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,4,0,17,0,0,17,18,57,184,0,17,16,185,0,9,0,2,244,184,0,17,16,184,0,11,220,185,0,12,0,2,244,65,3,0,86,0,12,0,1,93,186,0,25,0,0,0,17,17,18,57,184,0,0,16,185,0,28,0,2,244,48,49,1,65,5,0,105,0,3,0,121,0,3,0,2,93,65,3,0,89,0,4,0,1,93,65,3,0,149,0,19,0,1,93,65,7,0,103,0,19,0,119,0,19,0,135,0,19,0,3,93,65,7,0,101,0,20,0,117,0,20,0,133,0,20,0,3,93,65,3,0,6,0,20,0,1,93,65,3,0,150,0,20,0,1,93,0,65,3,0,118,0,3,0,1,93,65,3,0,133,0,4,0,1,93,65,3,0,22,0,4,0,1,93,65,3,0,87,0,4,0,1,93,65,3,0,133,0,14,0,1,93,65,7,0,6,0,14,0,22,0,14,0,38,0,14,0,3,93,65,7,0,101,0,19,0,117,0,19,0,133,0,19,0,3,93,65,3,0,6,0,20,0,1,93,65,3,0,151,0,20,0,1,93,41,1,62,1,55,54,53,52,38,35,34,7,39,62,3,51,50,30,2,21,20,14,2,7,51,1,214,254,98,91,116,28,56,65,57,93,70,12,7,35,51,67,39,55,75,45,19,23,51,82,59,242,129,179,52,104,48,54,59,93,85,13,34,30,20,35,55,69,33,36,83,103,130,84,0,1,0,40,255,242,1,228,2,202,0,49,2,46,186,0,45,0,5,0,3,43,65,3,0,79,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,16,0,5,0,1,93,65,3,0,16,0,45,0,1,113,65,3,0,16,0,45,0,1,93,184,0,45,16,185,0,16,0,4,244,186,0,22,0,45,0,5,17,18,57,184,0,22,47,186,0,40,0,45,0,5,17,18,57,184,0,40,47,185,0,27,0,4,244,186,0,32,0,5,0,45,17,18,57,184,0,32,47,186,0,43,0,22,0,40,17,18,57,65,3,0,117,0,43,0,1,93,65,3,0,86,0,43,0,1,93,65,3,0,100,0,43,0,1,93,65,3,0,132,0,43,0,1,93,0,184,0,0,69,88,184,0,35,47,27,185,0,35,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,6,220,65,3,0,32,0,6,0,1,93,184,0,5,208,65,7,0,10,0,5,0,26,0,5,0,42,0,5,0,3,113,184,0,0,16,185,0,11,0,2,244,186,0,24,0,35,0,0,17,18,57,184,0,24,47,185,0,21,0,2,244,184,0,35,16,185,0,29,0,2,244,184,0,35,16,184,0,31,220,65,5,0,144,0,31,0,160,0,31,0,2,93,186,0,43,0,24,0,21,17,18,57,48,49,1,65,3,0,137,0,3,0,1,93,65,13,0,56,0,33,0,72,0,33,0,88,0,33,0,104,0,33,0,120,0,33,0,136,0,33,0,6,93,65,3,0,7,0,37,0,1,93,65,7,0,87,0,42,0,103,0,42,0,119,0,42,0,3,93,65,5,0,85,0,44,0,101,0,44,0,2,93,65,3,0,133,0,44,0,1,93,65,3,0,118,0,44,0,1,93,65,3,0,87,0,47,0,1,93,0,65,11,0,57,0,3,0,73,0,3,0,89,0,3,0,105,0,3,0,121,0,3,0,5,93,65,3,0,138,0,3,0,1,93,65,13,0,54,0,33,0,70,0,33,0,86,0,33,0,102,0,33,0,118,0,33,0,134,0,33,0,6,93,65,3,0,6,0,37,0,1,93,65,3,0,88,0,42,0,1,93,65,3,0,105,0,42,0,1,93,65,3,0,122,0,42,0,1,93,65,3,0,86,0,44,0,1,93,65,3,0,118,0,44,0,1,93,65,3,0,103,0,44,0,1,93,65,3,0,135,0,44,0,1,93,65,3,0,90,0,47,0,1,93,65,3,0,89,0,48,0,1,93,23,34,46,2,39,55,30,3,51,50,62,2,53,52,46,2,43,1,55,51,50,54,53,52,35,34,7,39,62,1,51,50,30,2,21,20,6,7,22,21,20,14,2,230,30,61,53,39,7,23,28,42,37,38,23,30,55,40,24,17,39,63,47,73,10,37,91,76,119,85,50,17,16,83,63,66,83,47,17,40,51,116,40,69,93,14,11,17,18,7,88,15,20,14,6,15,34,54,38,30,48,34,18,76,58,57,94,41,81,16,30,35,53,63,29,42,69,35,39,135,54,85,59,30,0,2,0,14,0,0,1,244,2,188,0,9,0,12,1,7,186,0,1,0,5,0,3,43,184,0,1,16,184,0,0,220,184,0,1,16,185,0,4,0,4,244,65,3,0,143,0,5,0,1,93,184,0,10,208,184,0,1,16,184,0,8,208,186,0,6,0,10,0,8,17,18,57,65,3,0,137,0,6,0,1,93,184,0,5,16,184,0,12,208,65,3,0,116,0,12,0,1,93,65,3,0,22,0,12,0,1,113,65,3,0,37,0,12,0,1,113,65,3,0,99,0,12,0,1,93,65,3,0,130,0,12,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,14,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,186,0,1,0,6,0,3,17,18,57,184,0,1,47,65,3,0,144,0,1,0,1,93,184,0,4,208,184,0,1,16,185,0,8,0,2,244,184,0,10,208,184,0,6,16,184,0,11,208,65,3,0,252,0,11,0,1,93,65,3,0,46,0,11,0,1,113,65,5,0,125,0,11,0,141,0,11,0,2,93,65,3,0,11,0,11,0,1,113,65,3,0,106,0,11,0,1,93,48,49,65,3,0,92,0,11,0,1,93,37,35,21,35,53,33,1,51,17,51,35,53,7,1,244,85,100,254,211,1,66,79,85,185,153,190,190,190,1,254,254,88,254,254,0,0,0,0,1,0,51,255,242,1,233,2,188,0,31,1,213,186,0,27,0,5,0,3,43,65,3,0,79,0,5,0,1,113,65,3,0,47,0,5,0,1,93,65,3,0,47,0,5,0,1,113,65,3,0,16,0,5,0,1,93,65,3,0,16,0,27,0,1,93,65,3,0,64,0,27,0,1,93,65,3,0,96,0,27,0,1,93,184,0,27,16,185,0,13,0,4,244,186,0,17,0,5,0,27,17,18,57,184,0,17,47,184,0,16,220,65,3,0,86,0,16,0,1,113,184,0,17,16,184,0,18,208,186,0,19,0,17,0,27,17,18,57,184,0,19,47,184,0,16,16,184,0,21,208,186,0,22,0,21,0,16,17,18,57,65,3,0,39,0,22,0,1,113,0,184,0,0,69,88,184,0,19,47,27,185,0,19,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,6,220,65,3,0,48,0,6,0,1,93,185,0,5,0,2,244,184,0,0,16,185,0,8,0,2,244,186,0,22,0,19,0,0,17,18,57,184,0,22,47,185,0,16,0,2,244,184,0,19,16,185,0,20,0,2,244,48,49,1,65,3,0,72,0,3,0,1,93,65,3,0,137,0,11,0,1,93,65,3,0,70,0,24,0,1,93,65,3,0,102,0,24,0,1,93,65,3,0,55,0,24,0,1,93,65,3,0,100,0,25,0,1,93,65,3,0,69,0,25,0,1,93,65,3,0,54,0,25,0,1,93,65,3,0,86,0,25,0,1,93,65,3,0,119,0,25,0,1,93,65,3,0,55,0,29,0,1,93,65,3,0,71,0,30,0,1,93,0,65,3,0,73,0,3,0,1,93,65,3,0,135,0,11,0,1,93,65,3,0,67,0,24,0,1,93,65,3,0,53,0,24,0,1,93,65,5,0,85,0,24,0,101,0,24,0,2,93,65,9,0,53,0,25,0,69,0,25,0,85,0,25,0,101,0,25,0,4,93,65,3,0,119,0,25,0,1,93,65,3,0,56,0,29,0,1,93,65,3,0,57,0,30,0,1,93,65,3,0,76,0,30,0,1,93,23,34,46,2,39,55,22,51,50,62,2,53,52,38,43,1,19,33,7,35,7,50,30,2,21,20,14,2,220,22,54,50,37,6,23,72,73,35,60,45,26,99,112,85,42,1,62,9,233,20,81,115,72,34,44,73,98,14,7,12,14,6,89,42,25,43,58,34,63,60,1,89,86,174,25,50,77,52,56,92,66,36,0,0,0,0,2,0,62,255,242,2,12,2,188,0,27,0,47,2,74,186,0,23,0,5,0,3,43,65,3,0,239,0,5,0,1,93,65,3,0,31,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,0,0,5,0,1,93,65,3,0,0,0,23,0,1,93,65,3,0,192,0,23,0,1,93,65,5,0,48,0,23,0,64,0,23,0,2,93,186,0,11,0,23,0,5,17,18,57,184,0,11,47,184,0,5,16,185,0,33,0,4,244,184,0,16,208,184,0,23,16,185,0,43,0,4,244,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,184,0,12,208,65,3,0,249,0,12,0,1,93,184,0,0,16,184,0,18,220,65,3,0,64,0,18,0,1,93,186,0,16,0,18,0,0,17,18,57,65,3,0,243,0,16,0,1,93,185,0,28,0,2,244,184,0,0,16,185,0,38,0,2,244,48,49,1,65,7,0,89,0,2,0,105,0,2,0,121,0,2,0,3,93,65,3,0,138,0,2,0,1,93,65,3,0,91,0,3,0,1,93,65,3,0,136,0,8,0,1,93,65,3,0,247,0,11,0,1,93,65,3,0,69,0,13,0,1,93,65,3,0,117,0,13,0,1,93,65,3,0,54,0,13,0,1,93,65,3,0,103,0,13,0,1,93,65,5,0,102,0,14,0,118,0,14,0,2,93,65,5,0,102,0,20,0,118,0,20,0,2,93,65,5,0,7,0,20,0,23,0,20,0,2,93,65,3,0,135,0,20,0,1,93,65,3,0,102,0,21,0,1,93,65,3,0,134,0,21,0,1,93,65,3,0,119,0,21,0,1,93,65,3,0,87,0,25,0,1,93,65,3,0,86,0,26,0,1,93,0,65,3,0,136,0,2,0,1,93,65,7,0,89,0,2,0,105,0,2,0,121,0,2,0,3,93,65,3,0,135,0,8,0,1,93,65,3,0,6,0,9,0,1,93,65,3,0,250,0,11,0,1,93,65,3,0,72,0,13,0,1,93,65,3,0,120,0,13,0,1,93,65,3,0,107,0,13,0,1,93,65,3,0,122,0,14,0,1,93,65,3,0,87,0,17,0,1,93,65,3,0,117,0,20,0,1,93,65,5,0,6,0,20,0,22,0,20,0,2,93,65,3,0,102,0,20,0,1,93,65,3,0,134,0,20,0,1,93,65,3,0,102,0,21,0,1,93,65,3,0,134,0,21,0,1,93,65,3,0,119,0,21,0,1,93,65,3,0,88,0,25,0,1,93,65,3,0,90,0,26,0,1,93,5,34,46,2,53,52,62,2,55,23,14,3,7,54,51,50,30,2,21,20,14,2,3,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,1,25,50,80,58,31,61,91,105,43,65,40,76,66,55,19,46,95,45,78,57,32,35,64,89,33,29,51,38,23,20,36,48,27,33,50,34,17,13,30,47,14,30,62,96,66,98,168,123,70,1,38,18,46,69,100,72,63,27,51,76,48,49,84,63,36,1,97,20,36,51,31,33,49,33,17,24,40,52,29,24,45,35,21,0,1,0,39,0,0,1,236,2,188,0,5,0,190,186,0,0,0,5,0,3,43,65,3,0,55,0,0,0,1,93,65,3,0,87,0,0,0,1,93,184,0,0,16,184,0,1,208,184,0,0,16,184,0,3,208,65,7,0,41,0,3,0,57,0,3,0,73,0,3,0,3,93,65,3,0,90,0,3,0,1,93,65,5,0,108,0,3,0,124,0,3,0,2,93,65,3,0,141,0,3,0,1,93,65,5,0,26,0,3,0,42,0,3,0,2,113,65,3,0,249,0,3,0,1,93,65,3,0,9,0,3,0,1,113,65,3,0,232,0,3,0,1,93,65,3,0,151,0,3,0,1,93,184,0,2,208,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,5,16,185,0,4,0,2,244,48,49,9,1,35,1,33,53,1,236,254,209,100,1,9,254,197,2,188,253,68,2,102,86,0,0,0,3,0,59,255,242,2,37,2,201,0,31,0,43,0,57,2,65,186,0,27,0,5,0,3,43,65,3,0,31,0,5,0,1,113,65,3,0,0,0,5,0,1,93,65,5,0,0,0,27,0,16,0,27,0,2,93,65,3,0,80,0,27,0,1,113,65,3,0,32,0,27,0,1,113,186,0,9,0,5,0,27,17,18,57,184,0,9,47,186,0,19,0,27,0,5,17,18,57,184,0,19,47,186,0,7,0,9,0,19,17,18,57,186,0,24,0,19,0,9,17,18,57,184,0,9,16,185,0,32,0,4,244,184,0,19,16,185,0,38,0,4,244,184,0,5,16,185,0,47,0,4,244,184,0,27,16,185,0,55,0,4,244,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,35,0,14,0,0,17,18,57,65,3,0,134,0,35,0,1,93,65,3,0,170,0,35,0,1,93,65,3,0,185,0,35,0,1,93,65,3,0,86,0,35,0,1,93,65,5,0,101,0,35,0,117,0,35,0,2,93,186,0,44,0,0,0,14,17,18,57,65,3,0,138,0,44,0,1,93,65,3,0,185,0,44,0,1,93,65,3,0,41,0,44,0,1,93,186,0,7,0,35,0,44,17,18,57,186,0,24,0,35,0,44,17,18,57,184,0,14,16,185,0,41,0,2,244,184,0,0,16,185,0,50,0,2,244,48,49,1,65,3,0,104,0,2,0,1,93,65,3,0,90,0,2,0,1,93,65,3,0,89,0,3,0,1,93,65,3,0,10,0,3,0,1,93,65,3,0,122,0,3,0,1,93,65,3,0,107,0,3,0,1,93,65,5,0,57,0,8,0,73,0,8,0,2,93,65,3,0,24,0,11,0,1,93,65,3,0,9,0,11,0,1,93,65,5,0,6,0,17,0,22,0,17,0,2,93,65,3,0,100,0,26,0,1,93,65,3,0,117,0,26,0,1,93,65,5,0,86,0,29,0,102,0,29,0,2,93,65,3,0,133,0,42,0,1,93,65,5,0,56,0,53,0,72,0,53,0,2,93,0,65,5,0,89,0,2,0,105,0,2,0,2,93,65,7,0,89,0,3,0,105,0,3,0,121,0,3,0,3,93,65,3,0,6,0,11,0,1,93,65,3,0,23,0,11,0,1,93,65,3,0,7,0,17,0,1,93,65,3,0,119,0,26,0,1,93,65,5,0,88,0,29,0,104,0,29,0,2,93,65,3,0,89,0,30,0,1,93,65,3,0,69,0,53,0,1,93,65,3,0,55,0,53,0,1,93,5,34,46,2,53,52,55,38,53,52,62,2,51,50,30,2,21,20,14,2,7,30,1,21,20,14,2,3,20,22,23,62,1,53,52,38,35,34,6,23,14,1,21,20,22,51,50,62,2,53,52,38,1,40,60,89,59,29,134,93,24,50,78,56,54,76,49,23,11,27,45,34,81,75,33,64,95,170,60,51,58,59,58,54,54,62,119,66,77,71,66,32,54,40,22,79,14,33,56,73,41,116,71,72,92,36,64,46,27,25,43,58,32,27,41,38,38,24,28,89,72,40,76,60,36,2,36,34,60,19,17,67,40,39,44,49,241,13,73,63,58,59,19,34,47,27,51,73,0,0,2,0,45,0,0,1,251,2,202,0,26,0,46,2,23,186,0,5,0,22,0,3,43,65,3,0,224,0,5,0,1,93,65,3,0,64,0,5,0,1,93,65,3,0,192,0,5,0,1,93,65,3,0,128,0,5,0,1,93,65,3,0,63,0,22,0,1,93,65,3,0,31,0,22,0,1,93,186,0,11,0,22,0,5,17,18,57,184,0,11,47,184,0,5,16,185,0,32,0,4,244,184,0,16,208,184,0,22,16,185,0,42,0,4,244,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,14,62,89,184,0,0,69,88,184,0,10,47,27,185,0,10,0,6,62,89,184,0,12,208,65,3,0,246,0,12,0,1,93,184,0,0,16,184,0,19,220,65,3,0,79,0,19,0,1,93,186,0,16,0,0,0,19,17,18,57,185,0,27,0,2,244,184,0,0,16,185,0,37,0,2,244,48,49,1,65,3,0,117,0,2,0,1,93,65,3,0,86,0,2,0,1,93,65,3,0,134,0,2,0,1,93,65,3,0,86,0,3,0,1,93,65,3,0,134,0,6,0,1,93,65,3,0,6,0,8,0,1,93,65,3,0,134,0,8,0,1,93,65,3,0,23,0,8,0,1,93,65,5,0,57,0,13,0,73,0,13,0,2,93,65,5,0,106,0,13,0,122,0,13,0,2,93,65,3,0,88,0,16,0,1,93,65,3,0,87,0,17,0,1,93,65,3,0,136,0,20,0,1,93,65,3,0,121,0,20,0,1,93,65,5,0,9,0,21,0,25,0,21,0,2,93,65,3,0,105,0,21,0,1,93,65,3,0,138,0,21,0,1,93,65,3,0,89,0,24,0,1,93,65,3,0,89,0,25,0,1,93,0,65,3,0,102,0,2,0,1,93,65,3,0,134,0,2,0,1,93,65,3,0,87,0,2,0,1,93,65,3,0,119,0,2,0,1,93,65,3,0,86,0,3,0,1,93,65,3,0,24,0,8,0,1,93,65,3,0,137,0,8,0,1,93,65,3,0,9,0,9,0,1,93,65,3,0,101,0,13,0,1,93,65,3,0,118,0,13,0,1,93,65,3,0,71,0,13,0,1,93,65,3,0,88,0,16,0,1,93,65,3,0,89,0,17,0,1,93,65,3,0,104,0,20,0,1,93,65,5,0,122,0,20,0,138,0,20,0,2,93,65,3,0,86,0,24,0,1,93,65,3,0,85,0,25,0,1,93,1,50,30,2,21,20,14,2,35,39,62,3,55,14,1,35,34,38,53,52,62,2,19,50,62,2,53,52,46,2,35,34,14,2,21,20,30,2,1,32,42,79,61,37,61,89,101,40,73,41,83,70,50,9,20,76,43,100,112,36,64,89,32,30,51,38,22,21,35,48,27,33,50,34,17,13,29,47,2,202,24,58,97,73,110,172,118,62,38,19,51,71,94,63,27,30,102,100,51,85,62,35,254,159,20,37,51,32,31,49,33,17,24,40,53,28,24,46,34,21,0,0,2,0,57,0,0,0,147,1,184,0,3,0,7,0,102,187,0,7,0,4,0,6,0,4,43,65,3,0,16,0,7,0,1,93,184,0,7,16,184,0,0,208,65,3,0,16,0,6,0,1,93,184,0,6,16,184,0,1,208,0,184,0,2,47,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,2,16,184,0,1,220,65,3,0,48,0,1,0,1,113,184,0,5,16,184,0,6,220,65,3,0,63,0,6,0,1,113,48,49,19,35,53,51,17,35,53,51,147,90,90,90,90,1,98,86,254,72,86,0,0,0,0,2,0,57,255,147,0,158,1,184,0,3,0,10,0,136,187,0,10,0,4,0,9,0,4,43,65,3,0,16,0,10,0,1,93,184,0,10,16,184,0,0,208,65,3,0,16,0,9,0,1,93,184,0,9,16,184,0,1,208,184,0,9,16,184,0,6,208,186,0,7,0,9,0,10,17,18,57,0,184,0,2,47,184,0,0,69,88,184,0,8,47,27,185,0,8,0,6,62,89,184,0,2,16,184,0,1,220,65,3,0,48,0,1,0,1,113,184,0,8,16,184,0,4,208,184,0,8,16,184,0,5,220,184,0,8,16,184,0,9,220,65,3,0,63,0,9,0,1,113,48,49,19,35,53,51,17,7,39,55,39,53,51,158,100,100,78,23,35,34,100,1,98,86,254,71,108,13,87,9,86,0,0,0,0,1,0,33,0,78,1,88,1,234,0,5,0,73,184,0,2,47,184,0,4,220,184,0,0,208,184,0,4,16,185,0,3,0,4,244,184,0,1,208,184,0,2,16,185,0,5,0,4,244,0,25,184,0,2,47,24,184,0,1,208,184,0,1,47,184,0,2,16,184,0,3,208,184,0,3,47,184,0,2,16,184,0,5,208,48,49,37,35,39,55,51,7,1,88,95,216,216,95,216,78,206,206,206,0,2,0,66,0,160,1,180,1,138,0,3,0,7,0,61,184,0,5,47,65,3,0,16,0,5,0,1,93,184,0,4,220,184,0,0,208,184,0,5,16,184,0,1,208,0,184,0,5,47,184,0,1,220,65,3,0,15,0,1,0,1,93,184,0,2,220,184,0,5,16,184,0,6,220,48,49,1,33,53,33,21,33,53,33,1,180,254,142,1,114,254,142,1,114,1,62,76,234,76,0,1,0,60,0,78,1,115,1,234,0,5,0,82,184,0,0,47,65,3,0,16,0,0,0,1,93,184,0,4,220,185,0,5,0,4,244,184,0,1,208,184,0,4,16,184,0,2,208,184,0,0,16,185,0,3,0,4,244,0,25,184,0,0,47,24,184,0,1,208,184,0,1,47,184,0,0,16,184,0,3,208,184,0,0,16,184,0,5,208,184,0,5,47,48,49,1,7,35,55,39,51,1,115,216,95,216,216,95,1,28,206,206,206,0,0,0,2,0,30,0,0,1,141,2,238,0,36,0,40,1,93,186,0,29,0,21,0,3,43,65,3,0,16,0,21,0,1,93,65,3,0,16,0,29,0,1,93,186,0,1,0,21,0,29,17,18,57,184,0,1,47,65,5,0,16,0,1,0,32,0,1,0,2,113,65,7,0,16,0,1,0,32,0,1,0,48,0,1,0,3,93,184,0,0,220,184,0,29,16,184,0,10,220,65,7,0,48,0,10,0,64,0,10,0,80,0,10,0,3,113,186,0,39,0,21,0,29,17,18,57,184,0,39,47,185,0,40,0,4,244,0,184,0,0,69,88,184,0,24,47,27,185,0,24,0,18,62,89,184,0,0,69,88,184,0,38,47,27,185,0,38,0,6,62,89,184,0,39,220,65,3,0,63,0,39,0,1,113,184,0,1,220,184,0,24,16,185,0,15,0,1,244,184,0,24,16,184,0,20,220,48,49,1,65,3,0,121,0,8,0,1,93,65,3,0,6,0,26,0,1,93,65,3,0,102,0,26,0,1,93,65,3,0,101,0,27,0,1,93,65,3,0,119,0,27,0,1,93,65,3,0,39,0,33,0,1,93,65,3,0,134,0,34,0,1,93,65,3,0,23,0,34,0,1,93,0,65,7,0,54,0,22,0,70,0,22,0,86,0,22,0,3,93,65,3,0,7,0,26,0,1,93,65,3,0,103,0,26,0,1,93,65,5,0,103,0,27,0,119,0,27,0,2,93,65,3,0,40,0,33,0,1,93,65,3,0,137,0,33,0,1,93,65,3,0,25,0,34,0,1,93,65,3,0,138,0,34,0,1,93,55,35,38,53,52,62,4,53,52,46,2,35,34,14,2,7,39,62,1,51,50,30,2,21,20,6,15,1,14,1,31,1,35,53,51,226,59,3,22,34,38,34,22,21,35,46,26,22,43,35,26,5,25,19,86,54,48,77,54,29,35,25,51,26,35,1,18,91,91,200,40,5,31,53,49,47,49,55,32,30,46,31,16,13,20,24,11,67,29,38,33,54,67,33,35,76,32,65,33,66,29,227,86,0,2,0,49,255,169,2,163,2,41,0,61,0,76,1,131,184,0,38,47,65,3,0,48,0,38,0,1,93,184,0,48,220,186,0,7,0,38,0,48,17,18,57,184,0,7,47,184,0,0,208,65,3,0,102,0,0,0,1,93,65,3,0,70,0,0,0,1,93,184,0,64,208,65,3,0,68,0,64,0,1,93,65,3,0,197,0,64,0,1,93,65,3,0,54,0,64,0,1,93,65,3,0,53,0,64,0,1,113,65,3,0,5,0,64,0,1,93,65,3,0,212,0,64,0,1,93,65,3,0,19,0,64,0,1,93,184,0,15,208,65,3,0,55,0,15,0,1,93,186,0,28,0,38,0,48,17,18,57,186,0,52,0,48,0,38,17,18,57,184,0,0,16,184,0,57,208,184,0,7,16,184,0,72,220,65,3,0,176,0,72,0,1,93,0,184,0,0,69,88,184,0,43,47,27,185,0,43,0,16,62,89,184,0,33,220,186,0,2,0,33,0,43,17,18,57,184,0,2,47,186,0,10,0,43,0,33,17,18,57,184,0,10,47,186,0,15,0,2,0,10,17,18,57,65,3,0,129,0,15,0,1,93,65,3,0,100,0,15,0,1,93,65,3,0,195,0,15,0,1,93,65,3,0,49,0,15,0,1,93,65,7,0,0,0,15,0,16,0,15,0,32,0,15,0,3,93,184,0,23,208,184,0,23,47,186,0,28,0,33,0,43,17,18,57,65,5,0,19,0,28,0,35,0,28,0,2,93,65,3,0,1,0,28,0,1,93,186,0,52,0,43,0,33,17,18,57,184,0,55,220,184,0,2,16,184,0,62,220,184,0,10,16,184,0,69,220,48,49,1,65,5,0,57,0,5,0,73,0,5,0,2,93,0,65,3,0,54,0,5,0,1,93,1,38,35,34,14,2,21,20,22,51,50,62,2,55,20,14,2,21,20,22,51,50,62,2,55,14,3,35,34,46,2,53,52,62,2,51,50,30,2,21,20,14,2,7,6,35,34,53,52,62,2,39,50,23,14,3,35,34,38,53,52,62,2,2,33,51,71,46,91,72,45,44,51,21,50,48,43,14,1,1,1,26,29,15,36,36,34,12,24,70,86,97,51,57,92,65,34,60,104,136,77,58,93,64,34,5,16,33,28,39,27,37,10,16,19,111,47,7,6,41,54,59,25,22,22,34,53,61,1,123,53,50,79,101,51,48,63,17,31,42,26,1,9,10,10,1,32,51,11,18,23,12,43,71,51,28,35,66,96,60,80,140,103,60,36,66,94,58,26,56,51,42,13,17,53,13,48,61,72,30,22,39,85,72,47,36,28,39,73,55,34,0,0,0,2,0,7,0,0,2,97,2,188,0,7,0,10,1,97,187,0,7,0,4,0,6,0,4,43,65,3,0,16,0,7,0,1,93,184,0,7,16,184,0,0,208,65,3,0,246,0,0,0,1,93,65,3,0,86,0,0,0,1,93,65,3,0,22,0,0,0,1,93,185,0,1,0,4,244,65,3,0,16,0,6,0,1,93,186,0,9,0,6,0,7,17,18,57,186,0,2,0,1,0,9,17,18,57,184,0,6,16,184,0,5,208,65,3,0,249,0,5,0,1,93,65,3,0,25,0,5,0,1,93,65,3,0,89,0,5,0,1,93,185,0,4,0,4,244,186,0,3,0,4,0,9,17,18,57,186,0,8,0,9,0,1,17,18,57,186,0,10,0,9,0,4,17,18,57,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,8,0,7,0,4,17,18,57,184,0,8,47,185,0,2,0,2,244,184,0,7,16,184,0,9,208,48,49,1,65,3,0,56,0,0,0,1,93,65,5,0,72,0,6,0,88,0,6,0,2,93,65,3,0,57,0,6,0,1,93,65,7,0,105,0,6,0,121,0,6,0,137,0,6,0,3,93,65,7,0,102,0,7,0,118,0,7,0,134,0,7,0,3,93,65,7,0,55,0,7,0,71,0,7,0,87,0,7,0,3,93,0,65,3,0,22,0,9,0,1,93,65,3,0,250,0,9,0,1,93,65,5,0,10,0,9,0,26,0,9,0,2,113,65,3,0,43,0,9,0,1,113,33,35,39,33,7,35,19,51,19,11,1,2,97,100,67,254,244,67,100,251,100,54,104,104,189,189,2,188,254,87,1,36,254,220,0,0,3,0,80,0,0,2,50,2,188,0,20,0,33,0,46,2,71,186,0,16,0,1,0,3,43,65,3,0,191,0,1,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,65,3,0,80,0,1,0,1,113,65,3,0,240,0,16,0,1,93,65,5,0,0,0,16,0,16,0,16,0,2,93,65,3,0,208,0,16,0,1,93,65,3,0,80,0,16,0,1,113,65,3,0,16,0,16,0,1,113,186,0,8,0,16,0,1,17,18,57,184,0,8,47,184,0,1,16,185,0,36,0,4,244,184,0,23,208,186,0,13,0,8,0,23,17,18,57,65,3,0,5,0,13,0,1,93,184,0,8,16,185,0,29,0,4,244,184,0,16,16,185,0,42,0,4,244,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,23,0,3,0,0,17,18,57,184,0,23,47,185,0,35,0,2,244,186,0,13,0,23,0,35,17,18,57,184,0,3,16,185,0,21,0,2,244,184,0,0,16,185,0,37,0,2,244,48,49,1,65,3,0,119,0,5,0,1,93,65,3,0,117,0,6,0,1,93,65,3,0,6,0,6,0,1,93,65,3,0,38,0,6,0,1,93,65,3,0,134,0,6,0,1,93,65,3,0,23,0,6,0,1,93,65,5,0,118,0,11,0,134,0,11,0,2,93,65,3,0,118,0,12,0,1,93,65,3,0,135,0,12,0,1,93,65,3,0,85,0,14,0,1,93,65,3,0,102,0,14,0,1,93,65,3,0,134,0,14,0,1,93,65,3,0,117,0,15,0,1,93,65,3,0,116,0,18,0,1,93,65,3,0,6,0,18,0,1,93,65,5,0,86,0,18,0,102,0,18,0,2,93,65,5,0,87,0,19,0,103,0,19,0,2,93,0,65,3,0,133,0,5,0,1,93,65,3,0,118,0,5,0,1,93,65,3,0,133,0,6,0,1,93,65,3,0,118,0,6,0,1,93,65,7,0,7,0,6,0,23,0,6,0,39,0,6,0,3,93,65,3,0,136,0,11,0,1,93,65,3,0,121,0,11,0,1,93,65,3,0,136,0,12,0,1,93,65,3,0,122,0,12,0,1,93,65,3,0,101,0,14,0,1,93,65,3,0,86,0,14,0,1,93,65,3,0,134,0,14,0,1,93,65,3,0,119,0,15,0,1,93,65,3,0,9,0,18,0,1,93,65,5,0,90,0,18,0,106,0,18,0,2,93,65,3,0,123,0,18,0,1,93,65,3,0,106,0,19,0,1,93,65,3,0,91,0,19,0,1,93,33,35,17,51,50,30,2,21,20,14,2,7,30,1,21,20,14,2,3,35,21,51,50,62,2,53,52,46,2,19,35,21,51,50,62,2,53,52,46,2,1,64,240,158,65,99,66,34,3,12,23,19,65,52,43,69,87,98,90,118,24,40,30,17,23,38,50,30,148,98,45,70,49,26,20,36,52,2,188,14,39,67,53,27,40,34,33,20,25,80,60,67,82,44,15,2,103,206,7,22,44,38,33,38,19,5,254,220,237,7,24,44,38,35,47,29,13,0,0,0,1,0,39,255,242,2,71,2,202,0,38,1,174,186,0,12,0,5,0,3,43,65,3,0,95,0,5,0,1,93,65,3,0,127,0,5,0,1,93,65,3,0,63,0,5,0,1,93,65,3,0,16,0,5,0,1,93,65,3,0,0,0,12,0,1,113,65,5,0,0,0,12,0,16,0,12,0,2,93,65,3,0,224,0,12,0,1,93,65,3,0,176,0,12,0,1,93,184,0,5,16,185,0,21,0,4,244,184,0,12,16,184,0,37,208,65,3,0,0,0,40,0,1,93,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,65,3,0,25,0,5,0,1,93,184,0,10,16,184,0,13,220,65,5,0,144,0,13,0,160,0,13,0,2,93,185,0,12,0,2,244,184,0,10,16,185,0,16,0,2,244,184,0,0,16,185,0,26,0,2,244,184,0,0,16,184,0,36,220,65,5,0,159,0,36,0,175,0,36,0,2,93,185,0,37,0,2,244,48,49,1,65,3,0,104,0,2,0,1,93,65,3,0,25,0,2,0,1,93,65,3,0,121,0,2,0,1,93,65,3,0,90,0,2,0,1,93,65,3,0,90,0,3,0,1,93,65,3,0,24,0,7,0,1,93,65,3,0,88,0,7,0,1,93,65,3,0,24,0,8,0,1,93,65,3,0,88,0,8,0,1,93,65,3,0,121,0,8,0,1,93,65,3,0,106,0,8,0,1,93,65,3,0,71,0,19,0,1,93,0,65,3,0,24,0,2,0,1,93,65,5,0,88,0,2,0,104,0,2,0,2,93,65,3,0,121,0,2,0,1,93,65,3,0,88,0,3,0,1,93,65,3,0,23,0,7,0,1,93,65,3,0,87,0,7,0,1,93,65,5,0,85,0,8,0,101,0,8,0,2,93,65,3,0,118,0,8,0,1,93,65,3,0,23,0,8,0,1,93,5,34,46,2,53,52,62,2,51,50,23,7,39,38,35,34,14,2,21,20,30,2,51,50,54,63,1,54,63,1,54,63,1,23,6,1,134,77,129,93,52,52,93,128,77,107,87,10,57,57,70,59,91,63,33,32,63,93,60,15,28,15,25,8,19,23,5,21,23,10,87,14,52,96,134,82,81,134,96,53,41,88,20,23,42,74,102,60,59,102,75,42,2,3,5,1,7,7,1,8,8,88,40,0,0,2,0,80,0,0,2,175,2,188,0,12,0,25,1,67,186,0,8,0,1,0,3,43,65,3,0,47,0,1,0,1,113,65,3,0,127,0,1,0,1,93,65,3,0,175,0,1,0,1,93,65,3,0,16,0,1,0,1,93,65,3,0,128,0,8,0,1,93,65,3,0,224,0,8,0,1,93,65,3,0,16,0,8,0,1,113,65,3,0,192,0,8,0,1,93,65,5,0,64,0,8,0,80,0,8,0,2,93,65,5,0,16,0,8,0,32,0,8,0,2,93,184,0,1,16,185,0,15,0,4,244,184,0,8,16,185,0,21,0,4,244,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,3,16,185,0,13,0,2,244,184,0,0,16,185,0,16,0,2,244,48,49,1,65,7,0,86,0,5,0,102,0,5,0,118,0,5,0,3,93,65,3,0,86,0,6,0,1,93,65,3,0,86,0,10,0,1,93,65,3,0,86,0,11,0,1,93,65,3,0,118,0,11,0,1,93,65,3,0,103,0,11,0,1,93,65,3,0,8,0,18,0,1,93,0,65,3,0,86,0,5,0,1,93,65,5,0,103,0,5,0,119,0,5,0,2,93,65,3,0,87,0,6,0,1,93,65,3,0,89,0,10,0,1,93,65,3,0,105,0,11,0,1,93,65,3,0,90,0,11,0,1,93,65,3,0,123,0,11,0,1,93,41,1,17,33,50,30,2,21,20,14,2,3,35,17,51,50,62,2,53,52,46,2,1,83,254,253,1,3,76,128,93,51,51,91,128,78,164,164,58,91,63,32,32,63,91,2,188,48,91,130,81,81,130,90,49,2,102,253,240,37,69,98,60,60,98,69,37,0,0,0,1,0,80,0,0,2,4,2,188,0,11,0,168,186,0,11,0,1,0,3,43,65,3,0,191,0,1,0,1,93,65,3,0,0,0,1,0,1,93,65,3,0,0,0,11,0,1,93,65,3,0,208,0,11,0,1,93,65,3,0,64,0,11,0,1,93,184,0,11,16,184,0,4,208,184,0,4,47,184,0,1,16,185,0,10,0,4,244,184,0,6,208,184,0,11,16,184,0,8,208,184,0,8,47,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,2,16,185,0,5,0,2,244,186,0,6,0,2,0,1,17,18,57,184,0,6,47,185,0,9,0,2,244,184,0,1,16,185,0,10,0,2,244,48,49,41,1,17,33,21,33,21,33,21,33,21,33,2,4,254,76,1,171,254,180,1,8,254,248,1,85,2,188,86,205,86,237,0,0,0,1,0,80,0,0,1,251,2,188,0,9,0,163,186,0,0,0,7,0,3,43,65,3,0,143,0,0,0,1,93,65,5,0,0,0,0,0,16,0,0,0,2,93,65,3,0,64,0,0,0,1,93,65,3,0,143,0,7,0,1,93,65,3,0,191,0,7,0,1,93,65,5,0,0,0,7,0,16,0,7,0,2,93,184,0,7,16,185,0,6,0,4,244,184,0,2,208,184,0,0,16,184,0,3,208,184,0,3,47,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,14,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,184,0,8,16,185,0,1,0,2,244,186,0,2,0,8,0,6,17,18,57,184,0,2,47,185,0,5,0,2,244,48,49,1,33,21,33,21,33,17,35,17,33,1,251,254,180,1,0,255,0,95,1,171,2,102,205,86,254,189,2,188,0,0,0,1,0,39,255,242,2,109,2,202,0,36,1,79,186,0,31,0,5,0,3,43,65,5,0,63,0,5,0,79,0,5,0,2,93,65,3,0,32,0,5,0,1,93,65,3,0,128,0,31,0,1,93,65,3,0,32,0,31,0,1,113,65,3,0,63,0,31,0,1,93,65,3,0,0,0,31,0,1,113,65,3,0,80,0,31,0,1,93,65,3,0,32,0,31,0,1,93,186,0,12,0,31,0,5,17,18,57,184,0,12,47,184,0,5,16,185,0,20,0,4,244,184,0,31,16,185,0,28,0,4,244,184,0,31,16,184,0,30,220,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,184,0,13,220,184,0,10,16,185,0,15,0,2,244,184,0,0,16,185,0,25,0,2,244,186,0,30,0,10,0,0,17,18,57,184,0,30,47,185,0,29,0,2,244,48,49,1,65,3,0,90,0,2,0,1,93,65,3,0,91,0,3,0,1,93,65,3,0,89,0,8,0,1,93,65,3,0,6,0,17,0,1,93,65,3,0,7,0,23,0,1,93,0,65,3,0,90,0,2,0,1,93,65,3,0,83,0,8,0,1,93,65,11,0,70,0,11,0,86,0,11,0,102,0,11,0,118,0,11,0,134,0,11,0,5,93,65,11,0,70,0,12,0,86,0,12,0,102,0,12,0,118,0,12,0,134,0,12,0,5,93,65,3,0,7,0,23,0,1,93,5,34,46,2,53,52,62,2,51,50,23,7,38,35,34,14,2,21,20,30,2,51,50,55,53,35,53,51,17,14,3,1,126,74,126,92,51,52,93,129,77,118,90,9,105,91,61,94,63,32,34,67,99,66,72,45,110,205,20,59,65,67,14,53,96,134,82,82,134,95,52,40,83,37,41,73,103,61,63,103,72,40,19,174,86,254,200,11,19,15,8,0,1,0,80,0,0,2,154,2,188,0,11,0,209,186,0,0,0,5,0,3,43,65,3,0,208,0,0,0,1,93,65,3,0,80,0,0,0,1,113,65,3,0,32,0,0,0,1,113,65,3,0,64,0,0,0,1,93,65,3,0,16,0,0,0,1,93,184,0,0,16,185,0,1,0,4,244,65,3,0,191,0,5,0,1,93,65,3,0,15,0,5,0,1,113,65,3,0,143,0,5,0,1,93,65,3,0,16,0,5,0,1,93,184,0,5,16,185,0,4,0,4,244,184,0,8,208,184,0,1,16,184,0,9,208,65,3,0,64,0,13,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,8,0,7,0,4,17,18,57,184,0,8,47,185,0,3,0,2,244,184,0,7,16,184,0,10,208,48,49,1,65,3,0,15,0,12,0,1,93,33,35,17,33,17,35,17,51,17,33,17,51,2,154,95,254,116,95,95,1,140,95,1,65,254,191,2,188,254,223,1,33,0,0,1,0,80,0,0,0,175,2,188,0,3,0,118,187,0,0,0,4,0,1,0,4,43,65,5,0,159,0,0,0,175,0,0,0,2,93,65,3,0,0,0,0,0,1,93,65,3,0,112,0,0,0,1,93,65,5,0,159,0,1,0,175,0,1,0,2,93,65,3,0,112,0,1,0,1,93,65,3,0,0,0,1,0,1,93,65,3,0,80,0,5,0,1,93,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,48,49,51,35,17,51,175,95,95,2,188,0,0,0,0,1,255,239,255,84,0,175,2,188,0,12,0,104,187,0,10,0,4,0,9,0,4,43,65,3,0,95,0,9,0,1,93,65,5,0,159,0,9,0,175,0,9,0,2,93,65,3,0,0,0,9,0,1,93,65,5,0,159,0,10,0,175,0,10,0,2,93,65,3,0,95,0,10,0,1,93,65,3,0,0,0,10,0,1,93,0,184,0,1,47,184,0,0,69,88,184,0,9,47,27,185,0,9,0,14,62,89,184,0,1,16,184,0,3,220,48,49,23,35,39,51,50,62,2,53,17,51,17,20,9,16,10,4,27,36,21,9,95,172,56,12,27,43,31,2,191,253,36,140,0,0,0,2,0,80,0,0,2,61,2,188,0,5,0,9,1,44,186,0,1,0,7,0,3,43,65,3,0,80,0,1,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,65,3,0,176,0,1,0,1,93,184,0,1,16,184,0,0,208,65,5,0,85,0,0,0,101,0,0,0,2,93,65,3,0,70,0,0,0,1,93,65,7,0,153,0,0,0,169,0,0,0,185,0,0,0,3,93,65,3,0,57,0,0,0,1,113,65,3,0,39,0,0,0,1,93,65,5,0,22,0,0,0,38,0,0,0,2,113,65,3,0,116,0,0,0,1,93,65,3,0,131,0,0,0,1,93,184,0,1,16,184,0,2,208,65,3,0,70,0,2,0,1,93,184,0,1,16,184,0,3,208,65,3,0,8,0,3,0,1,93,184,0,0,16,184,0,4,208,65,3,0,8,0,4,0,1,93,184,0,0,16,184,0,5,208,65,3,0,70,0,5,0,1,93,65,3,0,143,0,7,0,1,93,65,3,0,16,0,7,0,1,93,184,0,7,16,185,0,6,0,4,244,0,184,0,0,69,88,184,0,9,47,27,185,0,9,0,14,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,184,0,1,208,184,0,9,16,184,0,3,208,186,0,5,0,3,0,1,17,18,57,25,184,0,5,47,24,184,0,2,208,48,49,33,35,9,1,51,1,3,35,17,51,2,61,100,254,253,1,3,100,254,253,139,95,95,1,115,1,73,254,183,254,141,2,188,0,0,0,0,1,0,80,0,0,1,240,2,188,0,5,0,114,186,0,5,0,1,0,3,43,65,3,0,175,0,1,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,65,3,0,144,0,1,0,1,93,184,0,1,16,185,0,4,0,4,244,65,3,0,175,0,5,0,1,93,65,5,0,0,0,5,0,16,0,5,0,2,93,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,185,0,5,0,2,244,48,49,41,1,17,51,17,33,1,240,254,96,95,1,65,2,188,253,154,0,0,0,0,1,0,48,0,0,2,252,2,188,0,11,2,149,186,0,0,0,6,0,3,43,65,3,0,80,0,0,0,1,113,65,3,0,63,0,0,0,1,93,65,5,0,160,0,0,0,176,0,0,0,2,113,65,5,0,80,0,0,0,96,0,0,0,2,93,65,5,0,0,0,0,0,16,0,0,0,2,93,184,0,0,16,185,0,1,0,4,244,184,0,2,208,65,3,0,7,0,2,0,1,113,65,5,0,22,0,2,0,38,0,2,0,2,113,65,3,0,47,0,6,0,1,113,65,3,0,143,0,6,0,1,93,65,5,0,47,0,6,0,63,0,6,0,2,93,65,3,0,15,0,6,0,1,113,65,3,0,80,0,6,0,1,113,65,5,0,0,0,6,0,16,0,6,0,2,93,186,0,3,0,6,0,0,17,18,57,184,0,6,16,185,0,5,0,4,244,184,0,4,208,65,5,0,25,0,4,0,41,0,4,0,2,113,65,3,0,8,0,4,0,1,113,184,0,6,16,184,0,7,208,65,7,0,57,0,7,0,73,0,7,0,89,0,7,0,3,113,65,3,0,152,0,7,0,1,93,186,0,8,0,4,0,7,17,18,57,65,3,0,7,0,8,0,1,113,184,0,3,16,184,0,9,208,184,0,0,16,184,0,11,208,65,3,0,136,0,11,0,1,93,65,3,0,151,0,11,0,1,93,65,7,0,54,0,11,0,70,0,11,0,86,0,11,0,3,113,186,0,10,0,2,0,11,17,18,57,65,3,0,8,0,10,0,1,113,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,14,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,1,208,184,0,8,16,184,0,4,208,65,5,0,91,0,4,0,107,0,4,0,2,113,65,5,0,60,0,4,0,76,0,4,0,2,113,65,3,0,45,0,4,0,1,113,65,3,0,31,0,4,0,1,113,65,3,0,142,0,4,0,1,93,65,3,0,13,0,4,0,1,113,65,3,0,252,0,4,0,1,93,65,5,0,107,0,4,0,123,0,4,0,2,93,65,3,0,89,0,4,0,1,93,184,0,2,208,186,0,3,0,8,0,5,17,18,57,65,5,0,89,0,3,0,105,0,3,0,2,93,184,0,3,16,184,0,9,208,65,7,0,84,0,9,0,100,0,9,0,116,0,9,0,3,93,65,3,0,244,0,9,0,1,93,65,3,0,154,0,9,0,1,93,65,3,0,69,0,9,0,1,93,65,5,0,84,0,9,0,100,0,9,0,2,113,65,3,0,67,0,9,0,1,113,65,3,0,130,0,9,0,1,93,184,0,8,16,184,0,10,208,48,49,1,65,3,0,117,0,8,0,1,93,65,3,0,122,0,10,0,1,93,0,65,3,0,124,0,2,0,1,93,65,3,0,41,0,3,0,1,113,65,3,0,10,0,3,0,1,93,65,3,0,123,0,4,0,1,93,65,5,0,20,0,9,0,36,0,9,0,2,113,33,35,11,3,35,19,51,27,1,51,2,252,100,66,190,194,66,100,94,81,184,182,82,2,17,254,149,1,107,253,239,2,188,254,165,1,91,0,1,0,80,0,0,2,112,2,188,0,9,1,47,186,0,9,0,4,0,3,43,65,3,0,0,0,9,0,1,93,65,3,0,112,0,9,0,1,93,65,3,0,48,0,9,0,1,93,65,3,0,32,0,9,0,1,113,65,3,0,0,0,9,0,1,113,184,0,9,16,185,0,8,0,4,244,184,0,1,208,65,5,0,0,0,4,0,16,0,4,0,2,93,184,0,4,16,185,0,3,0,4,244,184,0,6,208,65,3,0,134,0,6,0,1,93,65,5,0,20,0,6,0,36,0,6,0,2,113,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,14,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,1,208,184,0,5,16,184,0,2,208,65,3,0,57,0,2,0,1,93,184,0,1,16,184,0,7,208,184,0,5,16,184,0,8,208,48,49,1,65,3,0,89,0,1,0,1,93,65,3,0,85,0,6,0,1,93,0,65,5,0,74,0,2,0,90,0,2,0,2,93,65,3,0,43,0,2,0,1,113,65,5,0,108,0,2,0,124,0,2,0,2,93,65,3,0,143,0,2,0,1,93,65,3,0,128,0,7,0,1,93,65,3,0,67,0,7,0,1,93,65,5,0,99,0,7,0,115,0,7,0,2,93,65,3,0,35,0,7,0,1,113,65,3,0,84,0,7,0,1,93,33,35,1,17,35,17,51,1,17,51,2,112,81,254,144,95,103,1,89,96,2,41,253,215,2,188,253,244,2,12,0,0,2,0,39,255,242,2,217,2,202,0,18,0,37,1,177,186,0,17,0,7,0,3,43,65,3,0,15,0,7,0,1,93,65,5,0,79,0,7,0,95,0,7,0,2,93,65,5,0,176,0,17,0,192,0,17,0,2,93,65,3,0,32,0,17,0,1,113,65,3,0,113,0,17,0,1,93,65,5,0,224,0,17,0,240,0,17,0,2,93,65,3,0,128,0,17,0,1,93,65,3,0,32,0,17,0,1,93,184,0,7,16,185,0,26,0,4,244,184,0,17,16,185,0,36,0,4,244,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,12,16,185,0,21,0,2,244,184,0,2,16,185,0,31,0,2,244,48,49,1,65,3,0,86,0,0,0,1,93,65,5,0,103,0,0,0,119,0,0,0,2,93,65,3,0,88,0,4,0,1,93,65,5,0,105,0,4,0,121,0,4,0,2,93,65,3,0,88,0,5,0,1,93,65,3,0,88,0,9,0,1,93,65,3,0,120,0,9,0,1,93,65,3,0,105,0,10,0,1,93,65,3,0,90,0,10,0,1,93,65,7,0,87,0,14,0,103,0,14,0,119,0,14,0,3,93,65,3,0,86,0,15,0,1,93,65,3,0,118,0,15,0,1,93,65,3,0,15,0,38,0,1,93,0,65,3,0,104,0,0,0,1,93,65,3,0,90,0,0,0,1,93,65,3,0,122,0,0,0,1,93,65,5,0,89,0,4,0,105,0,4,0,2,93,65,3,0,123,0,4,0,1,93,65,3,0,89,0,5,0,1,93,65,3,0,86,0,9,0,1,93,65,3,0,119,0,9,0,1,93,65,5,0,86,0,10,0,102,0,10,0,2,93,65,3,0,86,0,14,0,1,93,65,5,0,103,0,14,0,119,0,14,0,2,93,65,3,0,86,0,15,0,1,93,65,3,0,119,0,15,0,1,93,37,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,3,38,35,34,14,2,21,20,30,2,51,50,62,2,53,52,2,120,96,152,76,127,91,51,52,91,127,75,75,127,92,51,167,62,116,58,90,61,32,32,61,90,58,58,90,62,31,85,99,52,95,134,83,83,134,95,52,52,96,134,82,165,1,109,78,42,74,102,60,60,102,74,42,42,75,101,60,122,0,0,2,0,80,0,0,2,36,2,188,0,14,0,25,1,63,186,0,9,0,2,0,3,43,65,5,0,0,0,2,0,16,0,2,0,2,93,65,3,0,143,0,2,0,1,93,65,3,0,175,0,2,0,1,93,65,3,0,144,0,2,0,1,93,65,3,0,112,0,2,0,1,93,184,0,2,16,185,0,1,0,4,244,65,3,0,80,0,9,0,1,93,65,3,0,144,0,9,0,1,93,65,3,0,0,0,9,0,1,113,65,3,0,175,0,9,0,1,93,65,3,0,224,0,9,0,1,93,65,3,0,112,0,9,0,1,93,65,5,0,0,0,9,0,16,0,9,0,2,93,65,3,0,32,0,9,0,1,113,184,0,16,208,184,0,9,16,185,0,20,0,4,244,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,0,0,4,0,1,17,18,57,184,0,0,47,185,0,16,0,2,244,184,0,4,16,185,0,25,0,2,244,48,49,1,65,3,0,135,0,6,0,1,93,65,5,0,101,0,7,0,117,0,7,0,2,93,65,3,0,6,0,7,0,1,93,65,3,0,134,0,7,0,1,93,0,65,3,0,134,0,6,0,1,93,65,5,0,103,0,6,0,119,0,6,0,2,93,65,5,0,101,0,7,0,117,0,7,0,2,93,65,3,0,6,0,7,0,1,93,65,3,0,135,0,7,0,1,93,55,21,35,17,51,50,30,2,21,20,14,2,35,3,17,51,50,54,53,52,46,2,35,180,100,224,49,88,67,40,41,64,76,35,152,134,73,62,16,38,63,46,245,245,2,188,15,47,86,70,68,91,55,23,1,114,254,227,77,71,37,53,32,15,0,0,2,0,39,255,242,2,217,2,202,0,21,0,43,2,27,186,0,19,0,9,0,3,43,65,5,0,224,0,19,0,240,0,19,0,2,93,65,3,0,32,0,19,0,1,93,65,3,0,32,0,19,0,1,113,65,5,0,176,0,19,0,192,0,19,0,2,93,65,3,0,112,0,19,0,1,93,65,5,0,79,0,9,0,95,0,9,0,2,93,65,3,0,15,0,9,0,1,93,186,0,21,0,19,0,9,17,18,57,184,0,21,16,184,0,0,208,186,0,2,0,9,0,19,17,18,57,184,0,2,16,184,0,1,208,65,3,0,88,0,1,0,1,113,184,0,9,16,185,0,27,0,4,244,184,0,19,16,185,0,39,0,4,244,186,0,34,0,27,0,39,17,18,57,65,3,0,121,0,34,0,1,93,184,0,34,16,184,0,35,208,65,3,0,56,0,35,0,1,113,65,3,0,72,0,35,0,1,93,186,0,37,0,39,0,27,17,18,57,184,0,37,16,184,0,36,208,65,3,0,15,0,44,0,1,93,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,14,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,186,0,2,0,4,0,14,17,18,57,184,0,2,16,184,0,1,208,184,0,1,47,186,0,21,0,14,0,4,17,18,57,184,0,14,16,185,0,22,0,2,244,184,0,4,16,185,0,32,0,2,244,186,0,34,0,32,0,22,17,18,57,186,0,37,0,22,0,32,17,18,57,184,0,37,16,184,0,36,208,184,0,36,47,48,49,1,65,3,0,104,0,1,0,1,93,65,3,0,89,0,6,0,1,93,65,3,0,121,0,6,0,1,93,65,3,0,89,0,7,0,1,93,65,3,0,89,0,11,0,1,93,65,3,0,123,0,11,0,1,93,65,5,0,89,0,12,0,105,0,12,0,2,93,65,7,0,86,0,16,0,102,0,16,0,118,0,16,0,3,93,65,3,0,86,0,17,0,1,93,65,3,0,105,0,35,0,1,93,0,65,3,0,89,0,2,0,1,93,65,3,0,89,0,6,0,1,93,65,3,0,121,0,6,0,1,93,65,3,0,106,0,6,0,1,93,65,3,0,89,0,7,0,1,93,65,3,0,87,0,11,0,1,93,65,3,0,119,0,11,0,1,93,65,5,0,86,0,12,0,102,0,12,0,2,93,65,3,0,86,0,16,0,1,93,65,3,0,118,0,16,0,1,93,37,7,39,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,7,1,34,14,2,21,20,30,2,51,50,55,39,55,23,54,53,52,46,2,2,203,50,65,100,116,76,127,91,51,52,91,127,75,75,127,92,51,74,254,241,59,89,62,31,31,60,90,60,96,55,103,50,105,48,34,65,93,62,59,54,71,52,95,134,83,83,134,95,52,52,96,134,82,129,110,2,5,41,74,102,61,60,102,74,42,40,84,61,93,75,111,60,101,75,42,0,0,0,0,2,0,80,0,0,2,72,2,188,0,15,0,26,1,159,186,0,12,0,5,0,3,43,65,3,0,15,0,5,0,1,113,65,5,0,0,0,5,0,16,0,5,0,2,93,65,3,0,144,0,5,0,1,93,65,3,0,224,0,12,0,1,93,65,5,0,0,0,12,0,16,0,12,0,2,93,65,3,0,112,0,12,0,1,93,65,3,0,80,0,12,0,1,93,186,0,15,0,5,0,12,17,18,57,65,3,0,38,0,15,0,1,93,65,3,0,23,0,15,0,1,93,65,3,0,135,0,15,0,1,93,65,3,0,102,0,15,0,1,93,65,3,0,85,0,15,0,1,93,65,3,0,117,0,15,0,1,93,184,0,15,16,184,0,0,208,184,0,15,16,185,0,2,0,4,244,65,3,0,136,0,2,0,1,93,184,0,1,208,184,0,5,16,185,0,4,0,4,244,184,0,18,208,184,0,12,16,185,0,24,0,4,244,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,3,0,7,0,4,17,18,57,184,0,3,47,186,0,15,0,3,0,7,17,18,57,184,0,7,16,185,0,16,0,2,244,184,0,3,16,185,0,18,0,2,244,48,49,1,65,3,0,102,0,9,0,1,93,65,3,0,100,0,10,0,1,93,65,3,0,134,0,10,0,1,93,65,3,0,22,0,10,0,1,113,65,3,0,7,0,10,0,1,93,65,3,0,119,0,10,0,1,93,65,3,0,89,0,22,0,1,93,65,3,0,89,0,26,0,1,93,0,65,5,0,101,0,9,0,117,0,9,0,2,93,65,3,0,117,0,10,0,1,93,65,3,0,102,0,10,0,1,93,65,3,0,7,0,10,0,1,93,65,3,0,23,0,10,0,1,113,65,3,0,85,0,22,0,1,93,33,35,3,35,17,35,17,51,50,30,2,21,20,6,7,3,35,17,51,50,62,2,53,52,38,2,72,102,155,147,100,227,58,91,61,32,67,61,115,126,151,24,43,33,19,72,1,17,254,239,2,188,22,49,78,56,66,103,28,1,69,254,254,16,32,49,33,61,67,0,1,0,40,255,242,2,41,2,202,0,57,3,109,186,0,53,0,19,0,3,43,65,3,0,79,0,19,0,1,93,65,3,0,111,0,19,0,1,93,65,3,0,80,0,53,0,1,93,65,3,0,160,0,53,0,1,93,65,3,0,224,0,53,0,1,93,65,3,0,192,0,53,0,1,93,65,5,0,112,0,53,0,128,0,53,0,2,93,65,3,0,32,0,53,0,1,93,65,3,0,0,0,53,0,1,93,186,0,2,0,19,0,53,17,18,57,184,0,2,47,184,0,53,16,185,0,10,0,4,244,186,0,29,0,53,0,19,17,18,57,184,0,29,47,184,0,19,16,185,0,37,0,4,244,0,184,0,0,69,88,184,0,24,47,27,185,0,24,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,3,220,65,5,0,112,0,3,0,128,0,3,0,2,93,65,3,0,16,0,3,0,1,93,65,3,0,240,0,3,0,1,93,184,0,0,16,185,0,5,0,2,244,186,0,15,0,0,0,24,17,18,57,65,3,0,137,0,15,0,1,93,184,0,24,16,184,0,30,220,65,3,0,143,0,30,0,1,93,65,3,0,255,0,30,0,1,93,184,0,24,16,185,0,32,0,2,244,186,0,40,0,24,0,0,17,18,57,48,49,1,65,11,0,40,0,2,0,56,0,2,0,72,0,2,0,88,0,2,0,104,0,2,0,5,93,65,3,0,136,0,2,0,1,93,65,5,0,56,0,12,0,72,0,12,0,2,93,65,3,0,138,0,12,0,1,93,65,3,0,105,0,16,0,1,93,65,3,0,72,0,17,0,1,93,65,3,0,72,0,18,0,1,93,65,3,0,58,0,18,0,1,93,65,3,0,138,0,18,0,1,93,65,3,0,105,0,21,0,1,93,65,3,0,137,0,21,0,1,93,65,3,0,121,0,22,0,1,93,65,3,0,106,0,22,0,1,93,65,3,0,120,0,39,0,1,93,65,3,0,6,0,49,0,1,93,65,3,0,101,0,50,0,1,93,65,3,0,6,0,50,0,1,93,65,3,0,38,0,50,0,1,93,65,3,0,118,0,50,0,1,93,65,3,0,100,0,55,0,1,93,65,3,0,132,0,55,0,1,93,65,3,0,117,0,55,0,1,93,65,3,0,6,0,56,0,1,93,65,3,0,102,0,56,0,1,93,65,3,0,119,0,56,0,1,93,0,65,11,0,41,0,1,0,57,0,1,0,73,0,1,0,89,0,1,0,105,0,1,0,5,93,65,11,0,40,0,2,0,56,0,2,0,72,0,2,0,88,0,2,0,104,0,2,0,5,93,65,3,0,138,0,2,0,1,93,65,3,0,123,0,2,0,1,93,65,3,0,136,0,12,0,1,93,65,5,0,57,0,12,0,73,0,12,0,2,93,65,3,0,90,0,14,0,1,93,65,3,0,105,0,16,0,1,93,65,3,0,10,0,17,0,1,93,65,3,0,74,0,17,0,1,93,65,3,0,135,0,18,0,1,93,65,3,0,72,0,18,0,1,93,65,3,0,133,0,21,0,1,93,65,3,0,103,0,21,0,1,93,65,3,0,116,0,22,0,1,93,65,3,0,101,0,22,0,1,93,65,11,0,38,0,27,0,54,0,27,0,70,0,27,0,86,0,27,0,102,0,27,0,5,93,65,3,0,132,0,28,0,1,93,65,13,0,38,0,28,0,54,0,28,0,70,0,28,0,86,0,28,0,102,0,28,0,118,0,28,0,6,93,65,3,0,116,0,39,0,1,93,65,3,0,7,0,49,0,1,93,65,3,0,102,0,50,0,1,93,65,3,0,7,0,50,0,1,93,65,3,0,39,0,50,0,1,93,65,3,0,105,0,55,0,1,93,65,3,0,137,0,55,0,1,93,65,3,0,122,0,55,0,1,93,65,3,0,9,0,56,0,1,93,65,3,0,106,0,56,0,1,93,65,3,0,123,0,56,0,1,93,5,34,39,55,22,51,50,62,2,53,52,46,2,47,1,46,1,53,52,62,2,51,50,30,2,23,7,38,35,34,14,2,21,20,22,23,30,3,31,1,30,1,31,1,30,1,23,20,14,2,1,24,145,84,13,94,124,36,61,45,25,26,47,67,41,70,85,73,24,57,97,74,30,64,59,50,17,10,126,75,29,57,44,27,75,76,21,19,18,31,34,34,13,17,5,25,23,15,3,18,58,107,14,45,111,70,13,27,41,27,28,41,32,26,14,23,28,83,57,30,71,61,40,8,13,18,9,101,63,12,26,38,27,44,49,24,7,4,5,11,15,18,7,10,5,26,24,56,39,30,67,58,39,0,1,0,15,0,0,2,6,2,188,0,7,0,86,187,0,1,0,4,0,4,0,4,43,184,0,1,16,184,0,0,220,184,0,4,16,184,0,5,220,65,3,0,31,0,9,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,14,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,6,16,185,0,5,0,2,244,184,0,1,208,48,49,1,35,17,35,17,35,53,33,2,6,204,95,204,1,247,2,102,253,154,2,102,86,0,0,0,1,0,72,255,242,2,140,2,188,0,21,1,207,186,0,15,0,1,0,3,43,65,3,0,223,0,1,0,1,93,65,3,0,143,0,1,0,1,93,65,5,0,175,0,1,0,191,0,1,0,2,93,65,3,0,16,0,1,0,1,93,184,0,1,16,185,0,2,0,4,244,65,3,0,64,0,15,0,1,93,65,3,0,175,0,15,0,1,93,65,3,0,240,0,15,0,1,93,65,3,0,0,0,15,0,1,113,65,3,0,16,0,15,0,1,93,65,3,0,32,0,15,0,1,113,184,0,15,16,185,0,14,0,4,244,65,3,0,15,0,22,0,1,93,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,14,62,89,184,0,0,69,88,184,0,19,47,27,185,0,19,0,6,62,89,185,0,8,0,2,244,184,0,2,16,184,0,14,208,48,49,1,65,3,0,103,0,5,0,1,93,65,3,0,135,0,5,0,1,93,65,3,0,136,0,10,0,1,93,65,3,0,104,0,11,0,1,93,65,3,0,136,0,11,0,1,93,65,3,0,36,0,17,0,1,93,65,3,0,22,0,17,0,1,93,65,3,0,118,0,17,0,1,93,65,3,0,23,0,18,0,1,93,65,3,0,71,0,18,0,1,93,65,3,0,24,0,20,0,1,93,65,3,0,72,0,20,0,1,93,65,3,0,58,0,20,0,1,93,65,3,0,25,0,21,0,1,93,65,3,0,122,0,21,0,1,93,65,3,0,43,0,21,0,1,93,0,65,3,0,133,0,5,0,1,93,65,3,0,102,0,5,0,1,93,65,3,0,133,0,6,0,1,93,65,3,0,134,0,10,0,1,93,65,3,0,101,0,11,0,1,93,65,3,0,135,0,11,0,1,93,65,3,0,120,0,17,0,1,93,65,3,0,56,0,18,0,1,93,65,3,0,41,0,18,0,1,93,65,3,0,73,0,18,0,1,93,65,3,0,27,0,18,0,1,93,65,3,0,25,0,20,0,1,93,65,3,0,57,0,20,0,1,93,65,3,0,42,0,20,0,1,93,65,3,0,74,0,20,0,1,93,19,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,6,35,34,38,72,95,14,41,77,63,63,77,42,13,95,145,145,145,145,1,41,1,147,254,155,51,97,77,46,48,76,97,50,1,101,254,109,148,163,163,0,0,0,0,1,0,4,0,0,2,128,2,188,0,6,1,95,187,0,1,0,4,0,2,0,4,43,65,3,0,16,0,1,0,1,93,65,3,0,112,0,1,0,1,93,65,5,0,32,0,1,0,48,0,1,0,2,113,184,0,1,16,184,0,0,208,65,3,0,24,0,0,0,1,93,65,3,0,71,0,0,0,1,93,65,3,0,134,0,0,0,1,93,65,3,0,112,0,2,0,1,93,65,3,0,16,0,2,0,1,93,65,5,0,32,0,2,0,48,0,2,0,2,113,184,0,2,16,184,0,3,208,65,3,0,137,0,3,0,1,93,65,3,0,72,0,3,0,1,93,185,0,4,0,4,244,186,0,5,0,2,0,1,17,18,57,184,0,0,16,185,0,6,0,4,244,65,3,0,79,0,8,0,1,93,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,5,208,184,0,4,16,184,0,6,208,48,49,1,65,3,0,134,0,1,0,1,93,65,13,0,167,0,1,0,183,0,1,0,199,0,1,0,215,0,1,0,231,0,1,0,247,0,1,0,6,93,65,7,0,7,0,1,0,23,0,1,0,39,0,1,0,3,113,65,13,0,168,0,2,0,184,0,2,0,200,0,2,0,216,0,2,0,232,0,2,0,248,0,2,0,6,93,65,7,0,8,0,2,0,24,0,2,0,40,0,2,0,3,113,65,3,0,137,0,2,0,1,93,0,65,5,0,100,0,5,0,116,0,5,0,2,93,65,3,0,85,0,5,0,1,93,9,1,35,1,51,27,1,2,128,254,244,100,254,244,100,219,217,2,188,253,68,2,188,253,177,2,79,0,1,0,14,0,0,3,193,2,188,0,12,1,221,186,0,10,0,9,0,3,43,65,3,0,63,0,10,0,1,93,184,0,10,16,184,0,1,220,65,3,0,47,0,1,0,1,93,184,0,0,208,184,0,1,16,185,0,2,0,4,244,65,3,0,63,0,9,0,1,93,186,0,3,0,9,0,10,17,18,57,184,0,9,16,184,0,5,220,185,0,4,0,4,244,184,0,5,16,184,0,6,208,65,3,0,71,0,6,0,1,93,185,0,7,0,4,244,186,0,8,0,5,0,4,17,18,57,186,0,11,0,2,0,1,17,18,57,184,0,0,16,185,0,12,0,4,244,65,3,0,191,0,14,0,1,93,65,3,0,159,0,14,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,2,208,184,0,7,16,184,0,9,208,184,0,9,47,184,0,3,208,184,0,5,16,184,0,8,208,184,0,11,208,184,0,7,16,184,0,12,208,48,49,1,65,3,0,40,0,1,0,1,93,65,3,0,8,0,2,0,1,93,65,5,0,56,0,2,0,72,0,2,0,2,93,65,3,0,137,0,2,0,1,93,65,3,0,122,0,2,0,1,93,65,7,0,102,0,4,0,118,0,4,0,134,0,4,0,3,93,65,3,0,71,0,4,0,1,93,65,3,0,247,0,4,0,1,93,65,3,0,135,0,7,0,1,93,65,3,0,104,0,9,0,1,93,65,3,0,136,0,9,0,1,93,65,3,0,248,0,9,0,1,93,65,3,0,7,0,10,0,1,93,65,3,0,71,0,10,0,1,93,65,3,0,135,0,10,0,1,93,65,3,0,56,0,10,0,1,93,65,3,0,41,0,10,0,1,93,0,65,3,0,4,0,3,0,1,93,65,3,0,21,0,3,0,1,93,65,3,0,70,0,3,0,1,93,65,3,0,123,0,3,0,1,93,65,3,0,26,0,8,0,1,93,65,3,0,11,0,8,0,1,93,65,3,0,57,0,11,0,1,93,65,3,0,26,0,11,0,1,93,65,3,0,12,0,11,0,1,93,1,3,35,11,1,35,3,51,27,1,51,27,1,3,193,205,105,165,171,105,196,100,155,175,86,177,154,2,188,253,68,2,62,253,194,2,188,253,176,2,66,253,191,2,79,0,1,0,9,0,0,2,82,2,188,0,11,1,205,187,0,11,0,4,0,5,0,4,43,184,0,11,16,184,0,0,208,65,3,0,182,0,0,0,1,93,65,3,0,22,0,0,0,1,113,65,3,0,215,0,0,0,1,93,65,3,0,87,0,0,0,1,93,65,3,0,136,0,0,0,1,93,65,3,0,151,0,0,0,1,93,65,3,0,23,0,0,0,1,93,65,3,0,54,0,0,0,1,113,65,3,0,246,0,0,0,1,93,65,3,0,101,0,0,0,1,93,65,3,0,36,0,0,0,1,93,185,0,1,0,4,244,65,3,0,39,0,1,0,1,93,186,0,2,0,5,0,11,17,18,57,184,0,5,16,184,0,4,208,65,3,0,54,0,4,0,1,93,65,3,0,215,0,4,0,1,93,65,3,0,41,0,4,0,1,93,65,3,0,105,0,4,0,1,93,65,3,0,230,0,4,0,1,93,65,5,0,118,0,4,0,134,0,4,0,2,93,65,3,0,166,0,4,0,1,93,185,0,3,0,4,244,184,0,4,16,184,0,6,208,184,0,3,16,184,0,7,208,65,3,0,118,0,7,0,1,93,186,0,8,0,5,0,11,17,18,57,184,0,1,16,184,0,9,208,184,0,0,16,184,0,10,208,65,3,0,15,0,13,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,1,208,186,0,2,0,3,0,7,17,18,57,65,3,0,150,0,2,0,1,93,186,0,8,0,7,0,3,17,18,57,186,0,5,0,8,0,2,17,18,57,184,0,7,16,184,0,9,208,186,0,11,0,2,0,8,17,18,57,48,49,65,3,0,74,0,2,0,1,93,65,3,0,106,0,2,0,1,93,65,3,0,138,0,2,0,1,93,65,3,0,123,0,2,0,1,93,65,3,0,116,0,8,0,1,93,65,3,0,101,0,8,0,1,93,65,3,0,133,0,8,0,1,93,65,7,0,54,0,8,0,70,0,8,0,86,0,8,0,3,93,33,35,11,1,35,19,3,51,27,1,51,3,2,82,100,202,183,100,235,235,110,180,194,100,250,1,30,254,226,1,93,1,95,254,239,1,17,254,173,0,0,0,1,255,253,0,0,2,57,2,188,0,8,0,233,187,0,1,0,4,0,4,0,4,43,65,3,0,175,0,1,0,1,93,65,3,0,32,0,1,0,1,93,184,0,1,16,184,0,0,208,65,3,0,121,0,0,0,1,93,65,3,0,102,0,0,0,1,93,65,3,0,38,0,0,0,1,93,65,3,0,175,0,4,0,1,93,65,3,0,32,0,4,0,1,93,184,0,4,16,184,0,5,208,65,3,0,105,0,5,0,1,93,65,3,0,41,0,5,0,1,93,65,3,0,118,0,5,0,1,93,185,0,6,0,4,244,186,0,7,0,4,0,1,17,18,57,184,0,0,16,185,0,8,0,4,244,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,186,0,7,0,6,0,2,17,18,57,184,0,6,16,184,0,8,208,48,49,65,3,0,88,0,1,0,1,93,65,3,0,89,0,4,0,1,93,65,3,0,131,0,7,0,1,93,65,3,0,116,0,7,0,1,93,1,3,17,35,17,3,51,27,1,2,57,236,99,237,100,186,186,2,188,254,135,254,189,1,67,1,121,254,221,1,35,0,0,0,1,0,9,0,0,2,30,2,188,0,7,1,200,186,0,2,0,6,0,3,43,65,3,0,64,0,2,0,1,93,65,3,0,175,0,2,0,1,93,65,3,0,96,0,2,0,1,93,65,5,0,16,0,2,0,32,0,2,0,2,93,65,3,0,128,0,2,0,1,93,184,0,2,16,184,0,0,208,65,3,0,16,0,6,0,1,93,184,0,6,16,184,0,4,208,184,0,1,208,65,3,0,99,0,1,0,1,93,65,3,0,69,0,1,0,1,93,65,5,0,85,0,1,0,101,0,1,0,2,113,65,3,0,38,0,1,0,1,93,65,3,0,184,0,1,0,1,93,65,5,0,153,0,1,0,169,0,1,0,2,93,65,5,0,54,0,1,0,70,0,1,0,2,113,65,3,0,246,0,1,0,1,93,65,3,0,6,0,1,0,1,113,65,3,0,21,0,1,0,1,113,65,3,0,36,0,1,0,1,113,65,3,0,114,0,1,0,1,93,65,3,0,128,0,1,0,1,93,184,0,0,16,184,0,5,208,65,3,0,24,0,5,0,1,93,65,3,0,41,0,5,0,1,93,65,3,0,58,0,5,0,1,113,65,3,0,74,0,5,0,1,93,65,3,0,43,0,5,0,1,113,65,3,0,125,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,108,0,5,0,1,93,65,3,0,26,0,5,0,1,113,65,5,0,90,0,5,0,106,0,5,0,2,113,65,3,0,249,0,5,0,1,93,65,3,0,9,0,5,0,1,113,65,3,0,73,0,5,0,1,113,65,3,0,183,0,5,0,1,93,65,5,0,150,0,5,0,166,0,5,0,2,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,185,0,2,0,2,244,184,0,7,16,185,0,6,0,2,244,48,49,1,65,3,0,84,0,1,0,1,93,65,3,0,54,0,1,0,1,93,65,3,0,57,0,5,0,1,93,65,3,0,91,0,5,0,1,93,9,1,33,21,33,1,33,53,2,30,254,135,1,76,254,24,1,120,254,181,2,188,253,154,86,2,102,86,0,0,0,1,0,70,255,121,1,71,2,238,0,7,0,78,184,0,1,47,65,3,0,143,0,1,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,184,0,0,220,184,0,4,208,184,0,1,16,184,0,6,220,0,184,0,0,47,184,0,0,69,88,184,0,3,47,27,185,0,3,0,18,62,89,184,0,4,220,184,0,0,16,184,0,7,220,48,49,5,33,17,33,21,35,17,51,1,71,254,255,1,1,174,174,135,3,117,68,253,19,0,0,0,1,0,35,255,171,1,250,2,188,0,3,0,61,184,0,2,47,184,0,0,220,65,5,0,112,0,0,0,128,0,0,0,2,93,185,0,1,0,4,244,184,0,2,16,185,0,3,0,4,244,0,184,0,1,47,184,0,0,69,88,184,0,3,47,27,185,0,3,0,14,62,89,48,49,5,35,1,51,1,250,93,254,134,93,85,3,17,0,1,0,0,255,121,1,1,2,238,0,7,0,82,184,0,2,47,65,3,0,208,0,2,0,1,93,65,3,0,16,0,2,0,1,93,184,0,4,220,184,0,2,16,184,0,5,220,184,0,4,16,184,0,7,208,0,184,0,3,47,184,0,0,69,88,184,0,0,47,27,185,0,0,0,18,62,89,184,0,3,16,184,0,4,220,184,0,0,16,184,0,7,220,48,49,17,33,17,33,53,51,17,35,1,1,254,255,174,174,2,238,252,139,68,2,237,0,0,0,0,1,0,49,1,181,1,205,2,247,0,5,0,95,25,184,0,4,47,24,184,0,1,208,184,0,4,16,184,0,3,208,184,0,3,47,184,0,4,16,184,0,5,208,184,0,5,47,0,184,0,4,47,184,0,2,220,184,0,0,208,184,0,4,16,184,0,1,208,65,7,0,107,0,1,0,123,0,1,0,139,0,1,0,3,93,184,0,2,16,184,0,3,208,65,3,0,181,0,3,0,1,93,184,0,5,208,48,49,1,39,7,53,55,23,1,205,206,206,206,206,1,181,216,216,106,216,216,0,1,0,3,255,134,2,51,255,220,0,3,0,64,184,0,4,47,184,0,5,47,184,0,4,16,184,0,2,208,184,0,2,47,184,0,5,16,184,0,3,208,184,0,3,47,0,184,0,4,47,184,0,2,220,184,0,1,220,65,7,0,79,0,1,0,95,0,1,0,111,0,1,0,3,113,48,49,5,33,53,33,2,51,253,208,2,48,122,86,0,0,0,1,0,58,2,84,0,245,2,220,0,3,0,126,184,0,1,47,65,7,0,0,0,1,0,16,0,1,0,32,0,1,0,3,93,65,5,0,16,0,1,0,32,0,1,0,2,113,184,0,3,220,0,184,0,0,47,65,3,0,16,0,0,0,1,113,65,3,0,64,0,0,0,1,93,65,3,0,32,0,0,0,1,93,184,0,2,220,65,5,0,15,0,2,0,31,0,2,0,2,93,184,0,1,220,184,0,0,16,184,0,3,220,65,11,0,86,0,3,0,102,0,3,0,118,0,3,0,134,0,3,0,150,0,3,0,5,93,48,49,19,39,53,23,245,187,187,2,84,64,72,95,0,2,0,24,255,246,1,216,1,244,0,34,0,43,2,22,186,0,30,0,12,0,3,43,65,3,0,160,0,30,0,1,93,65,3,0,159,0,30,0,1,93,65,3,0,127,0,30,0,1,93,65,3,0,48,0,30,0,1,113,65,3,0,192,0,30,0,1,93,65,3,0,16,0,30,0,1,113,184,0,30,16,184,0,0,208,184,0,0,47,65,3,0,0,0,0,0,1,93,184,0,30,16,185,0,36,0,4,244,186,0,7,0,36,0,30,17,18,57,65,9,0,111,0,12,0,127,0,12,0,143,0,12,0,159,0,12,0,4,93,65,3,0,15,0,12,0,1,113,65,3,0,63,0,12,0,1,93,65,3,0,31,0,12,0,1,93,65,3,0,191,0,12,0,1,93,65,3,0,192,0,12,0,1,93,65,3,0,160,0,12,0,1,93,184,0,17,208,186,0,23,0,12,0,30,17,18,57,184,0,23,47,184,0,12,16,185,0,39,0,4,244,0,184,0,0,69,88,184,0,25,47,27,185,0,25,0,12,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,0,69,88,184,0,9,47,27,185,0,9,0,6,62,89,186,0,17,0,25,0,9,17,18,57,184,0,17,47,186,0,7,0,17,0,9,17,18,57,184,0,25,16,185,0,20,0,2,244,184,0,25,16,184,0,22,220,65,3,0,79,0,22,0,1,93,184,0,1,16,185,0,34,0,1,244,184,0,17,16,185,0,36,0,1,244,184,0,9,16,185,0,41,0,1,244,48,49,1,65,3,0,56,0,10,0,1,93,65,3,0,25,0,10,0,1,93,65,3,0,41,0,11,0,1,93,65,3,0,26,0,11,0,1,93,65,3,0,24,0,14,0,1,93,65,3,0,136,0,14,0,1,93,65,5,0,120,0,24,0,136,0,24,0,2,93,65,7,0,7,0,27,0,23,0,27,0,39,0,27,0,3,93,65,3,0,6,0,28,0,1,93,0,65,3,0,56,0,10,0,1,93,65,3,0,25,0,10,0,1,93,65,3,0,42,0,10,0,1,93,65,3,0,118,0,14,0,1,93,65,3,0,135,0,14,0,1,93,65,3,0,117,0,24,0,1,93,65,5,0,86,0,24,0,102,0,24,0,2,93,65,3,0,135,0,24,0,1,93,65,5,0,6,0,27,0,22,0,27,0,2,93,65,3,0,39,0,27,0,1,93,37,7,35,34,46,2,39,6,35,34,38,53,52,62,2,55,52,38,35,34,7,39,54,51,50,30,2,29,1,20,22,51,39,53,14,1,21,20,51,50,54,1,216,14,7,30,40,28,19,9,62,88,69,82,55,85,104,49,51,56,64,65,13,66,100,47,66,41,19,20,36,146,108,93,76,36,67,62,72,7,17,28,20,72,79,63,51,66,40,17,1,66,47,44,73,51,25,55,90,65,100,58,45,66,117,4,49,55,75,36,0,2,0,60,255,246,2,11,2,238,0,21,0,41,1,57,186,0,17,0,7,0,3,43,65,3,0,15,0,7,0,1,113,65,3,0,31,0,7,0,1,93,65,3,0,47,0,7,0,1,113,65,3,0,0,0,7,0,1,93,65,3,0,32,0,7,0,1,93,184,0,7,16,185,0,10,0,4,244,184,0,5,208,65,3,0,0,0,17,0,1,93,65,7,0,32,0,17,0,48,0,17,0,64,0,17,0,3,93,65,3,0,96,0,17,0,1,93,65,3,0,16,0,17,0,1,113,184,0,10,16,184,0,27,208,184,0,17,16,185,0,37,0,4,244,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,12,62,89,184,0,0,69,88,184,0,9,47,27,185,0,9,0,18,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,186,0,5,0,0,0,12,17,18,57,186,0,10,0,12,0,0,17,18,57,184,0,12,16,185,0,22,0,2,244,184,0,0,16,185,0,32,0,2,244,48,49,1,65,3,0,87,0,11,0,1,93,65,3,0,102,0,20,0,1,93,65,3,0,87,0,20,0,1,93,0,65,5,0,85,0,11,0,101,0,11,0,2,93,65,3,0,86,0,14,0,1,93,65,3,0,103,0,14,0,1,93,65,5,0,89,0,20,0,105,0,20,0,2,93,5,34,46,2,39,7,35,17,51,17,54,51,50,30,2,21,20,14,2,3,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,1,45,18,42,42,37,12,10,80,90,52,100,49,82,58,32,34,60,81,57,29,53,40,24,23,40,53,30,32,52,36,20,20,37,52,10,10,18,27,17,62,2,238,254,199,63,41,70,93,51,53,93,69,40,1,174,23,45,65,42,43,66,44,22,28,48,64,35,37,64,47,27,0,1,0,33,255,246,1,171,1,244,0,25,1,133,186,0,12,0,5,0,3,43,65,3,0,143,0,5,0,1,93,65,3,0,31,0,5,0,1,93,65,9,0,63,0,5,0,79,0,5,0,95,0,5,0,111,0,5,0,4,93,65,3,0,32,0,5,0,1,93,65,3,0,176,0,12,0,1,93,65,3,0,0,0,12,0,1,113,65,3,0,32,0,12,0,1,113,65,3,0,208,0,12,0,1,93,65,3,0,32,0,12,0,1,93,65,3,0,0,0,12,0,1,93,184,0,5,16,185,0,18,0,4,244,184,0,12,16,184,0,24,208,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,184,0,13,220,184,0,10,16,185,0,15,0,2,244,184,0,0,16,185,0,21,0,2,244,184,0,0,16,184,0,23,220,48,49,1,65,5,0,90,0,2,0,106,0,2,0,2,93,65,5,0,89,0,8,0,105,0,8,0,2,93,65,3,0,104,0,11,0,1,93,65,3,0,104,0,24,0,1,93,65,3,0,104,0,25,0,1,93,0,65,3,0,89,0,2,0,1,93,65,3,0,106,0,2,0,1,93,65,3,0,84,0,8,0,1,93,65,3,0,101,0,8,0,1,93,65,3,0,132,0,11,0,1,93,65,5,0,85,0,11,0,101,0,11,0,2,93,65,3,0,84,0,12,0,1,93,65,3,0,116,0,12,0,1,93,65,3,0,101,0,12,0,1,93,65,3,0,133,0,12,0,1,93,65,7,0,90,0,24,0,106,0,24,0,122,0,24,0,3,93,65,3,0,140,0,24,0,1,93,65,5,0,89,0,25,0,105,0,25,0,2,93,5,34,46,2,53,52,62,2,51,50,23,7,38,35,34,6,21,20,22,51,50,55,23,6,1,21,59,90,63,32,32,61,91,59,98,53,14,62,65,81,80,80,81,66,62,12,55,10,39,69,93,55,56,93,68,37,29,81,30,90,84,84,93,30,72,37,0,0,0,0,2,0,32,255,246,1,239,2,238,0,21,0,41,1,39,186,0,21,0,12,0,3,43,65,3,0,143,0,21,0,1,93,65,7,0,0,0,21,0,16,0,21,0,32,0,21,0,3,113,184,0,21,16,185,0,20,0,4,244,184,0,2,208,65,3,0,31,0,12,0,1,93,65,5,0,63,0,12,0,79,0,12,0,2,93,65,3,0,111,0,12,0,1,93,65,3,0,143,0,12,0,1,93,184,0,12,16,185,0,27,0,4,244,184,0,20,16,184,0,37,208,0,184,0,0,69,88,184,0,21,47,27,185,0,21,0,18,62,89,184,0,0,69,88,184,0,17,47,27,185,0,17,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,0,69,88,184,0,7,47,27,185,0,7,0,6,62,89,186,0,2,0,7,0,17,17,18,57,186,0,19,0,17,0,7,17,18,57,184,0,17,16,185,0,22,0,2,244,184,0,7,16,185,0,32,0,2,244,48,49,1,65,3,0,88,0,9,0,1,93,65,3,0,105,0,9,0,1,93,65,3,0,104,0,15,0,1,93,0,65,5,0,88,0,9,0,104,0,9,0,2,93,65,3,0,103,0,15,0,1,93,65,3,0,85,0,16,0,1,93,65,3,0,101,0,18,0,1,93,65,3,0,86,0,18,0,1,93,33,35,39,14,3,35,34,46,2,53,52,62,2,51,50,23,17,51,3,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,1,239,80,10,12,37,41,42,18,47,82,60,34,32,59,82,50,99,51,90,233,32,51,36,19,19,35,51,33,30,55,43,25,26,43,55,62,17,26,19,10,40,69,93,53,51,93,70,41,62,1,56,254,182,26,46,64,39,36,64,47,28,21,43,65,43,42,66,46,24,0,0,2,0,31,255,246,1,226,1,244,0,24,0,30,2,2,186,0,23,0,13,0,3,43,65,3,0,175,0,13,0,1,93,65,3,0,79,0,13,0,1,93,65,3,0,47,0,13,0,1,113,65,3,0,143,0,13,0,1,93,65,3,0,111,0,13,0,1,93,184,0,13,16,185,0,1,0,4,244,65,3,0,80,0,23,0,1,93,65,3,0,144,0,23,0,1,93,65,3,0,208,0,23,0,1,93,65,3,0,16,0,23,0,1,113,65,3,0,48,0,23,0,1,113,65,3,0,240,0,23,0,1,93,65,3,0,176,0,23,0,1,93,65,3,0,112,0,23,0,1,93,65,3,0,16,0,23,0,1,93,65,3,0,80,0,23,0,1,113,186,0,6,0,23,0,13,17,18,57,184,0,6,47,184,0,23,16,185,0,28,0,4,244,186,0,27,0,1,0,28,17,18,57,0,184,0,0,69,88,184,0,18,47,27,185,0,18,0,12,62,89,184,0,0,69,88,184,0,8,47,27,185,0,8,0,6,62,89,186,0,1,0,18,0,8,17,18,57,184,0,1,47,65,5,0,144,0,1,0,160,0,1,0,2,93,65,5,0,16,0,1,0,32,0,1,0,2,93,65,5,0,80,0,1,0,96,0,1,0,2,113,184,0,8,16,185,0,3,0,2,244,184,0,8,16,184,0,5,220,184,0,18,16,185,0,25,0,2,244,184,0,1,16,184,0,27,220,65,3,0,255,0,27,0,1,113,65,15,0,159,0,27,0,175,0,27,0,191,0,27,0,207,0,27,0,223,0,27,0,239,0,27,0,255,0,27,0,7,93,48,49,1,65,3,0,69,0,2,0,1,93,65,3,0,54,0,2,0,1,93,65,3,0,135,0,6,0,1,93,65,3,0,103,0,7,0,1,93,65,3,0,120,0,7,0,1,93,65,3,0,88,0,10,0,1,93,65,3,0,135,0,20,0,1,93,65,3,0,132,0,21,0,1,93,65,3,0,6,0,21,0,1,93,0,65,3,0,54,0,2,0,1,93,65,3,0,71,0,2,0,1,93,65,3,0,137,0,6,0,1,93,65,5,0,105,0,7,0,121,0,7,0,2,93,65,3,0,90,0,7,0,1,93,65,3,0,89,0,10,0,1,93,65,3,0,134,0,20,0,1,93,65,3,0,135,0,21,0,1,93,37,33,22,51,50,55,23,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,39,34,7,33,52,38,1,222,254,157,16,168,75,66,12,87,77,62,99,68,36,34,62,89,55,47,78,55,31,213,109,29,1,2,60,245,175,29,71,38,40,69,95,55,53,92,67,39,28,54,77,48,28,155,113,54,59,0,0,0,0,1,0,10,0,0,1,61,2,238,0,23,0,236,186,0,13,0,4,0,3,43,65,3,0,143,0,4,0,1,93,65,3,0,47,0,4,0,1,113,184,0,4,16,185,0,1,0,4,244,184,0,4,16,184,0,5,208,184,0,5,47,184,0,4,16,184,0,7,208,65,3,0,47,0,13,0,1,113,184,0,1,16,184,0,22,208,184,0,13,16,184,0,23,208,184,0,23,47,0,184,0,0,69,88,184,0,11,47,27,185,0,11,0,18,62,89,184,0,0,69,88,184,0,22,47,27,185,0,22,0,12,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,22,16,185,0,1,0,1,244,184,0,4,208,184,0,22,16,184,0,7,208,184,0,11,16,185,0,16,0,2,244,48,49,1,65,9,0,73,0,9,0,89,0,9,0,105,0,9,0,121,0,9,0,4,93,65,9,0,10,0,9,0,26,0,9,0,42,0,9,0,58,0,9,0,4,93,0,65,9,0,5,0,10,0,21,0,10,0,37,0,10,0,53,0,10,0,4,93,1,35,17,35,17,35,55,51,53,52,54,51,50,23,7,38,35,34,14,2,29,1,51,1,61,132,90,85,12,73,59,55,64,38,14,29,31,17,20,11,4,132,1,164,254,92,1,164,70,124,61,75,13,76,9,7,25,48,40,60,0,0,0,3,0,26,255,6,1,245,1,244,0,53,0,65,0,78,3,224,186,0,30,0,14,0,3,43,65,3,0,95,0,14,0,1,93,65,3,0,32,0,14,0,1,93,65,3,0,160,0,14,0,1,93,184,0,14,16,184,0,5,208,184,0,5,47,184,0,14,16,184,0,9,208,184,0,9,47,65,3,0,0,0,30,0,1,93,65,3,0,96,0,30,0,1,93,65,3,0,160,0,30,0,1,93,65,3,0,128,0,30,0,1,93,65,3,0,32,0,30,0,1,93,65,3,0,192,0,30,0,1,93,65,3,0,16,0,30,0,1,113,186,0,12,0,14,0,30,17,18,57,186,0,21,0,14,0,30,17,18,57,184,0,30,16,184,0,24,208,184,0,24,47,186,0,28,0,30,0,14,17,18,57,186,0,37,0,30,0,14,17,18,57,184,0,9,16,185,0,39,0,4,244,184,0,30,16,184,0,49,208,184,0,49,47,184,0,14,16,185,0,57,0,4,244,184,0,30,16,185,0,63,0,4,244,184,0,5,16,185,0,71,0,4,244,184,0,49,16,185,0,77,0,4,244,65,3,0,79,0,80,0,1,93,0,184,0,0,69,88,184,0,19,47,27,185,0,19,0,12,62,89,184,0,0,69,88,184,0,24,47,27,185,0,24,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,8,62,89,65,3,0,0,0,0,0,1,93,186,0,44,0,19,0,0,17,18,57,65,5,0,58,0,44,0,74,0,44,0,2,93,65,3,0,101,0,44,0,1,93,184,0,44,16,185,0,66,0,1,244,186,0,7,0,44,0,66,17,18,57,184,0,19,16,184,0,35,220,65,3,0,111,0,35,0,1,93,65,5,0,63,0,35,0,79,0,35,0,2,93,65,3,0,143,0,35,0,1,93,65,3,0,15,0,35,0,1,113,186,0,12,0,35,0,19,17,18,57,186,0,21,0,19,0,35,17,18,57,184,0,24,16,185,0,25,0,1,244,186,0,28,0,19,0,35,17,18,57,186,0,37,0,35,0,19,17,18,57,184,0,19,16,185,0,54,0,1,244,184,0,35,16,185,0,60,0,1,244,186,0,68,0,66,0,44,17,18,57,184,0,0,16,185,0,74,0,1,244,48,49,1,65,3,0,9,0,3,0,1,93,65,5,0,122,0,8,0,138,0,8,0,2,93,65,3,0,121,0,12,0,1,93,65,3,0,120,0,13,0,1,93,65,3,0,138,0,13,0,1,93,65,3,0,9,0,16,0,1,93,65,3,0,123,0,16,0,1,93,65,3,0,140,0,16,0,1,93,65,3,0,136,0,17,0,1,93,65,3,0,121,0,17,0,1,93,65,3,0,117,0,21,0,1,93,65,3,0,134,0,21,0,1,93,65,3,0,117,0,28,0,1,93,65,3,0,134,0,28,0,1,93,65,3,0,117,0,32,0,1,93,65,3,0,134,0,32,0,1,93,65,3,0,134,0,33,0,1,93,65,3,0,7,0,33,0,1,93,65,3,0,119,0,33,0,1,93,65,3,0,134,0,47,0,1,93,65,5,0,23,0,47,0,39,0,47,0,2,93,65,3,0,119,0,47,0,1,93,65,5,0,118,0,51,0,134,0,51,0,2,93,65,3,0,6,0,52,0,1,93,65,3,0,135,0,52,0,1,93,65,3,0,119,0,69,0,1,93,0,65,3,0,8,0,3,0,1,93,65,3,0,120,0,8,0,1,93,65,3,0,120,0,12,0,1,93,65,3,0,120,0,13,0,1,93,65,3,0,6,0,16,0,1,93,65,3,0,119,0,16,0,1,93,65,3,0,133,0,17,0,1,93,65,3,0,119,0,17,0,1,93,65,3,0,134,0,21,0,1,93,65,3,0,119,0,21,0,1,93,65,5,0,118,0,28,0,134,0,28,0,2,93,65,3,0,137,0,32,0,1,93,65,3,0,122,0,32,0,1,93,65,3,0,9,0,33,0,1,93,65,3,0,121,0,33,0,1,93,65,3,0,138,0,33,0,1,93,65,3,0,102,0,42,0,1,93,65,3,0,134,0,47,0,1,93,65,5,0,23,0,47,0,39,0,47,0,2,93,65,3,0,119,0,47,0,1,93,65,5,0,122,0,51,0,138,0,51,0,2,93,65,3,0,9,0,52,0,1,93,65,3,0,121,0,52,0,1,93,65,3,0,138,0,52,0,1,93,65,3,0,121,0,69,0,1,93,65,3,0,138,0,69,0,1,93,23,34,46,2,53,52,55,38,53,52,54,55,38,53,52,62,2,51,50,23,54,59,1,7,35,34,7,22,21,20,14,2,35,34,39,6,21,20,30,2,23,30,3,23,20,14,2,3,34,6,21,20,22,51,50,54,53,52,38,3,34,39,14,1,21,20,22,51,50,54,53,52,255,58,86,57,28,87,50,27,31,85,27,51,75,47,66,59,52,67,8,11,23,31,27,45,28,51,73,46,39,31,24,11,33,59,49,33,70,57,38,2,34,63,92,75,55,60,65,52,54,62,64,12,17,72,34,44,78,69,72,79,250,24,41,54,29,78,32,24,38,17,41,15,61,99,42,72,53,30,36,28,60,7,54,63,39,70,54,32,9,14,16,9,13,10,11,9,6,18,30,47,35,31,56,42,25,2,166,67,55,57,67,72,55,57,62,254,58,12,10,50,26,35,45,47,31,52,0,1,0,60,0,0,1,230,2,238,0,16,1,44,186,0,0,0,9,0,3,43,65,3,0,223,0,0,0,1,93,65,3,0,32,0,0,0,1,93,65,3,0,64,0,0,0,1,93,184,0,0,16,185,0,1,0,4,244,65,3,0,223,0,9,0,1,93,65,3,0,15,0,9,0,1,113,65,3,0,47,0,9,0,1,113,65,3,0,32,0,9,0,1,93,184,0,9,16,185,0,8,0,4,244,184,0,12,208,65,3,0,128,0,17,0,1,93,65,3,0,239,0,18,0,1,93,65,3,0,31,0,18,0,1,93,65,3,0,207,0,18,0,1,93,65,3,0,175,0,18,0,1,93,0,184,0,0,69,88,184,0,11,47,27,185,0,11,0,18,62,89,184,0,0,69,88,184,0,14,47,27,185,0,14,0,12,62,89,184,0,0,69,88,184,0,8,47,27,185,0,8,0,6,62,89,184,0,1,208,184,0,14,16,185,0,5,0,2,244,65,3,0,6,0,9,0,1,113,186,0,12,0,14,0,8,17,18,57,48,49,1,65,7,0,118,0,15,0,134,0,15,0,150,0,15,0,3,93,65,3,0,7,0,15,0,1,93,0,65,3,0,150,0,4,0,1,93,65,3,0,118,0,15,0,1,93,65,3,0,150,0,15,0,1,93,65,3,0,7,0,15,0,1,93,65,3,0,135,0,15,0,1,93,33,35,17,52,38,35,34,7,17,35,17,51,17,54,51,50,21,1,230,90,52,65,88,40,91,91,49,93,193,1,6,87,71,64,254,156,2,238,254,199,63,238,0,2,0,61,0,0,0,151,2,188,0,3,0,7,0,165,187,0,7,0,4,0,6,0,4,43,65,3,0,143,0,7,0,1,93,65,3,0,223,0,7,0,1,93,65,3,0,63,0,7,0,1,113,65,3,0,32,0,7,0,1,93,184,0,7,16,184,0,0,208,65,3,0,223,0,6,0,1,93,65,3,0,63,0,6,0,1,113,65,3,0,143,0,6,0,1,93,65,3,0,32,0,6,0,1,93,184,0,6,16,184,0,1,208,0,184,0,1,47,184,0,0,69,88,184,0,6,47,27,185,0,6,0,12,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,65,3,0,32,0,1,0,1,93,65,3,0,64,0,1,0,1,93,184,0,1,16,184,0,2,220,48,49,19,35,53,51,17,35,17,51,151,90,90,90,90,2,88,100,253,68,1,234,0,0,0,0,2,255,244,255,14,0,151,2,188,0,14,0,18,0,209,187,0,9,0,4,0,8,0,4,43,65,3,0,63,0,8,0,1,113,65,3,0,143,0,8,0,1,93,65,3,0,223,0,8,0,1,93,65,3,0,32,0,8,0,1,93,184,0,8,16,184,0,2,208,184,0,2,47,65,3,0,143,0,9,0,1,93,65,3,0,223,0,9,0,1,93,65,3,0,63,0,9,0,1,113,65,3,0,32,0,9,0,1,93,184,0,9,16,184,0,15,208,184,0,8,16,184,0,16,208,0,184,0,16,47,184,0,0,69,88,184,0,8,47,27,185,0,8,0,12,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,8,62,89,185,0,2,0,1,244,65,3,0,64,0,16,0,1,93,65,3,0,32,0,16,0,1,93,184,0,16,16,184,0,17,220,48,49,1,65,11,0,5,0,12,0,21,0,12,0,37,0,12,0,53,0,12,0,69,0,12,0,5,93,23,7,39,62,3,53,17,51,17,20,14,2,19,35,53,51,28,30,10,22,28,16,7,90,20,33,45,98,90,90,237,5,69,2,10,21,37,30,2,51,253,171,32,45,31,18,3,65,100,0,0,0,1,0,60,0,0,1,189,2,238,0,10,1,129,186,0,8,0,1,0,3,43,65,3,0,15,0,1,0,1,113,65,3,0,143,0,1,0,1,93,65,3,0,0,0,1,0,1,93,65,3,0,32,0,1,0,1,93,184,0,1,16,185,0,0,0,4,244,184,0,4,208,65,3,0,51,0,8,0,1,93,65,3,0,37,0,8,0,1,93,65,3,0,73,0,8,0,1,93,65,3,0,138,0,8,0,1,93,65,3,0,90,0,8,0,1,93,65,3,0,121,0,8,0,1,93,65,3,0,19,0,8,0,1,93,65,3,0,99,0,8,0,1,93,65,3,0,0,0,8,0,1,93,184,0,8,16,184,0,9,208,65,5,0,73,0,9,0,89,0,9,0,2,93,65,3,0,106,0,9,0,1,93,65,5,0,123,0,9,0,139,0,9,0,2,93,65,3,0,41,0,9,0,1,113,65,7,0,166,0,9,0,182,0,9,0,198,0,9,0,3,93,65,3,0,149,0,9,0,1,93,184,0,5,208,65,3,0,134,0,5,0,1,93,184,0,8,16,184,0,6,208,65,3,0,134,0,6,0,1,93,184,0,4,16,184,0,7,208,65,3,0,38,0,7,0,1,113,65,7,0,101,0,7,0,117,0,7,0,133,0,7,0,3,93,65,3,0,63,0,12,0,1,93,65,3,0,31,0,12,0,1,93,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,18,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,9,208,186,0,7,0,5,0,9,17,18,57,25,184,0,7,47,24,184,0,4,208,184,0,7,16,184,0,10,208,48,49,51,35,17,51,17,55,51,7,19,35,39,150,90,90,180,110,202,207,110,185,2,238,254,31,221,226,254,248,249,0,1,0,60,255,246,0,229,2,238,0,12,0,111,186,0,0,0,5,0,3,43,65,3,0,255,0,0,0,1,93,65,3,0,32,0,0,0,1,93,65,3,0,47,0,5,0,1,113,65,3,0,255,0,5,0,1,93,65,3,0,32,0,5,0,1,93,184,0,5,16,185,0,8,0,4,244,65,3,0,16,0,13,0,1,93,65,3,0,175,0,14,0,1,93,0,184,0,7,47,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,185,0,0,0,1,244,48,49,55,7,35,34,38,53,17,51,17,20,30,2,229,13,29,66,61,90,5,16,31,62,72,67,51,2,130,253,178,31,39,21,7,0,0,0,1,0,61,0,0,3,53,1,244,0,29,2,14,186,0,9,0,17,0,3,43,65,3,0,0,0,9,0,1,93,65,3,0,255,0,9,0,1,93,65,3,0,32,0,9,0,1,93,65,3,0,64,0,9,0,1,113,184,0,9,16,184,0,1,220,65,3,0,64,0,1,0,1,113,185,0,0,0,4,244,184,0,9,16,185,0,8,0,4,244,65,3,0,255,0,17,0,1,93,65,3,0,32,0,17,0,1,93,65,3,0,0,0,17,0,1,93,184,0,17,16,185,0,16,0,4,244,186,0,20,0,16,0,17,17,18,57,186,0,25,0,8,0,9,17,18,57,65,3,0,95,0,31,0,1,93,0,184,0,0,69,88,184,0,23,47,27,185,0,23,0,12,62,89,184,0,0,69,88,184,0,27,47,27,185,0,27,0,12,62,89,184,0,0,69,88,184,0,19,47,27,185,0,19,0,12,62,89,184,0,0,69,88,184,0,16,47,27,185,0,16,0,6,62,89,184,0,9,208,184,0,1,208,184,0,27,16,185,0,5,0,2,244,184,0,23,16,185,0,13,0,2,244,186,0,20,0,23,0,16,17,18,57,186,0,25,0,27,0,9,17,18,57,48,49,1,65,3,0,168,0,11,0,1,93,65,3,0,154,0,12,0,1,93,65,3,0,123,0,12,0,1,93,65,3,0,87,0,14,0,1,93,65,5,0,88,0,21,0,104,0,21,0,2,93,65,5,0,120,0,25,0,136,0,25,0,2,93,65,3,0,88,0,26,0,1,93,65,3,0,165,0,28,0,1,93,65,3,0,134,0,28,0,1,93,65,5,0,7,0,28,0,23,0,28,0,2,93,65,3,0,151,0,28,0,1,93,0,65,3,0,171,0,11,0,1,93,65,3,0,119,0,12,0,1,93,65,7,0,86,0,14,0,102,0,14,0,118,0,14,0,3,93,65,3,0,85,0,21,0,1,93,65,3,0,102,0,21,0,1,93,65,3,0,119,0,21,0,1,93,65,3,0,164,0,25,0,1,93,65,5,0,133,0,25,0,149,0,25,0,2,93,65,3,0,118,0,25,0,1,93,65,3,0,86,0,26,0,1,93,65,3,0,103,0,26,0,1,93,65,3,0,133,0,28,0,1,93,65,3,0,6,0,28,0,1,93,65,5,0,150,0,28,0,166,0,28,0,2,93,65,3,0,23,0,28,0,1,93,33,35,17,52,38,35,34,21,17,35,17,52,38,35,34,7,17,35,17,51,23,62,1,51,50,23,54,51,50,21,3,53,90,54,61,130,90,59,56,94,36,90,70,10,40,66,41,112,54,51,128,188,1,32,69,63,136,254,228,1,14,84,66,64,254,156,1,234,52,36,26,98,98,211,0,0,0,1,0,61,0,0,1,247,1,244,0,16,1,95,186,0,0,0,9,0,3,43,65,3,0,96,0,0,0,1,93,65,3,0,32,0,0,0,1,113,65,3,0,0,0,0,0,1,93,65,3,0,64,0,0,0,1,113,65,3,0,0,0,0,0,1,113,65,3,0,64,0,0,0,1,93,65,3,0,32,0,0,0,1,93,184,0,0,16,185,0,1,0,4,244,65,3,0,143,0,9,0,1,93,65,3,0,255,0,9,0,1,93,65,3,0,223,0,9,0,1,93,65,3,0,0,0,9,0,1,93,65,3,0,32,0,9,0,1,93,184,0,9,16,185,0,8,0,4,244,184,0,12,208,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,12,62,89,184,0,0,69,88,184,0,11,47,27,185,0,11,0,12,62,89,184,0,0,69,88,184,0,8,47,27,185,0,8,0,6,62,89,184,0,1,208,184,0,14,16,185,0,5,0,2,244,186,0,7,0,8,0,5,17,18,57,186,0,12,0,14,0,8,17,18,57,48,49,1,65,3,0,117,0,15,0,1,93,65,5,0,6,0,15,0,22,0,15,0,2,93,65,3,0,150,0,15,0,1,93,65,3,0,135,0,15,0,1,93,65,3,0,167,0,15,0,1,93,0,65,3,0,91,0,3,0,1,113,65,3,0,84,0,6,0,1,93,65,3,0,84,0,13,0,1,93,65,3,0,22,0,15,0,1,93,65,3,0,134,0,15,0,1,93,65,3,0,7,0,15,0,1,93,65,3,0,119,0,15,0,1,93,65,3,0,151,0,15,0,1,93,33,35,17,52,38,35,34,7,17,35,17,51,23,54,51,50,21,1,247,90,59,69,98,36,90,70,10,70,92,200,1,14,79,71,64,254,156,1,234,52,62,230,0,0,2,0,32,255,246,2,6,1,244,0,18,0,31,1,107,186,0,17,0,7,0,3,43,65,3,0,31,0,7,0,1,93,65,3,0,95,0,7,0,1,93,65,3,0,159,0,7,0,1,93,65,3,0,47,0,7,0,1,113,65,3,0,127,0,7,0,1,93,65,3,0,63,0,7,0,1,93,65,3,0,32,0,7,0,1,93,65,3,0,160,0,7,0,1,93,65,5,0,160,0,17,0,176,0,17,0,2,93,65,3,0,240,0,17,0,1,93,65,3,0,48,0,17,0,1,113,65,3,0,32,0,17,0,1,93,65,3,0,16,0,17,0,1,113,65,3,0,208,0,17,0,1,93,65,3,0,96,0,17,0,1,93,65,3,0,64,0,17,0,1,93,184,0,7,16,185,0,24,0,4,244,184,0,17,16,185,0,30,0,4,244,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,12,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,12,16,185,0,21,0,2,244,184,0,2,16,185,0,27,0,2,244,48,49,1,65,3,0,101,0,0,0,1,93,65,3,0,86,0,0,0,1,93,65,5,0,88,0,4,0,104,0,4,0,2,93,65,3,0,89,0,5,0,1,93,65,5,0,89,0,10,0,105,0,10,0,2,93,65,5,0,86,0,14,0,102,0,14,0,2,93,0,65,5,0,89,0,0,0,105,0,0,0,2,93,65,3,0,88,0,4,0,1,93,65,3,0,105,0,4,0,1,93,65,5,0,87,0,10,0,103,0,10,0,2,93,65,3,0,86,0,14,0,1,93,65,3,0,103,0,14,0,1,93,37,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,39,38,35,34,6,21,20,22,51,50,54,53,52,1,196,65,112,57,90,63,33,34,63,90,56,56,90,63,34,132,39,72,72,79,79,72,73,78,62,72,39,68,94,54,55,93,68,39,39,69,93,54,110,239,46,91,84,84,91,94,81,83,0,0,0,0,2,0,61,255,14,2,12,1,244,0,22,0,42,1,129,186,0,18,0,7,0,3,43,65,3,0,15,0,7,0,1,113,65,3,0,31,0,7,0,1,93,65,3,0,47,0,7,0,1,113,65,3,0,0,0,7,0,1,93,65,3,0,32,0,7,0,1,93,184,0,7,16,185,0,6,0,4,244,184,0,10,208,65,3,0,0,0,18,0,1,93,65,7,0,32,0,18,0,48,0,18,0,64,0,18,0,3,93,65,3,0,96,0,18,0,1,93,65,3,0,16,0,18,0,1,113,184,0,6,16,184,0,28,208,184,0,18,16,185,0,38,0,4,244,0,184,0,0,69,88,184,0,9,47,27,185,0,9,0,12,62,89,184,0,0,69,88,184,0,13,47,27,185,0,13,0,12,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,8,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,5,0,0,0,13,17,18,57,65,3,0,34,0,7,0,1,113,186,0,10,0,13,0,0,17,18,57,184,0,13,16,185,0,23,0,2,244,184,0,0,16,185,0,33,0,2,244,48,49,1,65,3,0,104,0,11,0,1,93,65,3,0,91,0,11,0,1,93,65,3,0,86,0,15,0,1,93,65,3,0,103,0,15,0,1,93,65,5,0,86,0,20,0,102,0,20,0,2,93,65,3,0,102,0,21,0,1,93,65,3,0,87,0,21,0,1,93,0,65,3,0,85,0,11,0,1,93,65,3,0,103,0,11,0,1,93,65,5,0,87,0,15,0,103,0,15,0,2,93,65,3,0,104,0,20,0,1,93,65,3,0,89,0,20,0,1,93,65,3,0,89,0,21,0,1,93,65,3,0,106,0,21,0,1,93,5,34,46,2,39,17,35,17,51,23,62,1,51,50,30,2,21,20,14,2,3,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,1,49,18,43,42,38,13,90,70,10,34,74,57,50,80,57,31,29,55,82,63,29,54,41,25,24,41,54,30,31,51,36,19,19,36,51,10,10,18,27,17,254,208,2,220,70,41,39,41,71,92,51,55,94,68,38,1,174,24,45,65,41,44,65,44,22,27,46,64,38,39,64,46,26,0,0,2,0,33,255,14,1,240,1,244,0,22,0,42,1,65,186,0,16,0,5,0,3,43,65,3,0,31,0,5,0,1,93,65,3,0,111,0,5,0,1,93,65,5,0,63,0,5,0,79,0,5,0,2,93,65,7,0,0,0,16,0,16,0,16,0,32,0,16,0,3,113,184,0,16,16,185,0,17,0,4,244,184,0,13,208,184,0,5,16,185,0,28,0,4,244,184,0,17,16,184,0,38,208,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,12,62,89,184,0,0,69,88,184,0,15,47,27,185,0,15,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,0,69,88,184,0,16,47,27,185,0,16,0,8,62,89,65,3,0,69,0,5,0,1,93,186,0,13,0,10,0,0,17,18,57,65,3,0,47,0,16,0,1,113,186,0,18,0,0,0,10,17,18,57,184,0,10,16,185,0,23,0,2,244,184,0,0,16,185,0,33,0,2,244,48,49,1,65,3,0,90,0,2,0,1,93,65,3,0,107,0,2,0,1,93,65,3,0,90,0,3,0,1,93,65,5,0,88,0,8,0,104,0,8,0,2,93,65,3,0,85,0,12,0,1,93,65,3,0,103,0,12,0,1,93,0,65,5,0,89,0,2,0,105,0,2,0,2,93,65,5,0,86,0,8,0,102,0,8,0,2,93,65,3,0,102,0,12,0,1,93,65,3,0,87,0,12,0,1,93,23,34,46,2,53,52,62,2,51,50,22,23,55,51,17,35,17,14,3,3,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,252,53,82,56,28,31,57,80,50,57,74,34,10,70,90,12,38,42,43,9,32,50,36,19,19,36,50,32,30,55,40,24,25,41,54,10,38,68,94,55,52,92,70,41,39,41,70,253,36,1,48,16,27,19,10,1,174,26,46,64,39,38,64,46,27,23,44,66,42,41,65,45,24,0,0,0,0,1,0,61,0,0,1,64,1,252,0,15,0,166,186,0,0,0,9,0,3,43,65,3,0,0,0,0,0,1,93,65,3,0,32,0,0,0,1,93,65,3,0,31,0,9,0,1,93,65,3,0,0,0,9,0,1,93,65,3,0,32,0,9,0,1,93,184,0,9,16,185,0,8,0,4,244,184,0,12,208,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,12,62,89,184,0,0,69,88,184,0,9,47,27,185,0,9,0,6,62,89,184,0,10,16,184,0,0,208,184,0,0,47,184,0,1,220,65,5,0,127,0,1,0,143,0,1,0,2,93,65,5,0,31,0,1,0,47,0,1,0,2,113,186,0,7,0,9,0,1,17,18,57,186,0,12,0,0,0,9,17,18,57,48,49,1,7,35,34,14,2,7,17,35,17,51,23,62,1,51,1,64,20,31,15,34,31,26,6,96,74,11,46,75,45,1,252,99,11,18,22,12,254,166,1,234,81,52,47,0,1,0,32,255,246,1,131,1,244,0,39,2,81,186,0,35,0,15,0,3,43,65,3,0,127,0,15,0,1,93,184,0,15,16,184,0,2,208,184,0,2,47,65,3,0,208,0,35,0,1,93,65,3,0,0,0,35,0,1,113,65,3,0,160,0,35,0,1,93,65,3,0,128,0,35,0,1,93,184,0,35,16,185,0,8,0,4,244,186,0,20,0,35,0,15,17,18,57,184,0,20,47,184,0,15,16,185,0,25,0,4,244,65,3,0,31,0,41,0,1,93,65,3,0,79,0,41,0,1,93,0,184,0,0,69,88,184,0,18,47,27,185,0,18,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,3,220,65,5,0,48,0,3,0,64,0,3,0,2,93,184,0,0,16,185,0,6,0,2,244,186,0,10,0,0,0,18,17,18,57,65,3,0,121,0,10,0,1,93,65,3,0,10,0,10,0,1,93,65,3,0,138,0,10,0,1,93,65,5,0,166,0,10,0,182,0,10,0,2,93,65,3,0,149,0,10,0,1,93,184,0,18,16,184,0,21,220,65,5,0,176,0,21,0,192,0,21,0,2,93,184,0,18,16,185,0,23,0,1,244,186,0,29,0,18,0,0,17,18,57,65,3,0,10,0,29,0,1,93,48,49,1,65,9,0,87,0,1,0,103,0,1,0,119,0,1,0,135,0,1,0,4,93,65,3,0,57,0,13,0,1,93,65,3,0,75,0,13,0,1,93,65,3,0,25,0,16,0,1,93,65,3,0,42,0,16,0,1,93,65,3,0,11,0,16,0,1,93,65,5,0,54,0,33,0,70,0,33,0,2,93,65,5,0,118,0,33,0,134,0,33,0,2,93,65,3,0,37,0,38,0,1,93,65,3,0,22,0,38,0,1,93,65,3,0,7,0,38,0,1,93,0,65,9,0,89,0,1,0,105,0,1,0,121,0,1,0,137,0,1,0,4,93,65,9,0,89,0,2,0,105,0,2,0,121,0,2,0,137,0,2,0,4,93,65,3,0,72,0,13,0,1,93,65,3,0,57,0,13,0,1,93,65,3,0,37,0,16,0,1,93,65,3,0,6,0,16,0,1,93,65,3,0,23,0,16,0,1,93,65,9,0,84,0,19,0,100,0,19,0,116,0,19,0,132,0,19,0,4,93,65,9,0,85,0,20,0,101,0,20,0,117,0,20,0,133,0,20,0,4,93,65,5,0,53,0,33,0,69,0,33,0,2,93,65,3,0,134,0,33,0,1,93,65,3,0,119,0,33,0,1,93,65,3,0,9,0,38,0,1,93,65,5,0,26,0,38,0,42,0,38,0,2,93,23,34,39,55,30,1,51,50,53,52,39,46,3,39,52,54,51,50,23,7,38,35,34,21,20,30,2,23,30,3,21,20,14,2,200,107,61,11,20,83,50,98,98,30,53,42,27,2,90,94,67,66,11,52,68,95,10,26,44,34,21,49,42,28,16,42,73,10,43,87,18,32,61,55,26,7,19,31,48,36,63,84,32,82,43,66,16,22,17,16,10,6,21,34,50,35,24,52,42,28,0,0,1,0,18,255,246,1,65,2,108,0,21,0,215,186,0,14,0,6,0,3,43,65,3,0,95,0,14,0,1,93,65,3,0,0,0,14,0,1,93,184,0,14,16,184,0,0,208,184,0,0,47,65,3,0,95,0,6,0,1,93,65,3,0,0,0,6,0,1,93,184,0,6,16,184,0,7,208,184,0,7,47,184,0,6,16,184,0,9,208,184,0,9,47,184,0,6,16,185,0,15,0,4,244,184,0,12,208,184,0,12,47,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,12,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,185,0,0,0,1,244,184,0,12,16,185,0,15,0,1,244,184,0,6,208,184,0,12,16,184,0,9,208,184,0,12,16,184,0,11,220,48,49,1,65,9,0,57,0,4,0,73,0,4,0,89,0,4,0,105,0,4,0,4,93,0,65,9,0,57,0,3,0,73,0,3,0,89,0,3,0,105,0,3,0,4,93,37,7,35,34,38,53,17,35,55,51,53,55,21,51,21,35,17,20,30,2,51,1,62,7,81,65,63,84,8,76,90,129,129,4,19,42,38,62,72,68,49,1,57,70,121,9,130,70,254,254,35,40,20,5,0,0,1,0,56,255,246,1,207,1,234,0,15,1,48,186,0,15,0,7,0,3,43,65,3,0,32,0,15,0,1,113,65,3,0,255,0,15,0,1,93,65,3,0,223,0,15,0,1,93,65,3,0,80,0,15,0,1,93,65,3,0,112,0,15,0,1,93,184,0,15,16,185,0,14,0,4,244,184,0,2,208,65,3,0,31,0,7,0,1,113,65,3,0,223,0,7,0,1,93,65,3,0,143,0,7,0,1,93,65,3,0,255,0,7,0,1,93,65,3,0,32,0,7,0,1,93,184,0,7,16,185,0,8,0,4,244,65,3,0,31,0,17,0,1,93,65,3,0,63,0,17,0,1,93,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,12,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,8,16,184,0,14,208,186,0,2,0,4,0,14,17,18,57,184,0,4,16,185,0,11,0,2,244,48,49,1,65,5,0,168,0,5,0,184,0,5,0,2,93,65,3,0,102,0,10,0,1,93,65,3,0,134,0,10,0,1,93,65,3,0,119,0,10,0,1,93,0,65,3,0,185,0,5,0,1,93,65,3,0,170,0,5,0,1,93,65,5,0,102,0,10,0,118,0,10,0,2,93,65,3,0,135,0,10,0,1,93,33,35,39,6,35,34,53,17,51,17,20,51,50,55,17,51,1,207,80,10,46,90,181,90,114,78,35,90,54,64,215,1,29,254,252,160,56,1,108,0,0,0,0,1,0,9,0,0,1,227,1,234,0,6,1,25,187,0,1,0,4,0,2,0,4,43,65,3,0,64,0,1,0,1,93,65,3,0,160,0,1,0,1,93,65,3,0,0,0,1,0,1,93,65,3,0,224,0,1,0,1,93,184,0,1,16,184,0,0,208,65,3,0,89,0,0,0,1,93,65,3,0,151,0,0,0,1,93,65,3,0,5,0,0,0,1,93,65,3,0,160,0,2,0,1,93,65,3,0,224,0,2,0,1,93,65,3,0,64,0,2,0,1,93,65,3,0,0,0,2,0,1,93,184,0,2,16,184,0,3,208,65,3,0,10,0,3,0,1,93,65,3,0,152,0,3,0,1,93,65,3,0,86,0,3,0,1,93,185,0,4,0,4,244,65,3,0,184,0,4,0,1,93,186,0,5,0,2,0,1,17,18,57,184,0,0,16,185,0,6,0,4,244,65,3,0,183,0,6,0,1,93,65,3,0,47,0,8,0,1,93,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,12,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,5,208,184,0,4,16,184,0,6,208,48,49,65,3,0,132,0,5,0,1,93,65,3,0,117,0,5,0,1,93,65,3,0,12,0,5,0,1,93,1,3,35,3,51,27,1,1,227,186,101,187,100,137,136,1,234,254,22,1,234,254,121,1,135,0,1,0,12,0,0,2,202,1,234,0,12,1,215,187,0,10,0,4,0,9,0,4,43,65,3,0,144,0,10,0,1,93,184,0,10,16,184,0,1,220,184,0,0,208,65,3,0,134,0,0,0,1,93,65,3,0,38,0,0,0,1,93,184,0,1,16,185,0,2,0,4,244,65,3,0,144,0,9,0,1,93,186,0,3,0,9,0,10,17,18,57,184,0,9,16,184,0,5,220,185,0,4,0,4,244,184,0,5,16,184,0,6,208,65,3,0,41,0,6,0,1,93,65,3,0,137,0,6,0,1,93,185,0,7,0,4,244,186,0,8,0,5,0,4,17,18,57,186,0,11,0,2,0,1,17,18,57,184,0,0,16,185,0,12,0,4,244,65,3,0,15,0,13,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,12,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,2,208,184,0,2,47,184,0,7,16,184,0,9,208,184,0,9,47,184,0,3,208,184,0,4,16,184,0,8,208,184,0,11,208,184,0,7,16,184,0,12,208,48,49,1,65,3,0,56,0,1,0,1,93,65,3,0,72,0,2,0,1,93,65,5,0,25,0,2,0,41,0,2,0,2,93,65,5,0,121,0,2,0,137,0,2,0,2,93,65,5,0,22,0,4,0,38,0,4,0,2,93,65,5,0,118,0,4,0,134,0,4,0,2,93,65,3,0,71,0,4,0,1,93,65,3,0,72,0,9,0,1,93,65,5,0,121,0,9,0,137,0,9,0,2,93,65,5,0,118,0,10,0,134,0,10,0,2,93,0,65,3,0,3,0,3,0,1,93,65,3,0,54,0,3,0,1,93,65,3,0,71,0,3,0,1,93,65,3,0,41,0,3,0,1,113,65,3,0,89,0,8,0,1,93,65,3,0,74,0,8,0,1,93,65,3,0,27,0,8,0,1,93,65,3,0,12,0,8,0,1,93,65,3,0,44,0,8,0,1,93,65,5,0,73,0,11,0,89,0,11,0,2,93,65,7,0,12,0,11,0,28,0,11,0,44,0,11,0,3,93,1,3,35,11,1,35,3,51,27,1,51,27,1,2,202,148,101,102,103,101,147,106,94,104,93,105,94,1,234,254,22,1,106,254,150,1,234,254,121,1,120,254,136,1,135,0,0,0,1,0,11,0,0,1,207,1,234,0,11,1,236,186,0,11,0,5,0,3,43,65,3,0,160,0,11,0,1,93,65,3,0,0,0,11,0,1,93,65,3,0,208,0,11,0,1,93,65,5,0,96,0,11,0,112,0,11,0,2,93,65,3,0,64,0,11,0,1,93,184,0,11,16,184,0,0,208,65,3,0,22,0,0,0,1,93,65,3,0,200,0,0,0,1,93,65,3,0,137,0,0,0,1,93,65,3,0,122,0,0,0,1,93,65,3,0,41,0,0,0,1,93,65,3,0,103,0,0,0,1,93,65,3,0,245,0,0,0,1,93,65,3,0,5,0,0,0,1,93,185,0,1,0,4,244,65,3,0,64,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,95,0,5,0,1,93,65,3,0,111,0,5,0,1,113,65,3,0,160,0,5,0,1,93,65,3,0,0,0,5,0,1,93,186,0,2,0,5,0,11,17,18,57,184,0,5,16,184,0,4,208,65,3,0,25,0,4,0,1,93,65,3,0,10,0,4,0,1,93,65,3,0,250,0,4,0,1,93,65,3,0,104,0,4,0,1,93,65,3,0,118,0,4,0,1,93,185,0,3,0,4,244,65,3,0,184,0,3,0,1,93,184,0,4,16,184,0,6,208,65,3,0,39,0,6,0,1,93,185,0,7,0,4,244,186,0,8,0,5,0,11,17,18,57,184,0,0,16,184,0,10,208,185,0,9,0,4,244,65,3,0,47,0,13,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,12,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,1,208,186,0,2,0,3,0,7,17,18,57,65,3,0,214,0,2,0,1,93,65,3,0,165,0,2,0,1,93,186,0,8,0,7,0,3,17,18,57,65,3,0,170,0,8,0,1,93,65,3,0,217,0,8,0,1,93,186,0,5,0,8,0,2,17,18,57,184,0,7,16,184,0,9,208,186,0,11,0,2,0,8,17,18,57,48,49,65,3,0,149,0,2,0,1,93,65,3,0,6,0,2,0,1,93,65,3,0,9,0,8,0,1,93,65,3,0,153,0,8,0,1,93,33,35,39,7,35,55,39,51,23,55,51,7,1,207,101,124,126,101,171,167,101,123,113,105,161,193,193,244,246,194,194,238,0,0,0,1,0,7,255,14,1,242,1,234,0,7,0,254,186,0,0,0,4,0,3,43,65,3,0,80,0,0,0,1,93,65,3,0,127,0,4,0,1,93,65,3,0,140,0,4,0,1,93,186,0,1,0,4,0,0,17,18,57,65,3,0,57,0,1,0,1,93,65,3,0,11,0,1,0,1,93,65,3,0,89,0,1,0,1,93,65,3,0,71,0,1,0,1,93,65,3,0,133,0,1,0,1,93,184,0,1,16,185,0,2,0,4,244,184,0,0,16,185,0,7,0,4,244,186,0,3,0,2,0,7,17,18,57,65,3,0,89,0,3,0,1,93,65,3,0,137,0,3,0,1,93,184,0,4,16,185,0,5,0,4,244,186,0,6,0,7,0,2,17,18,57,65,3,0,119,0,6,0,1,93,65,3,0,134,0,6,0,1,93,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,12,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,8,62,89,186,0,3,0,5,0,1,17,18,57,186,0,6,0,1,0,5,17,18,57,65,5,0,115,0,6,0,131,0,6,0,2,93,184,0,5,16,184,0,7,208,48,49,9,1,35,19,3,51,27,1,1,242,254,212,100,113,204,100,153,138,1,234,253,36,1,8,1,212,254,148,1,108,0,0,0,1,0,22,0,0,1,190,1,234,0,7,1,238,186,0,2,0,6,0,3,43,65,3,0,32,0,2,0,1,93,65,3,0,128,0,2,0,1,93,65,3,0,0,0,2,0,1,93,65,3,0,16,0,2,0,1,113,65,3,0,64,0,2,0,1,93,184,0,2,16,184,0,0,208,65,3,0,70,0,0,0,1,113,65,3,0,207,0,6,0,1,93,65,3,0,95,0,6,0,1,93,65,3,0,175,0,6,0,1,93,65,3,0,127,0,6,0,1,93,65,3,0,32,0,6,0,1,93,65,3,0,64,0,6,0,1,93,184,0,6,16,184,0,4,208,65,3,0,10,0,4,0,1,113,65,3,0,73,0,4,0,1,113,65,3,0,249,0,4,0,1,93,184,0,1,208,65,5,0,19,0,1,0,35,0,1,0,2,113,65,3,0,4,0,1,0,1,113,65,5,0,229,0,1,0,245,0,1,0,2,93,65,7,0,38,0,1,0,54,0,1,0,70,0,1,0,3,93,65,3,0,214,0,1,0,1,93,65,3,0,153,0,1,0,1,93,65,5,0,54,0,1,0,70,0,1,0,2,113,65,3,0,101,0,1,0,1,113,65,3,0,84,0,1,0,1,113,65,5,0,84,0,1,0,100,0,1,0,2,93,65,3,0,113,0,1,0,1,93,65,3,0,128,0,1,0,1,93,184,0,0,16,184,0,5,208,65,3,0,233,0,5,0,1,93,65,3,0,10,0,5,0,1,113,65,3,0,202,0,5,0,1,93,65,3,0,107,0,5,0,1,93,65,3,0,92,0,5,0,1,93,65,3,0,30,0,5,0,1,113,65,3,0,143,0,5,0,1,93,65,3,0,124,0,5,0,1,93,65,3,0,44,0,5,0,1,113,65,3,0,91,0,5,0,1,113,65,3,0,106,0,5,0,1,113,65,5,0,57,0,5,0,73,0,5,0,2,113,65,7,0,41,0,5,0,57,0,5,0,73,0,5,0,3,93,65,3,0,150,0,5,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,12,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,185,0,2,0,1,244,184,0,7,16,185,0,6,0,1,244,48,49,9,1,33,21,33,1,35,53,1,190,254,251,1,0,254,93,1,5,251,1,234,254,92,70,1,164,70,0,0,1,0,19,255,121,1,41,2,238,0,53,0,163,184,0,0,47,184,0,8,220,184,0,0,16,184,0,16,208,184,0,0,16,184,0,50,220,184,0,20,208,184,0,0,16,184,0,45,220,65,7,0,159,0,45,0,175,0,45,0,191,0,45,0,3,93,184,0,30,208,184,0,8,16,184,0,35,208,0,184,0,51,47,184,0,0,69,88,184,0,19,47,27,185,0,19,0,18,62,89,186,0,35,0,19,0,51,17,18,57,25,184,0,35,47,24,184,0,8,208,184,0,19,16,184,0,20,220,184,0,51,16,184,0,50,220,48,49,1,65,3,0,134,0,22,0,1,93,65,3,0,133,0,48,0,1,93,0,65,3,0,136,0,22,0,1,93,65,3,0,134,0,48,0,1,93,55,52,62,2,53,52,38,39,62,1,53,52,46,2,53,52,54,55,21,14,3,21,20,30,2,21,20,14,2,7,30,3,21,20,14,2,21,20,30,2,23,21,46,1,83,2,3,3,32,40,38,34,3,3,2,97,117,53,57,26,5,1,1,1,7,18,32,26,26,33,18,6,1,1,1,8,29,56,48,115,99,14,7,40,46,42,10,54,69,25,26,69,54,10,42,45,40,7,71,75,4,69,1,20,40,64,46,5,24,27,24,6,18,31,27,26,15,14,25,25,28,16,5,25,29,28,7,54,64,36,14,3,69,4,73,0,1,0,70,255,47,0,159,2,238,0,3,0,54,184,0,1,47,65,5,0,0,0,1,0,16,0,1,0,2,93,184,0,0,220,65,3,0,128,0,0,0,1,93,0,184,0,1,47,184,0,0,69,88,184,0,2,47,27,185,0,2,0,18,62,89,48,49,23,35,17,51,159,89,89,209,3,191,0,0,0,1,0,2,255,121,1,24,2,238,0,53,0,171,184,0,38,47,184,0,0,208,184,0,38,16,184,0,35,220,184,0,4,208,184,0,38,16,184,0,29,220,65,7,0,144,0,29,0,160,0,29,0,176,0,29,0,3,93,184,0,9,208,184,0,38,16,184,0,46,220,184,0,19,208,0,184,0,3,47,184,0,0,69,88,184,0,35,47,27,185,0,35,0,18,62,89,184,0,3,16,184,0,4,220,186,0,19,0,35,0,3,17,18,57,25,184,0,19,47,24,184,0,35,16,184,0,34,220,184,0,19,16,184,0,46,208,48,49,1,65,5,0,136,0,6,0,152,0,6,0,2,93,0,65,3,0,149,0,6,0,1,93,65,3,0,134,0,6,0,1,93,65,5,0,138,0,31,0,154,0,31,0,2,93,55,20,6,7,53,62,3,53,52,46,2,53,52,62,2,55,46,3,53,52,62,2,53,52,46,2,39,53,30,1,21,20,14,2,21,20,22,23,14,1,21,20,30,2,216,99,115,54,58,25,4,1,1,1,7,18,32,26,26,32,18,7,1,1,1,8,29,56,48,117,97,3,3,2,34,38,40,32,2,3,3,14,72,73,4,69,1,20,42,64,44,7,27,29,25,6,17,28,24,25,14,15,26,27,31,18,6,24,27,24,5,54,64,36,14,3,69,4,75,71,7,40,45,42,10,54,69,26,25,69,54,10,42,46,40,0,1,0,54,0,179,1,144,1,26,0,23,0,156,184,0,8,47,184,0,7,220,184,0,8,16,184,0,21,220,184,0,20,220,0,184,0,0,47,184,0,13,220,65,9,0,47,0,13,0,63,0,13,0,79,0,13,0,95,0,13,0,4,93,184,0,5,220,65,3,0,128,0,5,0,1,114,184,0,0,16,184,0,7,208,184,0,7,47,184,0,0,16,184,0,18,220,65,3,0,112,0,18,0,1,114,65,3,0,64,0,18,0,1,113,184,0,13,16,184,0,20,208,184,0,20,47,48,49,1,65,5,0,41,0,10,0,57,0,10,0,2,93,65,5,0,38,0,22,0,54,0,22,0,2,93,0,65,5,0,38,0,10,0,54,0,10,0,2,93,37,34,46,2,35,34,7,39,62,3,51,50,30,2,51,50,55,23,14,1,1,37,12,34,44,32,10,53,18,36,6,22,28,32,15,13,36,46,32,13,42,27,34,11,58,179,16,19,16,49,9,22,34,23,11,15,19,15,51,9,43,51,0,2,0,50,255,6,0,174,1,244,0,3,0,7,0,168,187,0,5,0,4,0,4,0,4,43,65,5,0,0,0,4,0,16,0,4,0,2,93,184,0,4,16,184,0,0,208,65,13,0,9,0,0,0,25,0,0,0,41,0,0,0,57,0,0,0,73,0,0,0,89,0,0,0,6,113,65,5,0,0,0,5,0,16,0,5,0,2,93,184,0,5,16,184,0,3,208,65,13,0,6,0,3,0,22,0,3,0,38,0,3,0,54,0,3,0,70,0,3,0,86,0,3,0,6,113,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,8,62,89,184,0,4,16,184,0,7,220,65,3,0,48,0,7,0,1,113,184,0,1,220,48,49,23,19,51,19,3,51,21,35,50,30,64,30,104,84,84,250,2,38,253,218,2,238,86,0,0,1,0,34,255,225,1,170,2,236,0,36,1,110,186,0,18,0,7,0,3,43,65,5,0,63,0,7,0,79,0,7,0,2,93,65,3,0,143,0,7,0,1,93,65,3,0,32,0,18,0,1,113,65,3,0,208,0,18,0,1,93,65,3,0,0,0,18,0,1,93,186,0,1,0,7,0,18,17,18,57,184,0,1,47,65,3,0,0,0,1,0,1,93,185,0,0,0,4,244,184,0,1,16,184,0,13,208,184,0,0,16,184,0,14,208,184,0,7,16,185,0,27,0,4,244,184,0,18,16,184,0,33,208,0,184,0,0,47,184,0,0,69,88,184,0,13,47,27,185,0,13,0,18,62,89,65,3,0,16,0,13,0,1,93,65,5,0,96,0,13,0,112,0,13,0,2,93,65,5,0,48,0,13,0,64,0,13,0,2,93,186,0,36,0,13,0,0,17,18,57,184,0,36,47,65,3,0,79,0,36,0,1,113,65,7,0,159,0,36,0,175,0,36,0,191,0,36,0,3,93,65,3,0,96,0,36,0,1,93,184,0,2,208,184,0,36,16,184,0,15,220,65,3,0,160,0,15,0,1,93,184,0,12,208,184,0,15,16,184,0,19,220,185,0,18,0,2,244,184,0,15,16,185,0,22,0,2,244,184,0,36,16,185,0,30,0,2,244,184,0,36,16,184,0,32,220,185,0,33,0,2,244,48,49,1,65,3,0,9,0,5,0,1,93,65,3,0,9,0,10,0,1,93,65,3,0,69,0,24,0,1,93,65,3,0,69,0,29,0,1,93,0,65,3,0,8,0,5,0,1,93,65,3,0,6,0,10,0,1,93,65,3,0,72,0,29,0,1,93,5,35,55,46,3,53,52,62,2,55,39,51,7,30,1,23,7,46,1,35,34,14,2,21,20,22,51,50,55,23,14,1,7,1,63,90,17,46,78,56,32,28,54,79,51,17,90,16,43,57,23,8,30,62,32,41,61,41,21,88,78,61,61,8,17,48,57,31,120,6,42,66,89,54,49,89,69,46,7,142,140,3,15,14,78,16,17,29,50,67,38,82,100,32,78,11,18,3,0,0,0,1,0,34,0,0,1,224,2,202,0,37,1,125,186,0,37,0,29,0,3,43,65,3,0,16,0,37,0,1,93,184,0,37,16,184,0,0,208,65,3,0,139,0,0,0,1,93,65,3,0,143,0,29,0,1,93,65,3,0,16,0,29,0,1,93,184,0,29,16,185,0,8,0,4,244,186,0,10,0,37,0,29,17,18,57,184,0,10,47,184,0,8,16,184,0,12,208,184,0,17,208,65,5,0,101,0,17,0,117,0,17,0,2,93,65,7,0,53,0,17,0,69,0,17,0,85,0,17,0,3,113,65,3,0,53,0,17,0,1,93,65,3,0,132,0,17,0,1,93,184,0,37,16,184,0,18,208,184,0,18,47,184,0,29,16,184,0,25,208,184,0,20,208,184,0,29,16,184,0,26,208,184,0,26,47,0,184,0,0,69,88,184,0,34,47,27,185,0,34,0,14,62,89,184,0,0,69,88,184,0,19,47,27,185,0,19,0,6,62,89,184,0,34,16,184,0,0,220,184,0,34,16,185,0,3,0,2,244,186,0,9,0,34,0,19,17,18,57,184,0,9,47,65,3,0,15,0,9,0,1,93,185,0,12,0,2,244,184,0,19,16,185,0,18,0,2,244,184,0,12,16,184,0,25,208,184,0,9,16,184,0,28,208,48,49,1,65,3,0,8,0,31,0,1,93,65,3,0,26,0,31,0,1,93,65,3,0,9,0,32,0,1,93,65,5,0,37,0,36,0,53,0,36,0,2,93,65,3,0,70,0,36,0,1,93,0,65,5,0,7,0,31,0,23,0,31,0,2,93,65,5,0,6,0,32,0,22,0,32,0,2,93,65,5,0,54,0,36,0,70,0,36,0,2,93,65,3,0,39,0,36,0,1,93,1,46,1,35,34,14,2,29,1,51,7,35,14,3,7,33,21,33,62,3,55,35,55,51,53,52,62,2,51,50,22,23,1,160,14,45,27,31,35,18,4,192,15,183,3,5,10,17,13,1,5,254,97,25,36,24,16,5,95,14,87,13,38,69,55,69,76,14,2,57,29,27,16,34,51,36,93,86,38,54,49,49,33,86,35,68,73,83,50,86,115,40,73,57,34,49,37,0,2,0,61,0,29,2,53,2,155,0,27,0,46,1,77,184,0,11,47,65,7,0,0,0,11,0,16,0,11,0,32,0,11,0,3,93,184,0,25,220,184,0,11,16,185,0,35,0,4,244,184,0,25,16,185,0,45,0,4,244,0,184,0,4,47,184,0,18,220,185,0,30,0,3,244,184,0,4,16,185,0,40,0,3,244,48,49,1,65,5,0,10,0,1,0,26,0,1,0,2,113,65,5,0,73,0,6,0,89,0,6,0,2,93,65,5,0,73,0,16,0,89,0,16,0,2,93,65,5,0,10,0,21,0,26,0,21,0,2,113,65,5,0,40,0,28,0,56,0,28,0,2,93,65,3,0,137,0,28,0,1,93,65,3,0,134,0,32,0,1,93,65,5,0,39,0,32,0,55,0,32,0,2,93,65,5,0,38,0,38,0,54,0,38,0,2,93,65,3,0,135,0,38,0,1,93,65,3,0,136,0,42,0,1,93,65,5,0,41,0,42,0,57,0,42,0,2,93,65,3,0,136,0,43,0,1,93,0,65,5,0,71,0,6,0,87,0,6,0,2,93,65,3,0,229,0,15,0,1,93,65,5,0,72,0,16,0,88,0,16,0,2,93,65,3,0,229,0,21,0,1,93,65,5,0,40,0,32,0,56,0,32,0,2,93,65,3,0,137,0,32,0,1,93,65,5,0,39,0,38,0,55,0,38,0,2,93,65,3,0,135,0,38,0,1,93,65,5,0,38,0,42,0,54,0,42,0,2,93,65,3,0,134,0,42,0,1,93,37,7,39,6,35,34,39,7,39,55,38,53,52,55,39,55,23,54,51,50,23,55,23,7,22,21,20,7,3,38,35,34,14,2,21,20,30,2,51,50,62,2,53,52,2,52,29,79,70,73,74,69,79,28,77,79,80,78,28,78,76,68,71,72,80,28,78,79,80,53,42,77,39,60,41,22,22,41,60,39,39,60,41,22,53,24,103,38,38,103,24,102,82,111,110,83,102,24,103,38,39,104,24,103,82,110,108,86,1,76,54,29,51,70,42,42,71,51,28,29,52,70,41,85,0,0,0,0,1,0,30,0,0,2,134,2,188,0,22,1,100,187,0,9,0,4,0,10,0,4,43,65,3,0,0,0,9,0,1,93,184,0,9,16,184,0,5,208,184,0,1,208,184,0,0,208,65,3,0,40,0,0,0,1,93,65,3,0,23,0,0,0,1,93,65,3,0,86,0,0,0,1,93,184,0,5,16,184,0,6,208,184,0,6,47,184,0,2,208,184,0,2,47,65,3,0,0,0,10,0,1,93,184,0,10,16,184,0,14,208,184,0,12,208,184,0,12,47,184,0,16,208,184,0,16,47,184,0,14,16,184,0,18,208,184,0,19,208,65,3,0,89,0,19,0,1,93,65,3,0,24,0,19,0,1,93,65,3,0,39,0,19,0,1,93,185,0,20,0,4,244,186,0,21,0,18,0,1,17,18,57,184,0,0,16,185,0,22,0,4,244,0,184,0,0,69,88,184,0,20,47,27,185,0,20,0,14,62,89,184,0,0,69,88,184,0,10,47,27,185,0,10,0,6,62,89,186,0,17,0,20,0,10,17,18,57,184,0,17,47,184,0,1,208,184,0,17,16,184,0,16,220,184,0,4,208,184,0,17,16,184,0,13,220,65,5,0,32,0,13,0,48,0,13,0,2,93,184,0,5,208,184,0,13,16,184,0,12,220,184,0,8,208,186,0,21,0,20,0,10,17,18,57,65,3,0,102,0,21,0,1,93,65,3,0,41,0,21,0,1,93,65,3,0,54,0,21,0,1,93,65,3,0,131,0,21,0,1,93,184,0,20,16,184,0,22,208,48,49,65,3,0,134,0,21,0,1,93,65,3,0,9,0,21,0,1,93,9,1,51,7,35,21,51,7,35,21,35,53,35,55,51,53,35,55,51,1,51,27,1,2,134,254,253,177,21,157,178,21,157,96,178,21,157,178,21,156,254,253,93,215,215,2,188,254,128,54,62,54,146,146,54,62,54,1,128,254,205,1,51,0,0,0,0,2,0,72,255,46,0,160,2,238,0,3,0,7,0,78,184,0,6,47,65,5,0,0,0,6,0,16,0,6,0,2,93,184,0,7,220,65,3,0,128,0,7,0,1,93,184,0,0,208,184,0,6,16,184,0,1,208,0,184,0,5,47,184,0,0,69,88,184,0,2,47,27,185,0,2,0,18,62,89,184,0,1,220,184,0,5,16,184,0,6,220,48,49,19,35,17,51,17,35,17,51,160,88,88,88,88,1,52,1,186,252,64,1,117,0,0,2,0,37,255,172,1,163,2,238,0,52,0,64,3,51,186,0,51,0,26,0,3,43,65,3,0,0,0,51,0,1,93,65,3,0,143,0,26,0,1,93,65,3,0,0,0,26,0,1,93,186,0,5,0,51,0,26,17,18,57,184,0,5,47,184,0,26,16,185,0,58,0,5,244,186,0,0,0,5,0,58,17,18,57,186,0,13,0,26,0,51,17,18,57,184,0,13,47,184,0,5,16,185,0,19,0,5,244,186,0,31,0,26,0,51,17,18,57,184,0,31,47,184,0,51,16,185,0,63,0,5,244,186,0,28,0,31,0,63,17,18,57,65,3,0,25,0,28,0,1,93,65,7,0,53,0,28,0,69,0,28,0,85,0,28,0,3,93,65,3,0,116,0,28,0,1,93,186,0,38,0,51,0,26,17,18,57,184,0,38,47,184,0,31,16,185,0,44,0,5,244,186,0,53,0,63,0,31,17,18,57,186,0,60,0,58,0,5,17,18,57,0,184,0,10,47,184,0,0,69,88,184,0,36,47,27,185,0,36,0,18,62,89,186,0,60,0,10,0,36,17,18,57,184,0,60,47,184,0,22,208,65,5,0,121,0,22,0,137,0,22,0,2,93,65,3,0,72,0,22,0,1,93,186,0,0,0,60,0,22,17,18,57,184,0,10,16,184,0,14,220,184,0,10,16,185,0,16,0,3,244,186,0,53,0,36,0,10,17,18,57,184,0,53,47,184,0,47,208,65,5,0,118,0,47,0,134,0,47,0,2,93,65,3,0,22,0,47,0,1,93,65,3,0,69,0,47,0,1,93,186,0,28,0,47,0,53,17,18,57,184,0,36,16,184,0,39,220,184,0,36,16,185,0,41,0,3,244,48,49,1,65,3,0,21,0,7,0,1,93,65,3,0,38,0,7,0,1,93,65,3,0,104,0,13,0,1,93,65,3,0,72,0,23,0,1,93,65,3,0,25,0,24,0,1,93,65,3,0,73,0,24,0,1,93,65,7,0,105,0,24,0,121,0,24,0,137,0,24,0,3,93,65,3,0,73,0,25,0,1,93,65,3,0,26,0,25,0,1,93,65,3,0,139,0,27,0,1,93,65,3,0,40,0,34,0,1,93,65,3,0,25,0,34,0,1,93,65,3,0,133,0,46,0,1,93,65,5,0,103,0,48,0,119,0,48,0,2,93,65,3,0,21,0,49,0,1,93,65,5,0,118,0,49,0,134,0,49,0,2,93,65,3,0,71,0,49,0,1,93,65,3,0,103,0,49,0,1,93,65,3,0,85,0,59,0,1,93,0,65,5,0,24,0,7,0,40,0,7,0,2,93,65,5,0,121,0,12,0,137,0,12,0,2,93,65,3,0,122,0,13,0,1,93,65,3,0,107,0,13,0,1,93,65,3,0,73,0,23,0,1,93,65,3,0,25,0,24,0,1,93,65,3,0,73,0,24,0,1,93,65,5,0,105,0,24,0,121,0,24,0,2,93,65,3,0,138,0,24,0,1,93,65,3,0,133,0,27,0,1,93,65,3,0,20,0,34,0,1,93,65,3,0,37,0,34,0,1,93,65,3,0,101,0,38,0,1,93,65,3,0,133,0,38,0,1,93,65,3,0,118,0,38,0,1,93,65,3,0,135,0,46,0,1,93,65,3,0,117,0,48,0,1,93,65,3,0,102,0,48,0,1,93,65,3,0,116,0,49,0,1,93,65,3,0,21,0,49,0,1,93,65,3,0,70,0,49,0,1,93,65,3,0,102,0,49,0,1,93,65,3,0,134,0,49,0,1,93,65,3,0,83,0,59,0,1,93,65,3,0,37,0,59,0,1,93,65,3,0,41,0,64,0,1,93,65,3,0,91,0,64,0,1,93,37,30,3,21,20,14,2,35,34,38,39,55,22,51,50,54,53,52,46,4,53,52,55,46,1,53,52,62,2,51,50,23,7,38,35,34,6,21,20,30,4,21,20,39,14,3,21,20,23,62,1,53,52,1,59,21,23,12,3,20,41,64,43,43,80,20,13,68,63,48,55,40,61,71,61,40,109,39,25,19,41,62,43,86,61,13,68,62,45,52,39,59,69,59,39,215,14,35,30,20,162,36,42,188,16,26,27,30,20,30,56,42,25,22,17,63,41,41,42,35,39,24,21,37,61,53,116,33,28,51,29,35,60,43,25,40,63,43,50,36,31,37,26,25,40,63,51,99,206,1,11,23,36,25,81,42,10,58,37,81,0,0,2,0,87,2,88,1,79,2,188,0,3,0,7,0,70,184,0,5,47,65,3,0,0,0,5,0,1,93,184,0,1,220,184,0,0,220,184,0,5,16,184,0,4,220,0,184,0,5,47,65,3,0,32,0,5,0,1,93,65,3,0,64,0,5,0,1,93,184,0,1,208,184,0,5,16,184,0,6,220,184,0,2,208,48,49,1,35,53,51,7,35,53,51,1,79,70,70,178,70,70,2,88,100,100,100,0,0,0,3,0,49,0,37,2,158,2,181,0,19,0,39,0,65,3,127,184,0,0,47,184,0,10,220,65,3,0,239,0,10,0,1,93,65,3,0,111,0,10,0,1,93,65,3,0,80,0,10,0,1,93,184,0,0,16,184,0,25,220,184,0,10,16,184,0,35,220,186,0,45,0,0,0,10,17,18,57,184,0,45,47,184,0,52,220,184,0,45,16,184,0,58,220,184,0,52,16,184,0,64,208,0,184,0,5,47,184,0,15,220,184,0,5,16,184,0,20,220,184,0,15,16,184,0,30,220,186,0,40,0,5,0,15,17,18,57,184,0,40,47,65,3,0,15,0,40,0,1,93,65,3,0,111,0,40,0,1,93,184,0,50,220,65,3,0,32,0,50,0,1,93,65,3,0,0,0,50,0,1,93,184,0,53,220,184,0,50,16,184,0,55,220,65,3,0,15,0,55,0,1,113,184,0,40,16,184,0,61,220,184,0,40,16,184,0,63,220,48,49,1,65,5,0,9,0,2,0,25,0,2,0,2,93,65,3,0,41,0,2,0,1,113,65,5,0,106,0,2,0,122,0,2,0,2,93,65,5,0,8,0,3,0,24,0,3,0,2,93,65,3,0,183,0,6,0,1,93,65,3,0,37,0,7,0,1,113,65,5,0,7,0,7,0,23,0,7,0,2,93,65,5,0,101,0,8,0,117,0,8,0,2,93,65,5,0,6,0,8,0,22,0,8,0,2,93,65,5,0,7,0,12,0,23,0,12,0,2,93,65,5,0,6,0,13,0,22,0,13,0,2,93,65,5,0,103,0,13,0,119,0,13,0,2,93,65,3,0,39,0,13,0,1,113,65,5,0,9,0,17,0,25,0,17,0,2,93,65,5,0,106,0,17,0,122,0,17,0,2,93,65,3,0,42,0,17,0,1,113,65,5,0,10,0,18,0,26,0,18,0,2,93,65,9,0,169,0,42,0,185,0,42,0,201,0,42,0,217,0,42,0,4,93,65,9,0,169,0,43,0,185,0,43,0,201,0,43,0,217,0,43,0,4,93,65,3,0,42,0,43,0,1,93,65,9,0,169,0,47,0,185,0,47,0,201,0,47,0,217,0,47,0,4,93,65,3,0,42,0,47,0,1,93,65,9,0,169,0,48,0,185,0,48,0,201,0,48,0,217,0,48,0,4,93,65,9,0,167,0,52,0,183,0,52,0,199,0,52,0,215,0,52,0,4,93,0,65,5,0,6,0,2,0,22,0,2,0,2,93,65,5,0,102,0,2,0,118,0,2,0,2,93,65,3,0,38,0,2,0,1,113,65,5,0,6,0,3,0,22,0,3,0,2,93,65,3,0,182,0,6,0,1,93,65,5,0,7,0,7,0,23,0,7,0,2,93,65,3,0,39,0,7,0,1,113,65,5,0,6,0,8,0,22,0,8,0,2,93,65,5,0,103,0,8,0,119,0,8,0,2,93,65,5,0,8,0,12,0,24,0,12,0,2,93,65,3,0,41,0,13,0,1,113,65,5,0,10,0,13,0,26,0,13,0,2,93,65,5,0,106,0,13,0,122,0,13,0,2,93,65,5,0,9,0,17,0,25,0,17,0,2,93,65,5,0,105,0,17,0,121,0,17,0,2,93,65,3,0,42,0,17,0,1,113,65,5,0,8,0,18,0,24,0,18,0,2,93,65,9,0,168,0,42,0,184,0,42,0,200,0,42,0,216,0,42,0,4,93,65,3,0,40,0,43,0,1,93,65,9,0,169,0,43,0,185,0,43,0,201,0,43,0,217,0,43,0,4,93,65,3,0,38,0,47,0,1,93,65,9,0,167,0,47,0,183,0,47,0,199,0,47,0,215,0,47,0,4,93,65,9,0,165,0,48,0,181,0,48,0,197,0,48,0,213,0,48,0,4,93,65,9,0,165,0,51,0,181,0,51,0,197,0,51,0,213,0,51,0,4,93,65,9,0,165,0,52,0,181,0,52,0,197,0,52,0,213,0,52,0,4,93,65,9,0,172,0,64,0,188,0,64,0,204,0,64,0,220,0,64,0,4,93,19,52,62,2,51,50,30,2,21,20,14,2,35,34,46,2,1,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,3,34,46,2,53,52,62,2,51,50,23,7,38,35,34,6,21,20,22,51,50,55,23,6,49,46,83,114,68,68,114,82,46,46,82,114,68,68,115,82,46,1,55,63,96,66,34,33,66,97,63,63,96,66,33,34,65,96,54,35,58,42,23,23,42,58,35,48,42,7,45,38,45,46,46,45,37,46,7,38,1,109,74,121,86,47,47,87,121,73,73,120,87,48,48,86,121,1,100,41,75,104,63,63,104,75,41,42,75,104,62,62,104,75,42,254,61,24,43,61,38,38,62,43,24,19,60,19,59,48,48,59,20,59,20,0,2,0,33,1,178,1,57,2,213,0,27,0,35,1,120,184,0,9,47,65,3,0,96,0,9,0,1,93,184,0,24,220,65,3,0,159,0,24,0,1,93,184,0,0,208,184,0,0,47,184,0,24,16,185,0,29,0,5,244,184,0,4,208,184,0,29,16,184,0,14,208,186,0,19,0,24,0,9,17,18,57,184,0,19,47,184,0,9,16,185,0,32,0,5,244,0,184,0,21,47,184,0,6,220,65,3,0,96,0,6,0,1,93,65,3,0,48,0,6,0,1,93,65,3,0,208,0,6,0,1,93,184,0,2,208,186,0,14,0,21,0,6,17,18,57,184,0,14,47,184,0,21,16,185,0,16,0,3,244,184,0,21,16,184,0,18,220,184,0,6,16,185,0,34,0,3,244,184,0,27,208,184,0,14,16,184,0,29,220,48,49,1,65,3,0,151,0,7,0,1,93,65,3,0,183,0,7,0,1,93,65,3,0,217,0,7,0,1,93,65,13,0,59,0,8,0,75,0,8,0,91,0,8,0,107,0,8,0,123,0,8,0,139,0,8,0,6,93,65,3,0,40,0,11,0,1,93,65,3,0,34,0,22,0,1,93,65,13,0,53,0,22,0,69,0,22,0,85,0,22,0,101,0,22,0,117,0,22,0,133,0,22,0,6,93,65,3,0,151,0,22,0,1,93,0,65,7,0,170,0,7,0,186,0,7,0,202,0,7,0,3,93,65,3,0,155,0,7,0,1,93,65,3,0,220,0,7,0,1,93,65,3,0,38,0,11,0,1,93,65,3,0,36,0,22,0,1,93,65,15,0,53,0,22,0,69,0,22,0,85,0,22,0,101,0,22,0,117,0,22,0,133,0,22,0,149,0,22,0,7,93,1,7,35,34,39,6,35,34,38,53,52,62,2,55,38,35,34,7,39,54,51,50,29,1,20,22,51,39,53,14,1,21,20,51,50,1,57,7,27,48,19,31,61,37,50,35,52,58,23,2,51,32,51,6,54,55,109,9,17,101,35,55,40,27,1,239,61,31,31,46,39,29,38,23,10,1,42,20,60,23,108,80,30,12,12,63,1,25,22,32,0,0,0,2,0,15,0,78,2,11,1,234,0,5,0,11,0,156,184,0,8,47,65,3,0,31,0,8,0,1,93,65,3,0,143,0,8,0,1,93,184,0,2,220,184,0,4,220,184,0,0,208,185,0,1,0,4,244,184,0,3,208,184,0,2,16,185,0,5,0,4,244,184,0,8,16,184,0,10,220,184,0,6,208,184,0,10,16,185,0,9,0,4,244,184,0,7,208,184,0,8,16,185,0,11,0,4,244,65,3,0,47,0,13,0,1,93,0,25,184,0,8,47,24,184,0,7,208,184,0,7,47,184,0,1,208,184,0,8,16,184,0,11,208,184,0,2,208,184,0,8,16,184,0,9,208,184,0,9,47,184,0,3,208,184,0,2,16,184,0,5,208,48,49,37,35,39,55,51,15,1,35,39,55,51,7,2,11,101,147,147,101,148,113,100,147,147,100,147,78,206,206,206,206,206,206,206,0,0,0,0,1,0,66,0,151,2,14,1,150,0,5,0,66,184,0,0,47,65,3,0,0,0,0,0,1,93,65,3,0,208,0,0,0,1,93,184,0,1,220,65,7,0,0,0,1,0,16,0,1,0,32,0,1,0,3,113,184,0,0,16,184,0,3,220,0,184,0,3,47,184,0,4,220,184,0,1,220,48,49,37,35,53,33,53,33,2,14,55,254,107,1,204,151,195,60,0,1,0,57,0,230,1,111,1,68,0,3,0,72,184,0,1,47,65,5,0,0,0,1,0,16,0,1,0,2,93,65,3,0,48,0,1,0,1,113,184,0,0,220,65,3,0,96,0,0,0,1,93,0,184,0,1,47,184,0,2,220,65,3,0,32,0,2,0,1,113,65,5,0,112,0,2,0,128,0,2,0,2,93,48,49,37,33,53,33,1,111,254,202,1,54,230,94,0,0,0,4,0,49,0,37,2,158,2,181,0,19,0,39,0,52,0,60,2,254,184,0,0,47,184,0,10,220,65,3,0,239,0,10,0,1,93,65,3,0,111,0,10,0,1,93,65,3,0,80,0,10,0,1,93,184,0,0,16,184,0,25,220,65,3,0,79,0,25,0,1,113,184,0,10,16,184,0,35,220,65,3,0,64,0,35,0,1,113,186,0,45,0,0,0,10,17,18,57,184,0,45,47,65,3,0,64,0,45,0,1,93,184,0,50,220,184,0,45,16,184,0,44,220,65,5,0,239,0,44,0,255,0,44,0,2,93,186,0,52,0,50,0,44,17,18,57,65,5,0,69,0,52,0,85,0,52,0,2,93,65,3,0,100,0,52,0,1,93,184,0,52,16,184,0,40,208,65,5,0,233,0,40,0,249,0,40,0,2,93,184,0,52,16,184,0,42,208,184,0,41,208,184,0,44,16,184,0,55,208,184,0,50,16,184,0,58,220,0,184,0,5,47,184,0,15,220,184,0,5,16,184,0,20,220,184,0,15,16,184,0,30,220,186,0,45,0,5,0,15,17,18,57,184,0,45,47,184,0,41,208,184,0,45,16,184,0,46,220,65,3,0,32,0,46,0,1,93,65,3,0,0,0,46,0,1,93,186,0,43,0,46,0,45,17,18,57,184,0,43,47,186,0,52,0,46,0,43,17,18,57,65,3,0,88,0,52,0,1,93,184,0,46,16,184,0,54,220,184,0,43,16,184,0,55,220,48,49,1,65,5,0,9,0,2,0,25,0,2,0,2,93,65,5,0,106,0,2,0,122,0,2,0,2,93,65,5,0,9,0,3,0,25,0,3,0,2,93,65,3,0,41,0,3,0,1,113,65,5,0,6,0,7,0,22,0,7,0,2,93,65,3,0,38,0,7,0,1,113,65,5,0,6,0,8,0,22,0,8,0,2,93,65,5,0,102,0,8,0,118,0,8,0,2,93,65,3,0,35,0,12,0,1,113,65,5,0,6,0,12,0,22,0,12,0,2,93,65,5,0,102,0,12,0,118,0,12,0,2,93,65,5,0,7,0,13,0,23,0,13,0,2,93,65,5,0,103,0,13,0,119,0,13,0,2,93,65,5,0,8,0,17,0,24,0,17,0,2,93,65,5,0,9,0,18,0,25,0,18,0,2,93,65,3,0,41,0,18,0,1,113,65,5,0,25,0,40,0,41,0,40,0,2,113,65,3,0,90,0,40,0,1,113,0,65,5,0,102,0,2,0,118,0,2,0,2,93,65,5,0,7,0,2,0,23,0,2,0,2,93,65,3,0,39,0,2,0,1,113,65,5,0,6,0,3,0,22,0,3,0,2,93,65,3,0,38,0,3,0,1,113,65,3,0,37,0,7,0,1,113,65,3,0,182,0,7,0,1,93,65,5,0,7,0,7,0,23,0,7,0,2,93,65,5,0,102,0,8,0,118,0,8,0,2,93,65,5,0,7,0,8,0,23,0,8,0,2,93,65,5,0,8,0,12,0,24,0,12,0,2,93,65,5,0,104,0,12,0,120,0,12,0,2,93,65,3,0,40,0,12,0,1,113,65,5,0,9,0,13,0,25,0,13,0,2,93,65,5,0,105,0,13,0,121,0,13,0,2,93,65,5,0,8,0,17,0,24,0,17,0,2,93,65,5,0,106,0,17,0,122,0,17,0,2,93,65,5,0,8,0,18,0,24,0,18,0,2,93,65,3,0,24,0,40,0,1,113,65,3,0,41,0,40,0,1,113,19,52,62,2,51,50,30,2,21,20,14,2,35,34,46,2,1,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,19,35,39,35,21,35,17,51,50,22,21,20,7,39,35,21,51,50,53,52,38,49,46,83,114,68,68,114,82,46,46,82,114,68,68,115,82,46,1,55,63,97,66,34,33,66,97,64,63,97,65,34,34,66,96,66,63,65,55,62,118,54,56,54,70,42,40,61,26,1,109,74,121,86,47,47,87,121,73,73,120,87,48,48,86,121,1,101,42,75,105,62,62,105,76,41,41,76,105,62,62,105,75,42,254,73,117,117,1,65,45,55,51,36,138,99,50,24,25,0,0,0,0,2,0,34,1,226,1,43,2,243,0,16,0,34,1,110,184,0,5,47,65,3,0,246,0,2,0,1,93,184,0,15,220,65,3,0,79,0,15,0,1,93,65,3,0,15,0,15,0,1,93,184,0,5,16,184,0,22,220,65,3,0,143,0,22,0,1,113,65,5,0,239,0,22,0,255,0,22,0,2,114,184,0,15,16,184,0,30,220,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,18,62,89,184,0,2,220,65,3,0,255,0,2,0,1,93,65,3,0,0,0,2,0,1,93,184,0,10,16,184,0,17,220,184,0,2,16,184,0,25,220,48,49,1,65,7,0,21,0,0,0,37,0,0,0,53,0,0,0,3,93,65,3,0,6,0,0,0,1,93,65,7,0,26,0,4,0,42,0,4,0,58,0,4,0,3,93,65,3,0,11,0,4,0,1,93,65,7,0,25,0,7,0,41,0,7,0,57,0,7,0,3,93,65,3,0,10,0,7,0,1,93,65,7,0,24,0,8,0,40,0,8,0,56,0,8,0,3,93,65,7,0,22,0,12,0,38,0,12,0,54,0,12,0,3,93,65,3,0,7,0,12,0,1,93,65,3,0,6,0,13,0,1,93,0,65,9,0,9,0,0,0,25,0,0,0,41,0,0,0,57,0,0,0,4,93,65,9,0,9,0,3,0,25,0,3,0,41,0,3,0,57,0,3,0,4,93,65,3,0,6,0,7,0,1,93,65,7,0,23,0,8,0,39,0,8,0,55,0,8,0,3,93,65,7,0,22,0,12,0,38,0,12,0,54,0,12,0,3,93,65,3,0,7,0,12,0,1,93,65,3,0,7,0,13,0,1,93,1,6,35,34,38,53,52,62,2,51,50,30,2,21,20,39,34,14,2,21,20,22,51,50,62,2,53,52,46,2,1,7,36,61,63,69,18,35,49,30,30,50,34,19,133,21,32,23,12,49,44,21,30,21,10,11,22,32,2,8,38,77,59,30,50,36,21,21,37,50,29,59,170,18,30,41,22,48,62,19,31,36,24,22,40,31,18,0,0,0,0,2,0,64,0,42,1,178,2,20,0,11,0,15,0,121,184,0,4,47,65,3,0,0,0,4,0,1,93,184,0,1,220,65,3,0,239,0,1,0,1,93,184,0,0,220,184,0,4,16,184,0,5,220,184,0,4,16,184,0,7,208,184,0,1,16,184,0,10,208,184,0,5,16,184,0,14,208,184,0,0,16,184,0,15,208,0,184,0,13,47,184,0,5,220,184,0,1,208,184,0,5,16,184,0,3,220,184,0,5,16,184,0,6,220,184,0,8,220,184,0,6,16,184,0,10,208,184,0,13,16,184,0,14,220,48,49,1,35,21,35,53,35,53,51,53,51,21,51,17,33,53,33,1,178,153,64,153,153,64,153,254,142,1,114,1,71,144,144,67,138,138,254,160,67,0,0,1,0,25,1,64,1,17,2,194,0,23,1,117,186,0,20,0,12,0,3,43,65,3,0,80,0,12,0,1,93,184,0,12,16,184,0,1,208,65,3,0,80,0,20,0,1,93,65,3,0,32,0,20,0,1,93,184,0,20,16,185,0,6,0,5,244,184,0,1,16,184,0,22,208,65,3,0,102,0,22,0,1,93,65,3,0,38,0,22,0,1,93,65,7,0,21,0,22,0,37,0,22,0,53,0,22,0,3,113,184,0,20,16,184,0,23,208,184,0,23,47,0,184,0,0,69,88,184,0,15,47,27,185,0,15,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,185,0,23,0,1,244,184,0,2,208,184,0,15,16,185,0,9,0,3,244,184,0,15,16,184,0,11,220,65,3,0,239,0,11,0,1,93,184,0,12,220,48,49,1,65,3,0,136,0,3,0,1,93,65,11,0,72,0,13,0,88,0,13,0,104,0,13,0,120,0,13,0,136,0,13,0,5,93,65,11,0,55,0,17,0,71,0,17,0,87,0,17,0,103,0,17,0,119,0,17,0,5,93,65,11,0,54,0,18,0,70,0,18,0,86,0,18,0,102,0,18,0,118,0,18,0,5,93,65,7,0,150,0,22,0,166,0,22,0,182,0,22,0,3,93,0,65,3,0,135,0,3,0,1,93,65,11,0,70,0,13,0,86,0,13,0,102,0,13,0,118,0,13,0,134,0,13,0,5,93,65,11,0,55,0,17,0,71,0,17,0,87,0,17,0,103,0,17,0,119,0,17,0,5,93,65,11,0,55,0,18,0,71,0,18,0,87,0,18,0,103,0,18,0,119,0,18,0,5,93,1,35,62,3,53,52,38,35,34,7,39,62,1,51,50,30,2,21,20,7,51,1,17,248,57,66,33,8,30,27,51,42,9,11,61,45,30,42,27,13,106,120,1,64,77,97,60,30,9,25,28,59,65,19,35,16,28,37,21,68,146,0,1,0,19,1,56,1,21,2,194,0,38,1,205,186,0,34,0,5,0,3,43,65,3,0,159,0,5,0,1,93,65,3,0,111,0,5,0,1,93,65,3,0,95,0,5,0,1,113,65,3,0,240,0,5,0,1,93,65,3,0,32,0,5,0,1,113,65,5,0,16,0,34,0,32,0,34,0,2,93,65,3,0,159,0,34,0,1,93,65,3,0,240,0,34,0,1,93,65,3,0,80,0,34,0,1,93,65,3,0,32,0,34,0,1,113,184,0,34,16,185,0,10,0,5,244,186,0,14,0,5,0,34,17,18,57,184,0,14,47,65,3,0,15,0,14,0,1,93,186,0,30,0,34,0,5,17,18,57,184,0,30,47,185,0,18,0,5,244,186,0,23,0,5,0,34,17,18,57,184,0,23,47,186,0,32,0,14,0,30,17,18,57,65,7,0,38,0,32,0,54,0,32,0,70,0,32,0,3,93,65,5,0,85,0,32,0,101,0,32,0,2,93,0,184,0,0,69,88,184,0,25,47,27,185,0,25,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,184,0,6,220,65,5,0,112,0,6,0,128,0,6,0,2,93,184,0,0,16,185,0,8,0,1,244,186,0,16,0,25,0,0,17,18,57,184,0,16,47,65,3,0,31,0,16,0,1,93,185,0,13,0,3,244,184,0,25,16,185,0,20,0,3,244,184,0,25,16,184,0,22,220,186,0,32,0,16,0,13,17,18,57,48,49,1,65,3,0,38,0,27,0,1,93,65,3,0,70,0,27,0,1,93,65,3,0,55,0,27,0,1,93,65,3,0,87,0,27,0,1,93,65,3,0,104,0,27,0,1,93,65,3,0,38,0,37,0,1,93,65,3,0,71,0,37,0,1,93,0,65,3,0,101,0,27,0,1,93,65,9,0,38,0,27,0,54,0,27,0,70,0,27,0,86,0,27,0,4,93,65,3,0,118,0,27,0,1,93,65,3,0,41,0,37,0,1,93,65,3,0,73,0,37,0,1,93,65,3,0,58,0,37,0,1,93,19,34,46,2,39,55,22,51,50,53,52,38,43,1,55,51,50,53,52,35,34,7,39,54,51,50,30,2,21,20,7,22,21,20,14,2,128,17,35,30,23,4,18,32,56,78,31,43,52,6,27,77,60,49,22,11,26,65,36,48,29,13,39,54,24,41,54,1,56,6,9,10,5,66,26,52,30,34,55,48,44,17,53,25,18,28,36,19,53,22,32,61,30,46,32,17,0,0,1,0,58,2,84,0,245,2,220,0,3,0,105,184,0,2,47,65,3,0,0,0,2,0,1,93,184,0,0,220,0,184,0,1,47,65,3,0,64,0,1,0,1,93,65,3,0,32,0,1,0,1,93,65,3,0,16,0,1,0,1,113,184,0,3,220,65,5,0,15,0,3,0,31,0,3,0,2,93,184,0,0,220,65,11,0,89,0,0,0,105,0,0,0,121,0,0,0,137,0,0,0,153,0,0,0,5,93,184,0,1,16,184,0,2,220,48,49,19,7,53,55,245,187,187,2,148,64,41,95,0,0,1,0,73,255,14,2,44,1,234,0,27,0,252,186,0,23,0,13,0,3,43,65,3,0,143,0,23,0,1,93,65,3,0,0,0,23,0,1,93,65,3,0,32,0,23,0,1,93,184,0,23,16,185,0,22,0,4,244,186,0,4,0,22,0,23,17,18,57,65,3,0,143,0,13,0,1,93,65,3,0,0,0,13,0,1,93,65,3,0,32,0,13,0,1,93,184,0,13,16,185,0,14,0,4,244,184,0,10,208,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,12,62,89,184,0,0,69,88,184,0,7,47,27,185,0,7,0,6,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,0,69,88,184,0,12,47,27,185,0,12,0,8,62,89,184,0,1,16,185,0,0,0,1,244,184,0,14,16,184,0,22,208,186,0,4,0,7,0,22,17,18,57,186,0,10,0,14,0,7,17,18,57,65,5,0,122,0,10,0,138,0,10,0,2,93,184,0,7,16,185,0,18,0,2,244,48,49,1,65,5,0,85,0,17,0,101,0,17,0,2,93,0,65,3,0,88,0,17,0,1,93,37,7,35,34,39,14,1,35,34,38,39,17,35,17,51,17,20,22,51,50,54,55,17,51,17,20,22,51,2,44,16,26,79,28,33,57,44,32,47,33,88,89,53,69,38,50,28,87,19,28,62,72,73,38,36,15,23,254,243,2,220,254,254,84,79,26,32,1,107,254,192,57,51,0,0,1,0,33,0,0,2,68,2,188,0,19,0,140,184,0,7,47,65,5,0,0,0,7,0,16,0,7,0,2,93,184,0,3,220,65,5,0,15,0,3,0,31,0,3,0,2,93,184,0,2,220,184,0,0,220,184,0,7,16,184,0,6,220,184,0,7,16,184,0,13,220,65,5,0,15,0,13,0,31,0,13,0,2,93,0,184,0,0,69,88,184,0,19,47,27,185,0,19,0,14,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,184,0,19,16,184,0,0,220,184,0,6,16,184,0,3,208,184,0,0,16,184,0,4,208,184,0,19,16,184,0,8,220,48,49,1,35,17,35,17,35,17,35,53,46,3,53,52,62,2,51,33,2,68,75,48,101,41,70,105,71,36,38,73,108,69,1,3,2,121,253,135,2,121,253,135,243,4,40,63,80,44,45,82,62,37,0,0,0,0,1,0,57,0,213,0,181,1,87,0,3,0,76,184,0,1,47,65,5,0,32,0,1,0,48,0,1,0,2,113,65,5,0,0,0,1,0,16,0,1,0,2,93,184,0,0,220,65,3,0,191,0,0,0,1,93,65,3,0,63,0,0,0,1,93,65,5,0,47,0,0,0,63,0,0,0,2,113,0,184,0,1,47,184,0,2,220,48,49,55,35,53,51,181,124,124,213,130,0,0,1,0,144,255,64,1,22,255,202,0,3,0,54,184,0,2,47,65,3,0,32,0,2,0,1,93,184,0,0,220,65,5,0,31,0,0,0,47,0,0,0,2,93,0,184,0,4,47,184,0,0,220,184,0,2,220,65,3,0,16,0,2,0,1,93,48,49,5,15,1,55,1,22,88,46,68,54,133,5,132,0,0,0,0,1,0,23,1,64,0,155,2,186,0,11,0,171,187,0,0,0,5,0,1,0,4,43,65,5,0,143,0,0,0,159,0,0,0,2,93,65,3,0,207,0,0,0,1,93,65,7,0,0,0,0,0,16,0,0,0,32,0,0,0,3,93,65,5,0,143,0,1,0,159,0,1,0,2,93,65,3,0,207,0,1,0,1,93,65,7,0,0,0,1,0,16,0,1,0,32,0,1,0,3,93,184,0,1,16,184,0,5,208,184,0,5,47,186,0,10,0,1,0,0,17,18,57,0,184,0,0,69,88,184,0,11,47,27,185,0,11,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,184,0,11,16,184,0,4,220,186,0,2,0,4,0,11,17,18,57,185,0,5,0,3,244,48,49,19,35,17,6,7,39,62,3,55,51,155,75,32,19,6,9,24,21,18,3,57,1,64,1,20,14,3,60,1,13,16,20,9,0,0,0,2,0,33,1,178,1,81,2,213,0,18,0,31,0,233,184,0,7,47,65,3,0,96,0,7,0,1,93,184,0,17,220,184,0,7,16,185,0,24,0,5,244,184,0,17,16,185,0,30,0,5,244,0,184,0,12,47,184,0,2,220,65,3,0,208,0,2,0,1,93,65,3,0,96,0,2,0,1,93,65,3,0,48,0,2,0,1,93,184,0,12,16,185,0,21,0,3,244,184,0,2,16,185,0,27,0,3,244,48,49,1,65,7,0,6,0,0,0,22,0,0,0,38,0,0,0,3,93,65,7,0,9,0,5,0,25,0,5,0,41,0,5,0,3,93,65,7,0,8,0,10,0,24,0,10,0,40,0,10,0,3,93,65,7,0,6,0,14,0,22,0,14,0,38,0,14,0,3,93,0,65,7,0,9,0,0,0,25,0,0,0,41,0,0,0,3,93,65,7,0,8,0,5,0,24,0,5,0,40,0,5,0,3,93,65,7,0,6,0,10,0,22,0,10,0,38,0,10,0,3,93,65,7,0,6,0,14,0,22,0,14,0,38,0,14,0,3,93,1,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,39,38,35,34,6,21,20,22,51,50,54,53,52,1,39,41,69,35,56,39,22,21,39,57,35,35,56,40,21,97,20,35,35,40,40,35,35,40,1,220,42,23,39,53,31,30,53,39,23,23,39,53,30,61,123,24,49,37,38,48,48,38,37,0,2,0,41,0,78,2,36,1,234,0,5,0,11,0,195,184,0,0,47,65,3,0,0,0,0,0,1,93,184,0,4,220,184,0,5,220,65,7,0,96,0,5,0,112,0,5,0,128,0,5,0,3,93,65,7,0,0,0,5,0,16,0,5,0,32,0,5,0,3,113,184,0,1,208,184,0,4,16,184,0,2,208,184,0,0,16,185,0,3,0,4,244,184,0,0,16,184,0,6,220,184,0,10,220,185,0,11,0,4,244,184,0,7,208,184,0,10,16,184,0,8,208,184,0,6,16,185,0,9,0,4,244,65,3,0,47,0,13,0,1,93,0,25,184,0,0,47,24,184,0,1,208,184,0,1,47,184,0,0,16,184,0,3,208,184,0,0,16,184,0,5,208,184,0,5,47,184,0,3,16,184,0,6,208,184,0,1,16,184,0,7,208,184,0,6,16,184,0,9,208,184,0,5,16,184,0,11,208,48,49,1,7,35,55,39,51,15,1,35,55,39,51,2,36,147,100,147,147,100,112,147,101,148,148,101,1,28,206,206,206,206,206,206,206,0,0,0,255,255,0,39,255,171,2,171,2,188,0,38,0,120,16,0,0,38,0,16,42,0,1,7,0,223,1,124,254,193,0,58,0,184,0,0,69,88,184,0,11,47,27,185,0,11,0,14,62,89,184,0,0,69,88,184,0,15,47,27,185,0,15,0,14,62,89,184,0,0,69,88,184,0,18,47,27,185,0,18,0,6,62,89,184,0,26,208,48,49,0,0,255,255,0,36,255,171,2,182,2,188,0,38,0,120,13,0,0,38,0,16,39,0,1,7,0,113,1,165,254,192,0,54,0,184,0,0,69,88,184,0,11,47,27,185,0,11,0,14,62,89,184,0,0,69,88,184,0,15,47,27,185,0,15,0,14,62,89,184,0,0,69,88,184,0,16,47,27,185,0,16,0,6,62,89,48,49,0,0,255,255,0,32,255,171,3,83,2,194,0,38,0,114,13,0,0,39,0,16,0,212,0,0,1,7,0,223,2,36,254,193,0,58,0,184,0,0,69,88,184,0,25,47,27,185,0,25,0,14,62,89,184,0,0,69,88,184,0,42,47,27,185,0,42,0,14,62,89,184,0,0,69,88,184,0,45,47,27,185,0,45,0,6,62,89,184,0,53,208,48,49,0,2,0,62,255,6,1,173,1,244,0,36,0,40,1,65,186,0,21,0,29,0,3,43,186,0,1,0,21,0,29,17,18,57,184,0,1,47,65,5,0,31,0,1,0,47,0,1,0,2,113,184,0,0,220,184,0,29,16,184,0,10,220,65,7,0,63,0,10,0,79,0,10,0,95,0,10,0,3,113,186,0,39,0,29,0,21,17,18,57,184,0,39,47,185,0,40,0,4,244,0,184,0,0,69,88,184,0,37,47,27,185,0,37,0,12,62,89,184,0,0,69,88,184,0,24,47,27,185,0,24,0,8,62,89,184,0,37,16,184,0,40,220,65,3,0,48,0,40,0,1,113,184,0,0,220,184,0,24,16,185,0,15,0,1,244,184,0,24,16,184,0,20,220,48,49,1,65,3,0,118,0,8,0,1,93,65,3,0,135,0,8,0,1,93,65,7,0,54,0,22,0,70,0,22,0,86,0,22,0,3,93,65,3,0,9,0,26,0,1,93,65,7,0,105,0,27,0,121,0,27,0,137,0,27,0,3,93,65,3,0,40,0,33,0,1,93,65,3,0,25,0,33,0,1,93,0,65,3,0,120,0,8,0,1,93,65,3,0,137,0,8,0,1,93,65,7,0,57,0,22,0,73,0,22,0,89,0,22,0,3,93,65,3,0,9,0,26,0,1,93,65,3,0,104,0,27,0,1,93,65,3,0,136,0,27,0,1,93,65,3,0,22,0,33,0,1,93,65,3,0,39,0,33,0,1,93,19,51,22,21,20,14,4,21,20,30,2,51,50,62,2,55,23,14,1,35,34,46,2,53,52,54,63,1,62,1,47,1,51,21,35,233,59,3,22,34,38,34,22,21,35,46,26,22,42,36,26,5,25,19,86,54,47,77,54,30,35,25,50,26,36,1,18,91,91,1,44,41,4,31,53,49,47,49,55,32,30,46,31,16,13,20,24,11,67,29,38,33,52,67,35,35,76,32,65,33,65,30,227,86,0,0,0,255,255,0,7,0,0,2,97,3,173,2,38,0,34,0,0,1,7,0,65,0,157,0,209,0,70,65,5,0,64,0,12,0,80,0,12,0,2,113,65,3,0,16,0,12,0,1,93,65,3,0,112,0,12,0,1,93,65,3,0,48,0,12,0,1,93,0,65,3,0,47,0,11,0,1,93,65,3,0,31,0,11,0,1,113,65,3,0,255,0,11,0,1,93,48,49,255,255,0,7,0,0,2,97,3,173,2,38,0,34,0,0,1,7,0,115,0,157,0,209,0,48,65,3,0,159,0,12,0,1,93,65,3,0,15,0,12,0,1,93,65,3,0,79,0,12,0,1,93,65,3,0,16,0,12,0,1,93,0,65,3,0,47,0,12,0,1,93,48,49,0,0,255,255,0,7,0,0,2,97,3,186,2,38,0,34,0,0,1,7,0,203,0,86,0,209,0,39,65,3,0,79,0,14,0,1,93,65,3,0,143,0,14,0,1,93,65,3,0,16,0,14,0,1,93,0,65,3,0,47,0,14,0,1,93,48,49,0,0,0,255,255,0,7,0,0,2,97,3,143,2,38,0,34,0,0,1,7,0,206,0,44,0,209,0,39,65,3,0,15,0,19,0,1,93,65,3,0,47,0,19,0,1,113,65,3,0,47,0,19,0,1,93,0,65,3,0,47,0,11,0,1,93,48,49,0,0,0,255,255,0,7,0,0,2,97,3,141,2,38,0,34,0,0,1,7,0,104,0,98,0,209,0,77,184,0,16,47,65,3,0,15,0,16,0,1,113,65,5,0,79,0,16,0,95,0,16,0,2,93,65,3,0,16,0,16,0,1,93,65,3,0,64,0,16,0,1,113,184,0,12,208,0,184,0,15,47,65,3,0,47,0,15,0,1,93,65,3,0,175,0,15,0,1,93,184,0,12,208,48,49,0,255,255,0,7,0,0,2,97,3,196,2,38,0,34,0,0,1,7,0,205,0,163,0,209,0,91,184,0,14,47,65,3,0,15,0,14,0,1,93,65,3,0,47,0,14,0,1,93,65,3,0,112,0,14,0,1,93,184,0,26,208,0,184,0,25,47,65,3,0,111,0,25,0,1,93,65,3,0,47,0,25,0,1,93,65,3,0,15,0,25,0,1,113,65,3,0,32,0,25,0,1,113,65,3,0,224,0,25,0,1,93,184,0,29,208,48,49,0,0,0,0,2,255,249,0,0,3,60,2,188,0,15,0,18,1,163,186,0,0,0,1,0,3,43,65,3,0,64,0,0,0,1,93,65,3,0,176,0,0,0,1,93,65,3,0,96,0,0,0,1,93,65,3,0,223,0,1,0,1,93,184,0,1,16,184,0,16,208,184,0,1,16,184,0,5,208,65,3,0,89,0,5,0,1,93,65,3,0,9,0,5,0,1,93,65,3,0,245,0,5,0,1,93,185,0,4,0,4,244,186,0,3,0,16,0,4,17,18,57,65,3,0,138,0,3,0,1,93,184,0,16,16,184,0,6,208,65,3,0,139,0,6,0,1,93,65,3,0,42,0,6,0,1,113,65,3,0,249,0,6,0,1,93,65,5,0,9,0,6,0,25,0,6,0,2,113,184,0,0,16,184,0,8,208,184,0,8,47,184,0,1,16,184,0,14,220,65,5,0,96,0,14,0,112,0,14,0,2,113,65,7,0,208,0,14,0,224,0,14,0,240,0,14,0,3,93,65,7,0,0,0,14,0,16,0,14,0,32,0,14,0,3,113,65,9,0,80,0,14,0,96,0,14,0,112,0,14,0,128,0,14,0,4,93,184,0,10,208,184,0,0,16,184,0,12,208,184,0,12,47,186,0,18,0,16,0,4,17,18,57,65,3,0,22,0,18,0,1,113,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,16,0,1,0,6,17,18,57,184,0,16,47,185,0,2,0,2,244,184,0,1,16,184,0,4,208,184,0,6,16,185,0,9,0,2,244,186,0,10,0,6,0,1,17,18,57,184,0,10,47,185,0,13,0,2,244,184,0,1,16,185,0,14,0,2,244,184,0,9,16,184,0,17,208,48,49,1,65,5,0,105,0,6,0,121,0,6,0,2,93,65,3,0,117,0,18,0,1,93,41,1,53,35,7,35,1,33,21,33,21,51,21,35,21,33,37,17,3,3,60,254,76,214,92,93,1,86,1,227,254,200,241,241,1,66,254,76,171,180,180,2,188,87,204,86,237,186,1,83,254,173,0,255,255,0,39,255,64,2,71,2,202,2,38,0,36,0,0,0,6,0,119,96,0,0,0,255,255,0,80,0,0,2,4,3,173,2,38,0,38,0,0,1,7,0,65,0,126,0,209,0,74,65,7,0,48,0,13,0,64,0,13,0,80,0,13,0,3,93,65,3,0,47,0,13,0,1,93,65,3,0,80,0,13,0,1,113,65,3,0,48,0,13,0,1,113,0,65,3,0,47,0,12,0,1,93,65,3,0,31,0,12,0,1,113,65,3,0,255,0,12,0,1,93,48,49,255,255,0,80,0,0,2,4,3,173,2,38,0,38,0,0,1,7,0,115,0,125,0,209,0,60,65,7,0,143,0,14,0,159,0,14,0,175,0,14,0,3,93,65,3,0,255,0,14,0,1,93,65,3,0,15,0,14,0,1,113,65,5,0,48,0,14,0,64,0,14,0,2,113,0,65,3,0,47,0,13,0,1,93,48,49,0,0,255,255,0,80,0,0,2,4,3,186,2,38,0,38,0,0,1,7,0,203,0,53,0,209,0,30,65,3,0,143,0,15,0,1,93,65,3,0,16,0,15,0,1,93,0,65,3,0,47,0,15,0,1,93,48,49,255,255,0,80,0,0,2,4,3,141,2,38,0,38,0,0,1,7,0,104,0,65,0,209,0,55,184,0,17,47,65,3,0,143,0,17,0,1,93,65,3,0,175,0,17,0,1,93,184,0,13,208,0,184,0,16,47,65,3,0,47,0,16,0,1,93,65,3,0,175,0,16,0,1,93,184,0,13,208,48,49,0,0,0,255,255,0,35,0,0,0,222,3,173,2,38,0,42,0,0,1,7,0,65,255,233,0,209,0,86,65,5,0,239,0,5,0,255,0,5,0,2,93,65,3,0,15,0,5,0,1,113,65,3,0,0,0,5,0,1,93,65,11,0,48,0,5,0,64,0,5,0,80,0,5,0,96,0,5,0,112,0,5,0,5,93,0,65,3,0,47,0,4,0,1,93,65,3,0,31,0,4,0,1,113,65,3,0,255,0,4,0,1,93,48,49,255,255,0,36,0,0,0,223,3,173,2,38,0,42,0,0,1,7,0,115,255,234,0,209,0,12,0,65,3,0,47,0,5,0,1,93,48,49,0,0,255,255,255,240,0,0,1,22,3,186,2,38,0,42,0,0,1,7,0,203,255,164,0,209,0,47,65,3,0,143,0,7,0,1,93,65,7,0,80,0,7,0,96,0,7,0,112,0,7,0,3,93,65,3,0,32,0,7,0,1,113,0,65,3,0,47,0,7,0,1,93,48,49,0,0,0,255,255,0,5,0,0,0,253,3,141,2,38,0,42,0,0,1,7,0,104,255,174,0,209,0,59,184,0,9,47,65,3,0,175,0,9,0,1,93,65,5,0,64,0,9,0,80,0,9,0,2,113,184,0,5,208,0,184,0,8,47,65,3,0,47,0,8,0,1,93,65,3,0,175,0,8,0,1,93,184,0,5,208,48,49,0,0,0,0,2,255,245,0,0,2,175,2,188,0,16,0,31,1,145,186,0,12,0,1,0,3,43,65,3,0,127,0,1,0,1,93,65,3,0,47,0,1,0,1,113,65,3,0,16,0,1,0,1,93,184,0,1,16,184,0,3,208,184,0,3,47,184,0,1,16,184,0,5,208,65,5,0,16,0,12,0,32,0,12,0,2,93,65,3,0,128,0,12,0,1,93,65,3,0,192,0,12,0,1,93,65,3,0,64,0,12,0,1,93,65,3,0,224,0,12,0,1,93,65,3,0,16,0,12,0,1,113,184,0,1,16,185,0,23,0,4,244,184,0,19,208,184,0,23,16,184,0,21,208,184,0,21,47,184,0,12,16,185,0,27,0,4,244,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,19,0,7,0,0,17,18,57,184,0,19,47,65,3,0,47,0,19,0,1,93,65,3,0,15,0,19,0,1,93,65,3,0,95,0,19,0,1,93,185,0,22,0,1,244,184,0,2,208,184,0,19,16,184,0,5,208,184,0,7,16,185,0,17,0,2,244,184,0,0,16,185,0,24,0,2,244,48,49,1,65,3,0,86,0,9,0,1,93,65,3,0,103,0,9,0,1,93,65,3,0,86,0,10,0,1,93,65,3,0,119,0,10,0,1,93,65,3,0,87,0,14,0,1,93,65,3,0,86,0,15,0,1,93,65,5,0,103,0,15,0,119,0,15,0,2,93,0,65,5,0,86,0,9,0,102,0,9,0,2,93,65,3,0,87,0,10,0,1,93,65,3,0,119,0,10,0,1,93,65,3,0,88,0,14,0,1,93,65,3,0,120,0,15,0,1,93,65,3,0,105,0,15,0,1,93,65,3,0,90,0,15,0,1,93,41,1,17,35,53,51,17,33,50,30,2,21,20,14,2,3,35,21,51,21,35,21,51,50,54,53,52,46,2,1,86,255,0,97,97,1,0,76,127,92,50,50,90,127,78,166,133,133,166,118,125,32,61,91,1,57,64,1,67,49,90,130,81,81,129,91,49,2,102,237,64,226,140,123,61,98,68,37,0,255,255,0,80,0,0,2,112,3,143,2,38,0,47,0,0,1,7,0,206,0,87,0,209,0,25,65,5,0,144,0,18,0,160,0,18,0,2,93,0,65,3,0,47,0,10,0,1,93,48,49,0,255,255,0,39,255,242,2,217,3,173,2,38,0,48,0,0,1,7,0,65,0,233,0,209,0,30,0,65,3,0,47,0,38,0,1,93,65,3,0,31,0,38,0,1,113,65,3,0,255,0,38,0,1,93,48,49,255,255,0,39,255,242,2,217,3,173,2,38,0,48,0,0,1,7,0,115,0,232,0,209,0,48,65,3,0,239,0,40,0,1,93,65,3,0,15,0,40,0,1,93,65,3,0,175,0,40,0,1,93,65,3,0,32,0,40,0,1,93,0,65,3,0,47,0,39,0,1,93,48,49,0,0,255,255,0,39,255,242,2,217,3,186,2,38,0,48,0,0,1,7,0,203,0,161,0,209,0,34,65,3,0,15,0,41,0,1,93,65,5,0,16,0,41,0,32,0,41,0,2,93,0,65,3,0,47,0,41,0,1,93,48,49,255,255,0,39,255,242,2,217,3,143,2,38,0,48,0,0,1,7,0,206,0,119,0,209,0,30,65,3,0,15,0,46,0,1,93,65,3,0,63,0,46,0,1,93,0,65,3,0,47,0,38,0,1,93,48,49,255,255,0,39,255,242,2,217,3,141,2,38,0,48,0,0,1,7,0,104,0,173,0,209,0,59,184,0,43,47,65,3,0,95,0,43,0,1,93,65,5,0,16,0,43,0,32,0,43,0,2,93,184,0,39,208,0,184,0,42,47,65,3,0,47,0,42,0,1,93,65,3,0,175,0,42,0,1,93,184,0,39,208,48,49,0,0,0,0,1,0,61,0,119,1,122,1,179,0,11,0,109,184,0,4,47,65,3,0,239,0,4,0,1,93,65,5,0,0,0,4,0,16,0,4,0,2,93,184,0,0,220,186,0,5,0,4,0,0,17,18,57,184,0,4,16,184,0,6,208,184,0,0,16,184,0,10,208,186,0,11,0,0,0,4,17,18,57,0,184,0,3,47,184,0,1,208,184,0,3,16,184,0,7,220,186,0,2,0,3,0,7,17,18,57,186,0,8,0,7,0,3,17,18,57,184,0,9,208,48,49,37,7,39,7,39,55,39,55,23,55,23,7,1,122,36,123,122,36,123,123,36,122,123,36,124,155,36,123,123,36,122,122,36,123,123,36,122,0,3,0,39,255,226,2,217,2,204,0,23,0,33,0,43,3,133,186,0,19,0,7,0,3,43,65,3,0,15,0,7,0,1,93,65,5,0,79,0,7,0,95,0,7,0,2,93,65,3,0,32,0,19,0,1,93,65,5,0,176,0,19,0,192,0,19,0,2,93,65,5,0,224,0,19,0,240,0,19,0,2,93,65,5,0,112,0,19,0,128,0,19,0,2,93,65,3,0,32,0,19,0,1,113,186,0,2,0,7,0,19,17,18,57,184,0,2,16,184,0,3,208,186,0,5,0,7,0,19,17,18,57,65,3,0,121,0,5,0,1,93,184,0,5,16,184,0,4,208,65,3,0,25,0,4,0,1,93,186,0,14,0,19,0,7,17,18,57,184,0,14,16,184,0,15,208,65,3,0,138,0,15,0,1,93,186,0,17,0,19,0,7,17,18,57,65,3,0,118,0,17,0,1,93,184,0,17,16,184,0,16,208,65,3,0,57,0,16,0,1,93,184,0,19,16,185,0,32,0,4,244,184,0,7,16,185,0,39,0,4,244,186,0,24,0,32,0,39,17,18,57,186,0,25,0,39,0,32,17,18,57,65,5,0,54,0,25,0,70,0,25,0,2,93,65,7,0,6,0,25,0,22,0,25,0,38,0,25,0,3,113,65,5,0,117,0,25,0,133,0,25,0,2,93,186,0,41,0,39,0,32,17,18,57,186,0,42,0,32,0,39,17,18,57,65,3,0,122,0,42,0,1,93,65,3,0,139,0,42,0,1,93,65,5,0,57,0,42,0,73,0,42,0,2,93,65,7,0,9,0,42,0,25,0,42,0,41,0,42,0,3,113,65,3,0,15,0,44,0,1,93,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,2,0,0,0,12,17,18,57,184,0,3,208,184,0,3,47,186,0,5,0,0,0,12,17,18,57,186,0,14,0,12,0,0,17,18,57,65,7,0,6,0,14,0,22,0,14,0,38,0,14,0,3,113,184,0,12,16,184,0,15,208,184,0,15,47,186,0,17,0,12,0,0,17,18,57,184,0,12,16,185,0,34,0,2,244,184,0,0,16,185,0,27,0,2,244,186,0,24,0,34,0,27,17,18,57,65,3,0,138,0,24,0,1,93,65,7,0,9,0,24,0,25,0,24,0,41,0,24,0,3,113,65,3,0,121,0,24,0,1,93,186,0,25,0,27,0,34,17,18,57,186,0,41,0,27,0,34,17,18,57,65,7,0,6,0,41,0,22,0,41,0,38,0,41,0,3,113,65,5,0,118,0,41,0,134,0,41,0,2,93,186,0,42,0,34,0,27,17,18,57,48,49,1,65,3,0,105,0,4,0,1,93,65,3,0,137,0,4,0,1,93,65,3,0,90,0,4,0,1,93,65,3,0,89,0,9,0,1,93,65,3,0,121,0,9,0,1,93,65,5,0,88,0,10,0,104,0,10,0,2,93,65,3,0,137,0,14,0,1,93,65,3,0,86,0,17,0,1,93,65,5,0,86,0,21,0,102,0,21,0,2,93,65,3,0,117,0,22,0,1,93,65,3,0,86,0,22,0,1,93,65,3,0,103,0,24,0,1,93,65,3,0,138,0,30,0,1,93,65,3,0,133,0,37,0,1,93,65,3,0,105,0,41,0,1,93,65,3,0,89,0,42,0,1,93,0,65,3,0,90,0,2,0,1,93,65,3,0,85,0,9,0,1,93,65,3,0,118,0,9,0,1,93,65,3,0,101,0,10,0,1,93,65,3,0,86,0,10,0,1,93,65,3,0,86,0,14,0,1,93,65,3,0,135,0,14,0,1,93,65,3,0,87,0,17,0,1,93,65,3,0,88,0,21,0,1,93,65,3,0,105,0,21,0,1,93,65,3,0,90,0,22,0,1,93,65,3,0,122,0,22,0,1,93,65,3,0,107,0,24,0,1,93,65,3,0,136,0,37,0,1,93,65,3,0,101,0,41,0,1,93,65,3,0,87,0,42,0,1,93,5,34,39,7,35,55,38,53,52,62,2,51,50,23,55,51,7,22,21,20,14,2,19,1,22,51,50,62,2,53,52,39,34,14,2,21,20,23,1,38,1,127,91,85,42,93,73,106,52,91,127,75,86,86,31,92,61,111,51,91,128,104,254,209,69,55,58,89,60,30,238,57,88,60,31,55,1,45,66,12,43,61,105,113,162,83,134,95,52,42,44,89,111,167,81,133,95,52,2,48,254,69,29,41,74,101,60,126,147,41,74,101,60,98,95,1,185,28,0,0,0,255,255,0,72,255,242,2,140,3,173,0,38,0,54,0,0,1,7,0,65,0,211,0,209,0,56,65,3,0,47,0,23,0,1,93,65,7,0,48,0,23,0,64,0,23,0,80,0,23,0,3,93,0,65,3,0,47,0,22,0,1,93,65,3,0,31,0,22,0,1,113,65,3,0,255,0,22,0,1,93,48,49,0,0,255,255,0,72,255,242,2,140,3,173,0,38,0,54,0,0,1,7,0,115,0,211,0,209,0,47,65,3,0,15,0,23,0,1,93,65,7,0,175,0,24,0,191,0,24,0,207,0,24,0,3,93,65,3,0,15,0,24,0,1,113,0,65,3,0,47,0,22,0,1,93,48,49,0,0,0,255,255,0,72,255,242,2,140,3,186,0,38,0,54,0,0,1,7,0,203,0,139,0,209,0,39,65,3,0,15,0,25,0,1,93,65,3,0,143,0,25,0,1,93,65,3,0,32,0,25,0,1,113,0,65,3,0,47,0,25,0,1,93,48,49,0,0,0,255,255,0,72,255,242,2,140,3,141,0,38,0,54,0,0,1,7,0,104,0,152,0,209,0,64,184,0,27,47,65,3,0,15,0,27,0,1,93,65,3,0,16,0,27,0,1,93,65,3,0,80,0,27,0,1,113,184,0,23,208,0,184,0,26,47,65,3,0,47,0,26,0,1,93,65,3,0,175,0,26,0,1,93,184,0,23,208,48,49,0,0,255,255,255,253,0,0,2,57,3,173,2,38,0,58,0,0,1,7,0,115,0,144,0,209,0,52,65,5,0,239,0,11,0,255,0,11,0,2,93,65,3,0,15,0,11,0,1,93,65,3,0,175,0,11,0,1,93,65,3,0,32,0,11,0,1,93,0,65,3,0,47,0,10,0,1,93,48,49,0,0,0,2,0,80,0,0,2,36,2,188,0,16,0,27,1,80,186,0,11,0,2,0,3,43,65,5,0,0,0,2,0,16,0,2,0,2,93,65,3,0,143,0,2,0,1,93,65,3,0,144,0,2,0,1,93,65,3,0,112,0,2,0,1,93,184,0,2,16,185,0,1,0,4,244,184,0,18,208,184,0,5,208,65,3,0,192,0,11,0,1,93,65,3,0,80,0,11,0,1,93,65,3,0,112,0,11,0,1,93,65,5,0,0,0,11,0,16,0,11,0,2,93,65,3,0,224,0,11,0,1,93,65,3,0,32,0,11,0,1,113,184,0,11,16,185,0,22,0,4,244,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,14,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,0,0,4,0,1,17,18,57,184,0,0,47,65,7,0,15,0,0,0,31,0,0,0,47,0,0,0,3,113,65,3,0,143,0,0,0,1,93,65,3,0,47,0,0,0,1,93,186,0,5,0,4,0,1,17,18,57,184,0,5,47,185,0,17,0,2,244,184,0,0,16,185,0,18,0,2,244,48,49,1,65,5,0,118,0,8,0,134,0,8,0,2,93,65,7,0,102,0,9,0,118,0,9,0,134,0,9,0,3,93,65,3,0,7,0,9,0,1,93,0,65,3,0,116,0,8,0,1,93,65,3,0,133,0,8,0,1,93,65,3,0,5,0,9,0,1,93,65,3,0,101,0,9,0,1,93,65,3,0,135,0,9,0,1,93,55,21,35,17,51,21,51,50,30,2,21,20,14,2,35,3,17,51,50,54,53,52,46,2,35,180,100,100,124,49,88,67,40,41,64,76,35,152,134,73,62,16,38,63,46,125,125,2,188,120,15,47,86,70,68,91,55,23,1,114,254,227,77,71,37,53,32,15,0,1,0,16,255,120,2,39,2,238,0,62,2,25,186,0,58,0,31,0,3,43,65,3,0,0,0,31,0,1,93,65,3,0,31,0,31,0,1,113,65,3,0,80,0,31,0,1,93,65,3,0,32,0,31,0,1,93,184,0,31,16,185,0,30,0,4,244,65,3,0,32,0,58,0,1,93,65,3,0,160,0,58,0,1,93,65,3,0,80,0,58,0,1,113,65,11,0,64,0,58,0,80,0,58,0,96,0,58,0,112,0,58,0,128,0,58,0,5,93,65,3,0,0,0,58,0,1,93,65,3,0,48,0,58,0,1,113,184,0,58,16,185,0,9,0,4,244,186,0,3,0,30,0,9,17,18,57,184,0,3,47,186,0,16,0,30,0,9,17,18,57,184,0,16,47,186,0,46,0,58,0,31,17,18,57,184,0,46,47,185,0,21,0,4,244,184,0,31,16,184,0,35,208,184,0,33,220,184,0,16,16,185,0,51,0,4,244,0,184,0,30,47,184,0,0,69,88,184,0,41,47,27,185,0,41,0,18,62,89,184,0,0,69,88,184,0,34,47,27,185,0,34,0,12,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,185,0,4,0,1,244,186,0,16,0,41,0,3,17,18,57,25,184,0,16,47,24,184,0,41,16,185,0,26,0,2,244,184,0,34,16,185,0,33,0,1,244,184,0,16,16,184,0,51,208,48,49,1,65,3,0,72,0,12,0,1,93,65,3,0,73,0,19,0,1,93,65,3,0,138,0,19,0,1,93,65,3,0,123,0,19,0,1,93,65,3,0,9,0,38,0,1,93,65,3,0,7,0,43,0,1,93,65,3,0,39,0,43,0,1,93,65,5,0,6,0,44,0,22,0,44,0,2,93,65,3,0,54,0,49,0,1,93,65,7,0,87,0,55,0,103,0,55,0,119,0,55,0,3,93,65,3,0,7,0,60,0,1,93,65,3,0,6,0,61,0,1,93,0,65,3,0,119,0,19,0,1,93,65,3,0,5,0,38,0,1,93,65,3,0,6,0,43,0,1,93,65,3,0,38,0,43,0,1,93,65,5,0,7,0,44,0,23,0,44,0,2,93,65,3,0,57,0,49,0,1,93,65,3,0,101,0,55,0,1,93,65,3,0,86,0,55,0,1,93,65,3,0,119,0,56,0,1,93,65,3,0,8,0,60,0,1,93,65,3,0,9,0,61,0,1,93,5,34,38,39,53,50,62,2,53,52,46,4,53,52,62,2,53,52,46,2,35,34,6,21,17,35,17,35,55,51,53,52,62,2,51,50,30,2,21,20,14,2,21,20,30,4,21,20,14,2,1,72,18,20,12,42,68,46,25,25,38,44,38,25,33,41,33,16,27,36,20,54,52,90,85,12,73,31,54,72,41,35,68,53,32,31,36,31,24,36,42,36,24,38,62,81,10,2,1,77,3,13,29,27,28,47,41,35,33,30,15,18,42,51,63,39,26,33,20,7,51,71,253,84,2,44,70,87,42,64,44,23,18,39,62,45,45,69,50,34,10,8,23,29,38,47,56,34,42,58,36,17,0,255,255,0,24,255,246,1,216,2,220,2,38,0,66,0,0,1,6,0,65,89,0,0,29,65,3,0,0,0,45,0,1,93,65,3,0,80,0,45,0,1,113,65,3,0,160,0,45,0,1,93,48,49,0,0,0,255,255,0,24,255,246,1,216,2,220,2,38,0,66,0,0,1,6,0,115,88,0,0,29,65,3,0,127,0,46,0,1,93,65,3,0,255,0,46,0,1,93,65,3,0,80,0,46,0,1,113,48,49,0,0,0,255,255,0,24,255,246,1,216,2,233,2,38,0,66,0,0,1,6,0,203,17,0,0,24,65,5,0,127,0,47,0,143,0,47,0,2,93,65,3,0,223,0,47,0,1,93,48,49,255,255,0,24,255,246,1,216,2,190,2,38,0,66,0,0,1,6,0,206,228,0,0,29,65,3,0,255,0,52,0,1,93,65,3,0,32,0,52,0,1,93,65,3,0,64,0,52,0,1,93,48,49,0,0,0,255,255,0,24,255,246,1,216,2,188,2,38,0,66,0,0,1,6,0,104,29,0,0,62,184,0,49,47,65,3,0,160,0,49,0,1,93,65,7,0,95,0,49,0,111,0,49,0,127,0,49,0,3,93,65,3,0,64,0,49,0,1,113,65,7,0,192,0,49,0,208,0,49,0,224,0,49,0,3,93,184,0,45,208,48,49,0,0,255,255,0,24,255,246,1,216,2,243,2,38,0,66,0,0,1,6,0,205,95,0,0,37,184,0,47,47,65,3,0,0,0,47,0,1,93,65,3,0,160,0,47,0,1,93,65,3,0,64,0,47,0,1,93,184,0,59,208,48,49,0,0,0,0,3,0,22,255,242,3,0,1,244,0,45,0,50,0,65,3,170,186,0,43,0,20,0,3,43,65,3,0,255,0,20,0,1,93,65,3,0,15,0,20,0,1,113,65,5,0,63,0,20,0,79,0,20,0,2,93,65,3,0,79,0,20,0,1,113,65,5,0,191,0,20,0,207,0,20,0,2,93,65,7,0,111,0,20,0,127,0,20,0,143,0,20,0,3,93,65,3,0,160,0,43,0,1,93,65,3,0,48,0,43,0,1,113,65,3,0,224,0,43,0,1,93,65,5,0,64,0,43,0,80,0,43,0,2,93,65,3,0,0,0,43,0,1,93,186,0,63,0,20,0,43,17,18,57,184,0,63,47,185,0,1,0,4,244,186,0,10,0,63,0,43,17,18,57,184,0,10,47,186,0,14,0,1,0,63,17,18,57,184,0,63,16,184,0,22,208,186,0,28,0,20,0,1,17,18,57,184,0,28,47,186,0,35,0,63,0,1,17,18,57,184,0,1,16,184,0,48,208,184,0,43,16,185,0,49,0,4,244,184,0,20,16,185,0,56,0,4,244,0,184,0,0,69,88,184,0,30,47,27,185,0,30,0,12,62,89,184,0,0,69,88,184,0,40,47,27,185,0,40,0,12,62,89,184,0,0,69,88,184,0,12,47,27,185,0,12,0,6,62,89,184,0,0,69,88,184,0,17,47,27,185,0,17,0,6,62,89,186,0,1,0,40,0,12,17,18,57,184,0,1,47,65,5,0,144,0,1,0,160,0,1,0,2,93,65,5,0,16,0,1,0,32,0,1,0,2,93,184,0,12,16,185,0,4,0,1,244,184,0,12,16,184,0,9,220,186,0,14,0,12,0,40,17,18,57,186,0,22,0,30,0,17,17,18,57,184,0,22,47,65,3,0,0,0,22,0,1,93,184,0,30,16,185,0,25,0,2,244,184,0,30,16,184,0,27,220,186,0,35,0,40,0,12,17,18,57,65,3,0,135,0,35,0,1,93,184,0,40,16,185,0,46,0,2,244,184,0,1,16,184,0,48,220,65,15,0,159,0,48,0,175,0,48,0,191,0,48,0,207,0,48,0,223,0,48,0,239,0,48,0,255,0,48,0,7,93,184,0,22,16,184,0,51,220,65,15,0,144,0,51,0,160,0,51,0,176,0,51,0,192,0,51,0,208,0,51,0,224,0,51,0,240,0,51,0,7,93,184,0,17,16,185,0,58,0,1,244,48,49,1,65,5,0,52,0,3,0,68,0,3,0,2,93,65,5,0,89,0,13,0,105,0,13,0,2,93,65,5,0,85,0,15,0,101,0,15,0,2,93,65,3,0,72,0,18,0,1,93,65,3,0,26,0,19,0,1,93,65,3,0,43,0,19,0,1,93,65,3,0,120,0,21,0,1,93,65,3,0,137,0,21,0,1,93,65,3,0,120,0,23,0,1,93,65,9,0,87,0,28,0,103,0,28,0,119,0,28,0,135,0,28,0,4,93,65,3,0,134,0,33,0,1,93,65,3,0,135,0,41,0,1,93,65,3,0,133,0,42,0,1,93,65,3,0,101,0,54,0,1,93,65,3,0,86,0,54,0,1,93,0,65,3,0,72,0,3,0,1,93,65,9,0,91,0,10,0,107,0,10,0,123,0,10,0,139,0,10,0,4,93,65,9,0,91,0,11,0,107,0,11,0,123,0,11,0,139,0,11,0,4,93,65,3,0,89,0,13,0,1,93,65,3,0,106,0,13,0,1,93,65,3,0,25,0,18,0,1,93,65,3,0,105,0,18,0,1,93,65,7,0,58,0,18,0,74,0,18,0,90,0,18,0,3,93,65,3,0,134,0,21,0,1,93,65,3,0,119,0,21,0,1,93,65,3,0,88,0,23,0,1,93,65,3,0,121,0,23,0,1,93,65,3,0,106,0,23,0,1,93,65,9,0,84,0,28,0,100,0,28,0,116,0,28,0,132,0,28,0,4,93,65,9,0,86,0,29,0,102,0,29,0,118,0,29,0,134,0,29,0,4,93,65,3,0,134,0,33,0,1,93,65,3,0,101,0,35,0,1,93,65,3,0,101,0,37,0,1,93,65,3,0,133,0,41,0,1,93,65,3,0,135,0,42,0,1,93,65,3,0,104,0,54,0,1,93,37,33,20,22,51,50,62,2,55,23,6,35,34,39,14,1,35,34,38,53,52,37,46,1,35,34,7,39,54,51,50,30,2,23,62,3,51,50,22,21,20,6,39,34,7,51,52,5,34,14,2,21,20,51,50,62,2,53,52,38,2,252,254,176,90,75,18,26,29,35,26,17,87,76,148,53,26,110,72,75,75,1,45,9,53,56,53,69,8,84,72,20,50,47,36,6,10,37,49,59,32,88,103,2,193,107,30,246,254,161,36,76,64,41,78,28,51,39,23,1,245,90,93,3,9,14,11,69,40,113,57,60,69,63,174,15,61,52,29,70,39,11,27,46,36,31,45,30,14,104,96,11,28,159,113,113,175,12,29,45,33,64,17,34,51,34,14,24,255,255,0,33,255,64,1,171,1,244,2,38,0,68,0,0,1,6,0,119,48,0,0,19,65,7,0,32,0,28,0,48,0,28,0,64,0,28,0,3,93,48,49,0,255,255,0,31,255,246,1,226,2,220,2,38,0,70,0,0,1,6,0,65,103,0,0,24,65,5,0,239,0,32,0,255,0,32,0,2,93,65,3,0,80,0,32,0,1,113,48,49,255,255,0,31,255,246,1,226,2,220,2,38,0,70,0,0,1,6,0,115,104,0,0,24,65,3,0,79,0,33,0,1,93,65,5,0,223,0,33,0,239,0,33,0,2,93,48,49,255,255,0,31,255,246,1,226,2,233,2,38,0,70,0,0,1,6,0,203,32,0,0,33,65,3,0,15,0,34,0,1,93,65,5,0,63,0,34,0,79,0,34,0,2,93,65,3,0,144,0,34,0,1,93,48,49,0,0,0,255,255,0,31,255,246,1,226,2,188,2,38,0,70,0,0,1,6,0,104,44,0,0,19,184,0,36,47,65,3,0,47,0,36,0,1,113,184,0,32,208,48,49,0,255,255,0,13,0,0,0,200,2,220,2,38,0,193,0,0,1,6,0,65,211,0,0,56,65,3,0,0,0,5,0,1,93,65,3,0,255,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,223,0,5,0,1,93,65,3,0,80,0,5,0,1,113,65,3,0,32,0,5,0,1,93,48,49,255,255,0,14,0,0,0,201,2,220,2,38,0,193,0,0,1,6,0,115,212,0,0,55,65,3,0,223,0,6,0,1,93,65,5,0,63,0,6,0,79,0,6,0,2,93,65,3,0,255,0,6,0,1,93,65,5,0,143,0,6,0,159,0,6,0,2,93,65,3,0,32,0,6,0,1,93,48,49,0,255,255,255,217,0,0,0,255,2,233,2,38,0,193,0,0,1,6,0,203,141,0,0,29,65,3,0,223,0,7,0,1,93,65,3,0,32,0,7,0,1,93,65,3,0,143,0,8,0,1,93,48,49,0,0,0,255,255,255,239,0,0,0,231,2,188,2,38,0,193,0,0,1,6,0,104,152,0,0,55,184,0,9,47,65,3,0,15,0,9,0,1,113,65,3,0,143,0,9,0,1,93,65,3,0,63,0,9,0,1,113,65,3,0,32,0,9,0,1,93,65,3,0,224,0,9,0,1,93,184,0,5,208,48,49,0,0,2,0,28,255,244,1,228,2,198,0,41,0,57,2,47,186,0,37,0,5,0,3,43,65,3,0,207,0,5,0,1,93,65,3,0,79,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,111,0,5,0,1,93,65,3,0,112,0,37,0,1,93,65,3,0,16,0,37,0,1,93,65,3,0,16,0,37,0,1,113,65,3,0,80,0,37,0,1,93,184,0,37,16,185,0,55,0,4,244,184,0,12,208,186,0,24,0,5,0,37,17,18,57,184,0,24,47,186,0,22,0,24,0,12,17,18,57,186,0,32,0,37,0,24,17,18,57,65,3,0,54,0,32,0,1,93,186,0,17,0,22,0,32,17,18,57,184,0,22,16,184,0,20,208,184,0,20,47,186,0,27,0,22,0,32,17,18,57,65,3,0,55,0,27,0,1,93,65,3,0,86,0,27,0,1,93,65,3,0,69,0,27,0,1,93,184,0,32,16,184,0,30,208,184,0,30,47,184,0,5,16,185,0,47,0,4,244,0,184,0,0,69,88,184,0,25,47,27,185,0,25,0,14,62,89,184,0,0,69,88,184,0,29,47,27,185,0,29,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,65,3,0,200,0,5,0,1,93,184,0,10,220,186,0,17,0,10,0,25,17,18,57,184,0,17,16,184,0,19,208,184,0,19,47,186,0,27,0,25,0,10,17,18,57,65,3,0,55,0,27,0,1,93,65,5,0,70,0,27,0,86,0,27,0,2,93,186,0,22,0,27,0,17,17,18,57,184,0,25,16,184,0,24,220,186,0,32,0,17,0,27,17,18,57,184,0,10,16,185,0,42,0,2,244,184,0,0,16,185,0,52,0,2,244,48,49,1,65,3,0,121,0,2,0,1,93,65,3,0,107,0,2,0,1,93,65,5,0,105,0,8,0,121,0,8,0,2,93,65,3,0,103,0,11,0,1,93,65,3,0,120,0,11,0,1,93,65,3,0,136,0,17,0,1,93,65,3,0,135,0,18,0,1,93,65,3,0,119,0,40,0,1,93,0,65,3,0,122,0,2,0,1,93,65,3,0,107,0,2,0,1,93,65,5,0,102,0,8,0,118,0,8,0,2,93,65,3,0,115,0,11,0,1,93,65,3,0,100,0,11,0,1,93,65,3,0,133,0,11,0,1,93,65,3,0,140,0,17,0,1,93,65,3,0,138,0,18,0,1,93,65,3,0,121,0,40,0,1,93,65,3,0,106,0,40,0,1,93,23,34,46,2,53,52,62,2,51,50,23,46,3,39,6,7,39,54,55,38,35,55,50,23,54,55,23,6,7,30,3,21,20,14,2,3,34,14,2,21,20,30,2,51,50,54,53,52,38,249,48,81,59,33,28,53,79,51,86,49,4,16,23,28,15,77,64,30,65,63,60,61,32,72,77,31,28,46,23,46,32,53,37,21,43,68,84,35,29,46,33,18,18,33,46,28,54,66,65,12,32,57,78,46,42,81,63,39,55,24,55,53,45,12,53,9,55,9,43,54,42,55,28,36,12,33,51,29,81,94,102,51,77,104,62,26,1,99,21,37,48,27,30,50,38,21,77,60,60,75,0,0,0,255,255,0,61,0,0,1,247,2,190,2,38,0,79,0,0,1,6,0,206,15,0,0,11,65,3,0,255,0,25,0,1,93,48,49,0,255,255,0,32,255,246,2,6,2,220,2,38,0,80,0,0,1,6,0,65,123,0,0,24,65,3,0,47,0,33,0,1,113,65,5,0,64,0,33,0,80,0,33,0,2,93,48,49,255,255,0,32,255,246,2,6,2,220,2,38,0,80,0,0,1,6,0,115,123,0,0,51,65,3,0,255,0,34,0,1,93,65,3,0,15,0,34,0,1,113,65,3,0,63,0,34,0,1,93,65,3,0,191,0,34,0,1,93,65,5,0,143,0,34,0,159,0,34,0,2,93,48,49,0,255,255,0,32,255,246,2,6,2,233,2,38,0,80,0,0,1,6,0,203,52,0,0,29,65,3,0,15,0,35,0,1,93,65,3,0,32,0,35,0,1,93,65,3,0,160,0,35,0,1,93,48,49,0,0,0,255,255,0,32,255,246,2,6,2,190,2,38,0,80,0,0,1,6,0,206,10,0,0,24,65,5,0,15,0,40,0,31,0,40,0,2,93,65,3,0,47,0,40,0,1,113,48,49,255,255,0,32,255,246,2,6,2,188,2,38,0,80,0,0,1,6,0,104,64,0,0,28,184,0,37,47,65,3,0,143,0,37,0,1,93,65,3,0,32,0,37,0,1,93,184,0,33,208,48,49,0,3,0,66,0,20,2,14,2,22,0,3,0,7,0,11,0,76,184,0,10,47,184,0,11,220,184,0,0,208,184,0,10,16,184,0,1,208,184,0,11,16,184,0,4,220,184,0,10,16,184,0,5,220,0,184,0,5,47,184,0,6,220,184,0,2,220,184,0,1,220,184,0,5,16,184,0,9,220,65,3,0,191,0,9,0,1,93,184,0,10,220,48,49,1,35,53,51,19,33,53,33,3,35,53,51,1,80,89,89,190,254,52,1,204,190,89,89,1,184,94,254,223,74,254,213,94,0,0,3,0,33,255,216,2,27,2,17,0,23,0,36,0,46,2,114,186,0,19,0,7,0,3,43,65,3,0,143,0,7,0,1,93,65,3,0,31,0,7,0,1,93,65,3,0,175,0,7,0,1,93,65,3,0,111,0,7,0,1,93,65,5,0,63,0,7,0,79,0,7,0,2,93,65,3,0,80,0,19,0,1,93,65,3,0,144,0,19,0,1,93,65,3,0,224,0,19,0,1,93,65,3,0,32,0,19,0,1,113,65,3,0,0,0,19,0,1,113,65,3,0,192,0,19,0,1,93,65,3,0,112,0,19,0,1,93,65,3,0,32,0,19,0,1,93,65,3,0,0,0,19,0,1,93,186,0,2,0,7,0,19,17,18,57,186,0,5,0,7,0,19,17,18,57,186,0,14,0,19,0,7,17,18,57,186,0,17,0,19,0,7,17,18,57,184,0,19,16,185,0,32,0,4,244,184,0,7,16,185,0,42,0,4,244,186,0,24,0,32,0,42,17,18,57,186,0,25,0,42,0,32,17,18,57,65,3,0,102,0,25,0,1,93,65,3,0,134,0,25,0,1,93,186,0,44,0,42,0,32,17,18,57,186,0,45,0,32,0,42,17,18,57,65,3,0,105,0,45,0,1,93,65,3,0,137,0,45,0,1,93,65,3,0,128,0,48,0,1,93,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,2,0,0,0,12,17,18,57,184,0,3,208,184,0,3,47,186,0,5,0,0,0,12,17,18,57,186,0,14,0,12,0,0,17,18,57,184,0,12,16,184,0,15,208,184,0,15,47,65,3,0,144,0,15,0,1,93,186,0,17,0,12,0,0,17,18,57,184,0,12,16,185,0,37,0,1,244,184,0,0,16,185,0,27,0,1,244,186,0,24,0,37,0,27,17,18,57,65,3,0,137,0,24,0,1,93,65,3,0,105,0,24,0,1,93,65,3,0,38,0,24,0,1,93,186,0,25,0,27,0,37,17,18,57,186,0,44,0,27,0,37,17,18,57,65,3,0,102,0,44,0,1,93,65,3,0,134,0,44,0,1,93,186,0,45,0,37,0,27,17,18,57,48,49,1,65,3,0,92,0,6,0,1,93,65,3,0,90,0,10,0,1,93,65,3,0,86,0,17,0,1,93,65,3,0,85,0,22,0,1,93,65,3,0,73,0,24,0,1,93,65,3,0,70,0,25,0,1,93,65,3,0,87,0,25,0,1,93,65,3,0,74,0,30,0,1,93,65,3,0,69,0,39,0,1,93,65,5,0,73,0,45,0,89,0,45,0,2,93,0,65,3,0,85,0,10,0,1,93,65,3,0,86,0,17,0,1,93,65,3,0,91,0,22,0,1,93,65,3,0,87,0,25,0,1,93,5,34,39,7,35,55,38,53,52,62,2,51,50,23,55,51,7,22,21,20,14,2,19,3,22,51,50,62,2,53,52,46,2,39,34,14,2,21,20,23,19,38,1,30,33,53,19,71,32,109,35,66,93,58,36,48,19,74,34,111,35,66,94,51,163,42,13,37,58,39,21,6,12,17,123,36,57,40,21,46,161,38,13,11,38,66,81,137,54,94,69,40,12,40,66,84,136,54,94,69,39,1,150,254,182,6,29,50,68,39,21,46,41,33,47,28,50,69,41,68,80,1,73,7,255,255,0,56,255,246,1,207,2,220,2,38,0,86,0,0,1,6,0,65,127,0,0,37,65,3,0,255,0,17,0,1,93,65,7,0,48,0,17,0,64,0,17,0,80,0,17,0,3,93,65,3,0,176,0,17,0,1,93,48,49,0,0,0,255,255,0,56,255,246,1,207,2,220,2,38,0,86,0,0,1,6,0,115,127,0,0,59,65,3,0,255,0,17,0,1,93,65,3,0,15,0,17,0,1,113,65,5,0,15,0,17,0,31,0,17,0,2,93,65,3,0,223,0,17,0,1,93,65,7,0,143,0,17,0,159,0,17,0,175,0,17,0,3,93,48,49,0,255,255,0,56,255,246,1,207,2,233,2,38,0,86,0,0,1,6,0,203,56,0,0,56,65,3,0,32,0,19,0,1,113,65,3,0,223,0,19,0,1,93,65,3,0,143,0,19,0,1,93,65,3,0,32,0,19,0,1,93,65,3,0,144,0,19,0,1,93,65,3,0,80,0,19,0,1,93,48,49,255,255,0,56,255,246,1,207,2,188,2,38,0,86,0,0,1,6,0,104,68,0,0,46,184,0,21,47,65,3,0,32,0,21,0,1,93,65,3,0,143,0,21,0,1,93,65,3,0,0,0,21,0,1,113,65,3,0,224,0,21,0,1,93,184,0,17,208,48,49,0,0,255,255,0,7,255,14,1,242,2,220,2,38,0,90,0,0,1,6,0,115,101,0,0,11,65,3,0,79,0,9,0,1,93,48,49,0,0,2,0,60,255,15,2,36,2,238,0,18,0,30,1,158,186,0,14,0,4,0,3,43,65,3,0,255,0,4,0,1,93,65,3,0,223,0,4,0,1,93,65,3,0,31,0,4,0,1,113,65,3,0,0,0,4,0,1,93,65,3,0,32,0,4,0,1,93,184,0,4,16,185,0,3,0,4,244,184,0,6,208,65,17,0,0,0,14,0,16,0,14,0,32,0,14,0,48,0,14,0,64,0,14,0,80,0,14,0,96,0,14,0,112,0,14,0,8,93,65,3,0,0,0,14,0,1,113,65,3,0,144,0,14,0,1,93,65,5,0,32,0,14,0,48,0,14,0,2,113,65,3,0,80,0,14,0,1,113,184,0,3,16,184,0,19,208,184,0,14,16,185,0,25,0,4,244,65,3,0,64,0,32,0,1,93,65,3,0,96,0,32,0,1,93,65,3,0,128,0,32,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,18,62,89,184,0,0,69,88,184,0,9,47,27,185,0,9,0,12,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,8,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,2,0,0,0,9,17,18,57,186,0,7,0,9,0,0,17,18,57,185,0,22,0,1,244,184,0,9,16,185,0,28,0,2,244,48,49,1,65,3,0,105,0,1,0,1,93,65,3,0,102,0,11,0,1,93,65,3,0,87,0,11,0,1,93,65,3,0,102,0,17,0,1,93,65,3,0,87,0,17,0,1,93,0,65,3,0,105,0,1,0,1,93,65,3,0,91,0,1,0,1,93,65,5,0,85,0,8,0,101,0,8,0,2,93,65,3,0,86,0,11,0,1,93,65,3,0,103,0,11,0,1,93,65,5,0,89,0,17,0,105,0,17,0,2,93,65,3,0,149,0,29,0,1,93,5,34,39,17,35,17,51,17,54,51,50,30,2,21,20,14,2,39,20,22,51,50,54,53,52,38,35,34,6,1,46,103,49,90,90,62,96,55,88,63,34,33,63,92,217,74,77,78,85,85,78,78,73,10,66,254,215,3,223,254,200,62,40,69,93,53,53,93,69,40,255,82,101,101,82,81,94,94,255,255,0,7,255,14,1,242,2,188,2,38,0,90,0,0,1,6,0,104,40,0,0,28,184,0,13,47,65,3,0,15,0,13,0,1,93,65,3,0,63,0,13,0,1,93,184,0,9,208,48,49,255,255,0,39,255,242,2,71,3,181,2,38,0,36,0,0,1,7,0,204,0,178,0,209,0,34,65,5,0,0,0,41,0,16,0,41,0,2,93,65,3,0,176,0,41,0,1,93,0,65,3,0,47,0,40,0,1,93,48,49,255,255,0,33,255,246,1,171,2,228,2,38,0,68,0,0,1,6,0,204,45,0,0,20,65,3,0,31,0,28,0,1,93,65,3,0,32,0,28,0,1,93,48,49,0,1,0,61,0,0,0,151,1,234,0,3,0,119,187,0,3,0,4,0,2,0,4,43,65,3,0,63,0,2,0,1,113,65,3,0,143,0,2,0,1,93,65,3,0,223,0,2,0,1,93,65,3,0,32,0,2,0,1,93,65,3,0,63,0,3,0,1,113,65,3,0,143,0,3,0,1,93,65,3,0,223,0,3,0,1,93,65,3,0,32,0,3,0,1,93,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,12,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,48,49,51,35,17,51,151,90,90,1,234,0,0,0,2,0,40,255,242,4,10,2,202,0,28,0,48,2,150,186,0,28,0,1,0,3,43,65,3,0,176,0,1,0,1,93,184,0,1,16,184,0,10,208,184,0,10,47,65,5,0,63,0,10,0,79,0,10,0,2,93,65,3,0,159,0,10,0,1,93,65,3,0,47,0,10,0,1,113,65,3,0,111,0,10,0,1,93,65,3,0,15,0,10,0,1,93,65,3,0,191,0,10,0,1,93,184,0,1,16,184,0,18,208,65,3,0,176,0,28,0,1,93,184,0,28,16,184,0,21,208,184,0,21,47,184,0,1,16,185,0,27,0,4,244,184,0,23,208,184,0,28,16,184,0,25,208,184,0,25,47,184,0,10,16,185,0,34,0,4,244,184,0,1,16,184,0,44,208,65,3,0,137,0,44,0,1,93,65,7,0,9,0,44,0,25,0,44,0,41,0,44,0,3,113,65,3,0,169,0,44,0,1,93,65,3,0,72,0,44,0,1,93,0,184,0,0,69,88,184,0,15,47,27,185,0,15,0,14,62,89,184,0,0,69,88,184,0,19,47,27,185,0,19,0,14,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,2,0,5,0,15,17,18,57,65,3,0,92,0,2,0,1,93,65,7,0,12,0,2,0,28,0,2,0,44,0,2,0,3,113,65,3,0,107,0,2,0,1,93,65,5,0,122,0,2,0,138,0,2,0,2,93,65,3,0,66,0,10,0,1,93,186,0,18,0,15,0,5,17,18,57,65,3,0,100,0,18,0,1,93,65,3,0,118,0,18,0,1,93,65,3,0,133,0,18,0,1,93,65,3,0,83,0,18,0,1,93,65,7,0,3,0,18,0,19,0,18,0,35,0,18,0,3,113,184,0,19,16,185,0,22,0,2,244,186,0,23,0,19,0,1,17,18,57,184,0,23,47,185,0,26,0,2,244,184,0,1,16,185,0,27,0,2,244,184,0,15,16,185,0,29,0,2,244,184,0,5,16,185,0,39,0,2,244,48,49,1,65,3,0,120,0,3,0,1,93,65,7,0,89,0,7,0,105,0,7,0,121,0,7,0,3,93,65,3,0,90,0,8,0,1,93,65,3,0,89,0,12,0,1,93,65,3,0,121,0,12,0,1,93,65,3,0,104,0,13,0,1,93,65,3,0,89,0,13,0,1,93,65,3,0,120,0,17,0,1,93,0,65,5,0,89,0,3,0,105,0,3,0,2,93,65,3,0,122,0,3,0,1,93,65,5,0,104,0,7,0,120,0,7,0,2,93,65,3,0,89,0,7,0,1,93,65,3,0,88,0,8,0,1,93,65,3,0,86,0,12,0,1,93,65,3,0,118,0,12,0,1,93,65,5,0,86,0,13,0,102,0,13,0,2,93,65,3,0,84,0,17,0,1,93,65,5,0,102,0,17,0,118,0,17,0,2,93,65,3,0,114,0,18,0,1,93,41,1,53,14,1,35,34,46,2,53,52,62,2,51,50,22,23,53,33,21,33,21,51,21,35,21,33,1,34,14,2,21,20,30,2,51,50,62,2,53,52,46,2,4,10,254,102,69,115,62,75,124,90,49,50,90,124,74,62,115,69,1,145,254,202,238,238,1,63,253,112,58,89,60,31,30,60,89,59,58,89,60,30,31,60,89,83,53,44,52,96,134,82,82,135,95,52,44,53,82,85,205,86,237,2,30,41,74,102,61,60,102,74,42,42,74,102,60,61,102,74,41,0,3,0,32,255,246,3,104,1,244,0,43,0,49,0,61,3,73,186,0,42,0,22,0,3,43,65,9,0,63,0,22,0,79,0,22,0,95,0,22,0,111,0,22,0,4,93,65,3,0,207,0,22,0,1,93,65,5,0,96,0,42,0,112,0,42,0,2,93,65,3,0,240,0,42,0,1,93,65,7,0,16,0,42,0,32,0,42,0,48,0,42,0,3,113,65,7,0,144,0,42,0,160,0,42,0,176,0,42,0,3,93,65,3,0,64,0,42,0,1,93,65,5,0,0,0,42,0,16,0,42,0,2,93,186,0,59,0,22,0,42,17,18,57,184,0,59,47,185,0,1,0,4,244,184,0,42,16,184,0,9,208,184,0,9,47,186,0,14,0,1,0,59,17,18,57,186,0,32,0,59,0,1,17,18,57,184,0,1,16,184,0,46,208,184,0,42,16,185,0,47,0,4,244,184,0,22,16,185,0,53,0,4,244,65,3,0,64,0,63,0,1,93,65,3,0,96,0,63,0,1,93,65,3,0,240,0,63,0,1,93,0,184,0,0,69,88,184,0,27,47,27,185,0,27,0,12,62,89,184,0,0,69,88,184,0,37,47,27,185,0,37,0,12,62,89,184,0,0,69,88,184,0,17,47,27,185,0,17,0,6,62,89,184,0,0,69,88,184,0,11,47,27,185,0,11,0,6,62,89,186,0,1,0,37,0,11,17,18,57,184,0,1,47,65,5,0,16,0,1,0,32,0,1,0,2,93,65,5,0,144,0,1,0,160,0,1,0,2,93,184,0,11,16,185,0,6,0,1,244,184,0,11,16,184,0,8,220,186,0,14,0,11,0,37,17,18,57,186,0,32,0,37,0,11,17,18,57,184,0,37,16,185,0,44,0,2,244,184,0,1,16,184,0,46,220,65,15,0,159,0,46,0,175,0,46,0,191,0,46,0,207,0,46,0,223,0,46,0,239,0,46,0,255,0,46,0,7,93,184,0,27,16,185,0,50,0,2,244,184,0,17,16,185,0,56,0,2,244,48,49,1,65,3,0,54,0,3,0,1,93,65,3,0,71,0,3,0,1,93,65,3,0,89,0,13,0,1,93,65,3,0,106,0,13,0,1,93,65,3,0,123,0,13,0,1,93,65,3,0,84,0,15,0,1,93,65,3,0,102,0,15,0,1,93,65,3,0,105,0,19,0,1,93,65,3,0,90,0,19,0,1,93,65,3,0,105,0,25,0,1,93,65,3,0,90,0,25,0,1,93,65,3,0,85,0,30,0,1,93,65,3,0,102,0,30,0,1,93,65,3,0,104,0,34,0,1,93,65,3,0,121,0,34,0,1,93,65,3,0,118,0,39,0,1,93,65,3,0,135,0,39,0,1,93,65,3,0,118,0,40,0,1,93,65,3,0,135,0,40,0,1,93,65,3,0,105,0,45,0,1,93,0,65,5,0,55,0,3,0,71,0,3,0,2,93,65,9,0,91,0,9,0,107,0,9,0,123,0,9,0,139,0,9,0,4,93,65,5,0,104,0,13,0,120,0,13,0,2,93,65,3,0,89,0,13,0,1,93,65,5,0,90,0,14,0,106,0,14,0,2,93,65,3,0,104,0,15,0,1,93,65,3,0,89,0,15,0,1,93,65,5,0,89,0,19,0,105,0,19,0,2,93,65,3,0,85,0,25,0,1,93,65,3,0,102,0,25,0,1,93,65,3,0,85,0,30,0,1,93,65,3,0,102,0,30,0,1,93,65,3,0,101,0,32,0,1,93,65,5,0,118,0,32,0,134,0,32,0,2,93,65,3,0,100,0,34,0,1,93,65,3,0,118,0,34,0,1,93,65,5,0,118,0,39,0,134,0,39,0,2,93,65,3,0,118,0,40,0,1,93,65,3,0,135,0,40,0,1,93,65,3,0,102,0,45,0,1,93,37,33,20,30,2,51,50,55,23,6,35,34,38,39,14,1,35,34,46,2,53,52,62,2,51,50,30,2,23,62,3,51,50,30,2,21,20,39,34,7,51,46,1,33,34,6,21,20,22,51,50,54,53,52,38,3,100,254,169,32,48,55,23,84,71,10,72,81,93,102,23,22,110,67,57,91,64,34,35,65,93,57,28,59,53,40,11,13,42,49,55,27,48,79,55,31,214,107,24,253,4,64,254,82,78,80,79,78,75,77,79,245,57,71,41,14,37,77,32,53,54,51,56,40,70,95,55,54,92,66,38,13,26,38,25,24,38,26,14,28,53,75,48,31,155,113,54,59,91,84,85,90,99,79,78,94,0,255,255,0,40,255,242,2,41,3,181,2,38,0,52,0,0,1,7,0,204,0,69,0,209,0,38,65,3,0,79,0,60,0,1,93,65,7,0,0,0,60,0,16,0,60,0,32,0,60,0,3,93,0,65,3,0,47,0,59,0,1,93,48,49,255,255,0,32,255,246,1,131,2,228,2,38,0,84,0,0,1,6,0,204,232,0,0,29,65,3,0,79,0,42,0,1,93,65,3,0,63,0,43,0,1,93,65,3,0,0,0,43,0,1,93,48,49,0,0,0,255,255,255,253,0,0,2,57,3,141,2,38,0,58,0,0,1,7,0,104,0,85,0,209,0,68,184,0,14,47,65,5,0,16,0,14,0,32,0,14,0,2,93,65,3,0,80,0,14,0,1,113,65,3,0,144,0,14,0,1,93,184,0,10,208,0,184,0,13,47,65,3,0,47,0,13,0,1,93,65,3,0,175,0,13,0,1,93,184,0,10,208,48,49,0,0,255,255,0,9,0,0,2,30,3,181,2,38,0,59,0,0,1,7,0,204,0,60,0,209,0,34,65,5,0,0,0,10,0,16,0,10,0,2,93,65,3,0,32,0,10,0,1,113,0,65,3,0,47,0,9,0,1,93,48,49,255,255,0,22,0,0,1,190,2,228,2,38,0,91,0,0,1,6,0,204,14,0,0,33,65,5,0,111,0,10,0,127,0,10,0,2,93,65,3,0,223,0,10,0,1,93,65,3,0,0,0,10,0,1,93,48,49,0,0,0,0,1,255,222,255,15,1,115,2,202,0,32,1,43,187,0,11,0,5,0,22,0,4,43,184,0,22,16,184,0,25,208,184,0,0,208,184,0,0,47,184,0,11,16,184,0,8,208,184,0,9,208,184,0,9,47,184,0,11,16,184,0,12,208,184,0,19,208,184,0,19,47,184,0,22,16,184,0,21,208,184,0,25,16,184,0,24,208,184,0,24,47,0,184,0,0,69,88,184,0,31,47,27,185,0,31,0,14,62,89,184,0,0,69,88,184,0,8,47,27,185,0,8,0,12,62,89,184,0,0,69,88,184,0,17,47,27,185,0,17,0,8,62,89,184,0,31,16,185,0,3,0,3,244,184,0,8,16,185,0,11,0,3,244,184,0,17,16,185,0,19,0,3,244,184,0,11,16,184,0,22,208,184,0,8,16,184,0,25,208,48,49,1,65,3,0,133,0,6,0,1,93,65,7,0,38,0,6,0,54,0,6,0,70,0,6,0,3,93,65,3,0,102,0,6,0,1,93,65,5,0,119,0,15,0,135,0,15,0,2,93,65,3,0,89,0,28,0,1,93,65,3,0,122,0,28,0,1,93,0,65,3,0,135,0,6,0,1,93,65,5,0,57,0,6,0,73,0,6,0,2,93,65,5,0,121,0,15,0,137,0,15,0,2,93,65,3,0,116,0,28,0,1,93,65,3,0,87,0,28,0,1,93,1,7,38,35,34,14,2,7,51,7,35,3,14,3,43,1,39,54,55,19,35,55,51,55,62,3,51,50,1,115,7,13,19,30,43,30,20,8,148,6,153,86,6,27,32,34,13,13,13,57,14,80,94,7,96,9,6,33,49,61,35,17,2,191,55,8,16,39,64,47,56,253,242,40,56,36,17,63,12,89,1,255,56,61,39,60,42,22,0,0,0,0,1,255,244,255,14,0,151,1,234,0,14,0,163,187,0,9,0,4,0,8,0,4,43,65,3,0,63,0,8,0,1,113,65,3,0,143,0,8,0,1,93,65,3,0,223,0,8,0,1,93,65,3,0,32,0,8,0,1,93,184,0,8,16,184,0,2,208,184,0,2,47,65,3,0,143,0,9,0,1,93,65,3,0,223,0,9,0,1,93,65,3,0,63,0,9,0,1,113,65,3,0,32,0,9,0,1,93,0,184,0,0,69,88,184,0,9,47,27,185,0,9,0,12,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,8,62,89,185,0,2,0,1,244,48,49,1,65,11,0,5,0,12,0,21,0,12,0,37,0,12,0,53,0,12,0,69,0,12,0,5,93,23,7,39,62,3,53,17,51,17,20,14,2,28,30,10,22,28,16,7,90,20,33,45,237,5,69,2,10,21,37,30,2,51,253,171,32,45,31,18,0,1,0,76,2,91,1,114,2,233,0,5,0,130,25,184,0,4,47,24,65,3,0,0,0,4,0,1,93,184,0,1,208,184,0,4,16,184,0,3,208,184,0,3,47,184,0,4,16,184,0,5,208,184,0,5,47,0,184,0,2,47,65,3,0,64,0,2,0,1,93,65,3,0,32,0,2,0,1,93,184,0,0,208,184,0,2,16,184,0,4,220,65,5,0,15,0,4,0,31,0,4,0,2,93,65,9,0,95,0,4,0,111,0,4,0,127,0,4,0,143,0,4,0,4,93,184,0,1,220,184,0,2,16,184,0,3,220,184,0,5,208,48,49,1,39,7,53,55,23,1,114,147,147,147,147,2,91,82,82,36,106,106,0,0,1,0,76,2,88,1,114,2,228,0,5,0,130,25,184,0,1,47,24,184,0,0,208,184,0,0,47,184,0,1,16,184,0,2,208,184,0,2,47,184,0,1,16,184,0,4,208,0,184,0,1,47,65,3,0,64,0,1,0,1,93,65,3,0,32,0,1,0,1,93,184,0,3,220,65,9,0,95,0,3,0,111,0,3,0,127,0,3,0,143,0,3,0,4,93,65,5,0,15,0,3,0,31,0,3,0,2,93,184,0,2,220,184,0,0,208,184,0,1,16,184,0,4,220,65,3,0,240,0,4,0,1,93,184,0,3,16,184,0,5,208,48,49,1,7,39,53,23,55,1,114,147,147,147,147,2,187,99,99,41,76,76,0,0,2,0,42,2,64,0,249,2,243,0,14,0,26,1,101,184,0,3,47,184,0,11,220,65,3,0,32,0,11,0,1,113,65,3,0,208,0,11,0,1,93,184,0,3,16,184,0,15,220,184,0,11,16,184,0,21,220,0,184,0,14,47,65,3,0,95,0,14,0,1,113,65,3,0,239,0,14,0,1,93,65,3,0,207,0,14,0,1,93,65,3,0,128,0,14,0,1,93,65,3,0,96,0,14,0,1,93,184,0,6,220,65,3,0,15,0,6,0,1,113,65,7,0,143,0,6,0,159,0,6,0,175,0,6,0,3,93,65,3,0,79,0,6,0,1,93,184,0,14,16,184,0,18,220,184,0,6,16,184,0,24,220,48,49,1,65,9,0,74,0,2,0,90,0,2,0,106,0,2,0,122,0,2,0,4,93,65,9,0,73,0,4,0,89,0,4,0,105,0,4,0,121,0,4,0,4,93,65,9,0,70,0,9,0,86,0,9,0,102,0,9,0,118,0,9,0,4,93,65,9,0,70,0,12,0,86,0,12,0,102,0,12,0,118,0,12,0,4,93,0,65,9,0,73,0,1,0,89,0,1,0,105,0,1,0,121,0,1,0,4,93,65,9,0,70,0,5,0,86,0,5,0,102,0,5,0,118,0,5,0,4,93,65,9,0,70,0,8,0,86,0,8,0,102,0,8,0,118,0,8,0,4,93,65,9,0,72,0,12,0,88,0,12,0,104,0,12,0,120,0,12,0,4,93,65,9,0,73,0,13,0,89,0,13,0,105,0,13,0,121,0,13,0,4,93,65,7,0,53,0,16,0,69,0,16,0,85,0,16,0,3,113,19,34,38,53,52,54,51,50,30,2,21,20,6,35,39,20,22,51,50,54,53,52,38,35,34,6,146,49,55,58,52,24,37,24,12,48,48,67,36,24,24,36,35,25,25,35,2,64,52,37,39,51,15,26,32,17,34,55,89,27,33,33,27,26,33,33,0,0,1,0,92,2,87,1,182,2,190,0,23,1,42,184,0,8,47,65,3,0,0,0,8,0,1,93,184,0,7,220,184,0,8,16,184,0,21,220,184,0,20,220,0,184,0,0,47,65,3,0,64,0,0,0,1,93,65,3,0,32,0,0,0,1,93,184,0,13,220,65,9,0,47,0,13,0,63,0,13,0,79,0,13,0,95,0,13,0,4,93,184,0,5,220,65,5,0,48,0,5,0,64,0,5,0,2,113,184,0,0,16,184,0,7,208,184,0,7,47,184,0,0,16,184,0,18,220,65,3,0,63,0,18,0,1,113,184,0,13,16,184,0,20,208,184,0,20,47,48,49,1,65,7,0,6,0,6,0,22,0,6,0,38,0,6,0,3,113,65,5,0,40,0,10,0,56,0,10,0,2,93,65,5,0,40,0,11,0,56,0,11,0,2,93,65,7,0,11,0,19,0,27,0,19,0,43,0,19,0,3,113,65,5,0,37,0,22,0,53,0,22,0,2,93,0,65,7,0,9,0,6,0,25,0,6,0,41,0,6,0,3,113,65,5,0,37,0,10,0,53,0,10,0,2,93,65,5,0,38,0,11,0,54,0,11,0,2,93,65,7,0,7,0,19,0,23,0,19,0,39,0,19,0,3,113,65,5,0,40,0,22,0,56,0,22,0,2,93,65,5,0,41,0,23,0,57,0,23,0,2,93,1,34,46,2,35,34,7,39,62,3,51,50,30,2,51,50,55,23,14,1,1,75,12,36,41,32,11,53,18,36,6,20,30,32,15,13,36,46,35,10,42,27,34,11,58,2,87,16,19,16,49,9,22,34,23,11,15,19,15,51,9,43,51,0,0,1,0,57,0,238,1,189,1,68,0,3,0,19,184,0,1,47,184,0,0,220,0,184,0,1,47,184,0,2,220,48,49,37,33,53,33,1,189,254,124,1,132,238,86,0,0,0,0,1,0,57,0,238,2,25,1,68,0,3,0,28,184,0,1,47,65,3,0,0,0,1,0,1,93,184,0,0,220,0,184,0,1,47,184,0,2,220,48,49,37,33,53,33,2,25,254,32,1,224,238,86,0,0,0,1,0,43,2,43,0,144,2,238,0,6,0,58,184,0,0,47,184,0,4,220,184,0,2,208,186,0,3,0,0,0,4,17,18,57,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,18,62,89,184,0,4,220,184,0,0,208,184,0,4,16,184,0,5,220,48,49,19,55,23,7,23,21,35,43,78,23,35,34,100,2,129,109,13,87,9,86,0,1,0,42,2,43,0,143,2,238,0,6,0,58,184,0,0,47,184,0,4,220,184,0,2,208,186,0,3,0,4,0,0,17,18,57,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,18,62,89,184,0,4,220,184,0,0,208,184,0,4,16,184,0,1,220,48,49,19,7,39,55,39,53,51,143,78,23,35,34,100,2,152,109,13,87,9,86,0,1,0,57,255,147,0,158,0,86,0,6,0,62,184,0,0,47,184,0,4,220,184,0,2,208,186,0,3,0,4,0,0,17,18,57,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,0,208,184,0,4,16,184,0,1,220,184,0,4,16,184,0,5,220,48,49,51,7,39,55,39,53,51,158,78,23,35,34,100,109,13,87,9,86,0,0,0,2,0,43,2,43,1,98,2,238,0,6,0,13,0,116,184,0,6,47,184,0,5,220,184,0,2,208,186,0,3,0,6,0,5,17,18,57,184,0,6,16,184,0,13,220,184,0,12,220,184,0,9,208,186,0,10,0,13,0,12,17,18,57,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,18,62,89,184,0,4,220,184,0,0,208,184,0,4,16,184,0,5,220,184,0,4,16,184,0,7,208,184,0,1,16,184,0,8,208,184,0,7,16,184,0,11,208,184,0,5,16,184,0,13,208,48,49,19,55,23,7,23,21,35,63,1,23,7,23,21,35,43,78,23,35,34,100,210,78,23,35,34,100,2,129,109,13,87,9,86,86,109,13,87,9,86,0,0,2,0,42,2,43,1,97,2,238,0,6,0,13,0,118,184,0,6,47,184,0,5,220,184,0,2,208,186,0,3,0,5,0,6,17,18,57,184,0,6,16,184,0,13,220,184,0,12,220,184,0,9,208,186,0,10,0,12,0,13,17,18,57,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,18,62,89,184,0,11,220,184,0,4,208,184,0,0,208,184,0,11,16,184,0,8,220,184,0,1,208,184,0,12,16,184,0,5,208,184,0,11,16,184,0,7,208,48,49,1,65,3,0,89,0,1,0,1,93,1,7,39,55,39,53,51,15,1,39,55,39,53,51,1,97,78,23,35,34,100,210,78,23,35,34,100,2,152,109,13,87,9,86,86,109,13,87,9,86,0,0,0,2,0,57,255,147,1,132,0,86,0,6,0,13,0,138,184,0,7,47,65,3,0,80,0,7,0,1,113,184,0,0,220,65,5,0,79,0,0,0,95,0,0,0,2,113,184,0,4,220,184,0,2,208,186,0,3,0,4,0,0,17,18,57,184,0,7,16,184,0,11,220,184,0,9,208,186,0,10,0,11,0,7,17,18,57,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,0,208,184,0,4,16,184,0,1,220,184,0,4,16,184,0,5,220,184,0,4,16,184,0,11,208,184,0,7,208,184,0,1,16,184,0,8,208,184,0,5,16,184,0,12,208,48,49,51,7,39,55,39,53,51,23,7,39,55,39,53,51,158,78,23,35,34,100,230,78,23,35,34,100,109,13,87,9,86,86,109,13,87,9,86,0,0,1,0,35,0,0,1,133,2,95,0,13,0,196,184,0,10,47,65,3,0,16,0,10,0,1,93,184,0,11,220,65,9,0,80,0,11,0,96,0,11,0,112,0,11,0,128,0,11,0,4,93,186,0,12,0,11,0,10,17,18,57,184,0,12,16,184,0,1,208,184,0,11,16,184,0,2,208,184,0,10,16,184,0,5,208,186,0,9,0,10,0,11,17,18,57,184,0,9,16,184,0,6,208,184,0,10,16,184,0,8,220,184,0,11,16,184,0,13,220,0,184,0,10,47,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,186,0,8,0,10,0,4,17,18,57,184,0,8,47,184,0,7,220,184,0,0,208,186,0,6,0,7,0,8,17,18,57,184,0,6,16,184,0,1,208,186,0,9,0,8,0,7,17,18,57,184,0,9,16,184,0,12,208,184,0,8,16,184,0,13,208,48,49,1,39,23,7,35,39,55,7,53,23,39,51,7,55,1,133,158,41,31,58,31,41,158,156,34,110,34,156,1,117,30,151,252,252,151,30,85,31,180,180,31,0,0,1,0,53,255,197,1,151,2,95,0,21,1,61,184,0,13,47,65,3,0,0,0,13,0,1,93,184,0,14,220,65,9,0,80,0,14,0,96,0,14,0,112,0,14,0,128,0,14,0,4,93,186,0,15,0,14,0,13,17,18,57,184,0,15,16,184,0,1,208,184,0,14,16,184,0,2,208,184,0,13,16,184,0,3,208,186,0,12,0,13,0,14,17,18,57,184,0,12,16,184,0,4,208,184,0,13,16,184,0,11,220,184,0,6,208,184,0,4,16,184,0,7,208,184,0,13,16,184,0,8,208,184,0,12,16,184,0,9,208,184,0,14,16,184,0,16,220,184,0,15,16,184,0,18,208,184,0,14,16,184,0,19,208,184,0,1,16,184,0,20,208,184,0,16,16,184,0,21,208,0,184,0,14,47,184,0,3,47,186,0,0,0,3,0,14,17,18,57,184,0,0,47,184,0,21,220,186,0,1,0,0,0,21,17,18,57,184,0,1,16,184,0,4,208,184,0,0,16,184,0,5,208,184,0,21,16,184,0,6,208,186,0,20,0,21,0,0,17,18,57,184,0,20,16,184,0,7,208,186,0,16,0,14,0,3,17,18,57,184,0,16,47,184,0,17,220,186,0,18,0,17,0,16,17,18,57,184,0,18,16,184,0,9,208,184,0,17,16,184,0,10,208,184,0,16,16,184,0,11,208,186,0,15,0,16,0,17,17,18,57,184,0,15,16,184,0,12,208,48,49,37,39,23,35,55,7,53,23,39,55,7,53,23,39,51,7,55,21,39,23,7,55,1,151,156,34,110,34,156,160,43,43,160,156,34,110,34,156,160,43,43,160,88,30,177,177,30,84,30,132,133,30,84,30,176,176,30,84,30,133,132,30,0,0,0,0,1,0,44,0,169,1,6,1,131,0,20,0,19,184,0,8,47,184,0,18,220,0,184,0,3,47,184,0,13,220,48,49,55,14,1,35,34,46,2,53,52,62,2,51,50,30,2,21,20,6,230,17,39,21,22,39,30,18,18,30,39,22,22,39,30,18,16,201,17,15,18,30,39,22,22,39,30,18,18,30,39,22,21,40,0,0,0,0,3,0,57,0,0,2,107,0,86,0,3,0,7,0,11,0,121,184,0,1,47,65,3,0,0,0,1,0,1,93,65,3,0,32,0,1,0,1,93,185,0,0,0,4,244,184,0,1,16,184,0,5,220,185,0,4,0,4,244,184,0,5,16,184,0,9,220,185,0,8,0,4,244,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,2,220,65,3,0,63,0,2,0,1,113,184,0,1,16,184,0,5,208,184,0,2,16,184,0,6,208,184,0,5,16,184,0,9,208,184,0,6,16,184,0,10,208,48,49,51,35,53,51,23,35,53,51,23,35,53,51,147,90,90,236,90,90,236,90,90,86,86,86,86,86,0,0,0,0,7,0,36,255,242,4,141,2,193,0,3,0,21,0,37,0,55,0,71,0,89,0,105,3,55,184,0,7,47,184,0,41,47,65,7,0,0,0,41,0,16,0,41,0,32,0,41,0,3,93,184,0,51,220,186,0,1,0,7,0,51,17,18,57,184,0,1,47,184,0,0,220,184,0,1,16,184,0,3,220,184,0,2,220,184,0,7,16,184,0,17,220,184,0,7,16,184,0,27,220,65,3,0,31,0,27,0,1,113,184,0,17,16,184,0,33,220,65,3,0,16,0,33,0,1,113,184,0,41,16,184,0,61,220,65,3,0,31,0,61,0,1,113,184,0,51,16,184,0,67,220,65,3,0,16,0,67,0,1,113,184,0,41,16,184,0,75,220,184,0,85,220,184,0,75,16,184,0,95,220,65,3,0,31,0,95,0,1,113,184,0,85,16,184,0,101,220,65,3,0,16,0,101,0,1,113,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,14,62,89,184,0,0,69,88,184,0,38,47,27,185,0,38,0,6,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,12,16,184,0,4,220,184,0,12,16,184,0,22,220,184,0,4,16,184,0,30,220,184,0,38,16,184,0,46,220,184,0,56,220,184,0,38,16,184,0,64,220,184,0,38,16,184,0,72,208,184,0,46,16,184,0,80,208,184,0,56,16,184,0,90,208,184,0,64,16,184,0,98,208,48,49,1,65,3,0,87,0,0,0,1,93,65,3,0,202,0,5,0,1,93,65,7,0,10,0,6,0,26,0,6,0,42,0,6,0,3,93,65,7,0,10,0,9,0,26,0,9,0,42,0,9,0,3,93,65,3,0,202,0,10,0,1,93,65,3,0,198,0,14,0,1,93,65,7,0,6,0,15,0,22,0,15,0,38,0,15,0,3,93,65,7,0,5,0,19,0,21,0,19,0,37,0,19,0,3,93,65,3,0,198,0,20,0,1,93,65,5,0,118,0,24,0,134,0,24,0,2,93,65,7,0,10,0,40,0,26,0,40,0,42,0,40,0,3,93,65,7,0,9,0,43,0,25,0,43,0,41,0,43,0,3,93,65,3,0,201,0,44,0,1,93,65,3,0,197,0,48,0,1,93,65,7,0,5,0,49,0,21,0,49,0,37,0,49,0,3,93,65,7,0,5,0,53,0,21,0,53,0,37,0,53,0,3,93,65,3,0,198,0,54,0,1,93,65,5,0,118,0,58,0,134,0,58,0,2,93,65,3,0,200,0,73,0,1,93,65,7,0,10,0,74,0,26,0,74,0,42,0,74,0,3,93,65,7,0,10,0,77,0,26,0,77,0,42,0,77,0,3,93,65,3,0,201,0,78,0,1,93,65,3,0,197,0,82,0,1,93,65,7,0,5,0,83,0,21,0,83,0,37,0,83,0,3,93,65,7,0,5,0,87,0,21,0,87,0,37,0,87,0,3,93,65,3,0,198,0,88,0,1,93,65,5,0,118,0,92,0,134,0,92,0,2,93,0,65,3,0,202,0,5,0,1,93,65,7,0,5,0,9,0,21,0,9,0,37,0,9,0,3,93,65,3,0,197,0,10,0,1,93,65,3,0,198,0,14,0,1,93,65,7,0,7,0,15,0,23,0,15,0,39,0,15,0,3,93,65,3,0,200,0,20,0,1,93,65,3,0,202,0,39,0,1,93,65,3,0,198,0,44,0,1,93,65,3,0,198,0,48,0,1,93,65,3,0,203,0,54,0,1,93,65,3,0,201,0,73,0,1,93,65,3,0,199,0,78,0,1,93,65,3,0,198,0,82,0,1,93,65,3,0,202,0,88,0,1,93,23,35,1,51,1,34,38,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,1,34,38,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,1,34,38,53,52,62,2,51,50,30,2,21,20,14,2,3,34,14,2,21,20,22,51,50,54,53,52,46,2,238,75,1,165,74,254,36,64,82,24,42,55,30,31,53,39,23,23,40,55,29,19,34,26,15,54,37,40,54,14,26,33,1,195,64,82,24,42,55,30,31,53,39,23,23,40,55,29,19,34,26,15,54,37,40,54,14,26,33,1,81,64,82,24,42,55,30,31,53,39,23,23,40,55,29,19,34,26,15,54,37,40,54,14,26,33,12,2,200,254,145,94,88,46,71,48,25,24,46,67,44,46,71,49,25,1,64,19,36,52,31,60,70,75,64,29,48,34,18,253,101,94,88,46,71,48,25,24,46,67,44,46,71,49,25,1,64,19,36,52,31,60,70,75,64,29,48,34,18,254,192,94,88,46,71,48,25,24,46,67,44,46,71,49,25,1,64,19,36,52,31,60,70,75,64,29,48,34,18,0,0,1,0,14,0,78,1,26,1,234,0,5,0,219,184,0,2,47,65,9,0,95,0,2,0,111,0,2,0,127,0,2,0,143,0,2,0,4,93,65,3,0,255,0,2,0,1,93,184,0,4,220,65,3,0,128,0,4,0,1,93,65,3,0,80,0,4,0,1,93,184,0,0,208,184,0,4,16,184,0,3,220,65,9,0,95,0,3,0,111,0,3,0,127,0,3,0,143,0,3,0,4,93,65,5,0,239,0,3,0,255,0,3,0,2,93,65,7,0,15,0,3,0,31,0,3,0,47,0,3,0,3,113,184,0,1,208,184,0,2,16,184,0,5,220,65,9,0,80,0,5,0,96,0,5,0,112,0,5,0,128,0,5,0,4,93,65,5,0,224,0,5,0,240,0,5,0,2,93,65,7,0,0,0,5,0,16,0,5,0,32,0,5,0,3,113,0,25,184,0,2,47,24,184,0,1,208,184,0,1,47,184,0,2,16,184,0,3,208,184,0,3,47,184,0,2,16,184,0,5,208,48,49,37,35,39,55,51,7,1,26,109,159,159,109,159,78,206,206,206,0,0,0,1,0,41,0,78,1,53,1,234,0,5,0,207,184,0,0,47,65,3,0,0,0,0,0,1,93,65,3,0,160,0,0,0,1,93,184,0,4,220,65,3,0,143,0,4,0,1,93,65,3,0,95,0,4,0,1,93,184,0,5,220,65,9,0,80,0,5,0,96,0,5,0,112,0,5,0,128,0,5,0,4,93,65,5,0,224,0,5,0,240,0,5,0,2,93,65,7,0,0,0,5,0,16,0,5,0,32,0,5,0,3,113,184,0,1,208,184,0,4,16,184,0,2,208,184,0,0,16,184,0,3,220,65,9,0,95,0,3,0,111,0,3,0,127,0,3,0,143,0,3,0,4,93,65,5,0,239,0,3,0,255,0,3,0,2,93,65,7,0,15,0,3,0,31,0,3,0,47,0,3,0,3,113,0,25,184,0,0,47,24,184,0,1,208,184,0,1,47,184,0,0,16,184,0,3,208,184,0,0,16,184,0,5,208,184,0,5,47,48,49,1,7,35,55,39,51,1,53,159,109,159,159,109,1,28,206,206,206,0,0,2,0,33,1,56,1,118,2,194,0,19,0,31,2,137,186,0,15,0,5,0,3,43,65,3,0,223,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,16,0,5,0,1,93,65,3,0,64,0,5,0,1,93,65,3,0,176,0,15,0,1,93,65,3,0,0,0,15,0,1,113,65,3,0,48,0,15,0,1,113,65,3,0,224,0,15,0,1,93,65,3,0,64,0,15,0,1,93,65,5,0,16,0,15,0,32,0,15,0,2,93,184,0,5,16,185,0,20,0,5,244,184,0,15,16,185,0,26,0,5,244,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,65,3,0,135,0,5,0,1,93,185,0,23,0,1,244,184,0,10,16,185,0,29,0,1,244,48,49,1,65,3,0,152,0,1,0,1,93,65,3,0,184,0,2,0,1,93,65,3,0,169,0,2,0,1,93,65,3,0,24,0,3,0,1,93,65,3,0,9,0,3,0,1,93,65,3,0,41,0,3,0,1,93,65,5,0,74,0,3,0,90,0,3,0,2,113,65,5,0,73,0,7,0,89,0,7,0,2,113,65,3,0,10,0,7,0,1,93,65,5,0,166,0,12,0,182,0,12,0,2,93,65,3,0,39,0,12,0,1,93,65,3,0,151,0,12,0,1,93,65,5,0,68,0,13,0,84,0,13,0,2,113,65,5,0,6,0,13,0,22,0,13,0,2,93,65,3,0,6,0,18,0,1,93,65,3,0,182,0,18,0,1,93,65,5,0,23,0,18,0,39,0,18,0,2,93,65,5,0,151,0,18,0,167,0,18,0,2,93,65,3,0,217,0,21,0,1,93,65,3,0,234,0,21,0,1,93,65,5,0,75,0,21,0,91,0,21,0,2,113,65,3,0,138,0,24,0,1,93,65,3,0,138,0,28,0,1,93,65,3,0,132,0,30,0,1,93,65,5,0,71,0,30,0,87,0,30,0,2,113,0,65,3,0,153,0,1,0,1,93,65,3,0,168,0,2,0,1,93,65,3,0,186,0,2,0,1,93,65,5,0,71,0,3,0,87,0,3,0,2,113,65,7,0,8,0,3,0,24,0,3,0,40,0,3,0,3,93,65,3,0,7,0,7,0,1,93,65,3,0,181,0,12,0,1,93,65,3,0,38,0,12,0,1,93,65,5,0,150,0,12,0,166,0,12,0,2,93,65,5,0,7,0,13,0,23,0,13,0,2,93,65,5,0,71,0,13,0,87,0,13,0,2,113,65,5,0,72,0,17,0,88,0,17,0,2,113,65,3,0,184,0,18,0,1,93,65,7,0,9,0,18,0,25,0,18,0,41,0,18,0,3,93,65,5,0,153,0,18,0,169,0,18,0,2,93,65,3,0,231,0,21,0,1,93,65,3,0,216,0,21,0,1,93,65,3,0,135,0,24,0,1,93,19,34,46,2,53,52,62,2,51,50,30,2,21,20,14,2,39,20,22,51,50,54,53,52,38,35,34,6,200,38,61,44,24,27,46,64,37,36,61,45,25,25,46,64,132,52,42,45,55,55,40,40,59,1,56,27,50,71,43,44,74,54,31,29,52,71,42,45,74,52,29,191,64,62,66,69,63,67,72,0,2,0,5,1,64,1,47,2,186,0,9,0,12,0,160,186,0,2,0,5,0,3,43,65,3,0,159,0,2,0,1,93,65,3,0,16,0,2,0,1,93,184,0,2,16,185,0,3,0,5,244,184,0,10,208,184,0,2,16,184,0,8,208,186,0,6,0,10,0,8,17,18,57,184,0,9,208,184,0,9,47,184,0,5,16,184,0,12,208,65,3,0,70,0,12,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,10,62,89,186,0,1,0,6,0,2,17,18,57,184,0,1,47,184,0,4,208,184,0,1,16,185,0,8,0,3,244,184,0,10,208,184,0,6,16,184,0,11,208,48,49,1,35,21,35,53,35,19,51,21,51,35,53,7,1,47,49,74,175,187,62,49,123,74,1,167,103,103,1,19,218,110,110,0,1,0,24,1,57,1,22,2,186,0,24,1,71,186,0,20,0,4,0,3,43,65,5,0,111,0,4,0,127,0,4,0,2,93,65,5,0,159,0,4,0,175,0,4,0,2,93,65,3,0,80,0,20,0,1,113,65,3,0,127,0,20,0,1,93,65,5,0,16,0,20,0,32,0,20,0,2,93,65,3,0,32,0,20,0,1,113,65,3,0,80,0,20,0,1,93,184,0,20,16,185,0,9,0,5,244,186,0,12,0,4,0,20,17,18,57,184,0,12,47,184,0,11,208,184,0,12,16,184,0,13,208,186,0,14,0,4,0,20,17,18,57,184,0,14,47,184,0,11,16,184,0,16,208,186,0,17,0,16,0,11,17,18,57,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,184,0,5,220,65,5,0,112,0,5,0,128,0,5,0,2,93,184,0,0,16,185,0,7,0,1,244,186,0,17,0,14,0,0,17,18,57,184,0,17,47,185,0,11,0,3,244,184,0,14,16,185,0,15,0,1,244,48,49,1,65,5,0,52,0,19,0,68,0,19,0,2,93,65,5,0,86,0,19,0,102,0,19,0,2,93,65,3,0,68,0,22,0,1,93,65,3,0,52,0,23,0,1,93,65,3,0,22,0,23,0,1,93,65,3,0,39,0,23,0,1,93,0,65,3,0,41,0,23,0,1,93,65,3,0,26,0,23,0,1,93,19,34,46,1,39,55,22,51,50,53,52,43,1,55,51,7,35,7,30,1,21,20,14,2,130,17,36,31,22,17,35,52,78,99,62,25,187,8,123,10,85,77,24,41,53,1,57,7,10,15,65,29,61,55,201,70,71,1,54,58,32,48,34,17,0,0,0,0,2,0,32,1,56,1,44,2,186,0,23,0,35,1,231,186,0,19,0,3,0,3,43,65,3,0,207,0,3,0,1,93,65,3,0,111,0,3,0,1,93,65,5,0,143,0,3,0,159,0,3,0,2,93,65,3,0,64,0,3,0,1,93,65,3,0,64,0,19,0,1,93,65,3,0,207,0,19,0,1,93,65,3,0,111,0,19,0,1,93,65,3,0,159,0,19,0,1,93,65,3,0,16,0,19,0,1,93,65,5,0,48,0,19,0,64,0,19,0,2,113,65,3,0,0,0,19,0,1,113,186,0,9,0,19,0,3,17,18,57,184,0,9,47,184,0,3,16,185,0,27,0,5,244,184,0,14,208,65,7,0,39,0,14,0,55,0,14,0,71,0,14,0,3,93,184,0,19,16,185,0,33,0,5,244,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,184,0,8,16,185,0,11,0,3,244,184,0,0,16,184,0,16,220,65,3,0,95,0,16,0,1,93,65,3,0,47,0,16,0,1,113,186,0,14,0,16,0,0,17,18,57,185,0,24,0,3,244,184,0,0,16,185,0,30,0,1,244,48,49,1,65,7,0,42,0,2,0,58,0,2,0,74,0,2,0,3,93,65,3,0,104,0,6,0,1,93,65,3,0,136,0,6,0,1,93,65,3,0,89,0,6,0,1,93,65,3,0,121,0,6,0,1,93,65,5,0,87,0,17,0,103,0,17,0,2,93,65,7,0,37,0,18,0,53,0,18,0,69,0,18,0,3,93,65,3,0,118,0,18,0,1,93,65,3,0,135,0,18,0,1,93,65,7,0,37,0,21,0,53,0,21,0,69,0,21,0,3,93,0,65,3,0,116,0,6,0,1,93,65,3,0,101,0,6,0,1,93,65,3,0,87,0,6,0,1,93,65,3,0,135,0,6,0,1,93,65,3,0,86,0,7,0,1,93,65,7,0,37,0,17,0,53,0,17,0,69,0,17,0,3,93,65,3,0,102,0,17,0,1,93,65,3,0,87,0,17,0,1,93,65,3,0,118,0,18,0,1,93,65,3,0,135,0,18,0,1,93,19,34,38,53,52,62,2,51,23,34,14,2,7,54,51,50,22,21,20,14,2,39,34,6,21,20,22,51,50,54,53,52,38,158,57,69,36,53,61,24,49,16,49,45,32,3,18,50,54,68,21,37,53,16,31,38,39,23,29,36,30,1,56,71,75,48,87,66,39,28,29,43,49,21,19,55,54,26,45,35,20,177,30,29,24,29,37,26,19,30,0,0,0,0,1,0,23,1,64,1,34,2,186,0,5,0,150,186,0,0,0,5,0,3,43,65,3,0,175,0,0,0,1,93,65,5,0,10,0,0,0,26,0,0,0,2,93,65,3,0,118,0,0,0,1,93,184,0,0,16,184,0,1,208,184,0,0,16,184,0,3,208,65,3,0,138,0,3,0,1,93,65,5,0,105,0,3,0,121,0,3,0,2,93,65,5,0,73,0,3,0,89,0,3,0,2,113,184,0,2,208,65,3,0,175,0,5,0,1,93,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,14,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,10,62,89,184,0,5,16,185,0,4,0,1,244,48,49,1,3,35,19,35,53,1,34,170,77,139,159,2,186,254,134,1,52,70,0,0,3,0,31,1,56,1,59,2,194,0,22,0,30,0,42,2,97,186,0,18,0,3,0,3,43,65,5,0,127,0,3,0,143,0,3,0,2,93,65,3,0,191,0,3,0,1,93,65,3,0,48,0,3,0,1,93,65,3,0,80,0,18,0,1,113,65,5,0,0,0,18,0,16,0,18,0,2,93,65,3,0,192,0,18,0,1,93,65,3,0,48,0,18,0,1,93,186,0,7,0,3,0,18,17,18,57,184,0,7,47,186,0,13,0,18,0,3,17,18,57,184,0,13,47,186,0,5,0,7,0,13,17,18,57,65,3,0,25,0,5,0,1,113,65,7,0,40,0,5,0,56,0,5,0,72,0,5,0,3,93,186,0,15,0,13,0,7,17,18,57,184,0,7,16,185,0,25,0,5,244,184,0,13,16,185,0,29,0,5,244,184,0,3,16,185,0,34,0,5,244,184,0,18,16,185,0,40,0,5,244,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,14,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,10,62,89,186,0,27,0,10,0,0,17,18,57,184,0,27,47,65,5,0,223,0,27,0,239,0,27,0,2,93,65,3,0,31,0,27,0,1,93,185,0,31,0,3,244,186,0,5,0,27,0,31,17,18,57,186,0,15,0,27,0,31,17,18,57,184,0,10,16,185,0,23,0,3,244,184,0,0,16,185,0,37,0,3,244,48,49,1,65,3,0,104,0,1,0,1,93,65,3,0,89,0,2,0,1,93,65,7,0,42,0,2,0,58,0,2,0,74,0,2,0,3,93,65,7,0,41,0,8,0,57,0,8,0,73,0,8,0,3,93,65,5,0,105,0,8,0,121,0,8,0,2,93,65,3,0,90,0,8,0,1,93,65,3,0,103,0,9,0,1,93,65,7,0,40,0,9,0,56,0,9,0,72,0,9,0,3,93,65,3,0,103,0,11,0,1,93,65,3,0,116,0,12,0,1,93,65,9,0,37,0,12,0,53,0,12,0,69,0,12,0,85,0,12,0,4,93,65,7,0,39,0,21,0,55,0,21,0,71,0,21,0,3,93,0,65,7,0,42,0,1,0,58,0,1,0,74,0,1,0,3,93,65,7,0,106,0,1,0,122,0,1,0,138,0,1,0,3,93,65,3,0,100,0,9,0,1,93,65,3,0,133,0,9,0,1,93,65,7,0,38,0,9,0,54,0,9,0,70,0,9,0,3,93,65,3,0,118,0,9,0,1,93,65,7,0,37,0,11,0,53,0,11,0,69,0,11,0,3,93,65,3,0,101,0,11,0,1,93,65,3,0,133,0,11,0,1,93,65,3,0,87,0,12,0,1,93,65,7,0,41,0,21,0,57,0,21,0,73,0,21,0,3,93,19,34,38,53,52,55,38,53,52,54,51,50,22,21,20,7,30,1,21,20,14,2,3,34,21,20,23,54,53,52,7,14,1,21,20,22,51,50,54,53,52,38,167,67,69,63,40,57,64,63,55,50,32,40,19,37,56,30,54,51,55,50,30,43,36,32,34,38,38,1,56,62,46,60,44,28,58,42,54,49,39,54,36,13,52,32,23,43,33,20,1,82,47,41,12,13,42,45,151,4,39,30,27,30,32,27,29,36,0,0,2,0,22,1,64,1,35,2,194,0,23,0,34,1,99,186,0,3,0,19,0,3,43,65,3,0,16,0,3,0,1,93,65,3,0,111,0,3,0,1,93,65,3,0,159,0,3,0,1,93,65,3,0,64,0,3,0,1,113,65,3,0,64,0,3,0,1,93,65,3,0,15,0,19,0,1,113,65,3,0,63,0,19,0,1,113,65,5,0,143,0,19,0,159,0,19,0,2,93,65,3,0,111,0,19,0,1,93,186,0,9,0,19,0,3,17,18,57,184,0,9,47,184,0,3,16,185,0,27,0,5,244,184,0,14,208,184,0,19,16,185,0,32,0,5,244,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,14,62,89,184,0,0,69,88,184,0,8,47,27,185,0,8,0,10,62,89,185,0,11,0,3,244,184,0,0,16,184,0,16,220,65,3,0,80,0,16,0,1,93,65,3,0,32,0,16,0,1,113,186,0,14,0,0,0,16,17,18,57,185,0,24,0,3,244,184,0,0,16,185,0,29,0,1,244,48,49,1,65,7,0,41,0,18,0,57,0,18,0,73,0,18,0,3,93,65,9,0,90,0,18,0,106,0,18,0,122,0,18,0,138,0,18,0,4,93,65,7,0,41,0,22,0,57,0,22,0,73,0,22,0,3,93,0,65,7,0,36,0,1,0,52,0,1,0,68,0,1,0,3,93,65,9,0,90,0,7,0,106,0,7,0,122,0,7,0,138,0,7,0,4,93,65,7,0,42,0,17,0,58,0,17,0,74,0,17,0,3,93,65,7,0,37,0,22,0,53,0,22,0,69,0,22,0,3,93,19,50,22,21,20,14,2,35,39,50,62,2,55,6,35,34,38,53,52,62,2,23,50,54,53,52,35,34,6,21,20,22,164,57,70,31,53,62,29,47,16,49,46,33,2,19,52,55,67,21,38,52,18,31,38,61,30,34,27,2,194,72,73,47,87,67,40,28,25,40,51,26,19,55,52,27,46,35,20,177,29,29,54,36,24,22,30,0,0,255,255,0,45,255,249,1,130,1,131,1,7,0,222,0,12,254,193,0,24,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,23,208,48,49,255,255,0,38,0,1,0,170,1,123,1,7,0,120,0,15,254,193,0,20,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,48,49,255,255,0,38,0,1,1,30,1,131,1,7,0,113,0,13,254,193,0,20,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,48,49,255,255,0,32,255,249,1,34,1,131,1,7,0,114,0,13,254,193,0,20,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,48,49,255,255,0,18,0,1,1,60,1,123,1,7,0,223,0,13,254,193,0,24,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,10,208,48,49,255,255,0,35,255,250,1,33,1,123,1,7,0,224,0,11,254,193,0,20,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,48,49,255,255,0,45,255,249,1,57,1,123,1,7,0,225,0,13,254,193,0,24,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,30,208,48,49,255,255,0,42,0,1,1,53,1,123,1,7,0,226,0,19,254,193,0,20,0,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,48,49,255,255,0,44,255,249,1,72,1,131,1,7,0,227,0,13,254,193,0,32,0,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,27,208,184,0,0,16,184,0,37,208,48,49,255,255,0,32,0,1,1,45,1,131,1,7,0,228,0,10,254,193,0,24,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,6,62,89,184,0,24,208,48,49,0,1,0,33,0,17,2,134,2,171,0,41,2,76,186,0,17,0,6,0,3,43,65,5,0,127,0,6,0,143,0,6,0,2,93,65,3,0,95,0,6,0,1,113,65,3,0,0,0,6,0,1,93,184,0,6,16,184,0,0,208,184,0,6,16,184,0,1,208,184,0,1,47,184,0,6,16,184,0,8,208,184,0,8,47,65,3,0,112,0,8,0,1,93,184,0,6,16,184,0,10,208,65,3,0,0,0,17,0,1,93,184,0,6,16,184,0,26,220,65,3,0,208,0,26,0,1,93,65,11,0,64,0,26,0,80,0,26,0,96,0,26,0,112,0,26,0,128,0,26,0,5,93,184,0,22,208,186,0,23,0,26,0,17,17,18,57,184,0,23,47,186,0,30,0,17,0,26,17,18,57,184,0,30,47,184,0,26,16,184,0,32,208,65,3,0,7,0,32,0,1,93,65,5,0,22,0,32,0,38,0,32,0,2,93,65,7,0,69,0,32,0,85,0,32,0,101,0,32,0,3,93,65,3,0,56,0,34,0,1,113,184,0,17,16,184,0,37,208,0,184,0,15,47,184,0,39,47,186,0,23,0,15,0,39,17,18,57,184,0,23,47,65,3,0,175,0,23,0,1,93,65,3,0,31,0,23,0,1,93,65,7,0,223,0,23,0,239,0,23,0,255,0,23,0,3,93,65,3,0,47,0,23,0,1,113,184,0,30,220,65,3,0,95,0,30,0,1,113,185,0,31,0,1,244,184,0,0,208,184,0,30,16,184,0,3,208,184,0,23,16,185,0,24,0,1,244,184,0,7,208,184,0,23,16,184,0,10,208,184,0,15,16,184,0,18,220,65,5,0,47,0,18,0,63,0,18,0,2,113,184,0,15,16,184,0,20,220,65,5,0,127,0,20,0,143,0,20,0,2,93,65,5,0,47,0,20,0,63,0,20,0,2,113,184,0,39,16,184,0,34,220,65,5,0,32,0,34,0,48,0,34,0,2,113,65,5,0,112,0,34,0,128,0,34,0,2,93,184,0,39,16,184,0,36,220,65,5,0,32,0,36,0,48,0,36,0,2,113,48,49,1,65,3,0,105,0,12,0,1,93,65,3,0,90,0,12,0,1,93,0,65,5,0,117,0,12,0,133,0,12,0,2,93,65,5,0,86,0,12,0,102,0,12,0,2,93,65,11,0,53,0,16,0,69,0,16,0,85,0,16,0,101,0,16,0,117,0,16,0,5,93,65,11,0,53,0,17,0,69,0,17,0,85,0,17,0,101,0,17,0,117,0,17,0,5,93,65,11,0,59,0,37,0,75,0,37,0,91,0,37,0,107,0,37,0,123,0,37,0,5,93,55,35,55,51,46,1,61,1,35,55,51,62,3,51,50,23,7,38,35,34,7,33,7,35,21,20,22,23,51,7,35,22,51,50,55,23,6,35,34,38,174,141,24,99,2,2,89,22,76,14,57,80,101,57,104,72,12,91,73,146,46,1,2,24,244,3,2,243,24,198,59,117,73,91,12,72,104,102,156,215,69,19,33,14,19,69,57,91,63,34,34,98,38,151,69,19,17,33,16,69,104,38,98,34,104,0,0,2,0,31,1,81,2,156,2,188,0,12,0,20,1,63,184,0,17,47,184,0,4,220,184,0,10,220,65,3,0,16,0,10,0,1,93,65,3,0,32,0,10,0,1,113,186,0,7,0,4,0,10,17,18,57,184,0,7,16,184,0,1,208,184,0,4,16,184,0,3,220,65,3,0,63,0,3,0,1,113,184,0,2,208,184,0,4,16,184,0,5,208,186,0,6,0,2,0,5,17,18,57,184,0,10,16,184,0,11,220,184,0,12,208,184,0,10,16,184,0,9,208,65,3,0,56,0,9,0,1,93,186,0,8,0,12,0,9,17,18,57,184,0,17,16,184,0,16,220,65,5,0,63,0,16,0,79,0,16,0,2,113,184,0,14,220,184,0,17,16,184,0,19,220,0,184,0,0,69,88,184,0,20,47,27,185,0,20,0,14,62,89,184,0,5,208,184,0,20,16,184,0,17,220,184,0,4,208,186,0,1,0,5,0,4,17,18,57,184,0,1,47,184,0,5,16,184,0,2,208,65,3,0,85,0,2,0,1,93,65,3,0,67,0,2,0,1,93,184,0,1,16,184,0,7,208,65,3,0,77,0,7,0,1,93,65,3,0,92,0,7,0,1,93,184,0,5,16,184,0,8,208,184,0,4,16,184,0,11,208,184,0,2,16,184,0,12,208,184,0,20,16,184,0,19,220,65,5,0,48,0,19,0,64,0,19,0,2,113,184,0,15,208,48,49,65,3,0,107,0,7,0,1,93,1,35,39,3,35,19,51,23,55,51,19,35,3,37,7,35,17,35,17,35,53,1,233,6,92,33,52,47,29,105,104,29,48,54,31,254,219,6,100,51,102,1,187,163,254,243,1,107,179,179,254,149,1,12,95,50,254,199,1,57,50,0,3,0,74,0,0,1,242,2,48,0,17,0,25,0,33,1,115,186,0,13,0,1,0,3,43,65,3,0,16,0,1,0,1,93,65,3,0,176,0,1,0,1,93,65,3,0,64,0,13,0,1,93,65,5,0,0,0,13,0,16,0,13,0,2,93,65,3,0,0,0,13,0,1,113,65,3,0,224,0,13,0,1,93,186,0,8,0,13,0,1,17,18,57,184,0,8,47,184,0,1,16,185,0,28,0,4,244,184,0,20,208,186,0,10,0,20,0,8,17,18,57,65,5,0,4,0,10,0,20,0,10,0,2,93,184,0,8,16,185,0,23,0,4,244,184,0,13,16,185,0,32,0,4,244,65,3,0,79,0,35,0,1,113,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,186,0,20,0,3,0,0,17,18,57,184,0,20,47,185,0,27,0,2,244,186,0,10,0,20,0,27,17,18,57,184,0,3,16,185,0,18,0,2,244,184,0,0,16,185,0,29,0,2,244,48,49,1,65,3,0,4,0,6,0,1,93,65,7,0,22,0,6,0,38,0,6,0,54,0,6,0,3,93,65,3,0,71,0,6,0,1,93,65,7,0,89,0,10,0,105,0,10,0,121,0,10,0,3,93,65,3,0,135,0,11,0,1,93,65,3,0,5,0,15,0,1,93,65,3,0,133,0,15,0,1,93,0,65,3,0,70,0,6,0,1,93,65,9,0,7,0,6,0,23,0,6,0,39,0,6,0,55,0,6,0,4,93,65,3,0,133,0,11,0,1,93,65,3,0,8,0,15,0,1,93,65,3,0,138,0,15,0,1,93,33,35,17,51,50,30,2,21,20,7,30,1,21,20,14,2,3,35,21,51,50,53,52,38,7,35,21,51,50,54,53,52,1,34,216,146,57,85,56,28,49,54,47,36,59,75,75,86,103,85,52,16,120,95,70,69,2,48,12,32,55,43,80,39,19,63,52,49,64,37,15,1,224,148,74,44,30,224,175,36,49,90,0,0,1,0,39,255,245,1,245,2,59,0,29,1,180,186,0,12,0,5,0,3,43,65,3,0,15,0,5,0,1,93,65,3,0,47,0,5,0,1,93,65,3,0,128,0,5,0,1,93,65,3,0,128,0,12,0,1,93,65,3,0,192,0,12,0,1,93,65,3,0,0,0,12,0,1,113,65,3,0,224,0,12,0,1,93,65,3,0,160,0,12,0,1,93,65,3,0,48,0,12,0,1,93,65,3,0,16,0,12,0,1,93,184,0,5,16,185,0,20,0,4,244,184,0,12,16,184,0,28,208,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,184,0,13,220,65,3,0,95,0,13,0,1,113,184,0,10,16,185,0,15,0,2,244,184,0,0,16,185,0,25,0,2,244,184,0,0,16,184,0,27,220,65,3,0,80,0,27,0,1,113,48,49,1,65,3,0,137,0,2,0,1,93,65,3,0,56,0,8,0,1,93,65,3,0,136,0,8,0,1,93,65,11,0,71,0,11,0,87,0,11,0,103,0,11,0,119,0,11,0,135,0,11,0,5,93,65,5,0,23,0,11,0,39,0,11,0,2,113,0,65,3,0,56,0,2,0,1,93,65,3,0,138,0,2,0,1,93,65,3,0,131,0,8,0,1,93,65,3,0,54,0,8,0,1,93,65,5,0,17,0,11,0,33,0,11,0,2,113,65,11,0,70,0,11,0,86,0,11,0,102,0,11,0,118,0,11,0,134,0,11,0,5,93,65,11,0,70,0,12,0,86,0,12,0,102,0,12,0,118,0,12,0,134,0,12,0,5,93,65,11,0,73,0,28,0,89,0,28,0,105,0,28,0,121,0,28,0,137,0,28,0,5,93,65,11,0,74,0,29,0,90,0,29,0,106,0,29,0,122,0,29,0,138,0,29,0,5,93,65,5,0,27,0,29,0,43,0,29,0,2,113,5,34,46,2,53,52,62,2,51,50,23,7,38,35,34,14,2,21,20,30,2,51,50,55,23,6,1,79,65,109,78,44,44,78,109,65,97,69,10,91,65,47,72,49,26,26,49,73,47,64,91,10,73,11,42,76,108,65,65,107,77,42,33,87,32,30,53,75,45,45,75,53,30,32,88,32,0,0,0,2,0,74,0,0,2,78,2,48,0,12,0,21,0,235,186,0,8,0,1,0,3,43,65,3,0,207,0,1,0,1,93,65,3,0,15,0,1,0,1,93,65,3,0,175,0,1,0,1,93,65,3,0,16,0,1,0,1,93,65,3,0,96,0,8,0,1,93,65,3,0,224,0,8,0,1,93,65,3,0,32,0,8,0,1,113,65,3,0,0,0,8,0,1,113,65,3,0,176,0,8,0,1,93,65,3,0,64,0,8,0,1,93,65,5,0,16,0,8,0,32,0,8,0,2,93,184,0,1,16,185,0,15,0,4,244,184,0,8,16,185,0,19,0,4,244,0,184,0,0,69,88,184,0,3,47,27,185,0,3,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,3,16,185,0,13,0,2,244,184,0,0,16,185,0,16,0,2,244,48,49,1,65,3,0,135,0,5,0,1,93,65,3,0,133,0,10,0,1,93,0,65,3,0,133,0,5,0,1,93,65,3,0,136,0,10,0,1,93,65,3,0,138,0,11,0,1,93,33,35,17,51,50,30,2,21,20,14,2,3,35,17,51,50,54,53,52,38,1,39,221,221,64,110,78,43,44,78,109,64,128,128,94,99,99,2,48,39,72,104,65,66,104,72,38,1,216,254,128,102,90,90,102,0,0,0,1,0,74,0,0,1,197,2,48,0,11,0,152,186,0,0,0,1,0,3,43,65,3,0,16,0,0,0,1,93,65,3,0,224,0,0,0,1,93,65,3,0,16,0,1,0,1,93,184,0,0,16,184,0,4,208,184,0,4,47,184,0,1,16,185,0,10,0,4,244,184,0,6,208,186,0,8,0,0,0,1,17,18,57,184,0,8,47,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,16,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,184,0,2,16,185,0,5,0,2,244,186,0,6,0,2,0,1,17,18,57,184,0,6,47,185,0,9,0,2,244,184,0,1,16,185,0,10,0,2,244,48,49,41,1,17,33,21,33,21,51,21,35,21,33,1,197,254,133,1,115,254,236,217,217,1,28,2,48,88,136,88,160,0,1,0,74,0,0,1,182,2,48,0,9,0,166,186,0,0,0,7,0,3,43,65,3,0,175,0,0,0,1,93,65,3,0,16,0,0,0,1,93,65,3,0,176,0,0,0,1,93,65,3,0,175,0,7,0,1,93,65,3,0,16,0,7,0,1,93,65,3,0,176,0,7,0,1,93,184,0,7,16,185,0,6,0,4,244,184,0,2,208,186,0,3,0,0,0,7,17,18,57,184,0,3,47,0,184,0,0,69,88,184,0,8,47,27,185,0,8,0,16,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,184,0,8,16,185,0,1,0,2,244,186,0,2,0,8,0,6,17,18,57,184,0,2,47,185,0,5,0,2,244,65,3,0,165,0,7,0,1,93,48,49,1,33,21,51,21,35,21,35,17,33,1,182,254,241,210,210,93,1,108,1,216,136,88,248,2,48,0,0,0,1,0,39,255,245,2,22,2,59,0,32,1,48,186,0,27,0,5,0,3,43,65,3,0,80,0,27,0,1,93,65,3,0,112,0,27,0,1,93,186,0,12,0,27,0,5,17,18,57,184,0,12,47,184,0,5,16,185,0,18,0,4,244,184,0,27,16,185,0,24,0,4,244,184,0,27,16,184,0,26,208,184,0,26,47,0,184,0,0,69,88,184,0,10,47,27,185,0,10,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,10,16,184,0,13,220,184,0,10,16,185,0,15,0,2,244,184,0,0,16,185,0,21,0,2,244,186,0,26,0,10,0,0,17,18,57,184,0,26,47,185,0,25,0,2,244,48,49,1,65,3,0,137,0,2,0,1,93,65,3,0,136,0,7,0,1,93,65,3,0,136,0,8,0,1,93,65,5,0,21,0,16,0,37,0,16,0,2,93,65,3,0,21,0,20,0,1,93,65,3,0,38,0,20,0,1,93,0,65,3,0,138,0,2,0,1,93,65,3,0,135,0,7,0,1,93,65,3,0,134,0,8,0,1,93,65,9,0,85,0,11,0,101,0,11,0,117,0,11,0,133,0,11,0,4,93,65,3,0,69,0,12,0,1,93,65,9,0,86,0,12,0,102,0,12,0,118,0,12,0,134,0,12,0,4,93,65,3,0,23,0,16,0,1,93,5,34,46,2,53,52,62,2,51,50,23,7,38,35,34,6,21,20,22,51,50,55,53,35,53,51,21,14,3,1,74,63,107,77,44,43,79,110,66,102,75,9,87,79,98,100,105,103,49,42,81,175,17,49,56,57,11,42,76,108,66,65,107,76,42,32,87,31,111,90,94,111,11,114,79,250,8,15,12,7,0,0,0,1,0,74,0,0,2,60,2,48,0,11,0,127,186,0,0,0,5,0,3,43,65,3,0,16,0,0,0,1,93,184,0,0,16,185,0,1,0,4,244,65,3,0,16,0,5,0,1,93,184,0,5,16,185,0,4,0,4,244,184,0,8,208,184,0,1,16,184,0,9,208,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,8,0,7,0,4,17,18,57,184,0,8,47,185,0,3,0,2,244,184,0,7,16,184,0,10,208,48,49,33,35,53,33,21,35,17,51,21,33,53,51,2,60,93,254,200,93,93,1,56,93,248,248,2,48,223,223,0,0,0,0,1,0,74,0,0,0,167,2,48,0,3,0,109,187,0,0,0,4,0,1,0,4,43,65,3,0,175,0,0,0,1,93,65,5,0,0,0,0,0,16,0,0,0,2,93,65,3,0,128,0,0,0,1,93,65,3,0,175,0,1,0,1,93,65,3,0,128,0,1,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,16,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,48,49,51,35,17,51,167,93,93,2,48,0,1,255,254,255,118,0,167,2,48,0,10,0,119,187,0,8,0,4,0,7,0,4,43,65,3,0,175,0,7,0,1,93,65,3,0,16,0,7,0,1,93,65,3,0,128,0,7,0,1,93,184,0,7,16,184,0,2,208,184,0,2,47,65,3,0,175,0,8,0,1,93,65,3,0,16,0,8,0,1,93,65,3,0,128,0,8,0,1,93,65,3,0,15,0,12,0,1,93,0,184,0,1,47,184,0,0,69,88,184,0,8,47,27,185,0,8,0,16,62,89,184,0,1,16,185,0,2,0,1,244,48,49,23,35,39,51,50,54,53,17,51,17,20,28,21,9,12,37,27,93,138,66,34,39,2,47,253,186,116,0,2,0,74,0,0,2,0,2,48,0,5,0,9,1,0,186,0,0,0,7,0,3,43,65,5,0,96,0,0,0,112,0,0,0,2,93,65,3,0,32,0,0,0,1,113,65,3,0,217,0,0,0,1,93,65,3,0,240,0,0,0,1,93,65,3,0,0,0,0,0,1,113,65,3,0,64,0,0,0,1,93,65,5,0,16,0,0,0,32,0,0,0,2,93,184,0,0,16,185,0,1,0,4,244,65,11,0,182,0,1,0,198,0,1,0,214,0,1,0,230,0,1,0,246,0,1,0,5,93,65,7,0,6,0,1,0,22,0,1,0,38,0,1,0,3,113,184,0,2,208,184,0,1,16,184,0,3,208,184,0,0,16,184,0,4,208,184,0,0,16,184,0,5,208,65,3,0,223,0,7,0,1,93,65,3,0,16,0,7,0,1,93,184,0,7,16,185,0,6,0,4,244,0,184,0,0,69,88,184,0,9,47,27,185,0,9,0,16,62,89,184,0,0,69,88,184,0,6,47,27,185,0,6,0,6,62,89,184,0,1,208,184,0,9,16,184,0,3,208,186,0,2,0,3,0,1,17,18,57,25,184,0,2,47,24,184,0,5,208,48,49,33,35,3,19,51,11,1,35,17,51,2,0,102,215,215,102,215,130,93,93,1,40,1,8,254,248,254,216,2,48,0,0,0,2,0,8,0,0,2,14,2,48,0,7,0,10,2,64,187,0,7,0,4,0,6,0,4,43,65,3,0,255,0,7,0,1,93,65,3,0,0,0,7,0,1,113,65,3,0,96,0,7,0,1,93,184,0,7,16,184,0,0,208,65,3,0,136,0,0,0,1,93,65,3,0,23,0,0,0,1,113,65,3,0,55,0,0,0,1,93,185,0,1,0,4,244,65,3,0,255,0,6,0,1,93,65,3,0,0,0,6,0,1,113,65,3,0,96,0,6,0,1,93,186,0,9,0,6,0,7,17,18,57,186,0,2,0,1,0,9,17,18,57,184,0,6,16,184,0,5,208,65,3,0,56,0,5,0,1,93,65,3,0,24,0,5,0,1,113,65,3,0,135,0,5,0,1,93,185,0,4,0,4,244,186,0,3,0,4,0,9,17,18,57,186,0,8,0,9,0,1,17,18,57,186,0,10,0,9,0,4,17,18,57,65,3,0,63,0,12,0,1,93,65,3,0,31,0,12,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,10,0,6,0,4,17,18,57,184,0,10,47,185,0,3,0,2,244,184,0,6,16,184,0,9,208,65,3,0,42,0,9,0,1,113,48,49,1,65,3,0,167,0,1,0,1,93,65,3,0,120,0,3,0,1,93,65,3,0,168,0,4,0,1,93,65,3,0,136,0,6,0,1,93,65,7,0,216,0,6,0,232,0,6,0,248,0,6,0,3,93,65,13,0,8,0,6,0,24,0,6,0,40,0,6,0,56,0,6,0,72,0,6,0,88,0,6,0,6,113,65,7,0,89,0,6,0,105,0,6,0,121,0,6,0,3,93,65,5,0,86,0,7,0,102,0,7,0,2,93,65,5,0,119,0,7,0,135,0,7,0,2,93,65,7,0,215,0,7,0,231,0,7,0,247,0,7,0,3,93,65,13,0,7,0,7,0,23,0,7,0,39,0,7,0,55,0,7,0,71,0,7,0,87,0,7,0,6,113,65,3,0,136,0,8,0,1,93,65,3,0,89,0,8,0,1,93,65,3,0,86,0,10,0,1,93,65,3,0,135,0,10,0,1,93,0,65,3,0,41,0,9,0,1,93,65,3,0,74,0,9,0,1,93,65,7,0,218,0,9,0,234,0,9,0,250,0,9,0,3,93,65,5,0,10,0,9,0,26,0,9,0,2,113,65,3,0,59,0,9,0,1,93,65,3,0,43,0,9,0,1,113,65,3,0,140,0,9,0,1,93,33,35,39,35,7,35,19,51,19,39,7,2,14,97,55,214,54,98,213,93,29,76,76,141,141,2,48,254,181,189,189,0,0,1,0,46,0,0,2,154,2,48,0,11,2,50,186,0,0,0,6,0,3,43,65,3,0,0,0,0,0,1,113,65,3,0,47,0,0,0,1,93,65,3,0,16,0,0,0,1,93,65,5,0,112,0,0,0,128,0,0,0,2,93,65,3,0,64,0,0,0,1,93,184,0,0,16,185,0,1,0,4,244,184,0,2,208,65,3,0,87,0,2,0,1,93,65,5,0,31,0,6,0,47,0,6,0,2,113,65,3,0,47,0,6,0,1,93,65,3,0,16,0,6,0,1,93,186,0,3,0,6,0,0,17,18,57,184,0,6,16,185,0,5,0,4,244,184,0,4,208,65,3,0,88,0,4,0,1,93,184,0,6,16,184,0,7,208,186,0,8,0,7,0,4,17,18,57,65,3,0,39,0,8,0,1,93,65,3,0,102,0,8,0,1,93,184,0,3,16,184,0,9,208,65,3,0,232,0,9,0,1,93,184,0,0,16,184,0,11,208,186,0,10,0,2,0,11,17,18,57,65,3,0,40,0,10,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,5,47,27,185,0,5,0,6,62,89,184,0,1,208,184,0,7,16,184,0,4,208,65,5,0,27,0,4,0,43,0,4,0,2,113,65,3,0,139,0,4,0,1,93,65,3,0,12,0,4,0,1,113,65,5,0,108,0,4,0,124,0,4,0,2,93,65,5,0,76,0,4,0,92,0,4,0,2,113,65,3,0,251,0,4,0,1,93,65,3,0,91,0,4,0,1,93,65,3,0,234,0,4,0,1,93,65,3,0,73,0,4,0,1,93,184,0,2,208,186,0,3,0,7,0,5,17,18,57,184,0,3,47,184,0,9,208,65,5,0,66,0,9,0,82,0,9,0,2,113,65,7,0,83,0,9,0,99,0,9,0,115,0,9,0,3,93,65,3,0,52,0,9,0,1,113,65,5,0,53,0,9,0,69,0,9,0,2,93,65,3,0,230,0,9,0,1,93,65,5,0,197,0,9,0,213,0,9,0,2,93,65,3,0,132,0,9,0,1,93,65,3,0,4,0,9,0,1,113,65,3,0,243,0,9,0,1,93,65,3,0,18,0,9,0,1,113,65,3,0,33,0,9,0,1,113,184,0,7,16,184,0,10,208,48,49,1,65,3,0,200,0,7,0,1,93,65,3,0,54,0,8,0,1,93,65,3,0,57,0,10,0,1,93,65,3,0,199,0,11,0,1,93,0,65,3,0,38,0,9,0,1,113,33,35,11,3,35,19,51,27,1,51,2,154,98,54,157,159,54,98,81,78,152,150,78,1,136,254,243,1,13,254,120,2,48,254,249,1,7,0,0,0,0,1,0,74,0,0,2,28,2,48,0,9,2,14,186,0,9,0,4,0,3,43,65,3,0,16,0,9,0,1,93,65,5,0,80,0,9,0,96,0,9,0,2,93,65,3,0,176,0,9,0,1,93,65,3,0,175,0,9,0,1,93,65,3,0,224,0,9,0,1,93,65,5,0,128,0,9,0,144,0,9,0,2,93,65,3,0,48,0,9,0,1,93,65,3,0,32,0,9,0,1,113,65,3,0,0,0,9,0,1,113,184,0,9,16,185,0,8,0,4,244,184,0,1,208,65,3,0,176,0,4,0,1,93,65,3,0,207,0,4,0,1,93,65,3,0,175,0,4,0,1,93,65,3,0,16,0,4,0,1,93,65,3,0,144,0,4,0,1,93,184,0,4,16,185,0,3,0,4,244,184,0,6,208,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,16,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,1,208,184,0,6,16,184,0,2,208,65,3,0,74,0,2,0,1,113,65,3,0,27,0,2,0,1,113,65,3,0,44,0,2,0,1,113,65,3,0,142,0,2,0,1,93,65,5,0,108,0,2,0,124,0,2,0,2,93,65,3,0,91,0,2,0,1,113,65,5,0,74,0,2,0,90,0,2,0,2,93,65,3,0,250,0,2,0,1,93,65,3,0,10,0,2,0,1,113,65,5,0,41,0,2,0,57,0,2,0,2,93,65,3,0,167,0,4,0,1,93,184,0,1,16,184,0,7,208,65,3,0,83,0,7,0,1,113,65,3,0,68,0,7,0,1,93,65,3,0,85,0,7,0,1,93,65,3,0,53,0,7,0,1,93,65,3,0,38,0,7,0,1,93,65,3,0,245,0,7,0,1,93,65,7,0,4,0,7,0,20,0,7,0,36,0,7,0,3,113,65,3,0,68,0,7,0,1,113,65,3,0,131,0,7,0,1,93,65,5,0,98,0,7,0,114,0,7,0,2,93,184,0,6,16,184,0,8,208,48,49,1,65,3,0,85,0,6,0,1,93,65,3,0,71,0,6,0,1,93,0,65,5,0,122,0,2,0,138,0,2,0,2,93,65,3,0,43,0,2,0,1,113,65,3,0,69,0,7,0,1,93,65,3,0,117,0,7,0,1,93,65,3,0,37,0,7,0,1,113,65,3,0,87,0,7,0,1,93,33,35,1,17,35,17,51,1,17,51,2,28,78,254,217,93,96,1,20,94,1,149,254,107,2,48,254,130,1,126,0,0,0,2,0,39,255,245,2,114,2,59,0,18,0,37,2,43,186,0,17,0,7,0,3,43,65,3,0,79,0,7,0,1,93,65,3,0,159,0,7,0,1,93,65,3,0,111,0,7,0,1,93,65,3,0,15,0,7,0,1,93,65,3,0,128,0,7,0,1,93,65,3,0,0,0,17,0,1,113,65,3,0,128,0,17,0,1,93,65,3,0,32,0,17,0,1,113,65,3,0,224,0,17,0,1,93,65,3,0,176,0,17,0,1,93,184,0,7,16,185,0,26,0,4,244,184,0,17,16,185,0,36,0,4,244,65,3,0,47,0,39,0,1,93,65,3,0,95,0,39,0,1,93,0,184,0,0,69,88,184,0,12,47,27,185,0,12,0,16,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,12,16,185,0,21,0,2,244,184,0,2,16,185,0,31,0,2,244,48,49,1,65,3,0,134,0,0,0,1,93,65,3,0,138,0,5,0,1,93,65,3,0,137,0,9,0,1,93,65,3,0,135,0,14,0,1,93,65,3,0,135,0,15,0,1,93,65,3,0,181,0,19,0,1,93,65,3,0,166,0,19,0,1,93,65,5,0,24,0,19,0,40,0,19,0,2,93,65,3,0,121,0,19,0,1,93,65,5,0,23,0,23,0,39,0,23,0,2,93,65,3,0,168,0,24,0,1,93,65,3,0,185,0,24,0,1,93,65,5,0,22,0,29,0,38,0,29,0,2,93,65,3,0,168,0,29,0,1,93,65,3,0,185,0,29,0,1,93,65,3,0,120,0,33,0,1,93,65,5,0,25,0,33,0,41,0,33,0,2,93,65,3,0,165,0,34,0,1,93,65,3,0,182,0,34,0,1,93,0,65,3,0,137,0,0,0,1,93,65,3,0,136,0,5,0,1,93,65,3,0,134,0,9,0,1,93,65,3,0,135,0,14,0,1,93,65,3,0,134,0,15,0,1,93,65,3,0,166,0,19,0,1,93,65,3,0,183,0,19,0,1,93,65,5,0,24,0,19,0,40,0,19,0,2,93,65,3,0,182,0,24,0,1,93,65,3,0,167,0,24,0,1,93,65,5,0,24,0,24,0,40,0,24,0,2,93,65,5,0,23,0,29,0,39,0,29,0,2,93,65,3,0,169,0,29,0,1,93,65,3,0,186,0,29,0,1,93,65,5,0,22,0,33,0,38,0,33,0,2,93,65,3,0,118,0,33,0,1,93,65,5,0,168,0,34,0,184,0,34,0,2,93,37,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,3,38,35,34,14,2,21,20,30,2,51,50,62,2,53,52,2,31,83,128,64,108,78,43,43,78,108,64,64,108,78,44,153,50,91,46,71,49,25,25,49,71,46,46,71,49,25,69,80,42,76,108,65,65,107,77,42,42,77,107,65,131,1,22,56,29,54,75,45,45,75,54,29,30,53,75,45,91,0,0,0,0,2,255,248,0,0,2,193,2,48,0,15,0,18,1,118,186,0,0,0,1,0,3,43,65,3,0,16,0,0,0,1,93,65,3,0,15,0,0,0,1,113,65,3,0,144,0,0,0,1,93,65,3,0,96,0,0,0,1,93,65,3,0,15,0,1,0,1,113,65,3,0,127,0,1,0,1,93,184,0,1,16,184,0,5,208,65,3,0,170,0,5,0,1,93,65,3,0,26,0,5,0,1,93,65,3,0,38,0,5,0,1,93,185,0,4,0,4,244,184,0,1,16,184,0,16,208,186,0,3,0,4,0,16,17,18,57,65,3,0,250,0,3,0,1,93,184,0,6,208,65,5,0,234,0,6,0,250,0,6,0,2,93,65,7,0,106,0,6,0,122,0,6,0,138,0,6,0,3,93,65,5,0,25,0,6,0,41,0,6,0,2,113,65,3,0,89,0,6,0,1,93,184,0,0,16,184,0,8,208,184,0,8,47,184,0,1,16,185,0,14,0,4,244,184,0,10,208,184,0,0,16,184,0,12,208,184,0,12,47,186,0,18,0,16,0,4,17,18,57,65,3,0,86,0,18,0,1,93,65,3,0,38,0,18,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,16,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,16,0,1,0,6,17,18,57,184,0,16,47,185,0,2,0,2,244,184,0,1,16,184,0,4,208,184,0,6,16,185,0,9,0,2,244,186,0,10,0,6,0,1,17,18,57,184,0,10,47,185,0,13,0,2,244,184,0,1,16,185,0,14,0,2,244,184,0,9,16,184,0,17,208,65,3,0,42,0,17,0,1,113,48,49,41,1,53,35,7,35,1,33,21,33,21,51,21,35,21,33,37,53,7,2,193,254,142,175,74,94,1,34,1,159,254,253,200,200,1,11,254,142,132,138,138,2,48,89,135,88,160,140,241,241,0,2,0,74,0,0,1,227,2,48,0,14,0,23,1,63,186,0,10,0,3,0,3,43,65,3,0,16,0,3,0,1,93,65,3,0,207,0,3,0,1,93,65,3,0,176,0,3,0,1,93,65,3,0,48,0,3,0,1,93,184,0,3,16,185,0,2,0,4,244,65,3,0,48,0,10,0,1,93,65,3,0,176,0,10,0,1,93,65,3,0,112,0,10,0,1,93,65,3,0,16,0,10,0,1,93,65,5,0,16,0,10,0,32,0,10,0,2,113,184,0,17,208,184,0,10,16,185,0,21,0,4,244,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,16,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,186,0,1,0,4,0,2,17,18,57,184,0,1,47,184,0,4,16,185,0,16,0,2,244,184,0,1,16,185,0,17,0,2,244,48,49,1,65,3,0,135,0,7,0,1,93,65,5,0,165,0,8,0,181,0,8,0,2,93,65,3,0,6,0,8,0,1,93,65,3,0,134,0,8,0,1,93,65,3,0,198,0,8,0,1,93,65,3,0,23,0,8,0,1,93,65,3,0,6,0,12,0,1,93,0,65,3,0,134,0,7,0,1,93,65,3,0,134,0,8,0,1,93,65,3,0,198,0,8,0,1,93,65,5,0,7,0,8,0,23,0,8,0,2,93,65,5,0,167,0,8,0,183,0,8,0,2,93,65,3,0,9,0,12,0,1,93,37,35,21,35,17,51,50,30,2,21,20,14,2,3,35,21,51,50,54,53,52,38,1,33,119,96,180,54,86,60,29,36,56,69,62,90,104,60,53,55,188,188,2,48,15,39,68,54,56,75,45,20,1,37,207,51,57,54,45,0,0,0,2,0,39,255,245,2,114,2,59,0,21,0,43,2,248,186,0,19,0,9,0,3,43,65,3,0,224,0,19,0,1,93,65,3,0,32,0,19,0,1,113,65,3,0,0,0,19,0,1,113,65,3,0,176,0,19,0,1,93,65,3,0,128,0,19,0,1,93,65,3,0,111,0,9,0,1,93,65,3,0,15,0,9,0,1,93,65,3,0,159,0,9,0,1,93,65,3,0,79,0,9,0,1,93,65,3,0,128,0,9,0,1,93,186,0,21,0,19,0,9,17,18,57,184,0,21,16,184,0,0,208,184,0,0,47,186,0,2,0,9,0,19,17,18,57,184,0,9,16,185,0,27,0,4,244,184,0,19,16,185,0,39,0,4,244,186,0,34,0,27,0,39,17,18,57,65,3,0,106,0,34,0,1,93,65,3,0,121,0,34,0,1,93,184,0,34,16,184,0,35,208,184,0,35,47,65,3,0,47,0,35,0,1,113,65,3,0,127,0,35,0,1,93,65,5,0,31,0,35,0,47,0,35,0,2,93,186,0,37,0,39,0,27,17,18,57,65,3,0,47,0,45,0,1,93,65,3,0,95,0,45,0,1,93,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,186,0,2,0,4,0,14,17,18,57,184,0,2,16,184,0,1,208,184,0,1,47,186,0,21,0,14,0,4,17,18,57,65,3,0,135,0,21,0,1,93,184,0,14,16,185,0,22,0,2,244,184,0,4,16,185,0,32,0,2,244,186,0,34,0,32,0,22,17,18,57,186,0,37,0,22,0,32,17,18,57,184,0,37,16,184,0,36,208,184,0,36,47,48,49,1,65,5,0,23,0,2,0,39,0,2,0,2,113,65,3,0,137,0,2,0,1,93,65,3,0,136,0,3,0,1,93,65,3,0,137,0,6,0,1,93,65,3,0,137,0,7,0,1,93,65,3,0,138,0,11,0,1,93,65,3,0,133,0,17,0,1,93,65,3,0,19,0,21,0,1,113,65,3,0,36,0,21,0,1,113,65,5,0,20,0,24,0,36,0,24,0,2,93,65,5,0,22,0,29,0,38,0,29,0,2,93,65,3,0,117,0,30,0,1,93,65,3,0,184,0,30,0,1,93,65,3,0,169,0,30,0,1,93,65,3,0,24,0,34,0,1,113,65,3,0,43,0,34,0,1,113,65,3,0,138,0,35,0,1,93,65,3,0,23,0,37,0,1,113,65,3,0,40,0,37,0,1,113,65,3,0,121,0,42,0,1,93,65,5,0,26,0,42,0,42,0,42,0,2,93,0,65,3,0,25,0,2,0,1,113,65,3,0,42,0,2,0,1,113,65,3,0,138,0,3,0,1,93,65,3,0,136,0,7,0,1,93,65,3,0,134,0,11,0,1,93,65,3,0,134,0,16,0,1,93,65,3,0,39,0,21,0,1,113,65,3,0,182,0,24,0,1,93,65,3,0,167,0,24,0,1,93,65,5,0,24,0,24,0,40,0,24,0,2,93,65,3,0,118,0,30,0,1,93,65,5,0,168,0,30,0,184,0,30,0,2,93,65,5,0,24,0,34,0,40,0,34,0,2,113,65,3,0,37,0,36,0,1,113,65,3,0,20,0,37,0,1,113,65,3,0,117,0,37,0,1,93,65,3,0,37,0,37,0,1,113,65,3,0,121,0,42,0,1,93,37,7,39,6,35,34,46,2,53,52,62,2,51,50,30,2,21,20,7,3,34,14,2,21,20,30,2,51,50,55,39,55,23,54,53,52,46,2,2,107,52,57,78,100,64,108,78,43,43,78,108,64,64,108,78,44,59,235,46,71,49,25,25,49,71,46,65,44,80,51,83,33,26,51,73,58,62,44,51,42,76,108,65,65,107,77,42,42,77,107,65,101,80,1,128,29,54,75,45,45,75,54,29,23,60,64,65,46,75,45,75,54,29,0,0,0,0,2,0,74,0,0,2,3,2,48,0,11,0,19,1,143,186,0,9,0,5,0,3,43,65,7,0,16,0,9,0,32,0,9,0,48,0,9,0,3,93,65,3,0,144,0,9,0,1,93,65,3,0,176,0,9,0,1,93,65,3,0,112,0,9,0,1,93,65,3,0,240,0,9,0,1,93,65,5,0,16,0,9,0,32,0,9,0,2,113,65,3,0,16,0,5,0,1,93,65,3,0,175,0,5,0,1,93,65,3,0,48,0,5,0,1,93,65,3,0,176,0,5,0,1,93,65,3,0,144,0,5,0,1,93,186,0,11,0,9,0,5,17,18,57,65,3,0,54,0,11,0,1,93,65,9,0,86,0,11,0,102,0,11,0,118,0,11,0,134,0,11,0,4,93,184,0,11,16,184,0,0,208,65,3,0,70,0,0,0,1,93,184,0,11,16,185,0,2,0,4,244,184,0,1,208,184,0,5,16,185,0,4,0,4,244,184,0,14,208,184,0,9,16,185,0,18,0,4,244,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,1,208,186,0,3,0,7,0,4,17,18,57,184,0,3,47,186,0,11,0,3,0,7,17,18,57,184,0,7,16,185,0,12,0,2,244,184,0,3,16,185,0,14,0,2,244,48,49,1,65,3,0,132,0,8,0,1,93,65,7,0,7,0,8,0,23,0,8,0,39,0,8,0,3,93,65,3,0,133,0,10,0,1,93,65,3,0,118,0,10,0,1,93,65,3,0,122,0,19,0,1,93,0,65,3,0,5,0,8,0,1,93,65,3,0,134,0,8,0,1,93,65,3,0,23,0,8,0,1,93,65,3,0,138,0,10,0,1,93,65,3,0,120,0,19,0,1,93,33,35,39,35,21,35,17,51,50,21,20,7,39,35,21,51,50,54,53,52,2,3,99,128,118,96,204,205,105,112,96,106,52,58,212,212,2,48,162,110,52,247,183,48,45,90,0,0,0,0,1,0,41,255,245,1,221,2,59,0,48,2,215,186,0,44,0,16,0,3,43,65,3,0,47,0,16,0,1,93,65,3,0,111,0,16,0,1,93,65,3,0,15,0,16,0,1,93,65,3,0,79,0,16,0,1,93,65,3,0,16,0,16,0,1,93,65,3,0,48,0,16,0,1,93,65,3,0,80,0,44,0,1,93,65,3,0,176,0,44,0,1,93,65,3,0,208,0,44,0,1,93,65,7,0,112,0,44,0,128,0,44,0,144,0,44,0,3,93,65,3,0,48,0,44,0,1,93,65,3,0,16,0,44,0,1,93,186,0,2,0,16,0,44,17,18,57,184,0,2,47,184,0,44,16,185,0,7,0,4,244,186,0,26,0,44,0,16,17,18,57,184,0,26,47,184,0,16,16,185,0,34,0,4,244,0,184,0,0,69,88,184,0,21,47,27,185,0,21,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,184,0,3,220,65,3,0,32,0,3,0,1,93,184,0,0,16,185,0,5,0,2,244,186,0,11,0,0,0,21,17,18,57,65,3,0,138,0,11,0,1,93,65,7,0,89,0,11,0,105,0,11,0,121,0,11,0,3,93,184,0,21,16,184,0,27,220,65,3,0,47,0,27,0,1,93,65,3,0,144,0,27,0,1,93,184,0,21,16,185,0,29,0,2,244,186,0,37,0,21,0,0,17,18,57,48,49,1,65,3,0,121,0,9,0,1,93,65,3,0,25,0,14,0,1,93,65,3,0,121,0,14,0,1,93,65,3,0,43,0,14,0,1,93,65,3,0,9,0,19,0,1,93,65,13,0,55,0,25,0,71,0,25,0,87,0,25,0,103,0,25,0,119,0,25,0,135,0,25,0,6,93,65,3,0,133,0,36,0,1,93,65,3,0,135,0,39,0,1,93,65,3,0,6,0,41,0,1,93,65,3,0,38,0,41,0,1,93,65,3,0,23,0,41,0,1,93,65,3,0,87,0,41,0,1,93,65,3,0,37,0,42,0,1,93,65,3,0,101,0,42,0,1,93,65,3,0,22,0,42,0,1,93,65,5,0,6,0,47,0,22,0,47,0,2,93,0,65,15,0,58,0,1,0,74,0,1,0,90,0,1,0,106,0,1,0,122,0,1,0,138,0,1,0,154,0,1,0,7,93,65,3,0,43,0,1,0,1,113,65,3,0,28,0,1,0,1,113,65,13,0,58,0,2,0,74,0,2,0,90,0,2,0,106,0,2,0,122,0,2,0,138,0,2,0,6,93,65,3,0,121,0,9,0,1,93,65,3,0,41,0,14,0,1,93,65,3,0,121,0,14,0,1,93,65,3,0,26,0,14,0,1,93,65,3,0,5,0,19,0,1,93,65,13,0,53,0,25,0,69,0,25,0,85,0,25,0,101,0,25,0,117,0,25,0,133,0,25,0,6,93,65,3,0,134,0,39,0,1,93,65,3,0,84,0,41,0,1,93,65,3,0,6,0,41,0,1,93,65,5,0,23,0,41,0,39,0,41,0,2,93,65,3,0,22,0,42,0,1,93,65,3,0,102,0,42,0,1,93,65,3,0,39,0,42,0,1,93,65,3,0,40,0,47,0,1,93,65,5,0,10,0,47,0,26,0,47,0,2,93,23,34,39,55,22,51,50,53,52,46,2,47,1,46,1,53,52,62,2,51,50,30,2,23,7,38,35,34,14,2,21,20,30,2,23,30,3,21,20,14,2,246,129,67,12,71,115,126,29,53,75,46,48,35,47,26,52,81,56,27,55,49,42,15,10,102,70,24,45,34,20,26,53,78,53,23,46,36,23,15,49,91,11,39,107,58,70,24,34,26,23,14,21,15,54,48,31,60,46,28,7,11,15,8,96,50,8,16,26,18,24,26,20,22,20,9,24,35,51,36,24,56,48,32,0,0,0,0,1,0,17,0,0,1,197,2,48,0,7,0,113,187,0,1,0,4,0,4,0,4,43,65,3,0,176,0,1,0,1,93,184,0,1,16,184,0,0,220,65,3,0,176,0,4,0,1,93,184,0,4,16,184,0,5,220,65,3,0,15,0,9,0,1,93,65,3,0,112,0,9,0,1,93,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,16,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,6,16,185,0,5,0,2,244,184,0,1,208,48,49,1,35,17,35,17,35,53,33,1,197,171,94,171,1,180,1,216,254,40,1,216,88,0,0,0,0,1,0,67,255,245,2,48,2,48,0,21,1,39,186,0,18,0,4,0,3,43,65,3,0,175,0,4,0,1,93,65,3,0,223,0,4,0,1,93,65,3,0,16,0,4,0,1,93,184,0,4,16,185,0,5,0,4,244,65,3,0,240,0,18,0,1,93,65,3,0,223,0,18,0,1,93,65,3,0,175,0,18,0,1,93,65,3,0,16,0,18,0,1,93,65,3,0,16,0,18,0,1,113,184,0,18,16,185,0,17,0,4,244,0,184,0,0,69,88,184,0,5,47,27,185,0,5,0,16,62,89,184,0,0,69,88,184,0,0,47,27,185,0,0,0,6,62,89,185,0,11,0,2,244,184,0,5,16,184,0,17,208,48,49,1,65,3,0,88,0,1,0,1,93,65,5,0,55,0,9,0,71,0,9,0,2,93,65,5,0,57,0,13,0,73,0,13,0,2,93,65,3,0,85,0,20,0,1,93,65,3,0,103,0,20,0,1,93,65,5,0,88,0,21,0,104,0,21,0,2,93,0,65,3,0,105,0,1,0,1,93,65,3,0,90,0,1,0,1,93,65,3,0,54,0,9,0,1,93,65,3,0,71,0,9,0,1,93,65,3,0,70,0,13,0,1,93,65,3,0,55,0,13,0,1,93,65,3,0,104,0,20,0,1,93,65,5,0,89,0,21,0,105,0,21,0,2,93,5,34,38,53,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,6,1,58,123,124,93,14,36,59,45,47,60,34,12,93,123,11,133,117,1,65,254,226,46,73,51,27,30,53,72,42,1,30,254,191,118,132,0,0,0,0,1,0,6,0,0,2,42,2,48,0,6,1,51,187,0,1,0,4,0,2,0,4,43,65,3,0,176,0,1,0,1,93,65,3,0,96,0,1,0,1,93,184,0,1,16,184,0,0,208,65,3,0,56,0,0,0,1,93,65,3,0,118,0,0,0,1,93,65,3,0,96,0,2,0,1,93,65,3,0,176,0,2,0,1,93,184,0,2,16,184,0,3,208,65,3,0,121,0,3,0,1,93,65,3,0,55,0,3,0,1,93,185,0,4,0,4,244,186,0,5,0,2,0,1,17,18,57,184,0,0,16,185,0,6,0,4,244,0,184,0,0,69,88,184,0,4,47,27,185,0,4,0,16,62,89,184,0,0,69,88,184,0,2,47,27,185,0,2,0,6,62,89,184,0,5,208,65,3,0,70,0,5,0,1,93,65,5,0,85,0,5,0,101,0,5,0,2,93,184,0,4,16,184,0,6,208,48,49,1,65,13,0,167,0,1,0,183,0,1,0,199,0,1,0,215,0,1,0,231,0,1,0,247,0,1,0,6,93,65,7,0,7,0,1,0,23,0,1,0,39,0,1,0,3,113,65,13,0,168,0,2,0,184,0,2,0,200,0,2,0,216,0,2,0,232,0,2,0,248,0,2,0,6,93,65,7,0,8,0,2,0,24,0,2,0,40,0,2,0,3,113,0,65,3,0,130,0,5,0,1,93,65,3,0,116,0,5,0,1,93,1,3,35,3,51,27,1,2,42,220,106,222,98,177,175,2,48,253,208,2,48,254,70,1,186,0,0,0,1,0,17,0,0,3,54,2,48,0,12,2,97,186,0,10,0,9,0,3,43,65,3,0,175,0,10,0,1,93,65,3,0,39,0,10,0,1,93,65,3,0,16,0,10,0,1,93,184,0,10,16,184,0,1,220,184,0,0,208,65,3,0,103,0,0,0,1,93,65,3,0,6,0,0,0,1,93,184,0,1,16,185,0,2,0,4,244,65,3,0,41,0,2,0,1,93,65,3,0,175,0,9,0,1,93,65,3,0,16,0,9,0,1,93,186,0,3,0,9,0,10,17,18,57,184,0,9,16,184,0,5,220,185,0,4,0,4,244,184,0,5,16,184,0,6,208,65,3,0,9,0,6,0,1,93,65,3,0,104,0,6,0,1,93,185,0,7,0,4,244,186,0,8,0,5,0,4,17,18,57,186,0,11,0,2,0,1,17,18,57,184,0,0,16,185,0,12,0,4,244,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,2,208,184,0,7,16,184,0,9,208,184,0,9,47,184,0,3,208,65,9,0,74,0,3,0,90,0,3,0,106,0,3,0,122,0,3,0,4,93,184,0,4,16,184,0,8,208,65,3,0,70,0,8,0,1,93,65,3,0,85,0,8,0,1,93,65,3,0,37,0,8,0,1,113,184,0,11,208,184,0,7,16,184,0,12,208,48,49,1,65,3,0,69,0,1,0,1,113,65,3,0,246,0,1,0,1,93,65,7,0,6,0,1,0,22,0,1,0,38,0,1,0,3,113,65,3,0,200,0,2,0,1,93,65,7,0,73,0,2,0,89,0,2,0,105,0,2,0,3,93,65,3,0,70,0,4,0,1,93,65,3,0,102,0,4,0,1,93,65,3,0,87,0,4,0,1,93,65,3,0,199,0,4,0,1,93,65,3,0,249,0,5,0,1,93,65,7,0,9,0,5,0,25,0,5,0,41,0,5,0,3,113,65,3,0,74,0,5,0,1,113,65,3,0,135,0,7,0,1,93,65,3,0,135,0,8,0,1,93,65,5,0,232,0,9,0,248,0,9,0,2,93,65,7,0,8,0,9,0,24,0,9,0,40,0,9,0,3,113,65,5,0,231,0,10,0,247,0,10,0,2,93,65,7,0,7,0,10,0,23,0,10,0,39,0,10,0,3,113,65,3,0,136,0,12,0,1,93,0,65,5,0,74,0,3,0,90,0,3,0,2,93,65,3,0,138,0,3,0,1,93,65,3,0,107,0,3,0,1,93,65,3,0,251,0,3,0,1,93,65,7,0,11,0,3,0,27,0,3,0,43,0,3,0,3,113,65,3,0,75,0,3,0,1,113,65,3,0,125,0,3,0,1,93,1,3,35,11,1,35,3,51,27,1,51,27,1,3,54,174,93,136,140,95,167,98,126,141,74,145,123,2,48,253,208,1,148,254,108,2,48,254,87,1,165,254,98,1,162,0,1,0,14,0,0,2,17,2,48,0,11,1,176,187,0,11,0,4,0,5,0,4,43,65,5,0,87,0,11,0,103,0,11,0,2,93,65,3,0,48,0,11,0,1,93,184,0,11,16,184,0,0,208,65,3,0,5,0,0,0,1,113,65,3,0,166,0,0,0,1,93,65,3,0,135,0,0,0,1,93,65,3,0,89,0,0,0,1,93,65,3,0,8,0,0,0,1,93,65,3,0,55,0,0,0,1,93,65,3,0,214,0,0,0,1,93,65,3,0,181,0,0,0,1,93,65,3,0,69,0,0,0,1,93,185,0,1,0,4,244,65,3,0,7,0,1,0,1,113,65,3,0,48,0,5,0,1,93,186,0,2,0,5,0,11,17,18,57,184,0,5,16,184,0,4,208,65,3,0,103,0,4,0,1,93,65,3,0,40,0,4,0,1,113,65,3,0,73,0,4,0,1,93,65,3,0,185,0,4,0,1,93,65,3,0,168,0,4,0,1,93,65,3,0,6,0,4,0,1,93,65,3,0,86,0,4,0,1,93,185,0,3,0,4,244,184,0,4,16,184,0,6,208,184,0,3,16,184,0,7,208,186,0,8,0,5,0,11,17,18,57,184,0,1,16,184,0,9,208,184,0,0,16,184,0,10,208,65,3,0,31,0,13,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,184,0,1,208,186,0,2,0,3,0,7,17,18,57,186,0,8,0,7,0,3,17,18,57,65,3,0,54,0,8,0,1,93,65,3,0,69,0,8,0,1,93,186,0,5,0,8,0,2,17,18,57,184,0,7,16,184,0,9,208,186,0,11,0,2,0,8,17,18,57,48,49,1,65,3,0,119,0,11,0,1,93,0,65,3,0,122,0,2,0,1,93,65,3,0,139,0,2,0,1,93,65,5,0,117,0,8,0,133,0,8,0,2,93,33,35,39,7,35,19,3,51,23,55,51,3,2,17,104,159,149,103,204,200,108,146,148,103,205,214,214,1,23,1,25,205,205,254,242,0,0,0,0,1,0,1,0,0,1,247,2,48,0,8,1,20,187,0,1,0,4,0,4,0,4,43,65,3,0,48,0,1,0,1,93,65,3,0,144,0,1,0,1,93,184,0,1,16,184,0,0,208,65,3,0,9,0,0,0,1,93,65,3,0,89,0,0,0,1,93,65,3,0,135,0,0,0,1,93,65,3,0,70,0,0,0,1,93,65,3,0,144,0,4,0,1,93,65,3,0,48,0,4,0,1,93,184,0,4,16,184,0,5,208,65,3,0,136,0,5,0,1,93,65,3,0,73,0,5,0,1,93,65,3,0,6,0,5,0,1,93,65,3,0,86,0,5,0,1,93,185,0,6,0,4,244,186,0,7,0,4,0,1,17,18,57,184,0,0,16,185,0,8,0,4,244,0,184,0,0,69,88,184,0,6,47,27,185,0,6,0,16,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,186,0,7,0,6,0,3,17,18,57,65,3,0,38,0,7,0,1,93,184,0,6,16,184,0,8,208,48,49,65,3,0,132,0,7,0,1,93,65,7,0,85,0,7,0,101,0,7,0,117,0,7,0,3,93,65,3,0,246,0,7,0,1,93,65,7,0,6,0,7,0,22,0,7,0,38,0,7,0,3,113,1,3,21,35,53,3,51,23,55,1,247,203,96,203,99,152,152,2,48,254,204,252,252,1,52,225,225,0,0,0,0,1,0,15,0,0,1,212,2,48,0,7,1,79,186,0,2,0,6,0,3,43,65,3,0,64,0,2,0,1,93,65,3,0,223,0,2,0,1,93,65,3,0,176,0,2,0,1,93,65,3,0,96,0,2,0,1,93,184,0,2,16,184,0,0,208,184,0,6,16,184,0,4,208,184,0,1,208,65,3,0,99,0,1,0,1,93,65,3,0,36,0,1,0,1,113,65,3,0,85,0,1,0,1,113,65,3,0,70,0,1,0,1,113,65,3,0,154,0,1,0,1,93,65,3,0,246,0,1,0,1,93,65,5,0,5,0,1,0,21,0,1,0,2,113,65,5,0,68,0,1,0,84,0,1,0,2,93,65,3,0,114,0,1,0,1,93,65,3,0,128,0,1,0,1,93,184,0,0,16,184,0,5,208,65,3,0,249,0,5,0,1,93,65,3,0,90,0,5,0,1,113,65,3,0,43,0,5,0,1,113,65,3,0,108,0,5,0,1,93,65,3,0,143,0,5,0,1,93,65,3,0,125,0,5,0,1,93,65,3,0,91,0,5,0,1,93,65,3,0,74,0,5,0,1,93,65,5,0,10,0,5,0,26,0,5,0,2,113,65,3,0,73,0,5,0,1,113,65,3,0,149,0,5,0,1,93,65,3,0,47,0,9,0,1,93,0,184,0,0,69,88,184,0,7,47,27,185,0,7,0,16,62,89,184,0,0,69,88,184,0,3,47,27,185,0,3,0,6,62,89,185,0,2,0,2,244,184,0,7,16,185,0,6,0,2,244,48,49,9,1,33,21,33,1,33,53,1,212,254,213,1,5,254,97,1,43,254,251,2,48,254,40,88,1,216,88,0,0,0,0,2,0,39,255,245,3,116,2,59,0,26,0,45,2,173,186,0,0,0,1,0,3,43,65,3,0,95,0,0,0,1,93,65,5,0,0,0,0,0,16,0,0,0,2,93,65,3,0,176,0,0,0,1,93,65,5,0,0,0,1,0,16,0,1,0,2,93,65,3,0,255,0,1,0,1,93,65,3,0,95,0,1,0,1,93,65,3,0,176,0,1,0,1,93,65,3,0,144,0,1,0,1,93,184,0,1,16,184,0,9,220,65,3,0,159,0,9,0,1,93,65,3,0,191,0,9,0,1,93,65,3,0,127,0,9,0,1,93,65,5,0,15,0,9,0,31,0,9,0,2,93,184,0,1,16,184,0,16,208,184,0,0,16,184,0,19,208,184,0,19,47,184,0,1,16,185,0,25,0,4,244,184,0,21,208,186,0,23,0,0,0,1,17,18,57,184,0,23,47,184,0,9,16,185,0,34,0,4,244,184,0,1,16,184,0,44,208,65,5,0,121,0,44,0,137,0,44,0,2,93,0,184,0,0,69,88,184,0,14,47,27,185,0,14,0,16,62,89,184,0,0,69,88,184,0,17,47,27,185,0,17,0,16,62,89,184,0,0,69,88,184,0,4,47,27,185,0,4,0,6,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,186,0,2,0,4,0,14,17,18,57,65,5,0,27,0,2,0,43,0,2,0,2,113,65,5,0,58,0,2,0,74,0,2,0,2,113,186,0,16,0,14,0,4,17,18,57,65,9,0,20,0,16,0,36,0,16,0,52,0,16,0,68,0,16,0,4,113,184,0,17,16,185,0,20,0,2,244,186,0,21,0,17,0,1,17,18,57,184,0,21,47,185,0,24,0,2,244,184,0,1,16,185,0,25,0,2,244,184,0,14,16,185,0,29,0,2,244,184,0,4,16,185,0,39,0,2,244,48,49,1,65,3,0,136,0,6,0,1,93,65,3,0,138,0,7,0,1,93,65,3,0,137,0,11,0,1,93,65,3,0,136,0,12,0,1,93,65,3,0,56,0,15,0,1,93,65,3,0,41,0,27,0,1,93,65,3,0,137,0,27,0,1,93,65,3,0,169,0,27,0,1,93,65,3,0,38,0,31,0,1,93,65,3,0,39,0,37,0,1,93,65,3,0,40,0,41,0,1,93,65,3,0,136,0,41,0,1,93,65,3,0,168,0,41,0,1,93,65,3,0,169,0,42,0,1,93,0,65,3,0,73,0,3,0,1,93,65,3,0,58,0,3,0,1,93,65,3,0,137,0,6,0,1,93,65,3,0,136,0,7,0,1,93,65,3,0,134,0,11,0,1,93,65,3,0,134,0,12,0,1,93,65,3,0,51,0,15,0,1,93,65,3,0,69,0,15,0,1,93,65,3,0,168,0,27,0,1,93,65,3,0,41,0,27,0,1,93,65,3,0,137,0,27,0,1,93,65,3,0,40,0,31,0,1,93,65,3,0,38,0,37,0,1,93,65,3,0,38,0,41,0,1,93,65,3,0,134,0,41,0,1,93,65,3,0,166,0,41,0,1,93,41,1,53,6,35,34,46,2,53,52,62,2,51,50,23,53,33,21,33,21,51,21,35,21,33,1,38,35,34,14,2,21,20,30,2,51,50,62,2,53,52,3,116,254,153,98,98,64,106,77,43,43,77,106,64,98,98,1,95,254,254,199,199,1,10,254,97,48,92,46,71,48,25,25,48,71,46,46,71,48,24,52,63,42,76,108,65,65,107,77,42,63,52,88,136,88,160,1,83,56,29,54,75,45,45,75,54,29,30,53,75,45,92,0,0,0,1,0,74,0,0,1,172,2,48,0,5,0,124,186,0,5,0,1,0,3,43,65,3,0,16,0,1,0,1,93,65,3,0,175,0,1,0,1,93,65,3,0,176,0,1,0,1,93,65,3,0,144,0,1,0,1,93,184,0,1,16,185,0,4,0,4,244,65,3,0,144,0,5,0,1,93,65,3,0,16,0,5,0,1,93,65,3,0,176,0,5,0,1,93,0,184,0,0,69,88,184,0,2,47,27,185,0,2,0,16,62,89,184,0,0,69,88,184,0,1,47,27,185,0,1,0,6,62,89,185,0,4,0,2,244,48,49,41,1,17,51,17,33,1,172,254,158,93,1,5,2,48,254,40,0,0,1,0,0,0,1,1,72,59,245,254,62,95,15,60,245,0,31,3,232,0,0,0,0,202,233,78,152,0,0,0,0,202,233,79,52,255,217,255,6,4,141,3,196,0,0,0,9,0,2,0,0,0,0,0,0,0,1,0,0,3,197,255,6,0,0,4,177,255,217,255,213,4,141,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,13,0,250,0,72,0,225,0,0,0,242,0,59,1,146,0,40,2,192,0,33,2,2,0,42,3,72,0,35,2,99,0,36,0,182,0,41,1,5,0,42,1,5,0,24,1,170,0,33,1,207,0,46,0,216,0,57,1,168,0,57,0,204,0,57,2,20,0,19,2,202,0,63,1,99,0,34,2,12,0,50,2,35,0,40,2,47,0,14,2,29,0,51,2,56,0,62,1,246,0,39,2,97,0,59,2,58,0,45,0,204,0,57,0,216,0,57,1,149,0,33,1,246,0,66,1,148,0,60,1,185,0,30,2,210,0,49,2,104,0,7,2,85,0,80,2,104,0,39,2,215,0,80,2,42,0,80,2,11,0,80,2,160,0,39,2,234,0,80,0,255,0,80,0,255,255,239,2,65,0,80,1,245,0,80,3,44,0,48,2,192,0,80,3,0,0,39,2,60,0,80,3,0,0,39,2,91,0,80,2,72,0,40,2,21,0,15,2,212,0,72,2,132,0,4,3,203,0,14,2,87,0,9,2,55,255,253,2,37,0,9,1,71,0,70,2,13,0,35,1,71,0,0,1,255,0,49,2,54,0,3,1,47,0,58,1,224,0,24,2,43,0,60,1,198,0,33,2,43,0,32,2,0,0,31,1,75,0,10,1,242,0,26,2,30,0,60,0,212,0,61,0,212,255,244,1,192,0,60,0,236,0,60,3,109,0,61,2,47,0,61,2,38,0,32,2,45,0,61,2,45,0,33,1,65,0,61,1,158,0,32,1,81,0,18,2,12,0,56,1,236,0,9,2,213,0,12,1,218,0,11,1,249,0,7,1,215,0,22,1,43,0,19,0,229,0,70,1,43,0,2,1,199,0,54,0,225,0,0,0,224,0,50,1,221,0,34,1,244,0,34,2,114,0,61,2,162,0,30,0,232,0,72,1,200,0,37,1,166,0,87,2,208,0,49,1,93,0,33,2,51,0,15,2,84,0,66,1,168,0,57,2,208,0,49,1,77,0,34,1,242,0,64,1,48,0,25,1,54,0,19,1,47,0,58,2,79,0,73,2,110,0,33,0,238,0,57,1,47,0,144,0,216,0,23,1,114,0,33,2,51,0,41,2,205,0,39,2,217,0,36,3,117,0,32,1,193,0,62,2,104,0,7,2,104,0,7,2,104,0,7,2,104,0,7,2,104,0,7,2,104,0,7,3,97,255,249,2,104,0,39,2,42,0,80,2,42,0,80,2,42,0,80,2,42,0,80,0,255,0,35,0,255,0,36,0,255,255,240,0,255,0,5,2,215,255,245,2,192,0,80,3,0,0,39,3,0,0,39,3,0,0,39,3,0,0,39,3,0,0,39,1,183,0,61,3,0,0,39,2,214,0,72,2,214,0,72,2,214,0,72,2,214,0,72,2,55,255,253,2,58,0,80,2,45,0,16,1,224,0,24,1,224,0,24,1,224,0,24,1,224,0,24,1,224,0,24,1,224,0,24,3,30,0,22,1,198,0,33,2,0,0,31,2,0,0,31,2,0,0,31,2,0,0,31,0,212,0,13,0,212,0,14,0,212,255,217,0,212,255,239,2,5,0,28,2,47,0,61,2,38,0,32,2,38,0,32,2,38,0,32,2,38,0,32,2,38,0,32,2,80,0,66,2,58,0,33,2,12,0,56,2,12,0,56,2,12,0,56,2,12,0,56,1,249,0,7,2,68,0,60,1,249,0,7,2,104,0,39,1,198,0,33,0,212,0,61,4,47,0,40,3,134,0,32,2,72,0,40,1,158,0,32,2,55,255,253,2,37,0,9,1,215,0,22,1,95,255,222,0,212,255,244,1,190,0,76,1,190,0,76,1,36,0,42,2,16,0,92,1,246,0,57,2,82,0,57,0,186,0,43,0,169,0,42,0,216,0,57,1,140,0,43,1,123,0,42,1,190,0,57,1,168,0,35,1,204,0,53,1,50,0,44,2,164,0,57,4,177,0,36,1,66,0,14,1,67,0,41,1,151,0,33,1,74,0,5,1,51,0,24,1,66,0,32,1,34,0,23,1,90,0,31,1,68,0,22,1,175,0,45,0,237,0,38,1,76,0,38,1,81,0,32,1,101,0,18,1,76,0,35,1,91,0,45,1,76,0,42,1,116,0,44,1,90,0,32,2,191,0,33,2,215,0,31,2,22,0,74,2,25,0,39,2,117,0,74,1,234,0,74,1,203,0,74,2,71,0,39,2,134,0,74,0,241,0,74,0,241,255,254,2,13,0,74,2,22,0,8,2,200,0,46,2,102,0,74,2,153,0,39,2,230,255,248,1,254,0,74,2,153,0,39,2,25,0,74,1,255,0,41,1,214,0,17,2,115,0,67,2,49,0,6,3,67,0,17,2,28,0,14,1,248,0,1,1,227,0,15,3,153,0,39,1,184,0,74,0,0,0,1,0,0,248,0,0,1,41,83,192,0,0,13,55,242,0,3,0,7,255,248,0,3,0,13,255,146,0,3,0,14,255,234,0,3,0,15,255,146,0,3,0,16,255,220,0,3,0,21,255,237,0,3,0,23,255,245,0,3,0,33,255,234,0,3,0,34,255,213,0,3,0,46,255,238,0,3,0,66,255,243,0,3,0,68,255,236,0,3,0,69,255,236,0,3,0,70,255,236,0,3,0,72,255,241,0,3,0,80,255,236,0,3,0,82,255,236,0,3,0,84,255,244,0,3,0,107,255,241,0,3,0,127,255,213,0,3,0,128,255,213,0,3,0,129,255,213,0,3,0,130,255,213,0,3,0,131,255,213,0,3,0,132,255,213,0,3,0,133,255,203,0,3,0,159,255,243,0,3,0,160,255,243,0,3,0,161,255,243,0,3,0,162,255,243,0,3,0,163,255,243,0,3,0,164,255,243,0,3,0,165,255,243,0,3,0,166,255,236,0,3,0,167,255,236,0,3,0,168,255,236,0,3,0,169,255,236,0,3,0,170,255,236,0,3,0,173,0,29,0,3,0,175,255,237,0,3,0,177,255,236,0,3,0,178,255,236,0,3,0,179,255,236,0,3,0,180,255,236,0,3,0,181,255,236,0,3,0,183,255,236,0,3,0,195,255,236,0,3,0,197,255,244,0,3,0,207,255,234,0,3,0,208,255,234,0,3,0,211,255,146,0,3,0,214,255,146,0,3,0,218,255,146,0,3,0,220,255,241,0,7,0,3,255,210,0,7,0,8,255,210,0,7,0,53,255,202,0,7,0,55,255,217,0,7,0,56,255,233,0,7,0,58,255,203,0,7,0,71,255,242,0,7,0,77,255,251,0,7,0,85,255,235,0,7,0,86,255,250,0,7,0,87,255,243,0,7,0,88,255,247,0,7,0,90,255,240,0,7,0,156,255,203,0,7,0,158,255,243,0,7,0,184,255,250,0,7,0,185,255,250,0,7,0,186,255,250,0,7,0,187,255,250,0,7,0,188,255,240,0,7,0,190,255,240,0,7,0,198,255,203,0,7,0,210,255,210,0,7,0,213,255,210,0,8,0,173,0,29,0,9,0,17,255,230,0,9,0,21,255,234,0,9,0,23,255,229,0,9,0,25,255,237,0,9,0,26,255,245,0,9,0,35,255,243,0,9,0,36,255,229,0,9,0,37,255,243,0,9,0,38,255,243,0,9,0,39,255,243,0,9,0,40,255,229,0,9,0,41,255,243,0,9,0,42,255,243,0,9,0,43,0,22,0,9,0,44,255,243,0,9,0,45,255,243,0,9,0,46,255,239,0,9,0,47,255,243,0,9,0,48,255,229,0,9,0,49,255,243,0,9,0,50,255,229,0,9,0,51,255,243,0,9,0,52,255,245,0,9,0,54,255,243,0,9,0,66,255,231,0,9,0,68,255,224,0,9,0,69,255,224,0,9,0,70,255,224,0,9,0,71,255,239,0,9,0,72,255,232,0,9,0,78,255,233,0,9,0,79,255,233,0,9,0,80,255,224,0,9,0,81,255,233,0,9,0,82,255,224,0,9,0,83,255,233,0,9,0,84,255,233,0,9,0,85,255,231,0,9,0,86,255,227,0,9,0,87,255,231,0,9,0,88,255,232,0,9,0,90,255,231,0,9,0,91,255,247,0,9,0,134,255,229,0,9,0,135,255,243,0,9,0,136,255,243,0,9,0,137,255,243,0,9,0,138,255,243,0,9,0,139,255,243,0,9,0,140,255,243,0,9,0,141,255,243,0,9,0,142,255,243,0,9,0,143,255,243,0,9,0,144,255,243,0,9,0,145,255,229,0,9,0,146,255,229,0,9,0,147,255,229,0,9,0,148,255,229,0,9,0,149,255,229,0,9,0,151,255,229,0,9,0,152,255,243,0,9,0,153,255,243,0,9,0,154,255,243,0,9,0,155,255,243,0,9,0,157,255,243,0,9,0,158,255,236,0,9,0,159,255,231,0,9,0,160,255,231,0,9,0,161,255,231,0,9,0,162,255,231,0,9,0,163,255,231,0,9,0,164,255,231,0,9,0,165,255,231,0,9,0,166,255,224,0,9,0,167,255,224,0,9,0,168,255,224,0,9,0,169,255,224,0,9,0,170,255,224,0,9,0,175,255,232,0,9,0,176,255,233,0,9,0,177,255,224,0,9,0,178,255,224,0,9,0,179,255,224,0,9,0,180,255,224,0,9,0,181,255,224,0,9,0,183,255,224,0,9,0,184,255,227,0,9,0,185,255,227,0,9,0,186,255,227,0,9,0,187,255,227,0,9,0,188,255,231,0,9,0,189,255,233,0,9,0,190,255,231,0,9,0,194,255,229,0,9,0,195,255,224,0,9,0,196,255,245,0,9,0,197,255,244,0,9,0,200,255,247,0,11,0,46,255,238,0,11,0,53,0,11,0,11,0,55,0,16,0,11,0,56,0,9,0,11,0,72,255,238,0,11,0,133,255,203,0,11,0,171,0,16,0,11,0,172,0,12,0,11,0,173,0,65,0,11,0,174,0,43,0,11,0,175,255,232,0,12,0,18,255,229,0,12,0,19,255,218,0,12,0,20,255,238,0,12,0,24,255,216,0,13,0,3,255,146,0,13,0,8,255,146,0,13,0,17,255,239,0,13,0,18,255,242,0,13,0,209,255,124,0,13,0,210,255,121,0,13,0,212,255,124,0,13,0,213,255,121,0,14,0,3,255,234,0,14,0,8,255,234,0,14,0,52,255,243,0,14,0,53,255,216,0,14,0,55,255,238,0,14,0,56,255,248,0,14,0,57,255,242,0,14,0,58,255,222,0,14,0,59,255,237,0,14,0,71,255,247,0,14,0,85,255,248,0,14,0,89,255,247,0,14,0,91,255,231,0,14,0,156,255,222,0,14,0,158,255,248,0,14,0,196,255,243,0,14,0,198,255,222,0,14,0,199,255,237,0,14,0,200,255,231,0,14,0,210,255,193,0,14,0,213,255,193,0,15,0,3,255,146,0,15,0,8,255,146,0,15,0,17,255,239,0,15,0,18,255,242,0,15,0,36,255,242,0,15,0,40,255,242,0,15,0,48,255,242,0,15,0,50,255,242,0,15,0,53,255,214,0,15,0,54,255,243,0,15,0,55,255,213,0,15,0,56,255,226,0,15,0,58,255,215,0,15,0,71,255,241,0,15,0,85,255,239,0,15,0,87,255,227,0,15,0,88,255,236,0,15,0,90,255,222,0,15,0,134,255,242,0,15,0,145,255,242,0,15,0,146,255,242,0,15,0,147,255,242,0,15,0,148,255,242,0,15,0,149,255,242,0,15,0,151,255,242,0,15,0,152,255,243,0,15,0,153,255,243,0,15,0,154,255,243,0,15,0,155,255,243,0,15,0,156,255,215,0,15,0,158,255,243,0,15,0,188,255,222,0,15,0,190,255,222,0,15,0,194,255,242,0,15,0,198,255,215,0,15,0,209,255,124,0,15,0,210,255,121,0,15,0,212,255,124,0,15,0,213,255,121,0,16,0,16,255,197,0,16,0,17,255,246,0,16,0,21,255,217,0,16,0,23,255,228,0,16,0,34,255,208,0,16,0,36,255,243,0,16,0,40,255,243,0,16,0,46,255,237,0,16,0,48,255,243,0,16,0,50,255,243,0,16,0,58,0,7,0,16,0,66,255,218,0,16,0,68,255,214,0,16,0,69,255,214,0,16,0,70,255,214,0,16,0,72,255,218,0,16,0,78,255,228,0,16,0,79,255,228,0,16,0,80,255,214,0,16,0,81,255,228,0,16,0,82,255,214,0,16,0,83,255,228,0,16,0,84,255,221,0,16,0,86,255,230,0,16,0,91,255,241,0,16,0,127,255,208,0,16,0,128,255,208,0,16,0,129,255,208,0,16,0,130,255,208,0,16,0,131,255,208,0,16,0,132,255,208,0,16,0,133,255,202,0,16,0,134,255,243,0,16,0,145,255,243,0,16,0,146,255,243,0,16,0,147,255,243,0,16,0,148,255,243,0,16,0,149,255,243,0,16,0,151,255,243,0,16,0,156,0,7,0,16,0,159,255,218,0,16,0,160,255,218,0,16,0,161,255,218,0,16,0,162,255,218,0,16,0,163,255,218,0,16,0,164,255,218,0,16,0,165,255,218,0,16,0,166,255,214,0,16,0,167,255,214,0,16,0,168,255,214,0,16,0,169,255,214,0,16,0,170,255,214,0,16,0,173,0,13,0,16,0,174,0,14,0,16,0,175,255,234,0,16,0,176,255,228,0,16,0,177,255,214,0,16,0,178,255,214,0,16,0,179,255,214,0,16,0,180,255,214,0,16,0,181,255,214,0,16,0,183,255,214,0,16,0,184,255,230,0,16,0,185,255,230,0,16,0,186,255,230,0,16,0,187,255,230,0,16,0,189,255,228,0,16,0,194,255,243,0,16,0,195,255,214,0,16,0,197,255,231,0,16,0,198,0,7,0,16,0,200,255,241,0,17,0,10,255,230,0,17,0,13,255,238,0,17,0,15,255,238,0,17,0,16,255,243,0,17,0,24,255,245,0,17,0,34,255,246,0,17,0,53,255,236,0,17,0,55,255,246,0,17,0,57,255,246,0,17,0,58,255,233,0,17,0,59,255,241,0,17,0,61,255,248,0,17,0,62,255,237,0,17,0,94,255,240,0,17,0,127,255,246,0,17,0,128,255,246,0,17,0,129,255,246,0,17,0,130,255,246,0,17,0,131,255,246,0,17,0,132,255,246,0,17,0,156,255,233,0,17,0,198,255,233,0,17,0,199,255,241,0,17,0,218,255,238,0,18,0,10,255,245,0,18,0,12,255,248,0,19,0,12,255,239,0,20,0,10,255,239,0,21,0,3,255,244,0,21,0,8,255,244,0,21,0,10,255,235,0,21,0,13,255,240,0,21,0,15,255,241,0,21,0,53,255,238,0,21,0,55,255,244,0,21,0,56,255,245,0,21,0,58,255,242,0,21,0,59,255,248,0,21,0,61,255,247,0,21,0,91,255,247,0,21,0,111,255,245,0,21,0,156,255,242,0,21,0,198,255,242,0,21,0,199,255,248,0,21,0,200,255,247,0,21,0,218,255,241,0,23,0,10,255,239,0,23,0,18,255,248,0,23,0,24,255,248,0,23,0,53,255,231,0,23,0,55,255,240,0,23,0,56,255,244,0,23,0,58,255,235,0,23,0,61,255,244,0,23,0,90,255,247,0,23,0,111,255,245,0,23,0,156,255,235,0,23,0,188,255,247,0,23,0,190,255,247,0,23,0,198,255,235,0,24,0,4,255,228,0,24,0,12,255,220,0,24,0,13,255,217,0,24,0,15,255,217,0,24,0,16,255,200,0,24,0,17,255,247,0,24,0,21,255,221,0,24,0,23,255,232,0,24,0,34,255,210,0,24,0,36,255,246,0,24,0,40,255,246,0,24,0,46,255,236,0,24,0,48,255,246,0,24,0,50,255,246,0,24,0,53,0,17,0,24,0,55,0,30,0,24,0,56,0,19,0,24,0,57,0,22,0,24,0,58,0,33,0,24,0,62,0,25,0,24,0,66,255,223,0,24,0,68,255,218,0,24,0,69,255,218,0,24,0,70,255,218,0,24,0,72,255,222,0,24,0,78,255,232,0,24,0,79,255,232,0,24,0,80,255,218,0,24,0,81,255,232,0,24,0,82,255,218,0,24,0,83,255,232,0,24,0,84,255,224,0,24,0,86,255,233,0,24,0,91,255,245,0,24,0,94,0,28,0,24,0,127,255,210,0,24,0,128,255,210,0,24,0,129,255,210,0,24,0,130,255,210,0,24,0,131,255,210,0,24,0,132,255,210,0,24,0,134,255,246,0,24,0,145,255,246,0,24,0,146,255,246,0,24,0,147,255,246,0,24,0,148,255,246,0,24,0,149,255,246,0,24,0,151,255,246,0,24,0,156,0,33,0,24,0,159,255,223,0,24,0,160,255,223,0,24,0,161,255,223,0,24,0,162,255,223,0,24,0,163,255,223,0,24,0,164,255,223,0,24,0,165,255,223,0,24,0,166,255,218,0,24,0,167,255,218,0,24,0,168,255,218,0,24,0,169,255,218,0,24,0,170,255,218,0,24,0,176,255,232,0,24,0,177,255,218,0,24,0,178,255,218,0,24,0,179,255,218,0,24,0,180,255,218,0,24,0,181,255,218,0,24,0,183,255,218,0,24,0,184,255,233,0,24,0,185,255,233,0,24,0,186,255,233,0,24,0,187,255,233,0,24,0,189,255,232,0,24,0,194,255,246,0,24,0,195,255,218,0,24,0,197,255,224,0,24,0,198,0,33,0,24,0,200,255,245,0,24,0,218,255,217,0,25,0,10,255,238,0,25,0,53,255,248,0,25,0,58,255,246,0,25,0,156,255,246,0,25,0,198,255,246,0,26,0,10,255,236,0,26,0,13,255,234,0,26,0,15,255,234,0,26,0,16,255,225,0,26,0,34,255,232,0,26,0,46,255,246,0,26,0,59,255,246,0,26,0,127,255,232,0,26,0,128,255,232,0,26,0,129,255,232,0,26,0,130,255,232,0,26,0,131,255,232,0,26,0,132,255,232,0,26,0,199,255,246,0,26,0,218,255,234,0,30,0,19,255,246,0,30,0,24,255,238,0,33,0,3,255,247,0,33,0,8,255,247,0,33,0,53,255,203,0,33,0,55,255,227,0,33,0,56,255,236,0,33,0,57,255,240,0,33,0,58,255,211,0,33,0,59,255,236,0,33,0,156,255,211,0,33,0,198,255,211,0,33,0,199,255,236,0,33,0,210,255,236,0,33,0,213,255,236,0,34,0,3,255,213,0,34,0,8,255,213,0,34,0,11,255,212,0,34,0,18,255,239,0,34,0,26,255,242,0,34,0,32,255,239,0,34,0,36,255,245,0,34,0,40,255,245,0,34,0,48,255,245,0,34,0,50,255,245,0,34,0,53,255,202,0,34,0,54,255,240,0,34,0,55,255,207,0,34,0,56,255,219,0,34,0,58,255,192,0,34,0,61,255,208,0,34,0,68,255,245,0,34,0,69,255,245,0,34,0,70,255,245,0,34,0,71,255,241,0,34,0,72,255,248,0,34,0,77,255,249,0,34,0,80,255,245,0,34,0,82,255,245,0,34,0,85,255,229,0,34,0,86,255,244,0,34,0,87,255,221,0,34,0,88,255,228,0,34,0,90,255,217,0,34,0,94,255,246,0,34,0,107,255,247,0,34,0,110,255,241,0,34,0,134,255,245,0,34,0,145,255,245,0,34,0,146,255,245,0,34,0,147,255,245,0,34,0,148,255,245,0,34,0,149,255,245,0,34,0,151,255,245,0,34,0,152,255,240,0,34,0,153,255,240,0,34,0,154,255,240,0,34,0,155,255,240,0,34,0,156,255,192,0,34,0,158,255,242,0,34,0,166,255,245,0,34,0,167,255,245,0,34,0,168,255,245,0,34,0,169,255,245,0,34,0,170,255,245,0,34,0,175,255,250,0,34,0,177,255,245,0,34,0,178,255,245,0,34,0,179,255,245,0,34,0,180,255,245,0,34,0,181,255,245,0,34,0,183,255,245,0,34,0,184,255,244,0,34,0,185,255,244,0,34,0,186,255,244,0,34,0,187,255,244,0,34,0,188,255,217,0,34,0,190,255,217,0,34,0,194,255,245,0,34,0,195,255,245,0,34,0,198,255,192,0,34,0,209,255,205,0,34,0,210,255,204,0,34,0,212,255,205,0,34,0,213,255,204,0,34,0,220,255,247,0,34,0,240,255,212,0,35,0,10,255,231,0,35,0,11,255,247,0,35,0,19,255,247,0,35,0,24,255,243,0,35,0,32,255,240,0,35,0,52,255,251,0,35,0,53,255,228,0,35,0,55,255,240,0,35,0,56,255,245,0,35,0,57,255,241,0,35,0,58,255,229,0,35,0,59,255,248,0,35,0,61,255,241,0,35,0,62,255,227,0,35,0,67,255,250,0,35,0,71,255,242,0,35,0,72,255,249,0,35,0,73,255,250,0,35,0,74,255,250,0,35,0,75,255,250,0,35,0,76,255,250,0,35,0,77,255,250,0,35,0,78,255,250,0,35,0,79,255,250,0,35,0,81,255,250,0,35,0,83,255,250,0,35,0,84,255,251,0,35,0,85,255,239,0,35,0,86,255,251,0,35,0,87,255,239,0,35,0,88,255,243,0,35,0,89,255,234,0,35,0,90,255,236,0,35,0,91,255,242,0,35,0,94,255,231,0,35,0,133,255,248,0,35,0,156,255,229,0,35,0,158,255,242,0,35,0,171,255,250,0,35,0,172,255,250,0,35,0,173,255,250,0,35,0,174,255,250,0,35,0,176,255,250,0,35,0,184,255,251,0,35,0,185,255,251,0,35,0,186,255,251,0,35,0,187,255,251,0,35,0,188,255,236,0,35,0,189,255,250,0,35,0,190,255,236,0,35,0,193,255,250,0,35,0,196,255,251,0,35,0,197,255,251,0,35,0,198,255,229,0,35,0,199,255,248,0,35,0,200,255,242,0,35,0,240,255,244,0,36,0,14,255,195,0,36,0,21,255,207,0,36,0,36,255,242,0,36,0,40,255,242,0,36,0,48,255,242,0,36,0,50,255,242,0,36,0,68,255,242,0,36,0,69,255,242,0,36,0,70,255,242,0,36,0,71,255,249,0,36,0,72,255,241,0,36,0,78,255,249,0,36,0,79,255,249,0,36,0,80,255,242,0,36,0,81,255,249,0,36,0,82,255,242,0,36,0,83,255,249,0,36,0,85,255,249,0,36,0,86,255,241,0,36,0,87,255,249,0,36,0,88,255,250,0,36,0,90,255,249,0,36,0,107,255,226,0,36,0,134,255,242,0,36,0,145,255,242,0,36,0,146,255,242,0,36,0,147,255,242,0,36,0,148,255,242,0,36,0,149,255,242,0,36,0,151,255,242,0,36,0,158,255,250,0,36,0,166,255,242,0,36,0,167,255,242,0,36,0,168,255,242,0,36,0,169,255,242,0,36,0,170,255,242,0,36,0,173,0,31,0,36,0,174,0,12,0,36,0,175,255,249,0,36,0,176,255,249,0,36,0,177,255,242,0,36,0,178,255,242,0,36,0,179,255,242,0,36,0,180,255,242,0,36,0,181,255,242,0,36,0,183,255,242,0,36,0,184,255,241,0,36,0,185,255,241,0,36,0,186,255,241,0,36,0,187,255,241,0,36,0,188,255,249,0,36,0,189,255,249,0,36,0,190,255,249,0,36,0,194,255,242,0,36,0,195,255,242,0,36,0,207,255,195,0,36,0,208,255,195,0,36,0,220,255,226,0,37,0,10,255,228,0,37,0,13,255,241,0,37,0,15,255,242,0,37,0,16,255,237,0,37,0,20,255,248,0,37,0,24,255,240,0,37,0,32,255,237,0,37,0,34,255,244,0,37,0,46,255,250,0,37,0,53,255,228,0,37,0,55,255,243,0,37,0,56,255,248,0,37,0,57,255,225,0,37,0,58,255,227,0,37,0,59,255,235,0,37,0,61,255,244,0,37,0,62,255,224,0,37,0,66,255,248,0,37,0,67,255,249,0,37,0,68,255,250,0,37,0,69,255,250,0,37,0,70,255,250,0,37,0,72,255,250,0,37,0,73,255,249,0,37,0,74,255,249,0,37,0,75,255,249,0,37,0,76,255,249,0,37,0,77,255,249,0,37,0,78,255,249,0,37,0,79,255,249,0,37,0,80,255,250,0,37,0,81,255,249,0,37,0,82,255,250,0,37,0,83,255,249,0,37,0,84,255,250,0,37,0,86,255,250,0,37,0,89,255,244,0,37,0,91,255,250,0,37,0,94,255,229,0,37,0,127,255,244,0,37,0,128,255,244,0,37,0,129,255,244,0,37,0,130,255,244,0,37,0,131,255,244,0,37,0,132,255,244,0,37,0,133,255,226,0,37,0,156,255,227,0,37,0,158,255,250,0,37,0,159,255,248,0,37,0,160,255,248,0,37,0,161,255,248,0,37,0,162,255,248,0,37,0,163,255,248,0,37,0,164,255,248,0,37,0,165,255,248,0,37,0,166,255,250,0,37,0,167,255,250,0,37,0,168,255,250,0,37,0,169,255,250,0,37,0,170,255,250,0,37,0,171,255,249,0,37,0,172,255,249,0,37,0,173,255,249,0,37,0,174,255,249,0,37,0,175,255,249,0,37,0,176,255,249,0,37,0,177,255,250,0,37,0,178,255,250,0,37,0,179,255,250,0,37,0,180,255,250,0,37,0,181,255,250,0,37,0,183,255,250,0,37,0,184,255,250,0,37,0,185,255,250,0,37,0,186,255,250,0,37,0,187,255,250,0,37,0,189,255,249,0,37,0,193,255,249,0,37,0,195,255,250,0,37,0,197,255,250,0,37,0,198,255,227,0,37,0,199,255,235,0,37,0,200,255,250,0,37,0,210,255,247,0,37,0,211,255,241,0,37,0,213,255,247,0,37,0,214,255,241,0,37,0,218,255,242,0,37,0,240,255,246,0,38,0,14,255,244,0,38,0,21,255,220,0,38,0,36,255,245,0,38,0,40,255,245,0,38,0,48,255,245,0,38,0,50,255,245,0,38,0,68,255,240,0,38,0,69,255,240,0,38,0,70,255,240,0,38,0,71,255,243,0,38,0,72,255,241,0,38,0,78,255,247,0,38,0,79,255,247,0,38,0,80,255,240,0,38,0,81,255,247,0,38,0,82,255,240,0,38,0,83,255,247,0,38,0,84,255,251,0,38,0,85,255,242,0,38,0,86,255,238,0,38,0,87,255,241,0,38,0,88,255,243,0,38,0,90,255,240,0,38,0,107,255,235,0,38,0,110,255,248,0,38,0,134,255,245,0,38,0,145,255,245,0,38,0,146,255,245,0,38,0,147,255,245,0,38,0,148,255,245,0,38,0,149,255,245,0,38,0,151,255,245,0,38,0,158,255,243,0,38,0,166,255,240,0,38,0,167,255,240,0,38,0,168,255,240,0,38,0,169,255,240,0,38,0,170,255,240,0,38,0,173,0,21,0,38,0,175,255,246,0,38,0,176,255,247,0,38,0,177,255,240,0,38,0,178,255,240,0,38,0,179,255,240,0,38,0,180,255,240,0,38,0,181,255,240,0,38,0,183,255,240,0,38,0,184,255,238,0,38,0,185,255,238,0,38,0,186,255,238,0,38,0,187,255,238,0,38,0,188,255,240,0,38,0,189,255,247,0,38,0,190,255,240,0,38,0,194,255,245,0,38,0,195,255,240,0,38,0,197,255,251,0,38,0,207,255,244,0,38,0,208,255,244,0,38,0,220,255,235,0,39,0,7,255,245,0,39,0,11,0,11,0,39,0,13,255,186,0,39,0,15,255,186,0,39,0,16,255,199,0,39,0,21,255,223,0,39,0,23,255,243,0,39,0,27,255,243,0,39,0,28,255,243,0,39,0,33,255,222,0,39,0,34,255,203,0,39,0,36,255,248,0,39,0,40,255,248,0,39,0,46,255,239,0,39,0,48,255,248,0,39,0,50,255,248,0,39,0,53,0,5,0,39,0,62,0,16,0,39,0,66,255,199,0,39,0,67,255,251,0,39,0,68,255,212,0,39,0,69,255,212,0,39,0,70,255,212,0,39,0,71,255,244,0,39,0,72,255,216,0,39,0,73,255,251,0,39,0,74,255,249,0,39,0,75,255,249,0,39,0,76,255,251,0,39,0,78,255,211,0,39,0,79,255,211,0,39,0,80,255,212,0,39,0,81,255,211,0,39,0,82,255,212,0,39,0,83,255,211,0,39,0,84,255,217,0,39,0,85,255,247,0,39,0,86,255,217,0,39,0,87,255,247,0,39,0,88,255,248,0,39,0,89,255,239,0,39,0,90,255,248,0,39,0,91,255,236,0,39,0,94,0,19,0,39,0,107,255,236,0,39,0,122,255,217,0,39,0,127,255,203,0,39,0,128,255,203,0,39,0,129,255,203,0,39,0,130,255,203,0,39,0,131,255,203,0,39,0,132,255,203,0,39,0,133,255,155,0,39,0,134,255,248,0,39,0,145,255,248,0,39,0,146,255,248,0,39,0,147,255,248,0,39,0,148,255,248,0,39,0,149,255,248,0,39,0,151,255,248,0,39,0,158,255,241,0,39,0,159,255,199,0,39,0,160,255,199,0,39,0,161,255,199,0,39,0,162,255,206,0,39,0,163,255,199,0,39,0,164,255,199,0,39,0,165,255,199,0,39,0,166,255,212,0,39,0,167,255,212,0,39,0,168,255,212,0,39,0,169,255,212,0,39,0,170,255,212,0,39,0,171,255,249,0,39,0,172,255,249,0,39,0,173,0,52,0,39,0,174,0,28,0,39,0,175,255,222,0,39,0,176,255,211,0,39,0,177,255,212,0,39,0,178,255,212,0,39,0,179,255,212,0,39,0,180,255,212,0,39,0,181,255,212,0,39,0,183,255,212,0,39,0,184,255,217,0,39,0,185,255,217,0,39,0,186,255,217,0,39,0,187,255,217,0,39,0,188,255,248,0,39,0,189,255,211,0,39,0,190,255,248,0,39,0,193,255,249,0,39,0,194,255,248,0,39,0,195,255,212,0,39,0,197,255,217,0,39,0,200,255,236,0,39,0,211,255,186,0,39,0,214,255,186,0,39,0,218,255,186,0,39,0,220,255,236,0,39,0,221,255,217,0,39,0,240,0,16,0,40,0,10,255,248,0,40,0,53,255,251,0,40,0,67,255,250,0,40,0,68,255,251,0,40,0,69,255,251,0,40,0,70,255,251,0,40,0,71,255,246,0,40,0,72,255,250,0,40,0,73,255,250,0,40,0,74,255,250,0,40,0,75,255,250,0,40,0,76,255,250,0,40,0,77,255,250,0,40,0,78,255,250,0,40,0,79,255,250,0,40,0,80,255,251,0,40,0,81,255,250,0,40,0,82,255,251,0,40,0,83,255,250,0,40,0,85,255,244,0,40,0,86,255,249,0,40,0,87,255,244,0,40,0,88,255,247,0,40,0,90,255,242,0,40,0,91,255,249,0,40,0,158,255,244,0,40,0,166,255,251,0,40,0,167,255,251,0,40,0,168,255,251,0,40,0,169,255,251,0,40,0,170,255,251,0,40,0,171,255,250,0,40,0,172,255,250,0,40,0,173,255,250,0,40,0,174,255,250,0,40,0,176,255,250,0,40,0,177,255,251,0,40,0,178,255,251,0,40,0,179,255,251,0,40,0,180,255,251,0,40,0,181,255,251,0,40,0,183,255,251,0,40,0,184,255,249,0,40,0,185,255,249,0,40,0,186,255,249,0,40,0,187,255,249,0,40,0,188,255,242,0,40,0,189,255,250,0,40,0,190,255,242,0,40,0,193,255,250,0,40,0,195,255,251,0,40,0,200,255,249,0,41,0,10,255,246,0,41,0,46,255,251,0,41,0,66,255,246,0,41,0,67,255,247,0,41,0,68,255,242,0,41,0,69,255,242,0,41,0,70,255,242,0,41,0,71,255,247,0,41,0,72,255,241,0,41,0,73,255,247,0,41,0,74,255,247,0,41,0,75,255,247,0,41,0,76,255,247,0,41,0,77,255,246,0,41,0,78,255,247,0,41,0,79,255,247,0,41,0,80,255,242,0,41,0,81,255,247,0,41,0,82,255,242,0,41,0,83,255,247,0,41,0,84,255,246,0,41,0,85,255,247,0,41,0,86,255,245,0,41,0,87,255,247,0,41,0,88,255,248,0,41,0,90,255,247,0,41,0,91,255,246,0,41,0,158,255,244,0,41,0,159,255,246,0,41,0,160,255,246,0,41,0,161,255,246,0,41,0,162,255,246,0,41,0,163,255,246,0,41,0,164,255,246,0,41,0,165,255,246,0,41,0,166,255,242,0,41,0,167,255,242,0,41,0,168,255,242,0,41,0,169,255,242,0,41,0,170,255,242,0,41,0,171,255,247,0,41,0,172,255,247,0,41,0,173,255,247,0,41,0,174,255,247,0,41,0,175,255,243,0,41,0,176,255,247,0,41,0,177,255,242,0,41,0,178,255,242,0,41,0,179,255,242,0,41,0,180,255,242,0,41,0,181,255,242,0,41,0,183,255,242,0,41,0,184,255,245,0,41,0,185,255,245,0,41,0,186,255,245,0,41,0,187,255,245,0,41,0,188,255,247,0,41,0,189,255,247,0,41,0,190,255,247,0,41,0,193,255,247,0,41,0,195,255,242,0,41,0,197,255,246,0,41,0,200,255,246,0,42,0,10,255,246,0,42,0,46,255,251,0,42,0,66,255,246,0,42,0,67,255,247,0,42,0,68,255,242,0,42,0,69,255,242,0,42,0,70,255,242,0,42,0,71,255,247,0,42,0,72,255,241,0,42,0,73,255,247,0,42,0,74,255,247,0,42,0,75,255,247,0,42,0,76,255,247,0,42,0,77,255,246,0,42,0,78,255,247,0,42,0,79,255,247,0,42,0,80,255,242,0,42,0,81,255,247,0,42,0,82,255,242,0,42,0,83,255,247,0,42,0,84,255,246,0,42,0,85,255,247,0,42,0,86,255,245,0,42,0,87,255,247,0,42,0,88,255,248,0,42,0,90,255,247,0,42,0,91,255,246,0,42,0,158,255,244,0,42,0,159,255,246,0,42,0,160,255,246,0,42,0,161,255,246,0,42,0,162,255,246,0,42,0,163,255,246,0,42,0,164,255,246,0,42,0,165,255,246,0,42,0,166,255,242,0,42,0,167,255,242,0,42,0,168,255,242,0,42,0,169,255,242,0,42,0,170,255,242,0,42,0,171,255,247,0,42,0,172,255,247,0,42,0,173,255,247,0,42,0,174,255,247,0,42,0,175,255,243,0,42,0,176,255,247,0,42,0,177,255,242,0,42,0,178,255,242,0,42,0,179,255,242,0,42,0,180,255,242,0,42,0,181,255,242,0,42,0,183,255,242,0,42,0,184,255,245,0,42,0,185,255,245,0,42,0,186,255,245,0,42,0,187,255,245,0,42,0,188,255,247,0,42,0,189,255,247,0,42,0,190,255,247,0,42,0,193,255,247,0,42,0,195,255,242,0,42,0,197,255,246,0,42,0,200,255,246,0,43,0,10,255,246,0,43,0,46,255,251,0,43,0,66,255,246,0,43,0,67,255,247,0,43,0,68,255,242,0,43,0,69,255,242,0,43,0,70,255,242,0,43,0,71,255,247,0,43,0,72,255,241,0,43,0,73,255,247,0,43,0,74,255,247,0,43,0,75,255,247,0,43,0,76,255,247,0,43,0,77,255,246,0,43,0,78,255,247,0,43,0,79,255,247,0,43,0,80,255,242,0,43,0,81,255,247,0,43,0,82,255,242,0,43,0,83,255,247,0,43,0,84,255,246,0,43,0,85,255,247,0,43,0,86,255,245,0,43,0,87,255,247,0,43,0,88,255,248,0,43,0,90,255,247,0,43,0,91,255,246,0,43,0,158,255,244,0,43,0,159,255,246,0,43,0,160,255,246,0,43,0,161,255,246,0,43,0,162,255,246,0,43,0,163,255,246,0,43,0,164,255,246,0,43,0,165,255,246,0,43,0,166,255,242,0,43,0,167,255,242,0,43,0,168,255,242,0,43,0,169,255,242,0,43,0,170,255,242,0,43,0,171,255,247,0,43,0,172,255,247,0,43,0,173,255,247,0,43,0,174,255,247,0,43,0,175,255,243,0,43,0,176,255,247,0,43,0,177,255,242,0,43,0,178,255,242,0,43,0,179,255,242,0,43,0,180,255,242,0,43,0,181,255,242,0,43,0,183,255,242,0,43,0,184,255,245,0,43,0,185,255,245,0,43,0,186,255,245,0,43,0,187,255,245,0,43,0,188,255,247,0,43,0,189,255,247,0,43,0,190,255,247,0,43,0,193,255,247,0,43,0,195,255,242,0,43,0,197,255,246,0,43,0,200,255,246,0,44,0,7,255,247,0,44,0,11,0,9,0,44,0,14,255,244,0,44,0,36,255,228,0,44,0,40,255,228,0,44,0,48,255,228,0,44,0,50,255,228,0,44,0,52,255,250,0,44,0,62,0,33,0,44,0,68,255,222,0,44,0,69,255,222,0,44,0,70,255,222,0,44,0,71,255,246,0,44,0,72,255,238,0,44,0,80,255,222,0,44,0,82,255,222,0,44,0,85,255,229,0,44,0,86,255,232,0,44,0,87,255,201,0,44,0,88,255,211,0,44,0,90,255,199,0,44,0,94,0,33,0,44,0,107,255,227,0,44,0,110,255,238,0,44,0,134,255,228,0,44,0,145,255,228,0,44,0,146,255,228,0,44,0,147,255,228,0,44,0,148,255,228,0,44,0,149,255,228,0,44,0,151,255,228,0,44,0,158,255,245,0,44,0,166,255,222,0,44,0,167,255,222,0,44,0,168,255,222,0,44,0,169,255,222,0,44,0,170,255,222,0,44,0,171,0,10,0,44,0,173,0,24,0,44,0,174,0,41,0,44,0,175,255,239,0,44,0,177,255,222,0,44,0,178,255,222,0,44,0,179,255,222,0,44,0,180,255,222,0,44,0,181,255,222,0,44,0,183,255,222,0,44,0,184,255,232,0,44,0,185,255,232,0,44,0,186,255,232,0,44,0,187,255,232,0,44,0,188,255,199,0,44,0,190,255,199,0,44,0,194,255,228,0,44,0,195,255,222,0,44,0,196,255,250,0,44,0,207,255,244,0,44,0,208,255,244,0,44,0,220,255,227,0,44,0,240,0,27,0,45,0,3,255,166,0,45,0,8,255,166,0,45,0,11,255,166,0,45,0,14,255,196,0,45,0,17,255,243,0,45,0,18,255,236,0,45,0,21,255,194,0,45,0,26,255,227,0,45,0,32,255,231,0,45,0,36,255,232,0,45,0,40,255,232,0,45,0,48,255,232,0,45,0,50,255,232,0,45,0,53,255,189,0,45,0,54,255,238,0,45,0,55,255,154,0,45,0,56,255,203,0,45,0,58,255,158,0,45,0,61,255,187,0,45,0,62,255,240,0,45,0,68,255,246,0,45,0,69,255,246,0,45,0,70,255,246,0,45,0,71,255,241,0,45,0,72,255,249,0,45,0,80,255,246,0,45,0,82,255,246,0,45,0,85,255,232,0,45,0,86,255,249,0,45,0,87,255,199,0,45,0,88,255,212,0,45,0,90,255,181,0,45,0,94,255,241,0,45,0,107,255,222,0,45,0,110,255,220,0,45,0,134,255,232,0,45,0,145,255,232,0,45,0,146,255,232,0,45,0,147,255,232,0,45,0,148,255,232,0,45,0,149,255,232,0,45,0,151,255,232,0,45,0,152,255,238,0,45,0,153,255,238,0,45,0,154,255,238,0,45,0,155,255,238,0,45,0,156,255,158,0,45,0,158,255,243,0,45,0,166,255,246,0,45,0,167,255,246,0,45,0,168,255,246,0,45,0,169,255,246,0,45,0,170,255,246,0,45,0,177,255,246,0,45,0,178,255,246,0,45,0,179,255,246,0,45,0,180,255,246,0,45,0,181,255,246,0,45,0,183,255,246,0,45,0,184,255,249,0,45,0,185,255,249,0,45,0,186,255,249,0,45,0,187,255,249,0,45,0,188,255,181,0,45,0,190,255,181,0,45,0,194,255,232,0,45,0,195,255,246,0,45,0,198,255,158,0,45,0,207,255,196,0,45,0,208,255,196,0,45,0,209,255,167,0,45,0,210,255,167,0,45,0,212,255,167,0,45,0,213,255,167,0,45,0,220,255,222,0,45,0,240,255,166,0,46,0,3,255,238,0,46,0,8,255,238,0,46,0,10,255,242,0,46,0,11,255,238,0,46,0,18,255,247,0,46,0,32,255,242,0,46,0,35,255,251,0,46,0,36,255,251,0,46,0,37,255,251,0,46,0,38,255,251,0,46,0,39,255,251,0,46,0,40,255,251,0,46,0,41,255,251,0,46,0,42,255,251,0,46,0,43,255,251,0,46,0,44,255,251,0,46,0,45,255,251,0,46,0,47,255,251,0,46,0,48,255,251,0,46,0,49,255,251,0,46,0,50,255,251,0,46,0,51,255,251,0,46,0,53,255,231,0,46,0,54,255,248,0,46,0,55,255,236,0,46,0,56,255,238,0,46,0,58,255,233,0,46,0,61,255,239,0,46,0,66,255,250,0,46,0,67,255,245,0,46,0,68,255,244,0,46,0,69,255,244,0,46,0,70,255,244,0,46,0,71,255,240,0,46,0,72,255,243,0,46,0,73,255,245,0,46,0,74,255,246,0,46,0,75,255,246,0,46,0,76,255,245,0,46,0,77,255,245,0,46,0,78,255,246,0,46,0,79,255,246,0,46,0,80,255,244,0,46,0,81,255,246,0,46,0,82,255,244,0,46,0,83,255,246,0,46,0,84,255,250,0,46,0,85,255,236,0,46,0,86,255,244,0,46,0,87,255,234,0,46,0,88,255,236,0,46,0,90,255,233,0,46,0,91,255,249,0,46,0,134,255,251,0,46,0,135,255,251,0,46,0,136,255,251,0,46,0,137,255,251,0,46,0,138,255,251,0,46,0,139,255,251,0,46,0,140,255,251,0,46,0,141,255,251,0,46,0,142,255,251,0,46,0,143,255,251,0,46,0,144,255,251,0,46,0,145,255,251,0,46,0,146,255,251,0,46,0,147,255,251,0,46,0,148,255,251,0,46,0,149,255,251,0,46,0,151,255,251,0,46,0,152,255,248,0,46,0,153,255,248,0,46,0,154,255,248,0,46,0,155,255,248,0,46,0,156,255,233,0,46,0,157,255,251,0,46,0,158,255,238,0,46,0,159,255,250,0,46,0,160,255,250,0,46,0,161,255,250,0,46,0,162,255,250,0,46,0,163,255,250,0,46,0,164,255,250,0,46,0,165,255,250,0,46,0,166,255,244,0,46,0,167,255,244,0,46,0,168,255,244,0,46,0,169,255,244,0,46,0,170,255,244,0,46,0,171,255,246,0,46,0,172,255,246,0,46,0,173,255,246,0,46,0,174,255,246,0,46,0,175,255,247,0,46,0,176,255,246,0,46,0,177,255,244,0,46,0,178,255,244,0,46,0,179,255,244,0,46,0,180,255,244,0,46,0,181,255,244,0,46,0,183,255,244,0,46,0,184,255,244,0,46,0,185,255,244,0,46,0,186,255,244,0,46,0,187,255,244,0,46,0,188,255,233,0,46,0,189,255,246,0,46,0,190,255,233,0,46,0,193,255,246,0,46,0,194,255,251,0,46,0,195,255,244,0,46,0,197,255,250,0,46,0,198,255,233,0,46,0,200,255,249,0,46,0,209,255,236,0,46,0,210,255,236,0,46,0,212,255,236,0,46,0,213,255,236,0,46,0,240,255,237,0,47,0,10,255,246,0,47,0,46,255,251,0,47,0,66,255,246,0,47,0,67,255,247,0,47,0,68,255,242,0,47,0,69,255,242,0,47,0,70,255,242,0,47,0,71,255,247,0,47,0,72,255,241,0,47,0,73,255,247,0,47,0,74,255,247,0,47,0,75,255,247,0,47,0,76,255,247,0,47,0,77,255,246,0,47,0,78,255,247,0,47,0,79,255,247,0,47,0,80,255,242,0,47,0,81,255,247,0,47,0,82,255,242,0,47,0,83,255,247,0,47,0,84,255,246,0,47,0,85,255,247,0,47,0,86,255,245,0,47,0,87,255,247,0,47,0,88,255,248,0,47,0,90,255,247,0,47,0,91,255,246,0,47,0,158,255,244,0,47,0,159,255,246,0,47,0,160,255,246,0,47,0,161,255,246,0,47,0,162,255,246,0,47,0,163,255,246,0,47,0,164,255,246,0,47,0,165,255,246,0,47,0,166,255,242,0,47,0,167,255,242,0,47,0,168,255,242,0,47,0,169,255,242,0,47,0,170,255,242,0,47,0,171,255,247,0,47,0,172,255,247,0,47,0,173,255,247,0,47,0,174,255,247,0,47,0,175,255,243,0,47,0,176,255,247,0,47,0,177,255,242,0,47,0,178,255,242,0,47,0,179,255,242,0,47,0,180,255,242,0,47,0,181,255,242,0,47,0,183,255,242,0,47,0,184,255,245,0,47,0,185,255,245,0,47,0,186,255,245,0,47,0,187,255,245,0,47,0,188,255,247,0,47,0,189,255,247,0,47,0,190,255,247,0,47,0,193,255,247,0,47,0,195,255,242,0,47,0,197,255,246,0,47,0,200,255,246,0,48,0,10,255,229,0,48,0,13,255,242,0,48,0,15,255,242,0,48,0,16,255,239,0,48,0,24,255,243,0,48,0,32,255,240,0,48,0,34,255,245,0,48,0,46,255,251,0,48,0,53,255,232,0,48,0,55,255,244,0,48,0,56,255,248,0,48,0,57,255,229,0,48,0,58,255,230,0,48,0,59,255,238,0,48,0,61,255,245,0,48,0,62,255,227,0,48,0,66,255,247,0,48,0,67,255,250,0,48,0,68,255,250,0,48,0,69,255,250,0,48,0,70,255,250,0,48,0,72,255,250,0,48,0,73,255,250,0,48,0,74,255,249,0,48,0,75,255,249,0,48,0,76,255,250,0,48,0,77,255,250,0,48,0,78,255,249,0,48,0,79,255,249,0,48,0,80,255,250,0,48,0,81,255,249,0,48,0,82,255,250,0,48,0,83,255,249,0,48,0,84,255,250,0,48,0,86,255,251,0,48,0,89,255,245,0,48,0,91,255,250,0,48,0,94,255,231,0,48,0,127,255,245,0,48,0,128,255,245,0,48,0,129,255,245,0,48,0,130,255,245,0,48,0,131,255,245,0,48,0,132,255,245,0,48,0,133,255,229,0,48,0,156,255,230,0,48,0,158,255,251,0,48,0,159,255,247,0,48,0,160,255,247,0,48,0,161,255,247,0,48,0,162,255,247,0,48,0,163,255,247,0,48,0,164,255,247,0,48,0,165,255,247,0,48,0,166,255,250,0,48,0,167,255,250,0,48,0,168,255,250,0,48,0,169,255,250,0,48,0,170,255,250,0,48,0,171,255,249,0,48,0,172,255,249,0,48,0,173,255,249,0,48,0,174,255,249,0,48,0,175,255,250,0,48,0,176,255,249,0,48,0,177,255,250,0,48,0,178,255,250,0,48,0,179,255,250,0,48,0,180,255,250,0,48,0,181,255,250,0,48,0,183,255,250,0,48,0,184,255,251,0,48,0,185,255,251,0,48,0,186,255,251,0,48,0,187,255,251,0,48,0,189,255,249,0,48,0,193,255,249,0,48,0,195,255,250,0,48,0,197,255,250,0,48,0,198,255,230,0,48,0,199,255,238,0,48,0,200,255,250,0,48,0,210,255,247,0,48,0,211,255,242,0,48,0,213,255,247,0,48,0,214,255,242,0,48,0,218,255,242,0,48,0,240,255,246,0,49,0,7,255,250,0,49,0,10,255,241,0,49,0,13,255,175,0,49,0,15,255,175,0,49,0,16,255,210,0,49,0,20,255,248,0,49,0,21,255,242,0,49,0,33,255,241,0,49,0,34,255,216,0,49,0,46,255,246,0,49,0,57,255,242,0,49,0,59,255,248,0,49,0,66,255,242,0,49,0,67,255,251,0,49,0,68,255,243,0,49,0,69,255,243,0,49,0,70,255,243,0,49,0,72,255,246,0,49,0,73,255,251,0,49,0,74,255,250,0,49,0,75,255,250,0,49,0,76,255,251,0,49,0,77,255,251,0,49,0,78,255,248,0,49,0,79,255,248,0,49,0,80,255,243,0,49,0,81,255,248,0,49,0,82,255,243,0,49,0,83,255,248,0,49,0,84,255,248,0,49,0,86,255,250,0,49,0,127,255,216,0,49,0,128,255,216,0,49,0,129,255,216,0,49,0,130,255,216,0,49,0,131,255,216,0,49,0,132,255,216,0,49,0,133,255,187,0,49,0,159,255,242,0,49,0,160,255,242,0,49,0,161,255,242,0,49,0,162,255,242,0,49,0,163,255,242,0,49,0,164,255,242,0,49,0,165,255,242,0,49,0,166,255,243,0,49,0,167,255,243,0,49,0,168,255,243,0,49,0,169,255,243,0,49,0,170,255,243,0,49,0,171,255,250,0,49,0,172,255,250,0,49,0,173,0,25,0,49,0,174,0,4,0,49,0,175,255,234,0,49,0,176,255,248,0,49,0,177,255,243,0,49,0,178,255,243,0,49,0,179,255,243,0,49,0,180,255,243,0,49,0,181,255,243,0,49,0,183,255,243,0,49,0,184,255,250,0,49,0,185,255,250,0,49,0,186,255,250,0,49,0,187,255,250,0,49,0,189,255,248,0,49,0,193,255,250,0,49,0,195,255,243,0,49,0,197,255,248,0,49,0,199,255,248,0,49,0,211,255,175,0,49,0,214,255,175,0,49,0,218,255,175,0,50,0,10,255,229,0,50,0,13,255,242,0,50,0,15,255,242,0,50,0,16,255,239,0,50,0,24,255,243,0,50,0,32,255,240,0,50,0,34,255,245,0,50,0,46,255,251,0,50,0,53,255,232,0,50,0,55,255,244,0,50,0,56,255,248,0,50,0,57,255,229,0,50,0,58,255,230,0,50,0,59,255,238,0,50,0,61,255,245,0,50,0,62,255,227,0,50,0,66,255,247,0,50,0,67,255,250,0,50,0,68,255,250,0,50,0,69,255,250,0,50,0,70,255,250,0,50,0,72,255,250,0,50,0,73,255,250,0,50,0,74,255,249,0,50,0,75,255,249,0,50,0,76,255,250,0,50,0,77,255,250,0,50,0,78,255,249,0,50,0,79,255,249,0,50,0,80,255,250,0,50,0,81,255,249,0,50,0,82,255,250,0,50,0,83,255,249,0,50,0,84,255,250,0,50,0,86,255,251,0,50,0,89,255,245,0,50,0,91,255,250,0,50,0,94,255,231,0,50,0,127,255,245,0,50,0,128,255,245,0,50,0,129,255,245,0,50,0,130,255,245,0,50,0,131,255,245,0,50,0,132,255,245,0,50,0,133,255,229,0,50,0,156,255,230,0,50,0,158,255,251,0,50,0,159,255,247,0,50,0,160,255,247,0,50,0,161,255,247,0,50,0,162,255,247,0,50,0,163,255,247,0,50,0,164,255,247,0,50,0,165,255,247,0,50,0,166,255,250,0,50,0,167,255,250,0,50,0,168,255,250,0,50,0,169,255,250,0,50,0,170,255,250,0,50,0,171,255,249,0,50,0,172,255,249,0,50,0,173,255,249,0,50,0,174,255,249,0,50,0,175,255,250,0,50,0,176,255,249,0,50,0,177,255,250,0,50,0,178,255,250,0,50,0,179,255,250,0,50,0,180,255,250,0,50,0,181,255,250,0,50,0,183,255,250,0,50,0,184,255,251,0,50,0,185,255,251,0,50,0,186,255,251,0,50,0,187,255,251,0,50,0,189,255,249,0,50,0,193,255,249,0,50,0,195,255,250,0,50,0,197,255,250,0,50,0,198,255,230,0,50,0,199,255,238,0,50,0,200,255,250,0,50,0,210,255,247,0,50,0,211,255,242,0,50,0,213,255,247,0,50,0,214,255,242,0,50,0,218,255,242,0,50,0,240,255,246,0,51,0,21,255,234,0,51,0,53,255,243,0,51,0,55,255,251,0,51,0,58,255,245,0,51,0,62,255,240,0,51,0,66,255,251,0,51,0,67,255,250,0,51,0,68,255,237,0,51,0,69,255,237,0,51,0,70,255,237,0,51,0,71,255,249,0,51,0,72,255,243,0,51,0,73,255,250,0,51,0,74,255,249,0,51,0,75,255,249,0,51,0,76,255,250,0,51,0,77,255,248,0,51,0,78,255,248,0,51,0,79,255,248,0,51,0,80,255,237,0,51,0,81,255,248,0,51,0,82,255,237,0,51,0,83,255,248,0,51,0,85,255,248,0,51,0,86,255,244,0,51,0,87,255,248,0,51,0,88,255,250,0,51,0,90,255,248,0,51,0,94,255,247,0,51,0,107,255,242,0,51,0,156,255,245,0,51,0,158,255,247,0,51,0,159,255,251,0,51,0,160,255,251,0,51,0,161,255,251,0,51,0,162,255,251,0,51,0,163,255,251,0,51,0,164,255,251,0,51,0,165,255,251,0,51,0,166,255,237,0,51,0,167,255,237,0,51,0,168,255,237,0,51,0,169,255,237,0,51,0,170,255,237,0,51,0,171,255,249,0,51,0,172,255,249,0,51,0,173,255,249,0,51,0,174,255,249,0,51,0,175,255,242,0,51,0,176,255,248,0,51,0,177,255,237,0,51,0,178,255,237,0,51,0,179,255,237,0,51,0,180,255,237,0,51,0,181,255,237,0,51,0,183,255,237,0,51,0,184,255,244,0,51,0,185,255,244,0,51,0,186,255,244,0,51,0,187,255,244,0,51,0,188,255,248,0,51,0,189,255,248,0,51,0,190,255,248,0,51,0,193,255,249,0,51,0,195,255,237,0,51,0,198,255,245,0,51,0,220,255,242,0,52,0,10,255,246,0,52,0,57,255,251,0,52,0,67,255,250,0,52,0,71,255,243,0,52,0,72,255,250,0,52,0,73,255,250,0,52,0,74,255,250,0,52,0,75,255,250,0,52,0,76,255,250,0,52,0,77,255,250,0,52,0,78,255,250,0,52,0,79,255,250,0,52,0,81,255,250,0,52,0,83,255,250,0,52,0,84,255,251,0,52,0,85,255,241,0,52,0,86,255,250,0,52,0,87,255,241,0,52,0,88,255,244,0,52,0,89,255,242,0,52,0,90,255,240,0,52,0,91,255,244,0,52,0,158,255,244,0,52,0,171,255,250,0,52,0,172,255,250,0,52,0,173,255,250,0,52,0,174,255,250,0,52,0,176,255,250,0,52,0,184,255,250,0,52,0,185,255,250,0,52,0,186,255,250,0,52,0,187,255,250,0,52,0,188,255,240,0,52,0,189,255,250,0,52,0,190,255,240,0,52,0,193,255,250,0,52,0,197,255,251,0,52,0,200,255,244,0,53,0,7,255,241,0,53,0,11,0,12,0,53,0,13,255,213,0,53,0,14,255,216,0,53,0,15,255,214,0,53,0,16,255,205,0,53,0,17,255,235,0,53,0,21,255,211,0,53,0,23,255,218,0,53,0,25,255,248,0,53,0,27,255,222,0,53,0,28,255,222,0,53,0,33,255,197,0,53,0,34,255,202,0,53,0,36,255,232,0,53,0,40,255,232,0,53,0,46,255,230,0,53,0,48,255,232,0,53,0,50,255,232,0,53,0,62,0,18,0,53,0,66,255,195,0,53,0,67,255,250,0,53,0,68,255,177,0,53,0,69,255,177,0,53,0,70,255,177,0,53,0,71,255,231,0,53,0,72,255,175,0,53,0,73,255,250,0,53,0,74,255,247,0,53,0,75,255,247,0,53,0,76,255,250,0,53,0,77,255,250,0,53,0,78,255,168,0,53,0,79,255,168,0,53,0,80,255,177,0,53,0,81,255,168,0,53,0,82,255,177,0,53,0,83,255,168,0,53,0,84,255,197,0,53,0,85,255,230,0,53,0,86,255,169,0,53,0,87,255,173,0,53,0,88,255,182,0,53,0,89,255,170,0,53,0,90,255,171,0,53,0,91,255,208,0,53,0,94,0,21,0,53,0,107,255,195,0,53,0,110,255,232,0,53,0,122,255,197,0,53,0,127,255,202,0,53,0,128,255,202,0,53,0,129,255,202,0,53,0,130,255,202,0,53,0,131,255,202,0,53,0,132,255,202,0,53,0,133,255,183,0,53,0,134,255,232,0,53,0,145,255,232,0,53,0,146,255,232,0,53,0,147,255,232,0,53,0,148,255,232,0,53,0,149,255,232,0,53,0,151,255,232,0,53,0,158,255,227,0,53,0,159,255,195,0,53,0,160,255,195,0,53,0,161,255,195,0,53,0,162,255,203,0,53,0,163,255,195,0,53,0,164,255,195,0,53,0,165,255,195,0,53,0,166,255,177,0,53,0,167,255,177,0,53,0,168,255,177,0,53,0,169,255,177,0,53,0,170,255,177,0,53,0,171,255,254,0,53,0,172,255,254,0,53,0,173,0,52,0,53,0,174,0,30,0,53,0,175,255,215,0,53,0,176,255,168,0,53,0,177,255,177,0,53,0,178,255,177,0,53,0,179,255,177,0,53,0,180,255,177,0,53,0,181,255,177,0,53,0,183,255,177,0,53,0,184,255,169,0,53,0,185,255,169,0,53,0,186,255,169,0,53,0,187,255,169,0,53,0,188,255,171,0,53,0,189,255,208,0,53,0,190,255,171,0,53,0,193,255,247,0,53,0,194,255,232,0,53,0,195,255,177,0,53,0,197,255,216,0,53,0,200,255,208,0,53,0,207,255,216,0,53,0,208,255,216,0,53,0,211,255,213,0,53,0,214,255,213,0,53,0,218,255,214,0,53,0,220,255,195,0,53,0,221,255,197,0,53,0,240,0,16,0,54,0,10,255,245,0,54,0,13,255,243,0,54,0,15,255,243,0,54,0,16,255,234,0,54,0,34,255,240,0,54,0,46,255,248,0,54,0,59,255,251,0,54,0,66,255,242,0,54,0,67,255,245,0,54,0,68,255,243,0,54,0,69,255,243,0,54,0,70,255,243,0,54,0,71,255,250,0,54,0,72,255,242,0,54,0,73,255,245,0,54,0,74,255,243,0,54,0,75,255,243,0,54,0,76,255,245,0,54,0,77,255,244,0,54,0,78,255,240,0,54,0,79,255,240,0,54,0,80,255,243,0,54,0,81,255,240,0,54,0,82,255,243,0,54,0,83,255,240,0,54,0,84,255,243,0,54,0,85,255,249,0,54,0,86,255,242,0,54,0,87,255,250,0,54,0,88,255,250,0,54,0,89,255,250,0,54,0,90,255,250,0,54,0,91,255,244,0,54,0,127,255,240,0,54,0,128,255,240,0,54,0,129,255,240,0,54,0,130,255,240,0,54,0,131,255,240,0,54,0,132,255,240,0,54,0,133,255,240,0,54,0,158,255,248,0,54,0,159,255,242,0,54,0,160,255,242,0,54,0,161,255,242,0,54,0,162,255,242,0,54,0,163,255,242,0,54,0,164,255,242,0,54,0,165,255,242,0,54,0,166,255,243,0,54,0,167,255,243,0,54,0,168,255,243,0,54,0,169,255,243,0,54,0,170,255,243,0,54,0,171,255,243,0,54,0,172,255,243,0,54,0,173,255,251,0,54,0,174,255,243,0,54,0,175,255,242,0,54,0,176,255,240,0,54,0,177,255,243,0,54,0,178,255,243,0,54,0,179,255,243,0,54,0,180,255,243,0,54,0,181,255,243,0,54,0,183,255,243,0,54,0,184,255,242,0,54,0,185,255,242,0,54,0,186,255,242,0,54,0,187,255,242,0,54,0,188,255,250,0,54,0,189,255,240,0,54,0,190,255,250,0,54,0,193,255,243,0,54,0,195,255,243,0,54,0,197,255,243,0,54,0,199,255,251,0,54,0,200,255,244,0,54,0,211,255,243,0,54,0,214,255,243,0,54,0,218,255,243,0,55,0,7,255,243,0,55,0,11,0,16,0,55,0,13,255,213,0,55,0,14,255,238,0,55,0,15,255,213,0,55,0,16,255,201,0,55,0,17,255,246,0,55,0,21,255,220,0,55,0,23,255,230,0,55,0,28,255,248,0,55,0,33,255,213,0,55,0,34,255,207,0,55,0,36,255,244,0,55,0,40,255,244,0,55,0,46,255,235,0,55,0,48,255,244,0,55,0,50,255,244,0,55,0,62,0,29,0,55,0,66,255,216,0,55,0,68,255,196,0,55,0,69,255,196,0,55,0,70,255,196,0,55,0,71,255,244,0,55,0,72,255,203,0,55,0,78,255,220,0,55,0,79,255,220,0,55,0,80,255,196,0,55,0,81,255,220,0,55,0,82,255,196,0,55,0,83,255,220,0,55,0,84,255,217,0,55,0,85,255,239,0,55,0,86,255,220,0,55,0,87,255,242,0,55,0,88,255,241,0,55,0,89,255,243,0,55,0,90,255,243,0,55,0,91,255,243,0,55,0,94,0,29,0,55,0,107,255,220,0,55,0,110,255,245,0,55,0,122,255,244,0,55,0,127,255,207,0,55,0,128,255,207,0,55,0,129,255,207,0,55,0,130,255,207,0,55,0,131,255,207,0,55,0,132,255,207,0,55,0,133,255,196,0,55,0,134,255,244,0,55,0,145,255,244,0,55,0,146,255,244,0,55,0,147,255,244,0,55,0,148,255,244,0,55,0,149,255,244,0,55,0,151,255,244,0,55,0,158,255,242,0,55,0,159,255,216,0,55,0,160,255,216,0,55,0,161,255,216,0,55,0,162,255,216,0,55,0,163,255,216,0,55,0,164,255,216,0,55,0,165,255,216,0,55,0,166,255,196,0,55,0,167,255,196,0,55,0,168,255,196,0,55,0,169,255,196,0,55,0,170,255,196,0,55,0,171,0,9,0,55,0,173,0,44,0,55,0,174,0,40,0,55,0,175,255,216,0,55,0,176,255,220,0,55,0,177,255,196,0,55,0,178,255,196,0,55,0,179,255,196,0,55,0,180,255,196,0,55,0,181,255,196,0,55,0,183,255,196,0,55,0,184,255,220,0,55,0,185,255,220,0,55,0,186,255,220,0,55,0,187,255,220,0,55,0,188,255,243,0,55,0,189,255,220,0,55,0,190,255,243,0,55,0,194,255,244,0,55,0,195,255,196,0,55,0,197,255,227,0,55,0,200,255,243,0,55,0,207,255,238,0,55,0,208,255,238,0,55,0,211,255,213,0,55,0,214,255,213,0,55,0,218,255,213,0,55,0,220,255,220,0,55,0,221,255,244,0,55,0,240,0,26,0,56,0,7,255,247,0,56,0,11,0,17,0,56,0,13,255,225,0,56,0,14,255,248,0,56,0,15,255,226,0,56,0,16,255,215,0,56,0,21,255,233,0,56,0,23,255,241,0,56,0,33,255,223,0,56,0,34,255,219,0,56,0,36,255,249,0,56,0,40,255,249,0,56,0,46,255,239,0,56,0,48,255,249,0,56,0,50,255,249,0,56,0,62,0,26,0,56,0,66,255,216,0,56,0,68,255,217,0,56,0,69,255,217,0,56,0,70,255,217,0,56,0,71,255,247,0,56,0,72,255,216,0,56,0,74,255,251,0,56,0,75,255,251,0,56,0,78,255,224,0,56,0,79,255,224,0,56,0,80,255,217,0,56,0,81,255,224,0,56,0,82,255,217,0,56,0,83,255,224,0,56,0,84,255,219,0,56,0,85,255,243,0,56,0,86,255,227,0,56,0,87,255,247,0,56,0,88,255,247,0,56,0,89,255,249,0,56,0,90,255,248,0,56,0,91,255,247,0,56,0,94,0,28,0,56,0,107,255,230,0,56,0,127,255,219,0,56,0,128,255,219,0,56,0,129,255,219,0,56,0,130,255,219,0,56,0,131,255,219,0,56,0,132,255,219,0,56,0,133,255,209,0,56,0,134,255,249,0,56,0,145,255,249,0,56,0,146,255,249,0,56,0,147,255,249,0,56,0,148,255,249,0,56,0,149,255,249,0,56,0,151,255,249,0,56,0,158,255,245,0,56,0,159,255,216,0,56,0,160,255,216,0,56,0,161,255,216,0,56,0,162,255,216,0,56,0,163,255,216,0,56,0,164,255,216,0,56,0,165,255,216,0,56,0,166,255,217,0,56,0,167,255,217,0,56,0,168,255,217,0,56,0,169,255,217,0,56,0,170,255,217,0,56,0,171,0,4,0,56,0,172,255,251,0,56,0,173,0,44,0,56,0,174,0,36,0,56,0,175,255,222,0,56,0,176,255,224,0,56,0,177,255,217,0,56,0,178,255,217,0,56,0,179,255,217,0,56,0,180,255,217,0,56,0,181,255,217,0,56,0,183,255,217,0,56,0,184,255,227,0,56,0,185,255,227,0,56,0,186,255,227,0,56,0,187,255,227,0,56,0,188,255,248,0,56,0,189,255,224,0,56,0,190,255,248,0,56,0,193,255,251,0,56,0,194,255,249,0,56,0,195,255,217,0,56,0,197,255,219,0,56,0,200,255,247,0,56,0,207,255,248,0,56,0,208,255,248,0,56,0,211,255,225,0,56,0,214,255,225,0,56,0,218,255,226,0,56,0,220,255,230,0,56,0,240,0,23,0,57,0,7,255,246,0,57,0,14,255,243,0,57,0,36,255,229,0,57,0,40,255,229,0,57,0,48,255,229,0,57,0,50,255,229,0,57,0,52,255,251,0,57,0,62,0,31,0,57,0,68,255,223,0,57,0,69,255,223,0,57,0,70,255,223,0,57,0,71,255,245,0,57,0,72,255,238,0,57,0,80,255,223,0,57,0,82,255,223,0,57,0,85,255,228,0,57,0,86,255,232,0,57,0,87,255,207,0,57,0,88,255,213,0,57,0,90,255,206,0,57,0,94,0,31,0,57,0,107,255,226,0,57,0,110,255,238,0,57,0,134,255,229,0,57,0,145,255,229,0,57,0,146,255,229,0,57,0,147,255,229,0,57,0,148,255,229,0,57,0,149,255,229,0,57,0,151,255,229,0,57,0,158,255,243,0,57,0,166,255,223,0,57,0,167,255,223,0,57,0,168,255,223,0,57,0,169,255,223,0,57,0,170,255,223,0,57,0,171,0,7,0,57,0,173,0,23,0,57,0,174,0,38,0,57,0,175,255,239,0,57,0,177,255,223,0,57,0,178,255,223,0,57,0,179,255,223,0,57,0,180,255,223,0,57,0,181,255,223,0,57,0,183,255,223,0,57,0,184,255,232,0,57,0,185,255,232,0,57,0,186,255,232,0,57,0,187,255,232,0,57,0,188,255,206,0,57,0,190,255,206,0,57,0,194,255,229,0,57,0,195,255,223,0,57,0,196,255,251,0,57,0,207,255,243,0,57,0,208,255,243,0,57,0,220,255,226,0,57,0,240,0,24,0,58,0,7,255,237,0,58,0,11,0,13,0,58,0,13,255,215,0,58,0,14,255,222,0,58,0,15,255,215,0,58,0,16,255,201,0,58,0,17,255,233,0,58,0,21,255,206,0,58,0,23,255,218,0,58,0,25,255,246,0,58,0,27,255,235,0,58,0,28,255,235,0,58,0,32,0,13,0,58,0,33,255,198,0,58,0,34,255,192,0,58,0,36,255,230,0,58,0,40,255,230,0,58,0,46,255,232,0,58,0,48,255,230,0,58,0,50,255,230,0,58,0,61,0,7,0,58,0,62,0,31,0,58,0,66,255,189,0,58,0,68,255,171,0,58,0,69,255,171,0,58,0,70,255,171,0,58,0,71,255,237,0,58,0,72,255,180,0,58,0,78,255,187,0,58,0,79,255,187,0,58,0,80,255,171,0,58,0,81,255,187,0,58,0,82,255,171,0,58,0,83,255,187,0,58,0,84,255,186,0,58,0,85,255,221,0,58,0,86,255,190,0,58,0,87,255,215,0,58,0,88,255,216,0,58,0,89,255,214,0,58,0,90,255,217,0,58,0,91,255,229,0,58,0,94,0,33,0,58,0,107,255,198,0,58,0,110,255,230,0,58,0,122,255,225,0,58,0,127,255,192,0,58,0,128,255,192,0,58,0,129,255,192,0,58,0,130,255,192,0,58,0,131,255,192,0,58,0,132,255,192,0,58,0,133,255,180,0,58,0,134,255,230,0,58,0,145,255,230,0,58,0,146,255,230,0,58,0,147,255,230,0,58,0,148,255,230,0,58,0,149,255,230,0,58,0,151,255,230,0,58,0,158,255,230,0,58,0,159,255,189,0,58,0,160,255,189,0,58,0,161,255,189,0,58,0,162,255,189,0,58,0,163,255,189,0,58,0,164,255,189,0,58,0,165,255,189,0,58,0,166,255,171,0,58,0,167,255,171,0,58,0,168,255,171,0,58,0,169,255,171,0,58,0,170,255,171,0,58,0,171,0,16,0,58,0,173,0,38,0,58,0,174,0,47,0,58,0,175,255,216,0,58,0,176,255,187,0,58,0,177,255,171,0,58,0,178,255,171,0,58,0,179,255,171,0,58,0,180,255,171,0,58,0,181,255,171,0,58,0,183,255,171,0,58,0,184,255,190,0,58,0,185,255,190,0,58,0,186,255,190,0,58,0,187,255,190,0,58,0,188,255,217,0,58,0,189,255,225,0,58,0,190,255,217,0,58,0,194,255,230,0,58,0,195,255,171,0,58,0,197,255,234,0,58,0,200,255,229,0,58,0,207,255,222,0,58,0,208,255,222,0,58,0,211,255,215,0,58,0,214,255,215,0,58,0,218,255,215,0,58,0,220,255,198,0,58,0,221,255,225,0,58,0,240,0,33,0,59,0,14,255,217,0,59,0,17,255,243,0,59,0,21,255,199,0,59,0,23,255,247,0,59,0,36,255,238,0,59,0,40,255,238,0,59,0,48,255,238,0,59,0,50,255,238,0,59,0,62,0,23,0,59,0,66,255,246,0,59,0,68,255,227,0,59,0,69,255,227,0,59,0,70,255,227,0,59,0,71,255,241,0,59,0,72,255,229,0,59,0,74,255,250,0,59,0,75,255,250,0,59,0,78,255,235,0,59,0,79,255,235,0,59,0,80,255,227,0,59,0,81,255,235,0,59,0,82,255,227,0,59,0,83,255,235,0,59,0,84,255,245,0,59,0,85,255,241,0,59,0,86,255,224,0,59,0,87,255,241,0,59,0,88,255,241,0,59,0,90,255,242,0,59,0,91,255,248,0,59,0,94,0,23,0,59,0,107,255,214,0,59,0,110,255,233,0,59,0,134,255,238,0,59,0,145,255,238,0,59,0,146,255,238,0,59,0,147,255,238,0,59,0,148,255,238,0,59,0,149,255,238,0,59,0,151,255,238,0,59,0,158,255,239,0,59,0,159,255,246,0,59,0,160,255,246,0,59,0,161,255,246,0,59,0,162,255,246,0,59,0,163,255,246,0,59,0,164,255,246,0,59,0,165,255,246,0,59,0,166,255,227,0,59,0,167,255,227,0,59,0,168,255,227,0,59,0,169,255,227,0,59,0,170,255,227,0,59,0,171,0,6,0,59,0,172,255,250,0,59,0,173,0,29,0,59,0,174,0,37,0,59,0,175,255,235,0,59,0,176,255,235,0,59,0,177,255,227,0,59,0,178,255,227,0,59,0,179,255,227,0,59,0,180,255,227,0,59,0,181,255,227,0,59,0,183,255,227,0,59,0,184,255,224,0,59,0,185,255,224,0,59,0,186,255,224,0,59,0,187,255,224,0,59,0,188,255,242,0,59,0,189,255,235,0,59,0,190,255,242,0,59,0,193,255,250,0,59,0,194,255,238,0,59,0,195,255,227,0,59,0,197,255,245,0,59,0,200,255,248,0,59,0,207,255,217,0,59,0,208,255,217,0,59,0,220,255,214,0,59,0,240,0,24,0,60,0,17,255,232,0,60,0,21,255,228,0,60,0,23,255,229,0,60,0,25,255,248,0,60,0,34,255,227,0,60,0,36,255,226,0,60,0,40,255,226,0,60,0,43,0,49,0,60,0,46,255,244,0,60,0,48,255,226,0,60,0,50,255,226,0,60,0,53,0,22,0,60,0,55,0,31,0,60,0,56,0,27,0,60,0,57,0,28,0,60,0,58,0,36,0,60,0,66,255,218,0,60,0,68,255,213,0,60,0,69,255,213,0,60,0,70,255,213,0,60,0,75,0,7,0,60,0,78,255,214,0,60,0,79,255,214,0,60,0,80,255,213,0,60,0,81,255,223,0,60,0,82,255,213,0,60,0,83,255,214,0,60,0,84,255,218,0,60,0,85,255,224,0,60,0,86,255,215,0,60,0,87,255,216,0,60,0,88,255,218,0,60,0,89,255,226,0,60,0,90,255,216,0,60,0,91,255,219,0,60,0,127,255,227,0,60,0,128,255,227,0,60,0,129,255,227,0,60,0,130,255,227,0,60,0,131,255,227,0,60,0,132,255,227,0,60,0,133,255,243,0,60,0,134,255,226,0,60,0,145,255,226,0,60,0,146,255,226,0,60,0,147,255,226,0,60,0,148,255,226,0,60,0,149,255,226,0,60,0,151,255,226,0,60,0,156,0,36,0,60,0,158,255,244,0,60,0,159,255,218,0,60,0,160,255,218,0,60,0,161,255,218,0,60,0,162,255,228,0,60,0,163,255,218,0,60,0,164,255,218,0,60,0,165,255,218,0,60,0,166,255,213,0,60,0,167,255,213,0,60,0,168,255,213,0,60,0,169,255,213,0,60,0,170,255,213,0,60,0,171,0,15,0,60,0,173,0,34,0,60,0,174,0,45,0,60,0,175,255,231,0,60,0,176,255,214,0,60,0,177,255,213,0,60,0,178,255,213,0,60,0,179,255,213,0,60,0,180,255,213,0,60,0,181,255,213,0,60,0,183,255,213,0,60,0,184,255,215,0,60,0,185,255,215,0,60,0,186,255,215,0,60,0,187,255,215,0,60,0,188,255,216,0,60,0,189,255,252,0,60,0,190,255,216,0,60,0,194,255,226,0,60,0,195,255,213,0,60,0,197,255,232,0,60,0,198,0,36,0,60,0,200,255,246,0,61,0,3,255,220,0,61,0,8,255,220,0,61,0,17,255,244,0,61,0,18,255,241,0,61,0,26,255,242,0,61,0,36,255,236,0,61,0,40,255,236,0,61,0,43,0,16,0,61,0,48,255,236,0,61,0,50,255,236,0,61,0,53,255,205,0,61,0,54,255,234,0,61,0,55,255,201,0,61,0,56,255,216,0,61,0,58,255,201,0,61,0,85,255,240,0,61,0,87,255,222,0,61,0,88,255,231,0,61,0,90,255,219,0,61,0,134,255,236,0,61,0,145,255,236,0,61,0,146,255,236,0,61,0,147,255,236,0,61,0,148,255,236,0,61,0,149,255,236,0,61,0,151,255,236,0,61,0,152,255,234,0,61,0,153,255,234,0,61,0,154,255,234,0,61,0,155,255,234,0,61,0,156,255,201,0,61,0,188,255,219,0,61,0,190,255,219,0,61,0,194,255,236,0,61,0,198,255,201,0,61,0,210,255,214,0,61,0,213,255,214,0,66,0,3,255,234,0,66,0,7,255,245,0,66,0,8,255,234,0,66,0,10,255,246,0,66,0,11,255,231,0,66,0,18,255,234,0,66,0,26,255,247,0,66,0,32,255,229,0,66,0,35,255,240,0,66,0,36,255,237,0,66,0,37,255,240,0,66,0,38,255,240,0,66,0,39,255,240,0,66,0,40,255,237,0,66,0,41,255,240,0,66,0,42,255,240,0,66,0,43,255,240,0,66,0,44,255,240,0,66,0,45,255,240,0,66,0,46,255,248,0,66,0,47,255,240,0,66,0,48,255,237,0,66,0,49,255,240,0,66,0,50,255,237,0,66,0,51,255,240,0,66,0,52,255,250,0,66,0,53,255,173,0,66,0,54,255,227,0,66,0,55,255,193,0,66,0,56,255,210,0,66,0,58,255,165,0,66,0,61,255,210,0,66,0,62,255,227,0,66,0,71,255,251,0,66,0,85,255,246,0,66,0,87,255,238,0,66,0,88,255,243,0,66,0,90,255,236,0,66,0,94,255,231,0,66,0,110,255,248,0,66,0,134,255,237,0,66,0,135,255,240,0,66,0,136,255,240,0,66,0,137,255,240,0,66,0,138,255,240,0,66,0,139,255,240,0,66,0,140,255,240,0,66,0,141,255,240,0,66,0,142,255,240,0,66,0,143,255,240,0,66,0,144,255,240,0,66,0,145,255,237,0,66,0,146,255,237,0,66,0,147,255,237,0,66,0,148,255,237,0,66,0,149,255,237,0,66,0,151,255,237,0,66,0,152,255,227,0,66,0,153,255,227,0,66,0,154,255,227,0,66,0,155,255,227,0,66,0,156,255,165,0,66,0,157,255,240,0,66,0,158,255,249,0,66,0,188,255,236,0,66,0,190,255,236,0,66,0,194,255,237,0,66,0,196,255,250,0,66,0,198,255,165,0,66,0,209,255,186,0,66,0,210,255,183,0,66,0,212,255,186,0,66,0,213,255,183,0,66,0,240,255,230,0,67,0,3,255,234,0,67,0,7,255,246,0,67,0,8,255,234,0,67,0,10,255,227,0,67,0,11,255,232,0,67,0,13,255,246,0,67,0,15,255,247,0,67,0,18,255,235,0,67,0,19,255,232,0,67,0,24,255,226,0,67,0,32,255,224,0,67,0,34,255,240,0,67,0,35,255,237,0,67,0,36,255,246,0,67,0,37,255,237,0,67,0,38,255,237,0,67,0,39,255,237,0,67,0,40,255,246,0,67,0,41,255,237,0,67,0,42,255,237,0,67,0,43,255,237,0,67,0,44,255,237,0,67,0,45,255,237,0,67,0,46,255,239,0,67,0,47,255,237,0,67,0,48,255,246,0,67,0,49,255,237,0,67,0,50,255,246,0,67,0,51,255,237,0,67,0,52,255,237,0,67,0,53,255,171,0,67,0,54,255,238,0,67,0,55,255,193,0,67,0,56,255,212,0,67,0,57,255,217,0,67,0,58,255,167,0,67,0,59,255,227,0,67,0,61,255,217,0,67,0,62,255,217,0,67,0,71,255,251,0,67,0,85,255,250,0,67,0,87,255,247,0,67,0,88,255,251,0,67,0,89,255,238,0,67,0,90,255,245,0,67,0,91,255,246,0,67,0,94,255,226,0,67,0,122,255,247,0,67,0,127,255,240,0,67,0,128,255,240,0,67,0,129,255,240,0,67,0,130,255,240,0,67,0,131,255,240,0,67,0,132,255,240,0,67,0,134,255,246,0,67,0,135,255,237,0,67,0,136,255,237,0,67,0,137,255,237,0,67,0,138,255,237,0,67,0,139,255,237,0,67,0,140,255,237,0,67,0,141,255,237,0,67,0,142,255,237,0,67,0,143,255,237,0,67,0,144,255,237,0,67,0,145,255,246,0,67,0,146,255,246,0,67,0,147,255,246,0,67,0,148,255,246,0,67,0,149,255,246,0,67,0,151,255,246,0,67,0,152,255,238,0,67,0,153,255,238,0,67,0,154,255,238,0,67,0,155,255,238,0,67,0,156,255,167,0,67,0,157,255,237,0,67,0,158,255,248,0,67,0,188,255,245,0,67,0,190,255,245,0,67,0,194,255,246,0,67,0,196,255,237,0,67,0,198,255,167,0,67,0,199,255,227,0,67,0,200,255,246,0,67,0,209,255,181,0,67,0,210,255,178,0,67,0,211,255,246,0,67,0,212,255,181,0,67,0,213,255,178,0,67,0,214,255,246,0,67,0,218,255,247,0,67,0,221,255,247,0,67,0,240,255,234,0,68,0,7,255,240,0,68,0,10,255,244,0,68,0,14,255,219,0,68,0,21,255,231,0,68,0,24,255,245,0,68,0,32,255,228,0,68,0,35,255,247,0,68,0,36,255,244,0,68,0,37,255,247,0,68,0,38,255,247,0,68,0,39,255,247,0,68,0,40,255,244,0,68,0,41,255,247,0,68,0,42,255,247,0,68,0,43,255,247,0,68,0,44,255,247,0,68,0,45,255,247,0,68,0,46,255,251,0,68,0,47,255,247,0,68,0,48,255,244,0,68,0,49,255,247,0,68,0,50,255,244,0,68,0,51,255,247,0,68,0,52,255,244,0,68,0,53,255,190,0,68,0,54,255,243,0,68,0,55,255,236,0,68,0,56,255,241,0,68,0,58,255,218,0,68,0,61,255,240,0,68,0,62,255,232,0,68,0,68,255,249,0,68,0,69,255,249,0,68,0,70,255,249,0,68,0,80,255,249,0,68,0,82,255,249,0,68,0,94,255,239,0,68,0,107,255,243,0,68,0,134,255,244,0,68,0,135,255,247,0,68,0,136,255,247,0,68,0,137,255,247,0,68,0,138,255,247,0,68,0,139,255,247,0,68,0,140,255,247,0,68,0,141,255,247,0,68,0,142,255,247,0,68,0,143,255,247,0,68,0,144,255,247,0,68,0,145,255,244,0,68,0,146,255,244,0,68,0,147,255,244,0,68,0,148,255,244,0,68,0,149,255,244,0,68,0,151,255,244,0,68,0,152,255,243,0,68,0,153,255,243,0,68,0,154,255,243,0,68,0,155,255,243,0,68,0,156,255,218,0,68,0,157,255,247,0,68,0,166,255,249,0,68,0,167,255,249,0,68,0,168,255,249,0,68,0,169,255,249,0,68,0,170,255,249,0,68,0,175,255,251,0,68,0,177,255,249,0,68,0,178,255,249,0,68,0,179,255,249,0,68,0,180,255,249,0,68,0,181,255,249,0,68,0,183,255,249,0,68,0,194,255,244,0,68,0,195,255,249,0,68,0,196,255,244,0,68,0,198,255,218,0,68,0,207,255,219,0,68,0,208,255,219,0,68,0,209,255,216,0,68,0,210,255,213,0,68,0,212,255,216,0,68,0,213,255,213,0,68,0,220,255,243,0,68,0,240,255,245,0,69,0,7,255,244,0,69,0,34,255,249,0,69,0,35,255,242,0,69,0,36,255,245,0,69,0,37,255,242,0,69,0,38,255,242,0,69,0,39,255,242,0,69,0,40,255,245,0,69,0,41,255,242,0,69,0,42,255,242,0,69,0,43,255,242,0,69,0,44,255,242,0,69,0,45,255,242,0,69,0,46,255,240,0,69,0,47,255,242,0,69,0,48,255,245,0,69,0,49,255,242,0,69,0,50,255,245,0,69,0,51,255,242,0,69,0,52,255,246,0,69,0,53,255,245,0,69,0,54,255,240,0,69,0,55,255,250,0,69,0,56,255,248,0,69,0,58,255,251,0,69,0,59,255,245,0,69,0,127,255,249,0,69,0,128,255,249,0,69,0,129,255,249,0,69,0,130,255,249,0,69,0,131,255,249,0,69,0,132,255,249,0,69,0,134,255,245,0,69,0,135,255,242,0,69,0,136,255,242,0,69,0,137,255,242,0,69,0,138,255,242,0,69,0,139,255,242,0,69,0,140,255,242,0,69,0,141,255,242,0,69,0,142,255,242,0,69,0,143,255,242,0,69,0,144,255,242,0,69,0,145,255,245,0,69,0,146,255,245,0,69,0,147,255,245,0,69,0,148,255,245,0,69,0,149,255,245,0,69,0,151,255,245,0,69,0,152,255,240,0,69,0,153,255,240,0,69,0,154,255,240,0,69,0,155,255,240,0,69,0,156,255,251,0,69,0,157,255,242,0,69,0,194,255,245,0,69,0,196,255,246,0,69,0,198,255,251,0,69,0,199,255,245,0,70,0,3,255,241,0,70,0,7,255,246,0,70,0,8,255,241,0,70,0,10,255,230,0,70,0,11,255,238,0,70,0,18,255,235,0,70,0,19,255,245,0,70,0,24,255,230,0,70,0,32,255,223,0,70,0,34,255,251,0,70,0,35,255,241,0,70,0,36,255,250,0,70,0,37,255,241,0,70,0,38,255,241,0,70,0,39,255,241,0,70,0,40,255,250,0,70,0,41,255,241,0,70,0,42,255,241,0,70,0,43,255,241,0,70,0,44,255,241,0,70,0,45,255,241,0,70,0,46,255,243,0,70,0,47,255,241,0,70,0,48,255,250,0,70,0,49,255,241,0,70,0,50,255,250,0,70,0,51,255,241,0,70,0,52,255,241,0,70,0,53,255,187,0,70,0,54,255,240,0,70,0,55,255,209,0,70,0,56,255,213,0,70,0,57,255,243,0,70,0,58,255,174,0,70,0,59,255,243,0,70,0,61,255,220,0,70,0,62,255,220,0,70,0,87,255,252,0,70,0,89,255,251,0,70,0,90,255,251,0,70,0,94,255,227,0,70,0,127,255,251,0,70,0,128,255,251,0,70,0,129,255,251,0,70,0,130,255,251,0,70,0,131,255,251,0,70,0,132,255,251,0,70,0,134,255,250,0,70,0,135,255,241,0,70,0,136,255,241,0,70,0,137,255,241,0,70,0,138,255,241,0,70,0,139,255,241,0,70,0,140,255,241,0,70,0,141,255,241,0,70,0,142,255,241,0,70,0,143,255,241,0,70,0,144,255,241,0,70,0,145,255,250,0,70,0,146,255,250,0,70,0,147,255,250,0,70,0,148,255,250,0,70,0,149,255,250,0,70,0,151,255,250,0,70,0,152,255,240,0,70,0,153,255,240,0,70,0,154,255,240,0,70,0,155,255,240,0,70,0,156,255,174,0,70,0,157,255,241,0,70,0,188,255,251,0,70,0,190,255,251,0,70,0,194,255,250,0,70,0,196,255,241,0,70,0,198,255,174,0,70,0,199,255,243,0,70,0,209,255,189,0,70,0,210,255,186,0,70,0,212,255,189,0,70,0,213,255,186,0,70,0,240,255,237,0,71,0,7,255,235,0,71,0,13,255,229,0,71,0,14,255,232,0,71,0,15,255,229,0,71,0,16,255,234,0,71,0,21,255,244,0,71,0,33,255,239,0,71,0,34,255,211,0,71,0,35,255,244,0,71,0,37,255,244,0,71,0,38,255,244,0,71,0,39,255,244,0,71,0,41,255,244,0,71,0,42,255,244,0,71,0,43,255,244,0,71,0,44,255,244,0,71,0,45,255,244,0,71,0,46,255,229,0,71,0,47,255,244,0,71,0,49,255,244,0,71,0,51,255,244,0,71,0,54,255,247,0,71,0,59,255,243,0,71,0,66,255,251,0,71,0,68,255,246,0,71,0,69,255,246,0,71,0,70,255,246,0,71,0,72,255,252,0,71,0,80,255,246,0,71,0,82,255,246,0,71,0,94,0,8,0,71,0,107,255,239,0,71,0,127,255,211,0,71,0,128,255,211,0,71,0,129,255,211,0,71,0,130,255,211,0,71,0,131,255,211,0,71,0,132,255,211,0,71,0,135,255,244,0,71,0,136,255,244,0,71,0,137,255,244,0,71,0,138,255,244,0,71,0,139,255,244,0,71,0,140,255,244,0,71,0,141,255,244,0,71,0,142,255,244,0,71,0,143,255,244,0,71,0,144,255,244,0,71,0,152,255,247,0,71,0,153,255,247,0,71,0,154,255,247,0,71,0,155,255,247,0,71,0,157,255,244,0,71,0,159,255,251,0,71,0,160,255,251,0,71,0,161,255,251,0,71,0,162,255,251,0,71,0,163,255,251,0,71,0,164,255,251,0,71,0,165,255,251,0,71,0,166,255,246,0,71,0,167,255,246,0,71,0,168,255,246,0,71,0,169,255,246,0,71,0,170,255,246,0,71,0,175,255,224,0,71,0,177,255,246,0,71,0,178,255,246,0,71,0,179,255,246,0,71,0,180,255,246,0,71,0,181,255,246,0,71,0,183,255,246,0,71,0,195,255,246,0,71,0,199,255,243,0,71,0,207,255,232,0,71,0,208,255,232,0,71,0,211,255,229,0,71,0,214,255,229,0,71,0,218,255,229,0,71,0,220,255,239,0,72,0,7,255,244,0,72,0,10,0,5,0,72,0,16,0,14,0,72,0,24,255,225,0,72,0,32,255,217,0,72,0,34,255,249,0,72,0,35,255,245,0,72,0,37,255,245,0,72,0,38,255,245,0,72,0,39,255,245,0,72,0,41,255,245,0,72,0,42,255,245,0,72,0,43,0,45,0,72,0,44,255,245,0,72,0,45,255,245,0,72,0,46,255,242,0,72,0,47,255,245,0,72,0,49,255,245,0,72,0,51,255,245,0,72,0,53,255,208,0,72,0,54,255,246,0,72,0,55,255,247,0,72,0,56,255,250,0,72,0,57,255,250,0,72,0,58,255,238,0,72,0,59,255,245,0,72,0,62,0,25,0,72,0,75,0,19,0,72,0,94,0,29,0,72,0,127,255,249,0,72,0,128,255,249,0,72,0,129,255,249,0,72,0,130,255,249,0,72,0,131,255,249,0,72,0,132,255,249,0,72,0,135,255,245,0,72,0,136,255,245,0,72,0,137,255,245,0,72,0,138,255,245,0,72,0,139,255,245,0,72,0,140,255,245,0,72,0,141,255,245,0,72,0,142,255,245,0,72,0,143,255,245,0,72,0,144,255,245,0,72,0,152,255,246,0,72,0,153,255,246,0,72,0,154,255,246,0,72,0,155,255,246,0,72,0,156,255,238,0,72,0,157,255,245,0,72,0,175,255,250,0,72,0,198,255,238,0,72,0,199,255,245,0,72,0,209,255,223,0,72,0,210,255,221,0,72,0,212,255,223,0,72,0,213,255,221,0,73,0,2,255,248,0,73,0,3,255,238,0,73,0,7,255,245,0,73,0,8,255,238,0,73,0,10,255,232,0,73,0,11,255,235,0,73,0,18,255,231,0,73,0,24,255,233,0,73,0,32,255,224,0,73,0,34,255,250,0,73,0,35,255,238,0,73,0,36,255,243,0,73,0,37,255,238,0,73,0,38,255,238,0,73,0,39,255,238,0,73,0,40,255,243,0,73,0,41,255,238,0,73,0,42,255,238,0,73,0,43,255,238,0,73,0,44,255,238,0,73,0,45,255,238,0,73,0,46,255,241,0,73,0,47,255,238,0,73,0,48,255,243,0,73,0,49,255,238,0,73,0,50,255,243,0,73,0,51,255,238,0,73,0,52,255,241,0,73,0,53,255,162,0,73,0,54,255,231,0,73,0,55,255,198,0,73,0,56,255,214,0,73,0,57,255,249,0,73,0,58,255,163,0,73,0,59,255,245,0,73,0,61,255,214,0,73,0,62,255,216,0,73,0,71,255,251,0,73,0,85,255,248,0,73,0,87,255,243,0,73,0,88,255,248,0,73,0,90,255,242,0,73,0,94,255,225,0,73,0,127,255,250,0,73,0,128,255,250,0,73,0,129,255,250,0,73,0,130,255,250,0,73,0,131,255,250,0,73,0,132,255,250,0,73,0,134,255,243,0,73,0,135,255,238,0,73,0,136,255,238,0,73,0,137,255,238,0,73,0,138,255,238,0,73,0,139,255,238,0,73,0,140,255,238,0,73,0,141,255,238,0,73,0,142,255,238,0,73,0,143,255,238,0,73,0,144,255,238,0,73,0,145,255,243,0,73,0,146,255,243,0,73,0,147,255,243,0,73,0,148,255,243,0,73,0,149,255,243,0,73,0,151,255,243,0,73,0,152,255,231,0,73,0,153,255,231,0,73,0,154,255,231,0,73,0,155,255,231,0,73,0,156,255,163,0,73,0,157,255,238,0,73,0,158,255,248,0,73,0,188,255,242,0,73,0,190,255,242,0,73,0,194,255,243,0,73,0,196,255,241,0,73,0,198,255,163,0,73,0,199,255,245,0,73,0,209,255,187,0,73,0,210,255,184,0,73,0,212,255,187,0,73,0,213,255,184,0,73,0,240,255,235,0,74,0,7,255,244,0,74,0,34,255,248,0,74,0,35,255,242,0,74,0,36,255,244,0,74,0,37,255,242,0,74,0,38,255,242,0,74,0,39,255,242,0,74,0,40,255,244,0,74,0,41,255,242,0,74,0,42,255,242,0,74,0,43,255,242,0,74,0,44,255,242,0,74,0,45,255,242,0,74,0,46,255,241,0,74,0,47,255,242,0,74,0,48,255,244,0,74,0,49,255,242,0,74,0,50,255,244,0,74,0,51,255,242,0,74,0,52,255,244,0,74,0,53,255,242,0,74,0,54,255,238,0,74,0,55,255,247,0,74,0,56,255,246,0,74,0,58,255,247,0,74,0,59,255,245,0,74,0,127,255,248,0,74,0,128,255,248,0,74,0,129,255,248,0,74,0,130,255,248,0,74,0,131,255,248,0,74,0,132,255,248,0,74,0,134,255,244,0,74,0,135,255,242,0,74,0,136,255,242,0,74,0,137,255,242,0,74,0,138,255,242,0,74,0,139,255,242,0,74,0,140,255,242,0,74,0,141,255,242,0,74,0,142,255,242,0,74,0,143,255,242,0,74,0,144,255,242,0,74,0,145,255,244,0,74,0,146,255,244,0,74,0,147,255,244,0,74,0,148,255,244,0,74,0,149,255,244,0,74,0,151,255,244,0,74,0,152,255,238,0,74,0,153,255,238,0,74,0,154,255,238,0,74,0,155,255,238,0,74,0,156,255,247,0,74,0,157,255,242,0,74,0,194,255,244,0,74,0,196,255,244,0,74,0,198,255,247,0,74,0,199,255,245,0,75,0,7,255,244,0,75,0,34,255,248,0,75,0,35,255,242,0,75,0,36,255,244,0,75,0,37,255,242,0,75,0,38,255,242,0,75,0,39,255,242,0,75,0,40,255,244,0,75,0,41,255,242,0,75,0,42,255,242,0,75,0,43,255,242,0,75,0,44,255,242,0,75,0,45,255,242,0,75,0,46,255,241,0,75,0,47,255,242,0,75,0,48,255,244,0,75,0,49,255,242,0,75,0,50,255,244,0,75,0,51,255,242,0,75,0,52,255,244,0,75,0,53,255,242,0,75,0,54,255,238,0,75,0,55,255,247,0,75,0,56,255,246,0,75,0,58,255,247,0,75,0,59,255,245,0,75,0,127,255,248,0,75,0,128,255,248,0,75,0,129,255,248,0,75,0,130,255,248,0,75,0,131,255,248,0,75,0,132,255,248,0,75,0,134,255,244,0,75,0,135,255,242,0,75,0,136,255,242,0,75,0,137,255,242,0,75,0,138,255,242,0,75,0,139,255,242,0,75,0,140,255,242,0,75,0,141,255,242,0,75,0,142,255,242,0,75,0,143,255,242,0,75,0,144,255,242,0,75,0,145,255,244,0,75,0,146,255,244,0,75,0,147,255,244,0,75,0,148,255,244,0,75,0,149,255,244,0,75,0,151,255,244,0,75,0,152,255,238,0,75,0,153,255,238,0,75,0,154,255,238,0,75,0,155,255,238,0,75,0,156,255,247,0,75,0,157,255,242,0,75,0,194,255,244,0,75,0,196,255,244,0,75,0,198,255,247,0,75,0,199,255,245,0,76,0,7,255,242,0,76,0,14,255,241,0,76,0,32,255,237,0,76,0,36,255,234,0,76,0,40,255,234,0,76,0,48,255,234,0,76,0,50,255,234,0,76,0,53,255,166,0,76,0,54,255,251,0,76,0,55,255,245,0,76,0,56,255,251,0,76,0,58,255,217,0,76,0,62,255,239,0,76,0,66,255,251,0,76,0,68,255,234,0,76,0,69,255,234,0,76,0,70,255,234,0,76,0,72,255,238,0,76,0,80,255,234,0,76,0,82,255,234,0,76,0,107,255,238,0,76,0,134,255,234,0,76,0,145,255,234,0,76,0,146,255,234,0,76,0,147,255,234,0,76,0,148,255,234,0,76,0,149,255,234,0,76,0,151,255,234,0,76,0,152,255,251,0,76,0,153,255,251,0,76,0,154,255,251,0,76,0,155,255,251,0,76,0,156,255,217,0,76,0,159,255,251,0,76,0,160,255,251,0,76,0,161,255,251,0,76,0,162,255,251,0,76,0,163,255,251,0,76,0,164,255,251,0,76,0,165,255,251,0,76,0,166,255,234,0,76,0,167,255,234,0,76,0,168,255,234,0,76,0,169,255,234,0,76,0,170,255,234,0,76,0,175,255,230,0,76,0,177,255,234,0,76,0,178,255,234,0,76,0,179,255,234,0,76,0,180,255,234,0,76,0,181,255,234,0,76,0,183,255,234,0,76,0,194,255,234,0,76,0,195,255,234,0,76,0,198,255,217,0,76,0,207,255,241,0,76,0,208,255,241,0,76,0,209,255,229,0,76,0,210,255,227,0,76,0,212,255,229,0,76,0,213,255,227,0,76,0,220,255,238,0,77,0,3,255,247,0,77,0,7,255,244,0,77,0,8,255,247,0,77,0,11,255,246,0,77,0,35,255,240,0,77,0,36,255,237,0,77,0,37,255,240,0,77,0,38,255,240,0,77,0,39,255,240,0,77,0,40,255,237,0,77,0,41,255,240,0,77,0,42,255,240,0,77,0,43,255,240,0,77,0,44,255,240,0,77,0,45,255,240,0,77,0,46,255,248,0,77,0,47,255,240,0,77,0,48,255,237,0,77,0,49,255,240,0,77,0,50,255,237,0,77,0,51,255,240,0,77,0,53,255,234,0,77,0,54,255,228,0,77,0,55,255,239,0,77,0,56,255,237,0,77,0,58,255,241,0,77,0,68,255,251,0,77,0,69,255,251,0,77,0,70,255,251,0,77,0,80,255,251,0,77,0,82,255,251,0,77,0,85,255,251,0,77,0,87,255,249,0,77,0,88,255,251,0,77,0,90,255,249,0,77,0,107,255,247,0,77,0,134,255,237,0,77,0,135,255,240,0,77,0,136,255,240,0,77,0,137,255,240,0,77,0,138,255,240,0,77,0,139,255,240,0,77,0,140,255,240,0,77,0,141,255,240,0,77,0,142,255,240,0,77,0,143,255,240,0,77,0,144,255,240,0,77,0,145,255,237,0,77,0,146,255,237,0,77,0,147,255,237,0,77,0,148,255,237,0,77,0,149,255,237,0,77,0,151,255,237,0,77,0,152,255,228,0,77,0,153,255,228,0,77,0,154,255,228,0,77,0,155,255,228,0,77,0,156,255,241,0,77,0,157,255,240,0,77,0,166,255,251,0,77,0,167,255,251,0,77,0,168,255,251,0,77,0,169,255,251,0,77,0,170,255,251,0,77,0,177,255,251,0,77,0,178,255,251,0,77,0,179,255,251,0,77,0,180,255,251,0,77,0,181,255,251,0,77,0,183,255,251,0,77,0,188,255,249,0,77,0,190,255,249,0,77,0,194,255,237,0,77,0,195,255,251,0,77,0,198,255,241,0,77,0,209,255,245,0,77,0,210,255,246,0,77,0,212,255,245,0,77,0,213,255,246,0,77,0,220,255,247,0,78,0,2,255,248,0,78,0,3,255,238,0,78,0,7,255,245,0,78,0,8,255,238,0,78,0,10,255,232,0,78,0,11,255,235,0,78,0,18,255,231,0,78,0,24,255,233,0,78,0,32,255,224,0,78,0,34,255,250,0,78,0,35,255,238,0,78,0,36,255,243,0,78,0,37,255,238,0,78,0,38,255,238,0,78,0,39,255,238,0,78,0,40,255,243,0,78,0,41,255,238,0,78,0,42,255,238,0,78,0,43,255,238,0,78,0,44,255,238,0,78,0,45,255,238,0,78,0,46,255,241,0,78,0,47,255,238,0,78,0,48,255,243,0,78,0,49,255,238,0,78,0,50,255,243,0,78,0,51,255,238,0,78,0,52,255,241,0,78,0,53,255,162,0,78,0,54,255,231,0,78,0,55,255,198,0,78,0,56,255,214,0,78,0,57,255,249,0,78,0,58,255,163,0,78,0,59,255,245,0,78,0,61,255,214,0,78,0,62,255,216,0,78,0,71,255,251,0,78,0,85,255,248,0,78,0,87,255,243,0,78,0,88,255,248,0,78,0,90,255,242,0,78,0,94,255,225,0,78,0,127,255,250,0,78,0,128,255,250,0,78,0,129,255,250,0,78,0,130,255,250,0,78,0,131,255,250,0,78,0,132,255,250,0,78,0,134,255,243,0,78,0,135,255,238,0,78,0,136,255,238,0,78,0,137,255,238,0,78,0,138,255,238,0,78,0,139,255,238,0,78,0,140,255,238,0,78,0,141,255,238,0,78,0,142,255,238,0,78,0,143,255,238,0,78,0,144,255,238,0,78,0,145,255,243,0,78,0,146,255,243,0,78,0,147,255,243,0,78,0,148,255,243,0,78,0,149,255,243,0,78,0,151,255,243,0,78,0,152,255,231,0,78,0,153,255,231,0,78,0,154,255,231,0,78,0,155,255,231,0,78,0,156,255,163,0,78,0,157,255,238,0,78,0,158,255,248,0,78,0,188,255,242,0,78,0,190,255,242,0,78,0,194,255,243,0,78,0,196,255,241,0,78,0,198,255,163,0,78,0,199,255,245,0,78,0,209,255,187,0,78,0,210,255,184,0,78,0,212,255,187,0,78,0,213,255,184,0,78,0,240,255,235,0,79,0,2,255,248,0,79,0,3,255,238,0,79,0,7,255,245,0,79,0,8,255,238,0,79,0,10,255,232,0,79,0,11,255,235,0,79,0,18,255,231,0,79,0,24,255,233,0,79,0,32,255,224,0,79,0,34,255,250,0,79,0,35,255,238,0,79,0,36,255,243,0,79,0,37,255,238,0,79,0,38,255,238,0,79,0,39,255,238,0,79,0,40,255,243,0,79,0,41,255,238,0,79,0,42,255,238,0,79,0,43,255,238,0,79,0,44,255,238,0,79,0,45,255,238,0,79,0,46,255,241,0,79,0,47,255,238,0,79,0,48,255,243,0,79,0,49,255,238,0,79,0,50,255,243,0,79,0,51,255,238,0,79,0,52,255,241,0,79,0,53,255,162,0,79,0,54,255,231,0,79,0,55,255,198,0,79,0,56,255,214,0,79,0,57,255,249,0,79,0,58,255,163,0,79,0,59,255,245,0,79,0,61,255,214,0,79,0,62,255,216,0,79,0,71,255,251,0,79,0,85,255,248,0,79,0,87,255,243,0,79,0,88,255,248,0,79,0,90,255,242,0,79,0,94,255,225,0,79,0,127,255,250,0,79,0,128,255,250,0,79,0,129,255,250,0,79,0,130,255,250,0,79,0,131,255,250,0,79,0,132,255,250,0,79,0,134,255,243,0,79,0,135,255,238,0,79,0,136,255,238,0,79,0,137,255,238,0,79,0,138,255,238,0,79,0,139,255,238,0,79,0,140,255,238,0,79,0,141,255,238,0,79,0,142,255,238,0,79,0,143,255,238,0,79,0,144,255,238,0,79,0,145,255,243,0,79,0,146,255,243,0,79,0,147,255,243,0,79,0,148,255,243,0,79,0,149,255,243,0,79,0,151,255,243,0,79,0,152,255,231,0,79,0,153,255,231,0,79,0,154,255,231,0,79,0,155,255,231,0,79,0,156,255,163,0,79,0,157,255,238,0,79,0,158,255,248,0,79,0,188,255,242,0,79,0,190,255,242,0,79,0,194,255,243,0,79,0,196,255,241,0,79,0,198,255,163,0,79,0,199,255,245,0,79,0,209,255,187,0,79,0,210,255,184,0,79,0,212,255,187,0,79,0,213,255,184,0,79,0,240,255,235,0,80,0,3,255,236,0,80,0,7,255,246,0,80,0,8,255,236,0,80,0,10,255,224,0,80,0,11,255,234,0,80,0,18,255,230,0,80,0,19,255,229,0,80,0,24,255,223,0,80,0,32,255,222,0,80,0,34,255,240,0,80,0,35,255,237,0,80,0,36,255,246,0,80,0,37,255,237,0,80,0,38,255,237,0,80,0,39,255,237,0,80,0,40,255,246,0,80,0,41,255,237,0,80,0,42,255,237,0,80,0,43,255,237,0,80,0,44,255,237,0,80,0,45,255,237,0,80,0,46,255,239,0,80,0,47,255,237,0,80,0,48,255,246,0,80,0,49,255,237,0,80,0,50,255,246,0,80,0,51,255,237,0,80,0,52,255,238,0,80,0,53,255,173,0,80,0,54,255,238,0,80,0,55,255,192,0,80,0,56,255,212,0,80,0,57,255,218,0,80,0,58,255,167,0,80,0,59,255,227,0,80,0,61,255,214,0,80,0,62,255,213,0,80,0,71,255,251,0,80,0,85,255,249,0,80,0,87,255,247,0,80,0,88,255,251,0,80,0,89,255,237,0,80,0,90,255,245,0,80,0,91,255,246,0,80,0,94,255,222,0,80,0,122,255,247,0,80,0,127,255,240,0,80,0,128,255,240,0,80,0,129,255,240,0,80,0,130,255,240,0,80,0,131,255,240,0,80,0,132,255,240,0,80,0,134,255,246,0,80,0,135,255,237,0,80,0,136,255,237,0,80,0,137,255,237,0,80,0,138,255,237,0,80,0,139,255,237,0,80,0,140,255,237,0,80,0,141,255,237,0,80,0,142,255,237,0,80,0,143,255,237,0,80,0,144,255,237,0,80,0,145,255,246,0,80,0,146,255,246,0,80,0,147,255,246,0,80,0,148,255,246,0,80,0,149,255,246,0,80,0,151,255,246,0,80,0,152,255,238,0,80,0,153,255,238,0,80,0,154,255,238,0,80,0,155,255,238,0,80,0,156,255,167,0,80,0,157,255,237,0,80,0,158,255,248,0,80,0,188,255,245,0,80,0,190,255,245,0,80,0,194,255,246,0,80,0,196,255,238,0,80,0,198,255,167,0,80,0,199,255,227,0,80,0,200,255,246,0,80,0,209,255,182,0,80,0,210,255,179,0,80,0,212,255,182,0,80,0,213,255,179,0,80,0,221,255,247,0,80,0,240,255,236,0,81,0,3,255,236,0,81,0,7,255,246,0,81,0,8,255,236,0,81,0,10,255,224,0,81,0,11,255,234,0,81,0,18,255,230,0,81,0,19,255,229,0,81,0,24,255,223,0,81,0,32,255,222,0,81,0,34,255,240,0,81,0,35,255,237,0,81,0,36,255,246,0,81,0,37,255,237,0,81,0,38,255,237,0,81,0,39,255,237,0,81,0,40,255,246,0,81,0,41,255,237,0,81,0,42,255,237,0,81,0,43,255,237,0,81,0,44,255,237,0,81,0,45,255,237,0,81,0,46,255,239,0,81,0,47,255,237,0,81,0,48,255,246,0,81,0,49,255,237,0,81,0,50,255,246,0,81,0,51,255,237,0,81,0,52,255,238,0,81,0,53,255,173,0,81,0,54,255,238,0,81,0,55,255,192,0,81,0,56,255,212,0,81,0,57,255,218,0,81,0,58,255,167,0,81,0,59,255,227,0,81,0,61,255,214,0,81,0,62,255,213,0,81,0,71,255,251,0,81,0,85,255,249,0,81,0,87,255,247,0,81,0,88,255,251,0,81,0,89,255,237,0,81,0,90,255,245,0,81,0,91,255,246,0,81,0,94,255,222,0,81,0,122,255,247,0,81,0,127,255,240,0,81,0,128,255,240,0,81,0,129,255,240,0,81,0,130,255,240,0,81,0,131,255,240,0,81,0,132,255,240,0,81,0,134,255,246,0,81,0,135,255,237,0,81,0,136,255,237,0,81,0,137,255,237,0,81,0,138,255,237,0,81,0,139,255,237,0,81,0,140,255,237,0,81,0,141,255,237,0,81,0,142,255,237,0,81,0,143,255,237,0,81,0,144,255,237,0,81,0,145,255,246,0,81,0,146,255,246,0,81,0,147,255,246,0,81,0,148,255,246,0,81,0,149,255,246,0,81,0,151,255,246,0,81,0,152,255,238,0,81,0,153,255,238,0,81,0,154,255,238,0,81,0,155,255,238,0,81,0,156,255,167,0,81,0,157,255,237,0,81,0,158,255,248,0,81,0,188,255,245,0,81,0,190,255,245,0,81,0,194,255,246,0,81,0,196,255,238,0,81,0,198,255,167,0,81,0,199,255,227,0,81,0,200,255,246,0,81,0,209,255,182,0,81,0,210,255,179,0,81,0,212,255,182,0,81,0,213,255,179,0,81,0,221,255,247,0,81,0,240,255,236,0,82,0,7,255,244,0,82,0,10,255,233,0,82,0,11,255,244,0,82,0,24,255,232,0,82,0,32,255,223,0,82,0,34,255,248,0,82,0,35,255,242,0,82,0,36,255,244,0,82,0,37,255,242,0,82,0,38,255,242,0,82,0,39,255,242,0,82,0,40,255,244,0,82,0,41,255,242,0,82,0,42,255,242,0,82,0,43,255,242,0,82,0,44,255,242,0,82,0,45,255,242,0,82,0,46,255,241,0,82,0,47,255,242,0,82,0,48,255,244,0,82,0,49,255,242,0,82,0,50,255,244,0,82,0,51,255,242,0,82,0,52,255,243,0,82,0,53,255,164,0,82,0,54,255,235,0,82,0,55,255,216,0,82,0,56,255,218,0,82,0,57,255,246,0,82,0,58,255,183,0,82,0,59,255,242,0,82,0,61,255,228,0,82,0,62,255,215,0,82,0,94,255,226,0,82,0,127,255,248,0,82,0,128,255,248,0,82,0,129,255,248,0,82,0,130,255,248,0,82,0,131,255,248,0,82,0,132,255,248,0,82,0,134,255,244,0,82,0,135,255,242,0,82,0,136,255,242,0,82,0,137,255,242,0,82,0,138,255,242,0,82,0,139,255,242,0,82,0,140,255,242,0,82,0,141,255,242,0,82,0,142,255,242,0,82,0,143,255,242,0,82,0,144,255,242,0,82,0,145,255,244,0,82,0,146,255,244,0,82,0,147,255,244,0,82,0,148,255,244,0,82,0,149,255,244,0,82,0,151,255,244,0,82,0,152,255,235,0,82,0,153,255,235,0,82,0,154,255,235,0,82,0,155,255,235,0,82,0,156,255,183,0,82,0,157,255,242,0,82,0,194,255,244,0,82,0,196,255,243,0,82,0,198,255,183,0,82,0,199,255,242,0,82,0,209,255,211,0,82,0,210,255,209,0,82,0,212,255,211,0,82,0,213,255,209,0,82,0,240,255,239,0,83,0,7,255,237,0,83,0,10,255,232,0,83,0,13,255,227,0,83,0,14,255,234,0,83,0,15,255,227,0,83,0,16,255,225,0,83,0,20,255,231,0,83,0,21,255,238,0,83,0,24,255,200,0,83,0,32,255,202,0,83,0,33,255,232,0,83,0,34,255,211,0,83,0,35,255,243,0,83,0,37,255,243,0,83,0,38,255,243,0,83,0,39,255,243,0,83,0,41,255,243,0,83,0,42,255,243,0,83,0,43,255,243,0,83,0,44,255,243,0,83,0,45,255,243,0,83,0,46,255,230,0,83,0,47,255,243,0,83,0,49,255,243,0,83,0,51,255,243,0,83,0,53,255,163,0,83,0,54,255,247,0,83,0,55,255,243,0,83,0,56,255,247,0,83,0,57,255,214,0,83,0,58,255,225,0,83,0,59,255,227,0,83,0,62,255,217,0,83,0,66,255,249,0,83,0,68,255,243,0,83,0,69,255,243,0,83,0,70,255,243,0,83,0,72,255,250,0,83,0,80,255,243,0,83,0,82,255,243,0,83,0,94,255,228,0,83,0,107,255,237,0,83,0,127,255,211,0,83,0,128,255,211,0,83,0,129,255,211,0,83,0,130,255,211,0,83,0,131,255,211,0,83,0,132,255,211,0,83,0,135,255,243,0,83,0,136,255,243,0,83,0,137,255,243,0,83,0,138,255,243,0,83,0,139,255,243,0,83,0,140,255,243,0,83,0,141,255,243,0,83,0,142,255,243,0,83,0,143,255,243,0,83,0,144,255,243,0,83,0,152,255,247,0,83,0,153,255,247,0,83,0,154,255,247,0,83,0,155,255,247,0,83,0,156,255,225,0,83,0,157,255,243,0,83,0,159,255,249,0,83,0,160,255,249,0,83,0,161,255,249,0,83,0,162,255,249,0,83,0,163,255,249,0,83,0,164,255,249,0,83,0,165,255,249,0,83,0,166,255,243,0,83,0,167,255,243,0,83,0,168,255,243,0,83,0,169,255,243,0,83,0,170,255,243,0,83,0,175,255,218,0,83,0,177,255,243,0,83,0,178,255,243,0,83,0,179,255,243,0,83,0,180,255,243,0,83,0,181,255,243,0,83,0,183,255,243,0,83,0,195,255,243,0,83,0,198,255,225,0,83,0,199,255,227,0,83,0,207,255,234,0,83,0,208,255,234,0,83,0,209,255,233,0,83,0,210,255,230,0,83,0,211,255,227,0,83,0,212,255,233,0,83,0,213,255,230,0,83,0,214,255,227,0,83,0,218,255,227,0,83,0,220,255,237,0,84,0,10,255,231,0,84,0,11,255,241,0,84,0,24,255,234,0,84,0,32,255,224,0,84,0,35,255,241,0,84,0,36,255,244,0,84,0,37,255,241,0,84,0,38,255,241,0,84,0,39,255,241,0,84,0,40,255,244,0,84,0,41,255,241,0,84,0,42,255,241,0,84,0,43,255,241,0,84,0,44,255,241,0,84,0,45,255,241,0,84,0,46,255,245,0,84,0,47,255,241,0,84,0,48,255,244,0,84,0,49,255,241,0,84,0,50,255,244,0,84,0,51,255,241,0,84,0,52,255,248,0,84,0,53,255,202,0,84,0,54,255,238,0,84,0,55,255,216,0,84,0,56,255,224,0,84,0,57,255,244,0,84,0,58,255,209,0,84,0,59,255,245,0,84,0,61,255,225,0,84,0,62,255,220,0,84,0,94,255,229,0,84,0,134,255,244,0,84,0,135,255,241,0,84,0,136,255,241,0,84,0,137,255,241,0,84,0,138,255,241,0,84,0,139,255,241,0,84,0,140,255,241,0,84,0,141,255,241,0,84,0,142,255,241,0,84,0,143,255,241,0,84,0,144,255,241,0,84,0,145,255,244,0,84,0,146,255,244,0,84,0,147,255,244,0,84,0,148,255,244,0,84,0,149,255,244,0,84,0,151,255,244,0,84,0,152,255,238,0,84,0,153,255,238,0,84,0,154,255,238,0,84,0,155,255,238,0,84,0,156,255,209,0,84,0,157,255,241,0,84,0,194,255,244,0,84,0,196,255,248,0,84,0,198,255,209,0,84,0,199,255,245,0,84,0,209,255,203,0,84,0,210,255,200,0,84,0,212,255,203,0,84,0,213,255,200,0,84,0,240,255,235,0,85,0,7,255,246,0,85,0,21,255,234,0,85,0,24,255,246,0,85,0,32,255,229,0,85,0,35,255,248,0,85,0,37,255,248,0,85,0,38,255,248,0,85,0,39,255,248,0,85,0,41,255,248,0,85,0,42,255,248,0,85,0,43,255,248,0,85,0,44,255,248,0,85,0,45,255,248,0,85,0,46,255,248,0,85,0,47,255,248,0,85,0,49,255,248,0,85,0,51,255,248,0,85,0,53,255,209,0,85,0,54,255,246,0,85,0,55,255,237,0,85,0,56,255,243,0,85,0,58,255,211,0,85,0,62,255,230,0,85,0,68,255,252,0,85,0,69,255,252,0,85,0,70,255,252,0,85,0,80,255,252,0,85,0,82,255,252,0,85,0,94,255,242,0,85,0,107,255,244,0,85,0,135,255,248,0,85,0,136,255,248,0,85,0,137,255,248,0,85,0,138,255,248,0,85,0,139,255,248,0,85,0,140,255,248,0,85,0,141,255,248,0,85,0,142,255,248,0,85,0,143,255,248,0,85,0,144,255,248,0,85,0,152,255,246,0,85,0,153,255,246,0,85,0,154,255,246,0,85,0,155,255,246,0,85,0,156,255,211,0,85,0,157,255,248,0,85,0,166,255,252,0,85,0,167,255,252,0,85,0,168,255,252,0,85,0,169,255,252,0,85,0,170,255,252,0,85,0,175,255,251,0,85,0,177,255,252,0,85,0,178,255,252,0,85,0,179,255,252,0,85,0,180,255,252,0,85,0,181,255,252,0,85,0,183,255,252,0,85,0,195,255,252,0,85,0,198,255,211,0,85,0,209,255,234,0,85,0,210,255,233,0,85,0,212,255,234,0,85,0,213,255,233,0,85,0,220,255,244,0,86,0,7,255,244,0,86,0,10,255,233,0,86,0,11,255,244,0,86,0,24,255,232,0,86,0,32,255,223,0,86,0,34,255,248,0,86,0,35,255,242,0,86,0,36,255,244,0,86,0,37,255,242,0,86,0,38,255,242,0,86,0,39,255,242,0,86,0,40,255,244,0,86,0,41,255,242,0,86,0,42,255,242,0,86,0,43,255,242,0,86,0,44,255,242,0,86,0,45,255,242,0,86,0,46,255,241,0,86,0,47,255,242,0,86,0,48,255,244,0,86,0,49,255,242,0,86,0,50,255,244,0,86,0,51,255,242,0,86,0,52,255,243,0,86,0,53,255,164,0,86,0,54,255,235,0,86,0,55,255,216,0,86,0,56,255,218,0,86,0,57,255,246,0,86,0,58,255,183,0,86,0,59,255,242,0,86,0,61,255,228,0,86,0,62,255,215,0,86,0,94,255,226,0,86,0,127,255,248,0,86,0,128,255,248,0,86,0,129,255,248,0,86,0,130,255,248,0,86,0,131,255,248,0,86,0,132,255,248,0,86,0,134,255,244,0,86,0,135,255,242,0,86,0,136,255,242,0,86,0,137,255,242,0,86,0,138,255,242,0,86,0,139,255,242,0,86,0,140,255,242,0,86,0,141,255,242,0,86,0,142,255,242,0,86,0,143,255,242,0,86,0,144,255,242,0,86,0,145,255,244,0,86,0,146,255,244,0,86,0,147,255,244,0,86,0,148,255,244,0,86,0,149,255,244,0,86,0,151,255,244,0,86,0,152,255,235,0,86,0,153,255,235,0,86,0,154,255,235,0,86,0,155,255,235,0,86,0,156,255,183,0,86,0,157,255,242,0,86,0,194,255,244,0,86,0,196,255,243,0,86,0,198,255,183,0,86,0,199,255,242,0,86,0,209,255,211,0,86,0,210,255,209,0,86,0,212,255,211,0,86,0,213,255,209,0,86,0,240,255,239,0,87,0,7,255,238,0,87,0,10,255,231,0,87,0,13,255,227,0,87,0,15,255,227,0,87,0,16,255,223,0,87,0,20,255,231,0,87,0,24,255,200,0,87,0,32,255,206,0,87,0,33,255,240,0,87,0,34,255,216,0,87,0,35,255,242,0,87,0,37,255,242,0,87,0,38,255,242,0,87,0,39,255,242,0,87,0,41,255,242,0,87,0,42,255,242,0,87,0,43,255,242,0,87,0,44,255,242,0,87,0,45,255,242,0,87,0,46,255,229,0,87,0,47,255,242,0,87,0,49,255,242,0,87,0,51,255,242,0,87,0,53,255,170,0,87,0,54,255,245,0,87,0,55,255,237,0,87,0,56,255,242,0,87,0,57,255,208,0,87,0,58,255,210,0,87,0,59,255,224,0,87,0,62,255,214,0,87,0,66,255,250,0,87,0,68,255,247,0,87,0,69,255,247,0,87,0,70,255,247,0,87,0,72,255,250,0,87,0,80,255,247,0,87,0,82,255,247,0,87,0,84,255,252,0,87,0,94,255,227,0,87,0,127,255,216,0,87,0,128,255,216,0,87,0,129,255,216,0,87,0,130,255,216,0,87,0,131,255,216,0,87,0,132,255,216,0,87,0,135,255,242,0,87,0,136,255,242,0,87,0,137,255,242,0,87,0,138,255,242,0,87,0,139,255,242,0,87,0,140,255,242,0,87,0,141,255,242,0,87,0,142,255,242,0,87,0,143,255,242,0,87,0,144,255,242,0,87,0,152,255,245,0,87,0,153,255,245,0,87,0,154,255,245,0,87,0,155,255,245,0,87,0,156,255,210,0,87,0,157,255,242,0,87,0,159,255,250,0,87,0,160,255,250,0,87,0,161,255,250,0,87,0,162,255,250,0,87,0,163,255,250,0,87,0,164,255,250,0,87,0,165,255,250,0,87,0,166,255,247,0,87,0,167,255,247,0,87,0,168,255,247,0,87,0,169,255,247,0,87,0,170,255,247,0,87,0,175,255,238,0,87,0,177,255,247,0,87,0,178,255,247,0,87,0,179,255,247,0,87,0,180,255,247,0,87,0,181,255,247,0,87,0,183,255,247,0,87,0,195,255,247,0,87,0,197,255,252,0,87,0,198,255,210,0,87,0,199,255,224,0,87,0,209,255,226,0,87,0,210,255,224,0,87,0,211,255,227,0,87,0,212,255,226,0,87,0,213,255,224,0,87,0,214,255,227,0,87,0,218,255,227,0,88,0,7,255,240,0,88,0,10,255,232,0,88,0,13,255,235,0,88,0,15,255,236,0,88,0,16,255,231,0,88,0,20,255,240,0,88,0,24,255,207,0,88,0,32,255,211,0,88,0,33,255,247,0,88,0,34,255,223,0,88,0,35,255,243,0,88,0,37,255,243,0,88,0,38,255,243,0,88,0,39,255,243,0,88,0,41,255,243,0,88,0,42,255,243,0,88,0,43,255,243,0,88,0,44,255,243,0,88,0,45,255,243,0,88,0,46,255,232,0,88,0,47,255,243,0,88,0,49,255,243,0,88,0,51,255,243,0,88,0,53,255,178,0,88,0,54,255,246,0,88,0,55,255,236,0,88,0,56,255,242,0,88,0,57,255,213,0,88,0,58,255,211,0,88,0,59,255,228,0,88,0,62,255,218,0,88,0,66,255,252,0,88,0,68,255,251,0,88,0,69,255,251,0,88,0,70,255,251,0,88,0,80,255,251,0,88,0,82,255,251,0,88,0,94,255,229,0,88,0,127,255,223,0,88,0,128,255,223,0,88,0,129,255,223,0,88,0,130,255,223,0,88,0,131,255,223,0,88,0,132,255,223,0,88,0,135,255,243,0,88,0,136,255,243,0,88,0,137,255,243,0,88,0,138,255,243,0,88,0,139,255,243,0,88,0,140,255,243,0,88,0,141,255,243,0,88,0,142,255,243,0,88,0,143,255,243,0,88,0,144,255,243,0,88,0,152,255,246,0,88,0,153,255,246,0,88,0,154,255,246,0,88,0,155,255,246,0,88,0,156,255,211,0,88,0,157,255,243,0,88,0,159,255,252,0,88,0,160,255,252,0,88,0,161,255,252,0,88,0,162,255,252,0,88,0,163,255,252,0,88,0,164,255,252,0,88,0,165,255,252,0,88,0,166,255,251,0,88,0,167,255,251,0,88,0,168,255,251,0,88,0,169,255,251,0,88,0,170,255,251,0,88,0,175,255,246,0,88,0,177,255,251,0,88,0,178,255,251,0,88,0,179,255,251,0,88,0,180,255,251,0,88,0,181,255,251,0,88,0,183,255,251,0,88,0,195,255,251,0,88,0,198,255,211,0,88,0,199,255,228,0,88,0,209,255,227,0,88,0,210,255,225,0,88,0,211,255,235,0,88,0,212,255,227,0,88,0,213,255,225,0,88,0,214,255,235,0,88,0,218,255,236,0,89,0,7,255,238,0,89,0,14,255,247,0,89,0,32,255,227,0,89,0,35,255,247,0,89,0,36,255,240,0,89,0,37,255,247,0,89,0,38,255,247,0,89,0,39,255,247,0,89,0,40,255,240,0,89,0,41,255,247,0,89,0,42,255,247,0,89,0,43,255,247,0,89,0,44,255,247,0,89,0,45,255,247,0,89,0,46,255,250,0,89,0,47,255,247,0,89,0,48,255,240,0,89,0,49,255,247,0,89,0,50,255,240,0,89,0,51,255,247,0,89,0,52,255,248,0,89,0,53,255,167,0,89,0,54,255,244,0,89,0,55,255,236,0,89,0,56,255,242,0,89,0,58,255,208,0,89,0,61,255,247,0,89,0,62,255,230,0,89,0,66,255,252,0,89,0,68,255,238,0,89,0,69,255,238,0,89,0,70,255,238,0,89,0,72,255,247,0,89,0,80,255,238,0,89,0,82,255,238,0,89,0,94,255,237,0,89,0,107,255,236,0,89,0,134,255,240,0,89,0,135,255,247,0,89,0,136,255,247,0,89,0,137,255,247,0,89,0,138,255,247,0,89,0,139,255,247,0,89,0,140,255,247,0,89,0,141,255,247,0,89,0,142,255,247,0,89,0,143,255,247,0,89,0,144,255,247,0,89,0,145,255,240,0,89,0,146,255,240,0,89,0,147,255,240,0,89,0,148,255,240,0,89,0,149,255,240,0,89,0,151,255,240,0,89,0,152,255,244,0,89,0,153,255,244,0,89,0,154,255,244,0,89,0,155,255,244,0,89,0,156,255,208,0,89,0,157,255,247,0,89,0,159,255,252,0,89,0,160,255,252,0,89,0,161,255,252,0,89,0,162,255,252,0,89,0,163,255,252,0,89,0,164,255,252,0,89,0,165,255,252,0,89,0,166,255,238,0,89,0,167,255,238,0,89,0,168,255,238,0,89,0,169,255,238,0,89,0,170,255,238,0,89,0,175,255,240,0,89,0,177,255,238,0,89,0,178,255,238,0,89,0,179,255,238,0,89,0,180,255,238,0,89,0,181,255,238,0,89,0,183,255,238,0,89,0,194,255,240,0,89,0,195,255,238,0,89,0,196,255,248,0,89,0,198,255,208,0,89,0,207,255,247,0,89,0,208,255,247,0,89,0,209,255,224,0,89,0,210,255,222,0,89,0,212,255,224,0,89,0,213,255,222,0,89,0,220,255,236,0,89,0,240,255,248,0,90,0,7,255,238,0,90,0,10,255,231,0,90,0,13,255,225,0,90,0,15,255,225,0,90,0,16,255,220,0,90,0,19,255,227,0,90,0,20,255,230,0,90,0,24,255,198,0,90,0,32,255,205,0,90,0,33,255,238,0,90,0,34,255,214,0,90,0,35,255,243,0,90,0,37,255,243,0,90,0,38,255,243,0,90,0,39,255,243,0,90,0,41,255,243,0,90,0,42,255,243,0,90,0,43,255,243,0,90,0,44,255,243,0,90,0,45,255,243,0,90,0,46,255,229,0,90,0,47,255,243,0,90,0,49,255,243,0,90,0,51,255,243,0,90,0,53,255,168,0,90,0,54,255,245,0,90,0,55,255,238,0,90,0,56,255,242,0,90,0,57,255,208,0,90,0,58,255,211,0,90,0,59,255,225,0,90,0,62,255,214,0,90,0,66,255,250,0,90,0,68,255,246,0,90,0,69,255,246,0,90,0,70,255,246,0,90,0,72,255,250,0,90,0,80,255,246,0,90,0,82,255,246,0,90,0,84,255,252,0,90,0,94,255,227,0,90,0,127,255,214,0,90,0,128,255,214,0,90,0,129,255,214,0,90,0,130,255,214,0,90,0,131,255,214,0,90,0,132,255,214,0,90,0,135,255,243,0,90,0,136,255,243,0,90,0,137,255,243,0,90,0,138,255,243,0,90,0,139,255,243,0,90,0,140,255,243,0,90,0,141,255,243,0,90,0,142,255,243,0,90,0,143,255,243,0,90,0,144,255,243,0,90,0,152,255,245,0,90,0,153,255,245,0,90,0,154,255,245,0,90,0,155,255,245,0,90,0,156,255,211,0,90,0,157,255,243,0,90,0,159,255,250,0,90,0,160,255,250,0,90,0,161,255,250,0,90,0,162,255,250,0,90,0,163,255,250,0,90,0,164,255,250,0,90,0,165,255,250,0,90,0,166,255,246,0,90,0,167,255,246,0,90,0,168,255,246,0,90,0,169,255,246,0,90,0,170,255,246,0,90,0,175,255,236,0,90,0,177,255,246,0,90,0,178,255,246,0,90,0,179,255,246,0,90,0,180,255,246,0,90,0,181,255,246,0,90,0,183,255,246,0,90,0,195,255,246,0,90,0,197,255,252,0,90,0,198,255,211,0,90,0,199,255,225,0,90,0,209,255,227,0,90,0,210,255,225,0,90,0,211,255,225,0,90,0,212,255,227,0,90,0,213,255,225,0,90,0,214,255,225,0,90,0,218,255,225,0,91,0,7,255,245,0,91,0,10,255,246,0,91,0,14,255,240,0,91,0,21,255,225,0,91,0,24,255,244,0,91,0,32,255,221,0,91,0,35,255,242,0,91,0,36,255,244,0,91,0,37,255,242,0,91,0,38,255,242,0,91,0,39,255,242,0,91,0,40,255,244,0,91,0,41,255,242,0,91,0,42,255,242,0,91,0,43,255,242,0,91,0,44,255,242,0,91,0,45,255,242,0,91,0,46,255,245,0,91,0,47,255,242,0,91,0,48,255,244,0,91,0,49,255,242,0,91,0,50,255,244,0,91,0,51,255,242,0,91,0,53,255,203,0,91,0,54,255,239,0,91,0,55,255,240,0,91,0,56,255,243,0,91,0,58,255,227,0,91,0,61,255,242,0,91,0,62,255,222,0,91,0,68,255,245,0,91,0,69,255,245,0,91,0,70,255,245,0,91,0,72,255,251,0,91,0,80,255,245,0,91,0,82,255,245,0,91,0,94,255,232,0,91,0,107,255,232,0,91,0,134,255,244,0,91,0,135,255,242,0,91,0,136,255,242,0,91,0,137,255,242,0,91,0,138,255,242,0,91,0,139,255,242,0,91,0,140,255,242,0,91,0,141,255,242,0,91,0,142,255,242,0,91,0,143,255,242,0,91,0,144,255,242,0,91,0,145,255,244,0,91,0,146,255,244,0,91,0,147,255,244,0,91,0,148,255,244,0,91,0,149,255,244,0,91,0,151,255,244,0,91,0,152,255,239,0,91,0,153,255,239,0,91,0,154,255,239,0,91,0,155,255,239,0,91,0,156,255,227,0,91,0,157,255,242,0,91,0,166,255,245,0,91,0,167,255,245,0,91,0,168,255,245,0,91,0,169,255,245,0,91,0,170,255,245,0,91,0,175,255,247,0,91,0,177,255,245,0,91,0,178,255,245,0,91,0,179,255,245,0,91,0,180,255,245,0,91,0,181,255,245,0,91,0,183,255,245,0,91,0,194,255,244,0,91,0,195,255,245,0,91,0,198,255,227,0,91,0,207,255,240,0,91,0,208,255,240,0,91,0,209,255,219,0,91,0,210,255,216,0,91,0,212,255,219,0,91,0,213,255,216,0,91,0,220,255,232,0,91,0,240,255,242,0,92,0,17,255,238,0,92,0,21,255,238,0,92,0,23,255,235,0,92,0,34,255,244,0,92,0,36,255,231,0,92,0,40,255,231,0,92,0,43,0,47,0,92,0,46,255,247,0,92,0,48,255,231,0,92,0,50,255,231,0,92,0,53,0,21,0,92,0,55,0,29,0,92,0,56,0,25,0,92,0,57,0,28,0,92,0,58,0,34,0,92,0,66,255,229,0,92,0,68,255,222,0,92,0,69,255,222,0,92,0,70,255,222,0,92,0,78,255,227,0,92,0,79,255,227,0,92,0,80,255,222,0,92,0,81,255,227,0,92,0,82,255,222,0,92,0,83,255,227,0,92,0,84,255,229,0,92,0,85,255,231,0,92,0,86,255,225,0,92,0,87,255,227,0,92,0,88,255,228,0,92,0,89,255,238,0,92,0,90,255,227,0,92,0,91,255,232,0,92,0,127,255,244,0,92,0,128,255,244,0,92,0,129,255,244,0,92,0,130,255,244,0,92,0,131,255,244,0,92,0,132,255,244,0,92,0,134,255,231,0,92,0,145,255,231,0,92,0,146,255,231,0,92,0,147,255,231,0,92,0,148,255,231,0,92,0,149,255,231,0,92,0,151,255,231,0,92,0,156,0,34,0,92,0,158,255,247,0,92,0,159,255,229,0,92,0,160,255,229,0,92,0,161,255,229,0,92,0,162,255,229,0,92,0,163,255,229,0,92,0,164,255,229,0,92,0,165,255,229,0,92,0,166,255,222,0,92,0,167,255,222,0,92,0,168,255,222,0,92,0,169,255,222,0,92,0,170,255,222,0,92,0,171,0,12,0,92,0,173,0,33,0,92,0,174,0,44,0,92,0,175,255,234,0,92,0,176,255,227,0,92,0,177,255,222,0,92,0,178,255,222,0,92,0,179,255,222,0,92,0,180,255,222,0,92,0,181,255,222,0,92,0,183,255,222,0,92,0,184,255,225,0,92,0,185,255,225,0,92,0,186,255,225,0,92,0,187,255,225,0,92,0,188,255,227,0,92,0,189,255,249,0,92,0,190,255,227,0,92,0,194,255,231,0,92,0,195,255,222,0,92,0,197,255,229,0,92,0,198,0,34,0,92,0,200,255,232,0,97,0,53,255,200,0,97,0,55,255,236,0,97,0,56,255,244,0,97,0,58,255,224,0,97,0,156,255,224,0,97,0,198,255,224,0,107,0,53,255,197,0,107,0,55,255,245,0,107,0,58,255,226,0,107,0,68,255,247,0,107,0,69,255,247,0,107,0,70,255,247,0,107,0,80,255,247,0,107,0,82,255,247,0,107,0,156,255,226,0,107,0,166,255,247,0,107,0,167,255,247,0,107,0,168,255,247,0,107,0,169,255,247,0,107,0,170,255,247,0,107,0,177,255,247,0,107,0,178,255,247,0,107,0,179,255,247,0,107,0,180,255,247,0,107,0,181,255,247,0,107,0,183,255,247,0,107,0,195,255,247,0,107,0,198,255,226,0,107,0,210,255,229,0,107,0,213,255,229,0,110,0,34,255,237,0,110,0,46,255,247,0,110,0,53,255,230,0,110,0,55,255,243,0,110,0,56,255,248,0,110,0,57,255,236,0,110,0,58,255,229,0,110,0,59,255,231,0,110,0,127,255,237,0,110,0,128,255,237,0,110,0,129,255,237,0,110,0,130,255,237,0,110,0,131,255,237,0,110,0,132,255,237,0,110,0,133,255,236,0,110,0,156,255,229,0,110,0,198,255,229,0,110,0,199,255,231,0,111,0,21,255,229,0,111,0,23,255,239,0,122,0,3,255,241,0,122,0,8,255,241,0,122,0,34,255,247,0,122,0,52,255,234,0,122,0,53,255,195,0,122,0,55,255,220,0,122,0,56,255,230,0,122,0,57,255,224,0,122,0,58,255,198,0,122,0,59,255,223,0,122,0,85,255,247,0,122,0,89,255,236,0,122,0,90,255,248,0,122,0,91,255,233,0,122,0,127,255,247,0,122,0,128,255,247,0,122,0,129,255,247,0,122,0,130,255,247,0,122,0,131,255,247,0,122,0,132,255,247,0,122,0,133,255,243,0,122,0,156,255,198,0,122,0,158,255,248,0,122,0,188,255,248,0,122,0,190,255,248,0,122,0,196,255,234,0,122,0,198,255,198,0,122,0,199,255,223,0,122,0,200,255,233,0,122,0,210,255,204,0,122,0,213,255,204,0,126,0,34,255,233,0,126,0,35,255,247,0,126,0,37,255,247,0,126,0,38,255,247,0,126,0,39,255,247,0,126,0,41,255,247,0,126,0,42,255,247,0,126,0,43,0,19,0,126,0,44,255,247,0,126,0,45,255,247,0,126,0,46,255,238,0,126,0,47,255,247,0,126,0,49,255,247,0,126,0,51,255,247,0,126,0,53,255,192,0,126,0,54,255,245,0,126,0,55,255,233,0,126,0,56,255,241,0,126,0,57,255,231,0,126,0,58,255,219,0,126,0,59,255,220,0,126,0,66,255,241,0,126,0,67,255,247,0,126,0,68,255,243,0,126,0,69,255,243,0,126,0,70,255,243,0,126,0,72,255,243,0,126,0,73,255,247,0,126,0,74,255,242,0,126,0,75,0,20,0,126,0,76,255,247,0,126,0,77,255,247,0,126,0,78,255,241,0,126,0,79,255,241,0,126,0,80,255,243,0,126,0,81,255,241,0,126,0,82,255,243,0,126,0,83,255,241,0,126,0,84,255,241,0,126,0,86,255,243,0,126,0,89,255,248,0,126,0,91,255,241,0,126,0,127,255,233,0,126,0,128,255,233,0,126,0,129,255,233,0,126,0,130,255,233,0,126,0,131,255,233,0,126,0,132,255,233,0,126,0,133,255,235,0,126,0,135,255,247,0,126,0,136,255,247,0,126,0,137,255,247,0,126,0,138,255,247,0,126,0,139,255,247,0,126,0,140,255,247,0,126,0,141,255,247,0,126,0,142,255,247,0,126,0,143,255,247,0,126,0,144,255,247,0,126,0,152,255,245,0,126,0,153,255,245,0,126,0,154,255,245,0,126,0,155,255,245,0,126,0,156,255,219,0,126,0,157,255,247,0,126,0,159,255,241,0,126,0,160,255,241,0,126,0,161,255,241,0,126,0,162,255,241,0,126,0,163,255,241,0,126,0,164,255,241,0,126,0,165,255,241,0,126,0,166,255,243,0,126,0,167,255,243,0,126,0,168,255,243,0,126,0,169,255,243,0,126,0,170,255,243,0,126,0,171,255,242,0,126,0,172,255,242,0,126,0,173,255,242,0,126,0,174,255,242,0,126,0,175,255,240,0,126,0,176,255,241,0,126,0,177,255,243,0,126,0,178,255,243,0,126,0,179,255,243,0,126,0,180,255,243,0,126,0,181,255,243,0,126,0,183,255,243,0,126,0,184,255,243,0,126,0,185,255,243,0,126,0,186,255,243,0,126,0,187,255,243,0,126,0,189,255,241,0,126,0,193,255,242,0,126,0,195,255,243,0,126,0,197,255,241,0,126,0,198,255,219,0,126,0,199,255,220,0,126,0,200,255,241,0,127,0,3,255,213,0,127,0,8,255,213,0,127,0,11,255,212,0,127,0,18,255,239,0,127,0,26,255,242,0,127,0,32,255,239,0,127,0,36,255,245,0,127,0,40,255,245,0,127,0,48,255,245,0,127,0,50,255,245,0,127,0,53,255,202,0,127,0,54,255,240,0,127,0,55,255,207,0,127,0,56,255,219,0,127,0,58,255,192,0,127,0,61,255,208,0,127,0,68,255,245,0,127,0,69,255,245,0,127,0,70,255,245,0,127,0,71,255,241,0,127,0,72,255,248,0,127,0,77,255,249,0,127,0,80,255,245,0,127,0,82,255,245,0,127,0,85,255,229,0,127,0,86,255,244,0,127,0,87,255,221,0,127,0,88,255,228,0,127,0,90,255,217,0,127,0,94,255,246,0,127,0,107,255,247,0,127,0,110,255,241,0,127,0,134,255,245,0,127,0,145,255,245,0,127,0,146,255,245,0,127,0,147,255,245,0,127,0,148,255,245,0,127,0,149,255,245,0,127,0,151,255,245,0,127,0,152,255,240,0,127,0,153,255,240,0,127,0,154,255,240,0,127,0,155,255,240,0,127,0,156,255,192,0,127,0,158,255,242,0,127,0,166,255,245,0,127,0,167,255,245,0,127,0,168,255,245,0,127,0,169,255,245,0,127,0,170,255,245,0,127,0,175,255,250,0,127,0,177,255,245,0,127,0,178,255,245,0,127,0,179,255,245,0,127,0,180,255,245,0,127,0,181,255,245,0,127,0,183,255,245,0,127,0,184,255,244,0,127,0,185,255,244,0,127,0,186,255,244,0,127,0,187,255,244,0,127,0,188,255,217,0,127,0,190,255,217,0,127,0,194,255,245,0,127,0,195,255,245,0,127,0,198,255,192,0,127,0,209,255,205,0,127,0,210,255,204,0,127,0,212,255,205,0,127,0,213,255,204,0,127,0,220,255,247,0,127,0,240,255,212,0,128,0,3,255,213,0,128,0,8,255,213,0,128,0,11,255,212,0,128,0,18,255,239,0,128,0,26,255,242,0,128,0,32,255,239,0,128,0,36,255,245,0,128,0,40,255,245,0,128,0,48,255,245,0,128,0,50,255,245,0,128,0,53,255,202,0,128,0,54,255,240,0,128,0,55,255,207,0,128,0,56,255,219,0,128,0,58,255,192,0,128,0,61,255,208,0,128,0,68,255,245,0,128,0,69,255,245,0,128,0,70,255,245,0,128,0,71,255,241,0,128,0,72,255,248,0,128,0,77,255,249,0,128,0,80,255,245,0,128,0,82,255,245,0,128,0,85,255,229,0,128,0,86,255,244,0,128,0,87,255,221,0,128,0,88,255,228,0,128,0,90,255,217,0,128,0,94,255,246,0,128,0,107,255,247,0,128,0,110,255,241,0,128,0,134,255,245,0,128,0,145,255,245,0,128,0,146,255,245,0,128,0,147,255,245,0,128,0,148,255,245,0,128,0,149,255,245,0,128,0,151,255,245,0,128,0,152,255,240,0,128,0,153,255,240,0,128,0,154,255,240,0,128,0,155,255,240,0,128,0,156,255,192,0,128,0,158,255,242,0,128,0,166,255,245,0,128,0,167,255,245,0,128,0,168,255,245,0,128,0,169,255,245,0,128,0,170,255,245,0,128,0,175,255,250,0,128,0,177,255,245,0,128,0,178,255,245,0,128,0,179,255,245,0,128,0,180,255,245,0,128,0,181,255,245,0,128,0,183,255,245,0,128,0,184,255,244,0,128,0,185,255,244,0,128,0,186,255,244,0,128,0,187,255,244,0,128,0,188,255,217,0,128,0,190,255,217,0,128,0,194,255,245,0,128,0,195,255,245,0,128,0,198,255,192,0,128,0,209,255,205,0,128,0,210,255,204,0,128,0,212,255,205,0,128,0,213,255,204,0,128,0,220,255,247,0,128,0,240,255,212,0,129,0,3,255,213,0,129,0,8,255,213,0,129,0,11,255,212,0,129,0,18,255,239,0,129,0,26,255,242,0,129,0,32,255,239,0,129,0,36,255,245,0,129,0,40,255,245,0,129,0,48,255,245,0,129,0,50,255,245,0,129,0,53,255,202,0,129,0,54,255,240,0,129,0,55,255,207,0,129,0,56,255,219,0,129,0,58,255,192,0,129,0,61,255,208,0,129,0,68,255,245,0,129,0,69,255,245,0,129,0,70,255,245,0,129,0,71,255,241,0,129,0,72,255,248,0,129,0,77,255,249,0,129,0,80,255,245,0,129,0,82,255,245,0,129,0,85,255,229,0,129,0,86,255,244,0,129,0,87,255,221,0,129,0,88,255,228,0,129,0,90,255,217,0,129,0,94,255,246,0,129,0,107,255,247,0,129,0,110,255,241,0,129,0,134,255,245,0,129,0,145,255,245,0,129,0,146,255,245,0,129,0,147,255,245,0,129,0,148,255,245,0,129,0,149,255,245,0,129,0,151,255,245,0,129,0,152,255,240,0,129,0,153,255,240,0,129,0,154,255,240,0,129,0,155,255,240,0,129,0,156,255,192,0,129,0,158,255,242,0,129,0,166,255,245,0,129,0,167,255,245,0,129,0,168,255,245,0,129,0,169,255,245,0,129,0,170,255,245,0,129,0,175,255,250,0,129,0,177,255,245,0,129,0,178,255,245,0,129,0,179,255,245,0,129,0,180,255,245,0,129,0,181,255,245,0,129,0,183,255,245,0,129,0,184,255,244,0,129,0,185,255,244,0,129,0,186,255,244,0,129,0,187,255,244,0,129,0,188,255,217,0,129,0,190,255,217,0,129,0,194,255,245,0,129,0,195,255,245,0,129,0,198,255,192,0,129,0,209,255,205,0,129,0,210,255,204,0,129,0,212,255,205,0,129,0,213,255,204,0,129,0,220,255,247,0,129,0,240,255,212,0,130,0,3,255,213,0,130,0,8,255,213,0,130,0,11,255,212,0,130,0,18,255,239,0,130,0,26,255,242,0,130,0,32,255,239,0,130,0,36,255,245,0,130,0,40,255,245,0,130,0,48,255,245,0,130,0,50,255,245,0,130,0,53,255,202,0,130,0,54,255,240,0,130,0,55,255,207,0,130,0,56,255,219,0,130,0,58,255,192,0,130,0,61,255,208,0,130,0,68,255,245,0,130,0,69,255,245,0,130,0,70,255,245,0,130,0,71,255,241,0,130,0,72,255,248,0,130,0,77,255,249,0,130,0,80,255,245,0,130,0,82,255,245,0,130,0,85,255,229,0,130,0,86,255,244,0,130,0,87,255,221,0,130,0,88,255,228,0,130,0,90,255,217,0,130,0,94,255,246,0,130,0,107,255,247,0,130,0,110,255,241,0,130,0,134,255,245,0,130,0,145,255,245,0,130,0,146,255,245,0,130,0,147,255,245,0,130,0,148,255,245,0,130,0,149,255,245,0,130,0,151,255,245,0,130,0,152,255,240,0,130,0,153,255,240,0,130,0,154,255,240,0,130,0,155,255,240,0,130,0,156,255,192,0,130,0,158,255,242,0,130,0,166,255,245,0,130,0,167,255,245,0,130,0,168,255,245,0,130,0,169,255,245,0,130,0,170,255,245,0,130,0,175,255,250,0,130,0,177,255,245,0,130,0,178,255,245,0,130,0,179,255,245,0,130,0,180,255,245,0,130,0,181,255,245,0,130,0,183,255,245,0,130,0,184,255,244,0,130,0,185,255,244,0,130,0,186,255,244,0,130,0,187,255,244,0,130,0,188,255,217,0,130,0,190,255,217,0,130,0,194,255,245,0,130,0,195,255,245,0,130,0,198,255,192,0,130,0,209,255,205,0,130,0,210,255,204,0,130,0,212,255,205,0,130,0,213,255,204,0,130,0,220,255,247,0,130,0,240,255,212,0,131,0,3,255,213,0,131,0,8,255,213,0,131,0,11,255,212,0,131,0,18,255,239,0,131,0,26,255,242,0,131,0,32,255,239,0,131,0,36,255,245,0,131,0,40,255,245,0,131,0,48,255,245,0,131,0,50,255,245,0,131,0,53,255,202,0,131,0,54,255,240,0,131,0,55,255,207,0,131,0,56,255,219,0,131,0,58,255,192,0,131,0,61,255,208,0,131,0,68,255,245,0,131,0,69,255,245,0,131,0,70,255,245,0,131,0,71,255,241,0,131,0,72,255,248,0,131,0,77,255,249,0,131,0,80,255,245,0,131,0,82,255,245,0,131,0,85,255,229,0,131,0,86,255,244,0,131,0,87,255,221,0,131,0,88,255,228,0,131,0,90,255,217,0,131,0,94,255,246,0,131,0,107,255,247,0,131,0,110,255,241,0,131,0,134,255,245,0,131,0,145,255,245,0,131,0,146,255,245,0,131,0,147,255,245,0,131,0,148,255,245,0,131,0,149,255,245,0,131,0,151,255,245,0,131,0,152,255,240,0,131,0,153,255,240,0,131,0,154,255,240,0,131,0,155,255,240,0,131,0,156,255,192,0,131,0,158,255,242,0,131,0,166,255,245,0,131,0,167,255,245,0,131,0,168,255,245,0,131,0,169,255,245,0,131,0,170,255,245,0,131,0,175,255,250,0,131,0,177,255,245,0,131,0,178,255,245,0,131,0,179,255,245,0,131,0,180,255,245,0,131,0,181,255,245,0,131,0,183,255,245,0,131,0,184,255,244,0,131,0,185,255,244,0,131,0,186,255,244,0,131,0,187,255,244,0,131,0,188,255,217,0,131,0,190,255,217,0,131,0,194,255,245,0,131,0,195,255,245,0,131,0,198,255,192,0,131,0,209,255,205,0,131,0,210,255,204,0,131,0,212,255,205,0,131,0,213,255,204,0,131,0,220,255,247,0,131,0,240,255,212,0,132,0,3,255,213,0,132,0,8,255,213,0,132,0,11,255,212,0,132,0,18,255,239,0,132,0,26,255,242,0,132,0,32,255,239,0,132,0,36,255,245,0,132,0,40,255,245,0,132,0,48,255,245,0,132,0,50,255,245,0,132,0,53,255,202,0,132,0,54,255,240,0,132,0,55,255,207,0,132,0,56,255,219,0,132,0,58,255,192,0,132,0,61,255,208,0,132,0,68,255,245,0,132,0,69,255,245,0,132,0,70,255,245,0,132,0,71,255,241,0,132,0,72,255,248,0,132,0,77,255,249,0,132,0,80,255,245,0,132,0,82,255,245,0,132,0,85,255,229,0,132,0,86,255,244,0,132,0,87,255,221,0,132,0,88,255,228,0,132,0,90,255,217,0,132,0,94,255,246,0,132,0,107,255,247,0,132,0,110,255,241,0,132,0,134,255,245,0,132,0,145,255,245,0,132,0,146,255,245,0,132,0,147,255,245,0,132,0,148,255,245,0,132,0,149,255,245,0,132,0,151,255,245,0,132,0,152,255,240,0,132,0,153,255,240,0,132,0,154,255,240,0,132,0,155,255,240,0,132,0,156,255,192,0,132,0,158,255,242,0,132,0,166,255,245,0,132,0,167,255,245,0,132,0,168,255,245,0,132,0,169,255,245,0,132,0,170,255,245,0,132,0,175,255,250,0,132,0,177,255,245,0,132,0,178,255,245,0,132,0,179,255,245,0,132,0,180,255,245,0,132,0,181,255,245,0,132,0,183,255,245,0,132,0,184,255,244,0,132,0,185,255,244,0,132,0,186,255,244,0,132,0,187,255,244,0,132,0,188,255,217,0,132,0,190,255,217,0,132,0,194,255,245,0,132,0,195,255,245,0,132,0,198,255,192,0,132,0,209,255,205,0,132,0,210,255,204,0,132,0,212,255,205,0,132,0,213,255,204,0,132,0,220,255,247,0,132,0,240,255,212,0,133,0,14,255,244,0,133,0,21,255,220,0,133,0,36,255,245,0,133,0,40,255,245,0,133,0,48,255,245,0,133,0,50,255,245,0,133,0,68,255,240,0,133,0,69,255,240,0,133,0,70,255,240,0,133,0,71,255,243,0,133,0,72,255,241,0,133,0,78,255,247,0,133,0,79,255,247,0,133,0,80,255,240,0,133,0,81,255,247,0,133,0,82,255,240,0,133,0,83,255,247,0,133,0,84,255,251,0,133,0,85,255,242,0,133,0,86,255,238,0,133,0,87,255,241,0,133,0,88,255,243,0,133,0,90,255,240,0,133,0,107,255,235,0,133,0,110,255,248,0,133,0,134,255,245,0,133,0,145,255,245,0,133,0,146,255,245,0,133,0,147,255,245,0,133,0,148,255,245,0,133,0,149,255,245,0,133,0,151,255,245,0,133,0,158,255,243,0,133,0,166,255,240,0,133,0,167,255,240,0,133,0,168,255,240,0,133,0,169,255,240,0,133,0,170,255,240,0,133,0,173,0,21,0,133,0,175,255,246,0,133,0,176,255,247,0,133,0,177,255,240,0,133,0,178,255,240,0,133,0,179,255,240,0,133,0,180,255,240,0,133,0,181,255,240,0,133,0,183,255,240,0,133,0,184,255,238,0,133,0,185,255,238,0,133,0,186,255,238,0,133,0,187,255,238,0,133,0,188,255,240,0,133,0,189,255,247,0,133,0,190,255,240,0,133,0,194,255,245,0,133,0,195,255,240,0,133,0,197,255,251,0,133,0,207,255,244,0,133,0,208,255,244,0,133,0,220,255,235,0,134,0,14,255,195,0,134,0,21,255,207,0,134,0,36,255,242,0,134,0,40,255,242,0,134,0,48,255,242,0,134,0,50,255,242,0,134,0,68,255,242,0,134,0,69,255,242,0,134,0,70,255,242,0,134,0,71,255,249,0,134,0,72,255,241,0,134,0,78,255,249,0,134,0,79,255,249,0,134,0,80,255,242,0,134,0,81,255,249,0,134,0,82,255,242,0,134,0,83,255,249,0,134,0,85,255,249,0,134,0,86,255,241,0,134,0,87,255,249,0,134,0,88,255,250,0,134,0,90,255,249,0,134,0,107,255,226,0,134,0,134,255,242,0,134,0,145,255,242,0,134,0,146,255,242,0,134,0,147,255,242,0,134,0,148,255,242,0,134,0,149,255,242,0,134,0,151,255,242,0,134,0,158,255,250,0,134,0,166,255,242,0,134,0,167,255,242,0,134,0,168,255,242,0,134,0,169,255,242,0,134,0,170,255,242,0,134,0,173,0,31,0,134,0,174,0,12,0,134,0,175,255,249,0,134,0,176,255,249,0,134,0,177,255,242,0,134,0,178,255,242,0,134,0,179,255,242,0,134,0,180,255,242,0,134,0,181,255,242,0,134,0,183,255,242,0,134,0,184,255,241,0,134,0,185,255,241,0,134,0,186,255,241,0,134,0,187,255,241,0,134,0,188,255,249,0,134,0,189,255,249,0,134,0,190,255,249,0,134,0,194,255,242,0,134,0,195,255,242,0,134,0,207,255,195,0,134,0,208,255,195,0,134,0,220,255,226,0,135,0,14,255,244,0,135,0,21,255,220,0,135,0,36,255,245,0,135,0,40,255,245,0,135,0,48,255,245,0,135,0,50,255,245,0,135,0,68,255,240,0,135,0,69,255,240,0,135,0,70,255,240,0,135,0,71,255,243,0,135,0,72,255,241,0,135,0,78,255,247,0,135,0,79,255,247,0,135,0,80,255,240,0,135,0,81,255,247,0,135,0,82,255,240,0,135,0,83,255,247,0,135,0,84,255,251,0,135,0,85,255,242,0,135,0,86,255,238,0,135,0,87,255,241,0,135,0,88,255,243,0,135,0,90,255,240,0,135,0,107,255,235,0,135,0,110,255,248,0,135,0,134,255,245,0,135,0,145,255,245,0,135,0,146,255,245,0,135,0,147,255,245,0,135,0,148,255,245,0,135,0,149,255,245,0,135,0,151,255,245,0,135,0,158,255,243,0,135,0,166,255,240,0,135,0,167,255,240,0,135,0,168,255,240,0,135,0,169,255,240,0,135,0,170,255,240,0,135,0,173,0,21,0,135,0,175,255,246,0,135,0,176,255,247,0,135,0,177,255,240,0,135,0,178,255,240,0,135,0,179,255,240,0,135,0,180,255,240,0,135,0,181,255,240,0,135,0,183,255,240,0,135,0,184,255,238,0,135,0,185,255,238,0,135,0,186,255,238,0,135,0,187,255,238,0,135,0,188,255,240,0,135,0,189,255,247,0,135,0,190,255,240,0,135,0,194,255,245,0,135,0,195,255,240,0,135,0,197,255,251,0,135,0,207,255,244,0,135,0,208,255,244,0,135,0,220,255,235,0,136,0,14,255,244,0,136,0,21,255,220,0,136,0,36,255,245,0,136,0,40,255,245,0,136,0,48,255,245,0,136,0,50,255,245,0,136,0,68,255,240,0,136,0,69,255,240,0,136,0,70,255,240,0,136,0,71,255,243,0,136,0,72,255,241,0,136,0,78,255,247,0,136,0,79,255,247,0,136,0,80,255,240,0,136,0,81,255,247,0,136,0,82,255,240,0,136,0,83,255,247,0,136,0,84,255,251,0,136,0,85,255,242,0,136,0,86,255,238,0,136,0,87,255,241,0,136,0,88,255,243,0,136,0,90,255,240,0,136,0,107,255,235,0,136,0,110,255,248,0,136,0,134,255,245,0,136,0,145,255,245,0,136,0,146,255,245,0,136,0,147,255,245,0,136,0,148,255,245,0,136,0,149,255,245,0,136,0,151,255,245,0,136,0,158,255,243,0,136,0,166,255,240,0,136,0,167,255,240,0,136,0,168,255,240,0,136,0,169,255,240,0,136,0,170,255,240,0,136,0,173,0,21,0,136,0,175,255,246,0,136,0,176,255,247,0,136,0,177,255,240,0,136,0,178,255,240,0,136,0,179,255,240,0,136,0,180,255,240,0,136,0,181,255,240,0,136,0,183,255,240,0,136,0,184,255,238,0,136,0,185,255,238,0,136,0,186,255,238,0,136,0,187,255,238,0,136,0,188,255,240,0,136,0,189,255,247,0,136,0,190,255,240,0,136,0,194,255,245,0,136,0,195,255,240,0,136,0,197,255,251,0,136,0,207,255,244,0,136,0,208,255,244,0,136,0,220,255,235,0,137,0,14,255,244,0,137,0,21,255,220,0,137,0,36,255,245,0,137,0,40,255,245,0,137,0,48,255,245,0,137,0,50,255,245,0,137,0,68,255,240,0,137,0,69,255,240,0,137,0,70,255,240,0,137,0,71,255,243,0,137,0,72,255,241,0,137,0,78,255,247,0,137,0,79,255,247,0,137,0,80,255,240,0,137,0,81,255,247,0,137,0,82,255,240,0,137,0,83,255,247,0,137,0,84,255,251,0,137,0,85,255,242,0,137,0,86,255,238,0,137,0,87,255,241,0,137,0,88,255,243,0,137,0,90,255,240,0,137,0,107,255,235,0,137,0,110,255,248,0,137,0,134,255,245,0,137,0,145,255,245,0,137,0,146,255,245,0,137,0,147,255,245,0,137,0,148,255,245,0,137,0,149,255,245,0,137,0,151,255,245,0,137,0,158,255,243,0,137,0,166,255,240,0,137,0,167,255,240,0,137,0,168,255,240,0,137,0,169,255,240,0,137,0,170,255,240,0,137,0,173,0,21,0,137,0,175,255,246,0,137,0,176,255,247,0,137,0,177,255,240,0,137,0,178,255,240,0,137,0,179,255,240,0,137,0,180,255,240,0,137,0,181,255,240,0,137,0,183,255,240,0,137,0,184,255,238,0,137,0,185,255,238,0,137,0,186,255,238,0,137,0,187,255,238,0,137,0,188,255,240,0,137,0,189,255,247,0,137,0,190,255,240,0,137,0,194,255,245,0,137,0,195,255,240,0,137,0,197,255,251,0,137,0,207,255,244,0,137,0,208,255,244,0,137,0,220,255,235,0,138,0,14,255,244,0,138,0,21,255,220,0,138,0,36,255,245,0,138,0,40,255,245,0,138,0,48,255,245,0,138,0,50,255,245,0,138,0,68,255,240,0,138,0,69,255,240,0,138,0,70,255,240,0,138,0,71,255,243,0,138,0,72,255,241,0,138,0,78,255,247,0,138,0,79,255,247,0,138,0,80,255,240,0,138,0,81,255,247,0,138,0,82,255,240,0,138,0,83,255,247,0,138,0,84,255,251,0,138,0,85,255,242,0,138,0,86,255,238,0,138,0,87,255,241,0,138,0,88,255,243,0,138,0,90,255,240,0,138,0,107,255,235,0,138,0,110,255,248,0,138,0,134,255,245,0,138,0,145,255,245,0,138,0,146,255,245,0,138,0,147,255,245,0,138,0,148,255,245,0,138,0,149,255,245,0,138,0,151,255,245,0,138,0,158,255,243,0,138,0,166,255,240,0,138,0,167,255,240,0,138,0,168,255,240,0,138,0,169,255,240,0,138,0,170,255,240,0,138,0,173,0,21,0,138,0,175,255,246,0,138,0,176,255,247,0,138,0,177,255,240,0,138,0,178,255,240,0,138,0,179,255,240,0,138,0,180,255,240,0,138,0,181,255,240,0,138,0,183,255,240,0,138,0,184,255,238,0,138,0,185,255,238,0,138,0,186,255,238,0,138,0,187,255,238,0,138,0,188,255,240,0,138,0,189,255,247,0,138,0,190,255,240,0,138,0,194,255,245,0,138,0,195,255,240,0,138,0,197,255,251,0,138,0,207,255,244,0,138,0,208,255,244,0,138,0,220,255,235,0,139,0,10,255,246,0,139,0,46,255,251,0,139,0,66,255,246,0,139,0,67,255,247,0,139,0,68,255,242,0,139,0,69,255,242,0,139,0,70,255,242,0,139,0,71,255,247,0,139,0,72,255,241,0,139,0,73,255,247,0,139,0,74,255,247,0,139,0,75,255,247,0,139,0,76,255,247,0,139,0,77,255,246,0,139,0,78,255,247,0,139,0,79,255,247,0,139,0,80,255,242,0,139,0,81,255,247,0,139,0,82,255,242,0,139,0,83,255,247,0,139,0,84,255,246,0,139,0,85,255,247,0,139,0,86,255,245,0,139,0,87,255,247,0,139,0,88,255,248,0,139,0,90,255,247,0,139,0,91,255,246,0,139,0,158,255,244,0,139,0,159,255,246,0,139,0,160,255,246,0,139,0,161,255,246,0,139,0,162,255,246,0,139,0,163,255,246,0,139,0,164,255,246,0,139,0,165,255,246,0,139,0,166,255,242,0,139,0,167,255,242,0,139,0,168,255,242,0,139,0,169,255,242,0,139,0,170,255,242,0,139,0,171,255,247,0,139,0,172,255,247,0,139,0,173,255,247,0,139,0,174,255,247,0,139,0,175,255,243,0,139,0,176,255,247,0,139,0,177,255,242,0,139,0,178,255,242,0,139,0,179,255,242,0,139,0,180,255,242,0,139,0,181,255,242,0,139,0,183,255,242,0,139,0,184,255,245,0,139,0,185,255,245,0,139,0,186,255,245,0,139,0,187,255,245,0,139,0,188,255,247,0,139,0,189,255,247,0,139,0,190,255,247,0,139,0,193,255,247,0,139,0,195,255,242,0,139,0,197,255,246,0,139,0,200,255,246,0,140,0,10,255,246,0,140,0,46,255,251,0,140,0,66,255,246,0,140,0,67,255,247,0,140,0,68,255,242,0,140,0,69,255,242,0,140,0,70,255,242,0,140,0,71,255,247,0,140,0,72,255,241,0,140,0,73,255,247,0,140,0,74,255,247,0,140,0,75,255,247,0,140,0,76,255,247,0,140,0,77,255,246,0,140,0,78,255,247,0,140,0,79,255,247,0,140,0,80,255,242,0,140,0,81,255,247,0,140,0,82,255,242,0,140,0,83,255,247,0,140,0,84,255,246,0,140,0,85,255,247,0,140,0,86,255,245,0,140,0,87,255,247,0,140,0,88,255,248,0,140,0,90,255,247,0,140,0,91,255,246,0,140,0,158,255,244,0,140,0,159,255,246,0,140,0,160,255,246,0,140,0,161,255,246,0,140,0,162,255,246,0,140,0,163,255,246,0,140,0,164,255,246,0,140,0,165,255,246,0,140,0,166,255,242,0,140,0,167,255,242,0,140,0,168,255,242,0,140,0,169,255,242,0,140,0,170,255,242,0,140,0,171,255,247,0,140,0,172,255,247,0,140,0,173,255,247,0,140,0,174,255,247,0,140,0,175,255,243,0,140,0,176,255,247,0,140,0,177,255,242,0,140,0,178,255,242,0,140,0,179,255,242,0,140,0,180,255,242,0,140,0,181,255,242,0,140,0,183,255,242,0,140,0,184,255,245,0,140,0,185,255,245,0,140,0,186,255,245,0,140,0,187,255,245,0,140,0,188,255,247,0,140,0,189,255,247,0,140,0,190,255,247,0,140,0,193,255,247,0,140,0,195,255,242,0,140,0,197,255,246,0,140,0,200,255,246,0,141,0,10,255,246,0,141,0,46,255,251,0,141,0,66,255,246,0,141,0,67,255,247,0,141,0,68,255,242,0,141,0,69,255,242,0,141,0,70,255,242,0,141,0,71,255,247,0,141,0,72,255,241,0,141,0,73,255,247,0,141,0,74,255,247,0,141,0,75,255,247,0,141,0,76,255,247,0,141,0,77,255,246,0,141,0,78,255,247,0,141,0,79,255,247,0,141,0,80,255,242,0,141,0,81,255,247,0,141,0,82,255,242,0,141,0,83,255,247,0,141,0,84,255,246,0,141,0,85,255,247,0,141,0,86,255,245,0,141,0,87,255,247,0,141,0,88,255,248,0,141,0,90,255,247,0,141,0,91,255,246,0,141,0,158,255,244,0,141,0,159,255,246,0,141,0,160,255,246,0,141,0,161,255,246,0,141,0,162,255,246,0,141,0,163,255,246,0,141,0,164,255,246,0,141,0,165,255,246,0,141,0,166,255,242,0,141,0,167,255,242,0,141,0,168,255,242,0,141,0,169,255,242,0,141,0,170,255,242,0,141,0,171,255,247,0,141,0,172,255,247,0,141,0,173,255,247,0,141,0,174,255,247,0,141,0,175,255,243,0,141,0,176,255,247,0,141,0,177,255,242,0,141,0,178,255,242,0,141,0,179,255,242,0,141,0,180,255,242,0,141,0,181,255,242,0,141,0,183,255,242,0,141,0,184,255,245,0,141,0,185,255,245,0,141,0,186,255,245,0,141,0,187,255,245,0,141,0,188,255,247,0,141,0,189,255,247,0,141,0,190,255,247,0,141,0,193,255,247,0,141,0,195,255,242,0,141,0,197,255,246,0,141,0,200,255,246,0,142,0,10,255,246,0,142,0,46,255,251,0,142,0,66,255,246,0,142,0,67,255,247,0,142,0,68,255,242,0,142,0,69,255,242,0,142,0,70,255,242,0,142,0,71,255,247,0,142,0,72,255,241,0,142,0,73,255,247,0,142,0,74,255,247,0,142,0,75,255,247,0,142,0,76,255,247,0,142,0,77,255,246,0,142,0,78,255,247,0,142,0,79,255,247,0,142,0,80,255,242,0,142,0,81,255,247,0,142,0,82,255,242,0,142,0,83,255,247,0,142,0,84,255,246,0,142,0,85,255,247,0,142,0,86,255,245,0,142,0,87,255,247,0,142,0,88,255,248,0,142,0,90,255,247,0,142,0,91,255,246,0,142,0,158,255,244,0,142,0,159,255,246,0,142,0,160,255,246,0,142,0,161,255,246,0,142,0,162,255,246,0,142,0,163,255,246,0,142,0,164,255,246,0,142,0,165,255,246,0,142,0,166,255,242,0,142,0,167,255,242,0,142,0,168,255,242,0,142,0,169,255,242,0,142,0,170,255,242,0,142,0,171,255,247,0,142,0,172,255,247,0,142,0,173,255,247,0,142,0,174,255,247,0,142,0,175,255,243,0,142,0,176,255,247,0,142,0,177,255,242,0,142,0,178,255,242,0,142,0,179,255,242,0,142,0,180,255,242,0,142,0,181,255,242,0,142,0,183,255,242,0,142,0,184,255,245,0,142,0,185,255,245,0,142,0,186,255,245,0,142,0,187,255,245,0,142,0,188,255,247,0,142,0,189,255,247,0,142,0,190,255,247,0,142,0,193,255,247,0,142,0,195,255,242,0,142,0,197,255,246,0,142,0,200,255,246,0,143,0,10,255,228,0,143,0,13,255,241,0,143,0,15,255,242,0,143,0,16,255,237,0,143,0,20,255,248,0,143,0,24,255,240,0,143,0,32,255,237,0,143,0,34,255,244,0,143,0,46,255,250,0,143,0,53,255,228,0,143,0,55,255,243,0,143,0,56,255,248,0,143,0,57,255,225,0,143,0,58,255,227,0,143,0,59,255,235,0,143,0,61,255,244,0,143,0,62,255,224,0,143,0,66,255,248,0,143,0,67,255,249,0,143,0,68,255,250,0,143,0,69,255,250,0,143,0,70,255,250,0,143,0,72,255,250,0,143,0,73,255,249,0,143,0,74,255,249,0,143,0,75,255,249,0,143,0,76,255,249,0,143,0,77,255,249,0,143,0,78,255,249,0,143,0,79,255,249,0,143,0,80,255,250,0,143,0,81,255,249,0,143,0,82,255,250,0,143,0,83,255,249,0,143,0,84,255,250,0,143,0,86,255,250,0,143,0,89,255,244,0,143,0,91,255,250,0,143,0,94,255,229,0,143,0,127,255,244,0,143,0,128,255,244,0,143,0,129,255,244,0,143,0,130,255,244,0,143,0,131,255,244,0,143,0,132,255,244,0,143,0,133,255,226,0,143,0,156,255,227,0,143,0,158,255,250,0,143,0,159,255,248,0,143,0,160,255,248,0,143,0,161,255,248,0,143,0,162,255,248,0,143,0,163,255,248,0,143,0,164,255,248,0,143,0,165,255,248,0,143,0,166,255,250,0,143,0,167,255,250,0,143,0,168,255,250,0,143,0,169,255,250,0,143,0,170,255,250,0,143,0,171,255,249,0,143,0,172,255,249,0,143,0,173,255,249,0,143,0,174,255,249,0,143,0,175,255,249,0,143,0,176,255,249,0,143,0,177,255,250,0,143,0,178,255,250,0,143,0,179,255,250,0,143,0,180,255,250,0,143,0,181,255,250,0,143,0,183,255,250,0,143,0,184,255,250,0,143,0,185,255,250,0,143,0,186,255,250,0,143,0,187,255,250,0,143,0,189,255,249,0,143,0,193,255,249,0,143,0,195,255,250,0,143,0,197,255,250,0,143,0,198,255,227,0,143,0,199,255,235,0,143,0,200,255,250,0,143,0,210,255,247,0,143,0,211,255,241,0,143,0,213,255,247,0,143,0,214,255,241,0,143,0,218,255,242,0,143,0,240,255,246,0,144,0,10,255,246,0,144,0,46,255,251,0,144,0,66,255,246,0,144,0,67,255,247,0,144,0,68,255,242,0,144,0,69,255,242,0,144,0,70,255,242,0,144,0,71,255,247,0,144,0,72,255,241,0,144,0,73,255,247,0,144,0,74,255,247,0,144,0,75,255,247,0,144,0,76,255,247,0,144,0,77,255,246,0,144,0,78,255,247,0,144,0,79,255,247,0,144,0,80,255,242,0,144,0,81,255,247,0,144,0,82,255,242,0,144,0,83,255,247,0,144,0,84,255,246,0,144,0,85,255,247,0,144,0,86,255,245,0,144,0,87,255,247,0,144,0,88,255,248,0,144,0,90,255,247,0,144,0,91,255,246,0,144,0,158,255,244,0,144,0,159,255,246,0,144,0,160,255,246,0,144,0,161,255,246,0,144,0,162,255,246,0,144,0,163,255,246,0,144,0,164,255,246,0,144,0,165,255,246,0,144,0,166,255,242,0,144,0,167,255,242,0,144,0,168,255,242,0,144,0,169,255,242,0,144,0,170,255,242,0,144,0,171,255,247,0,144,0,172,255,247,0,144,0,173,255,247,0,144,0,174,255,247,0,144,0,175,255,243,0,144,0,176,255,247,0,144,0,177,255,242,0,144,0,178,255,242,0,144,0,179,255,242,0,144,0,180,255,242,0,144,0,181,255,242,0,144,0,183,255,242,0,144,0,184,255,245,0,144,0,185,255,245,0,144,0,186,255,245,0,144,0,187,255,245,0,144,0,188,255,247,0,144,0,189,255,247,0,144,0,190,255,247,0,144,0,193,255,247,0,144,0,195,255,242,0,144,0,197,255,246,0,144,0,200,255,246,0,145,0,10,255,229,0,145,0,13,255,242,0,145,0,15,255,242,0,145,0,16,255,239,0,145,0,24,255,243,0,145,0,32,255,240,0,145,0,34,255,245,0,145,0,46,255,251,0,145,0,53,255,232,0,145,0,55,255,244,0,145,0,56,255,248,0,145,0,57,255,229,0,145,0,58,255,230,0,145,0,59,255,238,0,145,0,61,255,245,0,145,0,62,255,227,0,145,0,66,255,247,0,145,0,67,255,250,0,145,0,68,255,250,0,145,0,69,255,250,0,145,0,70,255,250,0,145,0,72,255,250,0,145,0,73,255,250,0,145,0,74,255,249,0,145,0,75,255,249,0,145,0,76,255,250,0,145,0,77,255,250,0,145,0,78,255,249,0,145,0,79,255,249,0,145,0,80,255,250,0,145,0,81,255,249,0,145,0,82,255,250,0,145,0,83,255,249,0,145,0,84,255,250,0,145,0,86,255,251,0,145,0,89,255,245,0,145,0,91,255,250,0,145,0,94,255,231,0,145,0,127,255,245,0,145,0,128,255,245,0,145,0,129,255,245,0,145,0,130,255,245,0,145,0,131,255,245,0,145,0,132,255,245,0,145,0,133,255,229,0,145,0,156,255,230,0,145,0,158,255,251,0,145,0,159,255,247,0,145,0,160,255,247,0,145,0,161,255,247,0,145,0,162,255,247,0,145,0,163,255,247,0,145,0,164,255,247,0,145,0,165,255,247,0,145,0,166,255,250,0,145,0,167,255,250,0,145,0,168,255,250,0,145,0,169,255,250,0,145,0,170,255,250,0,145,0,171,255,249,0,145,0,172,255,249,0,145,0,173,255,249,0,145,0,174,255,249,0,145,0,175,255,250,0,145,0,176,255,249,0,145,0,177,255,250,0,145,0,178,255,250,0,145,0,179,255,250,0,145,0,180,255,250,0,145,0,181,255,250,0,145,0,183,255,250,0,145,0,184,255,251,0,145,0,185,255,251,0,145,0,186,255,251,0,145,0,187,255,251,0,145,0,189,255,249,0,145,0,193,255,249,0,145,0,195,255,250,0,145,0,197,255,250,0,145,0,198,255,230,0,145,0,199,255,238,0,145,0,200,255,250,0,145,0,210,255,247,0,145,0,211,255,242,0,145,0,213,255,247,0,145,0,214,255,242,0,145,0,218,255,242,0,145,0,240,255,246,0,146,0,10,255,229,0,146,0,13,255,242,0,146,0,15,255,242,0,146,0,16,255,239,0,146,0,24,255,243,0,146,0,32,255,240,0,146,0,34,255,245,0,146,0,46,255,251,0,146,0,53,255,232,0,146,0,55,255,244,0,146,0,56,255,248,0,146,0,57,255,229,0,146,0,58,255,230,0,146,0,59,255,238,0,146,0,61,255,245,0,146,0,62,255,227,0,146,0,66,255,247,0,146,0,67,255,250,0,146,0,68,255,250,0,146,0,69,255,250,0,146,0,70,255,250,0,146,0,72,255,250,0,146,0,73,255,250,0,146,0,74,255,249,0,146,0,75,255,249,0,146,0,76,255,250,0,146,0,77,255,250,0,146,0,78,255,249,0,146,0,79,255,249,0,146,0,80,255,250,0,146,0,81,255,249,0,146,0,82,255,250,0,146,0,83,255,249,0,146,0,84,255,250,0,146,0,86,255,251,0,146,0,89,255,245,0,146,0,91,255,250,0,146,0,94,255,231,0,146,0,127,255,245,0,146,0,128,255,245,0,146,0,129,255,245,0,146,0,130,255,245,0,146,0,131,255,245,0,146,0,132,255,245,0,146,0,133,255,229,0,146,0,156,255,230,0,146,0,158,255,251,0,146,0,159,255,247,0,146,0,160,255,247,0,146,0,161,255,247,0,146,0,162,255,247,0,146,0,163,255,247,0,146,0,164,255,247,0,146,0,165,255,247,0,146,0,166,255,250,0,146,0,167,255,250,0,146,0,168,255,250,0,146,0,169,255,250,0,146,0,170,255,250,0,146,0,171,255,249,0,146,0,172,255,249,0,146,0,173,255,249,0,146,0,174,255,249,0,146,0,175,255,250,0,146,0,176,255,249,0,146,0,177,255,250,0,146,0,178,255,250,0,146,0,179,255,250,0,146,0,180,255,250,0,146,0,181,255,250,0,146,0,183,255,250,0,146,0,184,255,251,0,146,0,185,255,251,0,146,0,186,255,251,0,146,0,187,255,251,0,146,0,189,255,249,0,146,0,193,255,249,0,146,0,195,255,250,0,146,0,197,255,250,0,146,0,198,255,230,0,146,0,199,255,238,0,146,0,200,255,250,0,146,0,210,255,247,0,146,0,211,255,242,0,146,0,213,255,247,0,146,0,214,255,242,0,146,0,218,255,242,0,146,0,240,255,246,0,147,0,10,255,229,0,147,0,13,255,242,0,147,0,15,255,242,0,147,0,16,255,239,0,147,0,24,255,243,0,147,0,32,255,240,0,147,0,34,255,245,0,147,0,46,255,251,0,147,0,53,255,232,0,147,0,55,255,244,0,147,0,56,255,248,0,147,0,57,255,229,0,147,0,58,255,230,0,147,0,59,255,238,0,147,0,61,255,245,0,147,0,62,255,227,0,147,0,66,255,247,0,147,0,67,255,250,0,147,0,68,255,250,0,147,0,69,255,250,0,147,0,70,255,250,0,147,0,72,255,250,0,147,0,73,255,250,0,147,0,74,255,249,0,147,0,75,255,249,0,147,0,76,255,250,0,147,0,77,255,250,0,147,0,78,255,249,0,147,0,79,255,249,0,147,0,80,255,250,0,147,0,81,255,249,0,147,0,82,255,250,0,147,0,83,255,249,0,147,0,84,255,250,0,147,0,86,255,251,0,147,0,89,255,245,0,147,0,91,255,250,0,147,0,94,255,231,0,147,0,127,255,245,0,147,0,128,255,245,0,147,0,129,255,245,0,147,0,130,255,245,0,147,0,131,255,245,0,147,0,132,255,245,0,147,0,133,255,229,0,147,0,156,255,230,0,147,0,158,255,251,0,147,0,159,255,247,0,147,0,160,255,247,0,147,0,161,255,247,0,147,0,162,255,247,0,147,0,163,255,247,0,147,0,164,255,247,0,147,0,165,255,247,0,147,0,166,255,250,0,147,0,167,255,250,0,147,0,168,255,250,0,147,0,169,255,250,0,147,0,170,255,250,0,147,0,171,255,249,0,147,0,172,255,249,0,147,0,173,255,249,0,147,0,174,255,249,0,147,0,175,255,250,0,147,0,176,255,249,0,147,0,177,255,250,0,147,0,178,255,250,0,147,0,179,255,250,0,147,0,180,255,250,0,147,0,181,255,250,0,147,0,183,255,250,0,147,0,184,255,251,0,147,0,185,255,251,0,147,0,186,255,251,0,147,0,187,255,251,0,147,0,189,255,249,0,147,0,193,255,249,0,147,0,195,255,250,0,147,0,197,255,250,0,147,0,198,255,230,0,147,0,199,255,238,0,147,0,200,255,250,0,147,0,210,255,247,0,147,0,211,255,242,0,147,0,213,255,247,0,147,0,214,255,242,0,147,0,218,255,242,0,147,0,240,255,246,0,148,0,10,255,229,0,148,0,13,255,242,0,148,0,15,255,242,0,148,0,16,255,239,0,148,0,24,255,243,0,148,0,32,255,240,0,148,0,34,255,245,0,148,0,46,255,251,0,148,0,53,255,232,0,148,0,55,255,244,0,148,0,56,255,248,0,148,0,57,255,229,0,148,0,58,255,230,0,148,0,59,255,238,0,148,0,61,255,245,0,148,0,62,255,227,0,148,0,66,255,247,0,148,0,67,255,250,0,148,0,68,255,250,0,148,0,69,255,250,0,148,0,70,255,250,0,148,0,72,255,250,0,148,0,73,255,250,0,148,0,74,255,249,0,148,0,75,255,249,0,148,0,76,255,250,0,148,0,77,255,250,0,148,0,78,255,249,0,148,0,79,255,249,0,148,0,80,255,250,0,148,0,81,255,249,0,148,0,82,255,250,0,148,0,83,255,249,0,148,0,84,255,250,0,148,0,86,255,251,0,148,0,89,255,245,0,148,0,91,255,250,0,148,0,94,255,231,0,148,0,127,255,245,0,148,0,128,255,245,0,148,0,129,255,245,0,148,0,130,255,245,0,148,0,131,255,245,0,148,0,132,255,245,0,148,0,133,255,229,0,148,0,156,255,230,0,148,0,158,255,251,0,148,0,159,255,247,0,148,0,160,255,247,0,148,0,161,255,247,0,148,0,162,255,247,0,148,0,163,255,247,0,148,0,164,255,247,0,148,0,165,255,247,0,148,0,166,255,250,0,148,0,167,255,250,0,148,0,168,255,250,0,148,0,169,255,250,0,148,0,170,255,250,0,148,0,171,255,249,0,148,0,172,255,249,0,148,0,173,255,249,0,148,0,174,255,249,0,148,0,175,255,250,0,148,0,176,255,249,0,148,0,177,255,250,0,148,0,178,255,250,0,148,0,179,255,250,0,148,0,180,255,250,0,148,0,181,255,250,0,148,0,183,255,250,0,148,0,184,255,251,0,148,0,185,255,251,0,148,0,186,255,251,0,148,0,187,255,251,0,148,0,189,255,249,0,148,0,193,255,249,0,148,0,195,255,250,0,148,0,197,255,250,0,148,0,198,255,230,0,148,0,199,255,238,0,148,0,200,255,250,0,148,0,210,255,247,0,148,0,211,255,242,0,148,0,213,255,247,0,148,0,214,255,242,0,148,0,218,255,242,0,148,0,240,255,246,0,149,0,10,255,229,0,149,0,13,255,242,0,149,0,15,255,242,0,149,0,16,255,239,0,149,0,24,255,243,0,149,0,32,255,240,0,149,0,34,255,245,0,149,0,46,255,251,0,149,0,53,255,232,0,149,0,55,255,244,0,149,0,56,255,248,0,149,0,57,255,229,0,149,0,58,255,230,0,149,0,59,255,238,0,149,0,61,255,245,0,149,0,62,255,227,0,149,0,66,255,247,0,149,0,67,255,250,0,149,0,68,255,250,0,149,0,69,255,250,0,149,0,70,255,250,0,149,0,72,255,250,0,149,0,73,255,250,0,149,0,74,255,249,0,149,0,75,255,249,0,149,0,76,255,250,0,149,0,77,255,250,0,149,0,78,255,249,0,149,0,79,255,249,0,149,0,80,255,250,0,149,0,81,255,249,0,149,0,82,255,250,0,149,0,83,255,249,0,149,0,84,255,250,0,149,0,86,255,251,0,149,0,89,255,245,0,149,0,91,255,250,0,149,0,94,255,231,0,149,0,127,255,245,0,149,0,128,255,245,0,149,0,129,255,245,0,149,0,130,255,245,0,149,0,131,255,245,0,149,0,132,255,245,0,149,0,133,255,229,0,149,0,156,255,230,0,149,0,158,255,251,0,149,0,159,255,247,0,149,0,160,255,247,0,149,0,161,255,247,0,149,0,162,255,247,0,149,0,163,255,247,0,149,0,164,255,247,0,149,0,165,255,247,0,149,0,166,255,250,0,149,0,167,255,250,0,149,0,168,255,250,0,149,0,169,255,250,0,149,0,170,255,250,0,149,0,171,255,249,0,149,0,172,255,249,0,149,0,173,255,249,0,149,0,174,255,249,0,149,0,175,255,250,0,149,0,176,255,249,0,149,0,177,255,250,0,149,0,178,255,250,0,149,0,179,255,250,0,149,0,180,255,250,0,149,0,181,255,250,0,149,0,183,255,250,0,149,0,184,255,251,0,149,0,185,255,251,0,149,0,186,255,251,0,149,0,187,255,251,0,149,0,189,255,249,0,149,0,193,255,249,0,149,0,195,255,250,0,149,0,197,255,250,0,149,0,198,255,230,0,149,0,199,255,238,0,149,0,200,255,250,0,149,0,210,255,247,0,149,0,211,255,242,0,149,0,213,255,247,0,149,0,214,255,242,0,149,0,218,255,242,0,149,0,240,255,246,0,151,0,10,255,229,0,151,0,13,255,242,0,151,0,15,255,242,0,151,0,16,255,239,0,151,0,24,255,243,0,151,0,32,255,240,0,151,0,34,255,245,0,151,0,46,255,251,0,151,0,53,255,232,0,151,0,55,255,244,0,151,0,56,255,248,0,151,0,57,255,229,0,151,0,58,255,230,0,151,0,59,255,238,0,151,0,61,255,245,0,151,0,62,255,227,0,151,0,66,255,247,0,151,0,67,255,250,0,151,0,68,255,250,0,151,0,69,255,250,0,151,0,70,255,250,0,151,0,72,255,250,0,151,0,73,255,250,0,151,0,74,255,249,0,151,0,75,255,249,0,151,0,76,255,250,0,151,0,77,255,250,0,151,0,78,255,249,0,151,0,79,255,249,0,151,0,80,255,250,0,151,0,81,255,249,0,151,0,82,255,250,0,151,0,83,255,249,0,151,0,84,255,250,0,151,0,86,255,251,0,151,0,89,255,245,0,151,0,91,255,250,0,151,0,94,255,231,0,151,0,127,255,245,0,151,0,128,255,245,0,151,0,129,255,245,0,151,0,130,255,245,0,151,0,131,255,245,0,151,0,132,255,245,0,151,0,133,255,229,0,151,0,156,255,230,0,151,0,158,255,251,0,151,0,159,255,247,0,151,0,160,255,247,0,151,0,161,255,247,0,151,0,162,255,247,0,151,0,163,255,247,0,151,0,164,255,247,0,151,0,165,255,247,0,151,0,166,255,250,0,151,0,167,255,250,0,151,0,168,255,250,0,151,0,169,255,250,0,151,0,170,255,250,0,151,0,171,255,249,0,151,0,172,255,249,0,151,0,173,255,249,0,151,0,174,255,249,0,151,0,175,255,250,0,151,0,176,255,249,0,151,0,177,255,250,0,151,0,178,255,250,0,151,0,179,255,250,0,151,0,180,255,250,0,151,0,181,255,250,0,151,0,183,255,250,0,151,0,184,255,251,0,151,0,185,255,251,0,151,0,186,255,251,0,151,0,187,255,251,0,151,0,189,255,249,0,151,0,193,255,249,0,151,0,195,255,250,0,151,0,197,255,250,0,151,0,198,255,230,0,151,0,199,255,238,0,151,0,200,255,250,0,151,0,210,255,247,0,151,0,211,255,242,0,151,0,213,255,247,0,151,0,214,255,242,0,151,0,218,255,242,0,151,0,240,255,246,0,152,0,10,255,245,0,152,0,13,255,243,0,152,0,15,255,243,0,152,0,16,255,234,0,152,0,34,255,240,0,152,0,46,255,248,0,152,0,59,255,251,0,152,0,66,255,242,0,152,0,67,255,245,0,152,0,68,255,243,0,152,0,69,255,243,0,152,0,70,255,243,0,152,0,71,255,250,0,152,0,72,255,242,0,152,0,73,255,245,0,152,0,74,255,243,0,152,0,75,255,243,0,152,0,76,255,245,0,152,0,77,255,244,0,152,0,78,255,240,0,152,0,79,255,240,0,152,0,80,255,243,0,152,0,81,255,240,0,152,0,82,255,243,0,152,0,83,255,240,0,152,0,84,255,243,0,152,0,85,255,249,0,152,0,86,255,242,0,152,0,87,255,250,0,152,0,88,255,250,0,152,0,89,255,250,0,152,0,90,255,250,0,152,0,91,255,244,0,152,0,127,255,240,0,152,0,128,255,240,0,152,0,129,255,240,0,152,0,130,255,240,0,152,0,131,255,240,0,152,0,132,255,240,0,152,0,133,255,240,0,152,0,158,255,248,0,152,0,159,255,242,0,152,0,160,255,242,0,152,0,161,255,242,0,152,0,162,255,242,0,152,0,163,255,242,0,152,0,164,255,242,0,152,0,165,255,242,0,152,0,166,255,243,0,152,0,167,255,243,0,152,0,168,255,243,0,152,0,169,255,243,0,152,0,170,255,243,0,152,0,171,255,243,0,152,0,172,255,243,0,152,0,173,255,251,0,152,0,174,255,243,0,152,0,175,255,242,0,152,0,176,255,240,0,152,0,177,255,243,0,152,0,178,255,243,0,152,0,179,255,243,0,152,0,180,255,243,0,152,0,181,255,243,0,152,0,183,255,243,0,152,0,184,255,242,0,152,0,185,255,242,0,152,0,186,255,242,0,152,0,187,255,242,0,152,0,188,255,250,0,152,0,189,255,240,0,152,0,190,255,250,0,152,0,193,255,243,0,152,0,195,255,243,0,152,0,197,255,243,0,152,0,199,255,251,0,152,0,200,255,244,0,152,0,211,255,243,0,152,0,214,255,243,0,152,0,218,255,243,0,153,0,10,255,245,0,153,0,13,255,243,0,153,0,15,255,243,0,153,0,16,255,234,0,153,0,34,255,240,0,153,0,46,255,248,0,153,0,59,255,251,0,153,0,66,255,242,0,153,0,67,255,245,0,153,0,68,255,243,0,153,0,69,255,243,0,153,0,70,255,243,0,153,0,71,255,250,0,153,0,72,255,242,0,153,0,73,255,245,0,153,0,74,255,243,0,153,0,75,255,243,0,153,0,76,255,245,0,153,0,77,255,244,0,153,0,78,255,240,0,153,0,79,255,240,0,153,0,80,255,243,0,153,0,81,255,240,0,153,0,82,255,243,0,153,0,83,255,240,0,153,0,84,255,243,0,153,0,85,255,249,0,153,0,86,255,242,0,153,0,87,255,250,0,153,0,88,255,250,0,153,0,89,255,250,0,153,0,90,255,250,0,153,0,91,255,244,0,153,0,127,255,240,0,153,0,128,255,240,0,153,0,129,255,240,0,153,0,130,255,240,0,153,0,131,255,240,0,153,0,132,255,240,0,153,0,133,255,240,0,153,0,158,255,248,0,153,0,159,255,242,0,153,0,160,255,242,0,153,0,161,255,242,0,153,0,162,255,242,0,153,0,163,255,242,0,153,0,164,255,242,0,153,0,165,255,242,0,153,0,166,255,243,0,153,0,167,255,243,0,153,0,168,255,243,0,153,0,169,255,243,0,153,0,170,255,243,0,153,0,171,255,243,0,153,0,172,255,243,0,153,0,173,255,251,0,153,0,174,255,243,0,153,0,175,255,242,0,153,0,176,255,240,0,153,0,177,255,243,0,153,0,178,255,243,0,153,0,179,255,243,0,153,0,180,255,243,0,153,0,181,255,243,0,153,0,183,255,243,0,153,0,184,255,242,0,153,0,185,255,242,0,153,0,186,255,242,0,153,0,187,255,242,0,153,0,188,255,250,0,153,0,189,255,240,0,153,0,190,255,250,0,153,0,193,255,243,0,153,0,195,255,243,0,153,0,197,255,243,0,153,0,199,255,251,0,153,0,200,255,244,0,153,0,211,255,243,0,153,0,214,255,243,0,153,0,218,255,243,0,154,0,10,255,245,0,154,0,13,255,243,0,154,0,15,255,243,0,154,0,16,255,234,0,154,0,34,255,240,0,154,0,46,255,248,0,154,0,59,255,251,0,154,0,66,255,242,0,154,0,67,255,245,0,154,0,68,255,243,0,154,0,69,255,243,0,154,0,70,255,243,0,154,0,71,255,250,0,154,0,72,255,242,0,154,0,73,255,245,0,154,0,74,255,243,0,154,0,75,255,243,0,154,0,76,255,245,0,154,0,77,255,244,0,154,0,78,255,240,0,154,0,79,255,240,0,154,0,80,255,243,0,154,0,81,255,240,0,154,0,82,255,243,0,154,0,83,255,240,0,154,0,84,255,243,0,154,0,85,255,249,0,154,0,86,255,242,0,154,0,87,255,250,0,154,0,88,255,250,0,154,0,89,255,250,0,154,0,90,255,250,0,154,0,91,255,244,0,154,0,127,255,240,0,154,0,128,255,240,0,154,0,129,255,240,0,154,0,130,255,240,0,154,0,131,255,240,0,154,0,132,255,240,0,154,0,133,255,240,0,154,0,158,255,248,0,154,0,159,255,242,0,154,0,160,255,242,0,154,0,161,255,242,0,154,0,162,255,242,0,154,0,163,255,242,0,154,0,164,255,242,0,154,0,165,255,242,0,154,0,166,255,243,0,154,0,167,255,243,0,154,0,168,255,243,0,154,0,169,255,243,0,154,0,170,255,243,0,154,0,171,255,243,0,154,0,172,255,243,0,154,0,173,255,251,0,154,0,174,255,243,0,154,0,175,255,242,0,154,0,176,255,240,0,154,0,177,255,243,0,154,0,178,255,243,0,154,0,179,255,243,0,154,0,180,255,243,0,154,0,181,255,243,0,154,0,183,255,243,0,154,0,184,255,242,0,154,0,185,255,242,0,154,0,186,255,242,0,154,0,187,255,242,0,154,0,188,255,250,0,154,0,189,255,240,0,154,0,190,255,250,0,154,0,193,255,243,0,154,0,195,255,243,0,154,0,197,255,243,0,154,0,199,255,251,0,154,0,200,255,244,0,154,0,211,255,243,0,154,0,214,255,243,0,154,0,218,255,243,0,155,0,10,255,245,0,155,0,13,255,243,0,155,0,15,255,243,0,155,0,16,255,234,0,155,0,34,255,240,0,155,0,46,255,248,0,155,0,59,255,251,0,155,0,66,255,242,0,155,0,67,255,245,0,155,0,68,255,243,0,155,0,69,255,243,0,155,0,70,255,243,0,155,0,71,255,250,0,155,0,72,255,242,0,155,0,73,255,245,0,155,0,74,255,243,0,155,0,75,255,243,0,155,0,76,255,245,0,155,0,77,255,244,0,155,0,78,255,240,0,155,0,79,255,240,0,155,0,80,255,243,0,155,0,81,255,240,0,155,0,82,255,243,0,155,0,83,255,240,0,155,0,84,255,243,0,155,0,85,255,249,0,155,0,86,255,242,0,155,0,87,255,250,0,155,0,88,255,250,0,155,0,89,255,250,0,155,0,90,255,250,0,155,0,91,255,244,0,155,0,127,255,240,0,155,0,128,255,240,0,155,0,129,255,240,0,155,0,130,255,240,0,155,0,131,255,240,0,155,0,132,255,240,0,155,0,133,255,240,0,155,0,158,255,248,0,155,0,159,255,242,0,155,0,160,255,242,0,155,0,161,255,242,0,155,0,162,255,242,0,155,0,163,255,242,0,155,0,164,255,242,0,155,0,165,255,242,0,155,0,166,255,243,0,155,0,167,255,243,0,155,0,168,255,243,0,155,0,169,255,243,0,155,0,170,255,243,0,155,0,171,255,243,0,155,0,172,255,243,0,155,0,173,255,251,0,155,0,174,255,243,0,155,0,175,255,242,0,155,0,176,255,240,0,155,0,177,255,243,0,155,0,178,255,243,0,155,0,179,255,243,0,155,0,180,255,243,0,155,0,181,255,243,0,155,0,183,255,243,0,155,0,184,255,242,0,155,0,185,255,242,0,155,0,186,255,242,0,155,0,187,255,242,0,155,0,188,255,250,0,155,0,189,255,240,0,155,0,190,255,250,0,155,0,193,255,243,0,155,0,195,255,243,0,155,0,197,255,243,0,155,0,199,255,251,0,155,0,200,255,244,0,155,0,211,255,243,0,155,0,214,255,243,0,155,0,218,255,243,0,156,0,7,255,237,0,156,0,11,0,13,0,156,0,13,255,215,0,156,0,14,255,222,0,156,0,15,255,215,0,156,0,16,255,201,0,156,0,17,255,233,0,156,0,21,255,206,0,156,0,23,255,218,0,156,0,25,255,246,0,156,0,27,255,235,0,156,0,28,255,235,0,156,0,32,0,13,0,156,0,33,255,198,0,156,0,34,255,192,0,156,0,36,255,230,0,156,0,40,255,230,0,156,0,46,255,232,0,156,0,48,255,230,0,156,0,50,255,230,0,156,0,61,0,7,0,156,0,62,0,31,0,156,0,66,255,189,0,156,0,68,255,171,0,156,0,69,255,171,0,156,0,70,255,171,0,156,0,71,255,237,0,156,0,72,255,180,0,156,0,78,255,187,0,156,0,79,255,187,0,156,0,80,255,171,0,156,0,81,255,187,0,156,0,82,255,171,0,156,0,83,255,187,0,156,0,84,255,186,0,156,0,85,255,221,0,156,0,86,255,190,0,156,0,87,255,215,0,156,0,88,255,216,0,156,0,89,255,214,0,156,0,90,255,217,0,156,0,91,255,229,0,156,0,94,0,33,0,156,0,107,255,198,0,156,0,110,255,230,0,156,0,122,255,225,0,156,0,127,255,192,0,156,0,128,255,192,0,156,0,129,255,192,0,156,0,130,255,192,0,156,0,131,255,192,0,156,0,132,255,192,0,156,0,133,255,180,0,156,0,134,255,230,0,156,0,145,255,230,0,156,0,146,255,230,0,156,0,147,255,230,0,156,0,148,255,230,0,156,0,149,255,230,0,156,0,151,255,230,0,156,0,158,255,230,0,156,0,159,255,189,0,156,0,160,255,189,0,156,0,161,255,189,0,156,0,162,255,189,0,156,0,163,255,189,0,156,0,164,255,189,0,156,0,165,255,189,0,156,0,166,255,171,0,156,0,167,255,171,0,156,0,168,255,171,0,156,0,169,255,171,0,156,0,170,255,171,0,156,0,171,0,16,0,156,0,173,0,38,0,156,0,174,0,47,0,156,0,175,255,216,0,156,0,176,255,187,0,156,0,177,255,171,0,156,0,178,255,171,0,156,0,179,255,171,0,156,0,180,255,171,0,156,0,181,255,171,0,156,0,183,255,171,0,156,0,184,255,190,0,156,0,185,255,190,0,156,0,186,255,190,0,156,0,187,255,190,0,156,0,188,255,217,0,156,0,189,255,225,0,156,0,190,255,217,0,156,0,194,255,230,0,156,0,195,255,171,0,156,0,197,255,234,0,156,0,200,255,229,0,156,0,207,255,222,0,156,0,208,255,222,0,156,0,211,255,215,0,156,0,214,255,215,0,156,0,218,255,215,0,156,0,220,255,198,0,156,0,221,255,225,0,156,0,240,0,33,0,157,0,10,255,228,0,157,0,13,255,177,0,157,0,15,255,177,0,157,0,16,255,221,0,157,0,32,255,223,0,157,0,34,255,235,0,157,0,46,255,251,0,157,0,53,255,202,0,157,0,55,255,248,0,157,0,57,255,205,0,157,0,58,255,228,0,157,0,59,255,203,0,157,0,61,255,247,0,157,0,62,255,214,0,157,0,66,255,247,0,157,0,89,255,250,0,157,0,94,255,226,0,157,0,127,255,235,0,157,0,128,255,235,0,157,0,129,255,235,0,157,0,130,255,235,0,157,0,131,255,235,0,157,0,132,255,235,0,157,0,133,255,201,0,157,0,156,255,228,0,157,0,159,255,247,0,157,0,160,255,247,0,157,0,161,255,247,0,157,0,162,255,247,0,157,0,163,255,247,0,157,0,164,255,247,0,157,0,165,255,247,0,157,0,198,255,228,0,157,0,199,255,203,0,157,0,211,255,177,0,157,0,214,255,177,0,157,0,218,255,177,0,158,0,3,255,243,0,158,0,8,255,243,0,158,0,10,255,239,0,158,0,11,255,241,0,158,0,71,255,250,0,158,0,85,255,247,0,158,0,87,255,245,0,158,0,88,255,248,0,158,0,89,255,251,0,158,0,90,255,245,0,158,0,188,255,245,0,158,0,190,255,245,0,158,0,209,255,245,0,158,0,210,255,243,0,158,0,212,255,245,0,158,0,213,255,243,0,158,0,240,255,242,0,159,0,3,255,234,0,159,0,7,255,245,0,159,0,8,255,234,0,159,0,10,255,246,0,159,0,11,255,231,0,159,0,18,255,234,0,159,0,26,255,247,0,159,0,32,255,229,0,159,0,35,255,240,0,159,0,36,255,237,0,159,0,37,255,240,0,159,0,38,255,240,0,159,0,39,255,240,0,159,0,40,255,237,0,159,0,41,255,240,0,159,0,42,255,240,0,159,0,43,255,240,0,159,0,44,255,240,0,159,0,45,255,240,0,159,0,46,255,248,0,159,0,47,255,240,0,159,0,48,255,237,0,159,0,49,255,240,0,159,0,50,255,237,0,159,0,51,255,240,0,159,0,52,255,250,0,159,0,53,255,173,0,159,0,54,255,227,0,159,0,55,255,193,0,159,0,56,255,210,0,159,0,58,255,165,0,159,0,61,255,210,0,159,0,62,255,227,0,159,0,71,255,251,0,159,0,85,255,246,0,159,0,87,255,238,0,159,0,88,255,243,0,159,0,90,255,236,0,159,0,94,255,231,0,159,0,110,255,248,0,159,0,134,255,237,0,159,0,135,255,240,0,159,0,136,255,240,0,159,0,137,255,240,0,159,0,138,255,240,0,159,0,139,255,240,0,159,0,140,255,240,0,159,0,141,255,240,0,159,0,142,255,240,0,159,0,143,255,240,0,159,0,144,255,240,0,159,0,145,255,237,0,159,0,146,255,237,0,159,0,147,255,237,0,159,0,148,255,237,0,159,0,149,255,237,0,159,0,151,255,237,0,159,0,152,255,227,0,159,0,153,255,227,0,159,0,154,255,227,0,159,0,155,255,227,0,159,0,156,255,165,0,159,0,157,255,240,0,159,0,158,255,249,0,159,0,188,255,236,0,159,0,190,255,236,0,159,0,194,255,237,0,159,0,196,255,250,0,159,0,198,255,165,0,159,0,209,255,186,0,159,0,210,255,183,0,159,0,212,255,186,0,159,0,213,255,183,0,159,0,240,255,230,0,160,0,3,255,234,0,160,0,7,255,245,0,160,0,8,255,234,0,160,0,10,255,246,0,160,0,11,255,231,0,160,0,18,255,234,0,160,0,26,255,247,0,160,0,32,255,229,0,160,0,35,255,240,0,160,0,36,255,237,0,160,0,37,255,240,0,160,0,38,255,240,0,160,0,39,255,240,0,160,0,40,255,237,0,160,0,41,255,240,0,160,0,42,255,240,0,160,0,43,255,240,0,160,0,44,255,240,0,160,0,45,255,240,0,160,0,46,255,248,0,160,0,47,255,240,0,160,0,48,255,237,0,160,0,49,255,240,0,160,0,50,255,237,0,160,0,51,255,240,0,160,0,52,255,250,0,160,0,53,255,173,0,160,0,54,255,227,0,160,0,55,255,193,0,160,0,56,255,210,0,160,0,58,255,165,0,160,0,61,255,210,0,160,0,62,255,227,0,160,0,71,255,251,0,160,0,85,255,246,0,160,0,87,255,238,0,160,0,88,255,243,0,160,0,90,255,236,0,160,0,94,255,231,0,160,0,110,255,248,0,160,0,134,255,237,0,160,0,135,255,240,0,160,0,136,255,240,0,160,0,137,255,240,0,160,0,138,255,240,0,160,0,139,255,240,0,160,0,140,255,240,0,160,0,141,255,240,0,160,0,142,255,240,0,160,0,143,255,240,0,160,0,144,255,240,0,160,0,145,255,237,0,160,0,146,255,237,0,160,0,147,255,237,0,160,0,148,255,237,0,160,0,149,255,237,0,160,0,151,255,237,0,160,0,152,255,227,0,160,0,153,255,227,0,160,0,154,255,227,0,160,0,155,255,227,0,160,0,156,255,165,0,160,0,157,255,240,0,160,0,158,255,249,0,160,0,188,255,236,0,160,0,190,255,236,0,160,0,194,255,237,0,160,0,196,255,250,0,160,0,198,255,165,0,160,0,209,255,186,0,160,0,210,255,183,0,160,0,212,255,186,0,160,0,213,255,183,0,160,0,240,255,230,0,161,0,3,255,234,0,161,0,7,255,245,0,161,0,8,255,234,0,161,0,10,255,246,0,161,0,11,255,231,0,161,0,18,255,234,0,161,0,26,255,247,0,161,0,32,255,229,0,161,0,35,255,240,0,161,0,36,255,237,0,161,0,37,255,240,0,161,0,38,255,240,0,161,0,39,255,240,0,161,0,40,255,237,0,161,0,41,255,240,0,161,0,42,255,240,0,161,0,43,255,240,0,161,0,44,255,240,0,161,0,45,255,240,0,161,0,46,255,248,0,161,0,47,255,240,0,161,0,48,255,237,0,161,0,49,255,240,0,161,0,50,255,237,0,161,0,51,255,240,0,161,0,52,255,250,0,161,0,53,255,173,0,161,0,54,255,227,0,161,0,55,255,193,0,161,0,56,255,210,0,161,0,58,255,165,0,161,0,61,255,210,0,161,0,62,255,246,0,161,0,71,255,251,0,161,0,85,255,246,0,161,0,87,255,238,0,161,0,88,255,243,0,161,0,90,255,236,0,161,0,94,255,248,0,161,0,110,255,248,0,161,0,134,255,237,0,161,0,135,255,240,0,161,0,136,255,240,0,161,0,137,255,240,0,161,0,138,255,240,0,161,0,139,255,240,0,161,0,140,255,240,0,161,0,141,255,240,0,161,0,142,255,240,0,161,0,143,255,240,0,161,0,144,255,240,0,161,0,145,255,237,0,161,0,146,255,237,0,161,0,147,255,237,0,161,0,148,255,237,0,161,0,149,255,237,0,161,0,151,255,237,0,161,0,152,255,227,0,161,0,153,255,227,0,161,0,154,255,227,0,161,0,155,255,227,0,161,0,156,255,165,0,161,0,157,255,240,0,161,0,158,255,249,0,161,0,188,255,236,0,161,0,190,255,236,0,161,0,194,255,237,0,161,0,196,255,250,0,161,0,198,255,165,0,161,0,209,255,186,0,161,0,210,255,183,0,161,0,212,255,186,0,161,0,213,255,183,0,161,0,240,255,230,0,162,0,3,255,234,0,162,0,7,255,245,0,162,0,8,255,234,0,162,0,10,255,246,0,162,0,11,255,231,0,162,0,18,255,234,0,162,0,26,255,247,0,162,0,32,255,229,0,162,0,35,255,240,0,162,0,36,255,237,0,162,0,37,255,240,0,162,0,38,255,240,0,162,0,39,255,240,0,162,0,40,255,237,0,162,0,41,255,240,0,162,0,42,255,240,0,162,0,43,255,240,0,162,0,44,255,240,0,162,0,45,255,240,0,162,0,46,255,248,0,162,0,47,255,240,0,162,0,48,255,237,0,162,0,49,255,240,0,162,0,50,255,237,0,162,0,51,255,240,0,162,0,52,255,250,0,162,0,53,255,173,0,162,0,54,255,227,0,162,0,55,255,193,0,162,0,56,255,210,0,162,0,58,255,165,0,162,0,61,255,220,0,162,0,62,255,227,0,162,0,71,255,251,0,162,0,85,255,246,0,162,0,87,255,238,0,162,0,88,255,243,0,162,0,90,255,236,0,162,0,94,255,248,0,162,0,110,255,248,0,162,0,134,255,237,0,162,0,135,255,240,0,162,0,136,255,240,0,162,0,137,255,240,0,162,0,138,255,240,0,162,0,139,255,240,0,162,0,140,255,240,0,162,0,141,255,240,0,162,0,142,255,240,0,162,0,143,255,240,0,162,0,144,255,240,0,162,0,145,255,237,0,162,0,146,255,237,0,162,0,147,255,237,0,162,0,148,255,237,0,162,0,149,255,237,0,162,0,151,255,237,0,162,0,152,255,227,0,162,0,153,255,227,0,162,0,154,255,227,0,162,0,155,255,227,0,162,0,156,255,165,0,162,0,157,255,240,0,162,0,158,255,249,0,162,0,188,255,236,0,162,0,190,255,236,0,162,0,194,255,237,0,162,0,196,255,250,0,162,0,198,255,165,0,162,0,209,255,186,0,162,0,210,255,195,0,162,0,212,255,186,0,162,0,213,255,195,0,162,0,240,255,230,0,163,0,3,255,234,0,163,0,7,255,245,0,163,0,8,255,234,0,163,0,10,255,246,0,163,0,11,255,231,0,163,0,18,255,234,0,163,0,26,255,247,0,163,0,32,255,229,0,163,0,35,255,240,0,163,0,36,255,237,0,163,0,37,255,240,0,163,0,38,255,240,0,163,0,39,255,240,0,163,0,40,255,237,0,163,0,41,255,240,0,163,0,42,255,240,0,163,0,43,255,240,0,163,0,44,255,240,0,163,0,45,255,240,0,163,0,46,255,248,0,163,0,47,255,240,0,163,0,48,255,237,0,163,0,49,255,240,0,163,0,50,255,237,0,163,0,51,255,240,0,163,0,52,255,250,0,163,0,53,255,173,0,163,0,54,255,227,0,163,0,55,255,193,0,163,0,56,255,210,0,163,0,58,255,165,0,163,0,61,255,210,0,163,0,62,255,245,0,163,0,71,255,251,0,163,0,85,255,246,0,163,0,87,255,238,0,163,0,88,255,243,0,163,0,90,255,236,0,163,0,94,255,248,0,163,0,110,255,248,0,163,0,134,255,237,0,163,0,135,255,240,0,163,0,136,255,240,0,163,0,137,255,240,0,163,0,138,255,240,0,163,0,139,255,240,0,163,0,140,255,240,0,163,0,141,255,240,0,163,0,142,255,240,0,163,0,143,255,240,0,163,0,144,255,240,0,163,0,145,255,237,0,163,0,146,255,237,0,163,0,147,255,237,0,163,0,148,255,237,0,163,0,149,255,237,0,163,0,151,255,237,0,163,0,152,255,227,0,163,0,153,255,227,0,163,0,154,255,227,0,163,0,155,255,227,0,163,0,156,255,165,0,163,0,157,255,240,0,163,0,158,255,249,0,163,0,188,255,236,0,163,0,190,255,236,0,163,0,194,255,237,0,163,0,196,255,250,0,163,0,198,255,165,0,163,0,209,255,186,0,163,0,210,255,183,0,163,0,212,255,186,0,163,0,213,255,183,0,163,0,240,255,230,0,164,0,3,255,234,0,164,0,7,255,245,0,164,0,8,255,234,0,164,0,10,255,246,0,164,0,11,255,231,0,164,0,18,255,234,0,164,0,26,255,247,0,164,0,32,255,229,0,164,0,35,255,240,0,164,0,36,255,237,0,164,0,37,255,240,0,164,0,38,255,240,0,164,0,39,255,240,0,164,0,40,255,237,0,164,0,41,255,240,0,164,0,42,255,240,0,164,0,43,255,240,0,164,0,44,255,240,0,164,0,45,255,240,0,164,0,46,255,248,0,164,0,47,255,240,0,164,0,48,255,237,0,164,0,49,255,240,0,164,0,50,255,237,0,164,0,51,255,240,0,164,0,52,255,250,0,164,0,53,255,173,0,164,0,54,255,227,0,164,0,55,255,193,0,164,0,56,255,210,0,164,0,58,255,165,0,164,0,61,255,210,0,164,0,62,255,227,0,164,0,71,255,251,0,164,0,85,255,246,0,164,0,87,255,238,0,164,0,88,255,243,0,164,0,90,255,236,0,164,0,94,255,231,0,164,0,110,255,248,0,164,0,134,255,237,0,164,0,135,255,240,0,164,0,136,255,240,0,164,0,137,255,240,0,164,0,138,255,240,0,164,0,139,255,240,0,164,0,140,255,240,0,164,0,141,255,240,0,164,0,142,255,240,0,164,0,143,255,240,0,164,0,144,255,240,0,164,0,145,255,237,0,164,0,146,255,237,0,164,0,147,255,237,0,164,0,148,255,237,0,164,0,149,255,237,0,164,0,151,255,237,0,164,0,152,255,227,0,164,0,153,255,227,0,164,0,154,255,227,0,164,0,155,255,227,0,164,0,156,255,165,0,164,0,157,255,240,0,164,0,158,255,249,0,164,0,188,255,236,0,164,0,190,255,236,0,164,0,194,255,237,0,164,0,196,255,250,0,164,0,198,255,165,0,164,0,209,255,186,0,164,0,210,255,183,0,164,0,212,255,186,0,164,0,213,255,183,0,164,0,240,255,230,0,165,0,3,255,241,0,165,0,7,255,246,0,165,0,8,255,241,0,165,0,10,255,230,0,165,0,11,255,238,0,165,0,18,255,235,0,165,0,19,255,245,0,165,0,24,255,230,0,165,0,32,255,223,0,165,0,34,255,251,0,165,0,35,255,241,0,165,0,36,255,250,0,165,0,37,255,241,0,165,0,38,255,241,0,165,0,39,255,241,0,165,0,40,255,250,0,165,0,41,255,241,0,165,0,42,255,241,0,165,0,43,255,241,0,165,0,44,255,241,0,165,0,45,255,241,0,165,0,46,255,243,0,165,0,47,255,241,0,165,0,48,255,250,0,165,0,49,255,241,0,165,0,50,255,250,0,165,0,51,255,241,0,165,0,52,255,241,0,165,0,53,255,187,0,165,0,54,255,240,0,165,0,55,255,209,0,165,0,56,255,213,0,165,0,57,255,243,0,165,0,58,255,174,0,165,0,59,255,243,0,165,0,61,255,220,0,165,0,62,255,220,0,165,0,87,255,252,0,165,0,89,255,251,0,165,0,90,255,251,0,165,0,94,255,227,0,165,0,127,255,251,0,165,0,128,255,251,0,165,0,129,255,251,0,165,0,130,255,251,0,165,0,131,255,251,0,165,0,132,255,251,0,165,0,134,255,250,0,165,0,135,255,241,0,165,0,136,255,241,0,165,0,137,255,241,0,165,0,138,255,241,0,165,0,139,255,241,0,165,0,140,255,241,0,165,0,141,255,241,0,165,0,142,255,241,0,165,0,143,255,241,0,165,0,144,255,241,0,165,0,145,255,250,0,165,0,146,255,250,0,165,0,147,255,250,0,165,0,148,255,250,0,165,0,149,255,250,0,165,0,151,255,250,0,165,0,152,255,240,0,165,0,153,255,240,0,165,0,154,255,240,0,165,0,155,255,240,0,165,0,156,255,174,0,165,0,157,255,241,0,165,0,188,255,251,0,165,0,190,255,251,0,165,0,194,255,250,0,165,0,196,255,241,0,165,0,198,255,174,0,165,0,199,255,243,0,165,0,209,255,189,0,165,0,210,255,186,0,165,0,212,255,189,0,165,0,213,255,186,0,165,0,240,255,237,0,166,0,7,255,240,0,166,0,10,255,244,0,166,0,14,255,219,0,166,0,21,255,231,0,166,0,24,255,245,0,166,0,32,255,228,0,166,0,35,255,247,0,166,0,36,255,244,0,166,0,37,255,247,0,166,0,38,255,247,0,166,0,39,255,247,0,166,0,40,255,244,0,166,0,41,255,247,0,166,0,42,255,247,0,166,0,43,255,247,0,166,0,44,255,247,0,166,0,45,255,247,0,166,0,46,255,251,0,166,0,47,255,247,0,166,0,48,255,244,0,166,0,49,255,247,0,166,0,50,255,244,0,166,0,51,255,247,0,166,0,52,255,244,0,166,0,53,255,190,0,166,0,54,255,243,0,166,0,55,255,236,0,166,0,56,255,241,0,166,0,58,255,218,0,166,0,61,255,240,0,166,0,62,255,232,0,166,0,68,255,249,0,166,0,69,255,249,0,166,0,70,255,249,0,166,0,80,255,249,0,166,0,82,255,249,0,166,0,94,255,239,0,166,0,107,255,243,0,166,0,134,255,244,0,166,0,135,255,247,0,166,0,136,255,247,0,166,0,137,255,247,0,166,0,138,255,247,0,166,0,139,255,247,0,166,0,140,255,247,0,166,0,141,255,247,0,166,0,142,255,247,0,166,0,143,255,247,0,166,0,144,255,247,0,166,0,145,255,244,0,166,0,146,255,244,0,166,0,147,255,244,0,166,0,148,255,244,0,166,0,149,255,244,0,166,0,151,255,244,0,166,0,152,255,243,0,166,0,153,255,243,0,166,0,154,255,243,0,166,0,155,255,243,0,166,0,156,255,218,0,166,0,157,255,247,0,166,0,166,255,249,0,166,0,167,255,249,0,166,0,168,255,249,0,166,0,169,255,249,0,166,0,170,255,249,0,166,0,175,255,251,0,166,0,177,255,249,0,166,0,178,255,249,0,166,0,179,255,249,0,166,0,180,255,249,0,166,0,181,255,249,0,166,0,183,255,249,0,166,0,194,255,244,0,166,0,195,255,249,0,166,0,196,255,244,0,166,0,198,255,218,0,166,0,207,255,219,0,166,0,208,255,219,0,166,0,209,255,216,0,166,0,210,255,213,0,166,0,212,255,216,0,166,0,213,255,213,0,166,0,220,255,243,0,166,0,240,255,245,0,167,0,3,255,241,0,167,0,7,255,246,0,167,0,8,255,241,0,167,0,10,255,230,0,167,0,11,255,238,0,167,0,18,255,235,0,167,0,19,255,245,0,167,0,24,255,230,0,167,0,32,255,223,0,167,0,34,255,251,0,167,0,35,255,241,0,167,0,36,255,250,0,167,0,37,255,241,0,167,0,38,255,241,0,167,0,39,255,241,0,167,0,40,255,250,0,167,0,41,255,241,0,167,0,42,255,241,0,167,0,43,255,241,0,167,0,44,255,241,0,167,0,45,255,241,0,167,0,46,255,243,0,167,0,47,255,241,0,167,0,48,255,250,0,167,0,49,255,241,0,167,0,50,255,250,0,167,0,51,255,241,0,167,0,52,255,241,0,167,0,53,255,187,0,167,0,54,255,240,0,167,0,55,255,209,0,167,0,56,255,213,0,167,0,57,255,243,0,167,0,58,255,174,0,167,0,59,255,243,0,167,0,61,255,220,0,167,0,62,255,220,0,167,0,87,255,252,0,167,0,89,255,251,0,167,0,90,255,251,0,167,0,94,255,227,0,167,0,127,255,251,0,167,0,128,255,251,0,167,0,129,255,251,0,167,0,130,255,251,0,167,0,131,255,251,0,167,0,132,255,251,0,167,0,134,255,250,0,167,0,135,255,241,0,167,0,136,255,241,0,167,0,137,255,241,0,167,0,138,255,241,0,167,0,139,255,241,0,167,0,140,255,241,0,167,0,141,255,241,0,167,0,142,255,241,0,167,0,143,255,241,0,167,0,144,255,241,0,167,0,145,255,250,0,167,0,146,255,250,0,167,0,147,255,250,0,167,0,148,255,250,0,167,0,149,255,250,0,167,0,151,255,250,0,167,0,152,255,240,0,167,0,153,255,240,0,167,0,154,255,240,0,167,0,155,255,240,0,167,0,156,255,174,0,167,0,157,255,241,0,167,0,188,255,251,0,167,0,190,255,251,0,167,0,194,255,250,0,167,0,196,255,241,0,167,0,198,255,174,0,167,0,199,255,243,0,167,0,209,255,189,0,167,0,210,255,186,0,167,0,212,255,189,0,167,0,213,255,186,0,167,0,240,255,237,0,168,0,3,255,241,0,168,0,7,255,246,0,168,0,8,255,241,0,168,0,10,255,230,0,168,0,11,255,238,0,168,0,18,255,235,0,168,0,19,255,245,0,168,0,24,255,230,0,168,0,32,255,223,0,168,0,34,255,251,0,168,0,35,255,241,0,168,0,36,255,250,0,168,0,37,255,241,0,168,0,38,255,241,0,168,0,39,255,241,0,168,0,40,255,250,0,168,0,41,255,241,0,168,0,42,255,241,0,168,0,43,255,241,0,168,0,44,255,241,0,168,0,45,255,241,0,168,0,46,255,243,0,168,0,47,255,241,0,168,0,48,255,250,0,168,0,49,255,241,0,168,0,50,255,250,0,168,0,51,255,241,0,168,0,52,255,241,0,168,0,53,255,187,0,168,0,54,255,240,0,168,0,55,255,209,0,168,0,56,255,213,0,168,0,57,255,243,0,168,0,58,255,174,0,168,0,59,255,243,0,168,0,61,255,220,0,168,0,62,255,220,0,168,0,87,255,252,0,168,0,89,255,251,0,168,0,90,255,251,0,168,0,94,255,227,0,168,0,127,255,251,0,168,0,128,255,251,0,168,0,129,255,251,0,168,0,130,255,251,0,168,0,131,255,251,0,168,0,132,255,251,0,168,0,134,255,250,0,168,0,135,255,241,0,168,0,136,255,241,0,168,0,137,255,241,0,168,0,138,255,241,0,168,0,139,255,241,0,168,0,140,255,241,0,168,0,141,255,241,0,168,0,142,255,241,0,168,0,143,255,241,0,168,0,144,255,241,0,168,0,145,255,250,0,168,0,146,255,250,0,168,0,147,255,250,0,168,0,148,255,250,0,168,0,149,255,250,0,168,0,151,255,250,0,168,0,152,255,240,0,168,0,153,255,240,0,168,0,154,255,240,0,168,0,155,255,240,0,168,0,156,255,174,0,168,0,157,255,241,0,168,0,188,255,251,0,168,0,190,255,251,0,168,0,194,255,250,0,168,0,196,255,241,0,168,0,198,255,174,0,168,0,199,255,243,0,168,0,209,255,189,0,168,0,210,255,186,0,168,0,212,255,189,0,168,0,213,255,186,0,168,0,240,255,237,0,169,0,3,255,241,0,169,0,7,255,246,0,169,0,8,255,241,0,169,0,10,255,230,0,169,0,11,255,238,0,169,0,18,255,235,0,169,0,19,255,245,0,169,0,24,255,230,0,169,0,32,255,223,0,169,0,34,255,251,0,169,0,35,255,241,0,169,0,36,255,250,0,169,0,37,255,241,0,169,0,38,255,241,0,169,0,39,255,241,0,169,0,40,255,250,0,169,0,41,255,241,0,169,0,42,255,241,0,169,0,43,255,241,0,169,0,44,255,241,0,169,0,45,255,241,0,169,0,46,255,243,0,169,0,47,255,241,0,169,0,48,255,250,0,169,0,49,255,241,0,169,0,50,255,250,0,169,0,51,255,241,0,169,0,52,255,241,0,169,0,53,255,187,0,169,0,54,255,240,0,169,0,55,255,209,0,169,0,56,255,213,0,169,0,57,255,243,0,169,0,58,255,174,0,169,0,59,255,243,0,169,0,61,255,220,0,169,0,62,255,220,0,169,0,87,255,252,0,169,0,89,255,251,0,169,0,90,255,251,0,169,0,94,255,227,0,169,0,127,255,251,0,169,0,128,255,251,0,169,0,129,255,251,0,169,0,130,255,251,0,169,0,131,255,251,0,169,0,132,255,251,0,169,0,134,255,250,0,169,0,135,255,241,0,169,0,136,255,241,0,169,0,137,255,241,0,169,0,138,255,241,0,169,0,139,255,241,0,169,0,140,255,241,0,169,0,141,255,241,0,169,0,142,255,241,0,169,0,143,255,241,0,169,0,144,255,241,0,169,0,145,255,250,0,169,0,146,255,250,0,169,0,147,255,250,0,169,0,148,255,250,0,169,0,149,255,250,0,169,0,151,255,250,0,169,0,152,255,240,0,169,0,153,255,240,0,169,0,154,255,240,0,169,0,155,255,240,0,169,0,156,255,174,0,169,0,157,255,241,0,169,0,188,255,251,0,169,0,190,255,251,0,169,0,194,255,250,0,169,0,196,255,241,0,169,0,198,255,174,0,169,0,199,255,243,0,169,0,209,255,189,0,169,0,210,255,186,0,169,0,212,255,189,0,169,0,213,255,186,0,169,0,240,255,237,0,170,0,3,255,241,0,170,0,7,255,246,0,170,0,8,255,241,0,170,0,10,255,230,0,170,0,11,255,238,0,170,0,18,255,235,0,170,0,19,255,245,0,170,0,24,255,230,0,170,0,32,255,223,0,170,0,34,255,251,0,170,0,35,255,241,0,170,0,36,255,250,0,170,0,37,255,241,0,170,0,38,255,241,0,170,0,39,255,241,0,170,0,40,255,250,0,170,0,41,255,241,0,170,0,42,255,241,0,170,0,43,255,241,0,170,0,44,255,241,0,170,0,45,255,241,0,170,0,46,255,243,0,170,0,47,255,241,0,170,0,48,255,250,0,170,0,49,255,241,0,170,0,50,255,250,0,170,0,51,255,241,0,170,0,52,255,241,0,170,0,53,255,187,0,170,0,54,255,240,0,170,0,55,255,209,0,170,0,56,255,213,0,170,0,57,255,243,0,170,0,58,255,174,0,170,0,59,255,243,0,170,0,61,255,220,0,170,0,62,255,220,0,170,0,87,255,252,0,170,0,89,255,251,0,170,0,90,255,251,0,170,0,94,255,227,0,170,0,127,255,251,0,170,0,128,255,251,0,170,0,129,255,251,0,170,0,130,255,251,0,170,0,131,255,251,0,170,0,132,255,251,0,170,0,134,255,250,0,170,0,135,255,241,0,170,0,136,255,241,0,170,0,137,255,241,0,170,0,138,255,241,0,170,0,139,255,241,0,170,0,140,255,241,0,170,0,141,255,241,0,170,0,142,255,241,0,170,0,143,255,241,0,170,0,144,255,241,0,170,0,145,255,250,0,170,0,146,255,250,0,170,0,147,255,250,0,170,0,148,255,250,0,170,0,149,255,250,0,170,0,151,255,250,0,170,0,152,255,240,0,170,0,153,255,240,0,170,0,154,255,240,0,170,0,155,255,240,0,170,0,156,255,174,0,170,0,157,255,241,0,170,0,188,255,251,0,170,0,190,255,251,0,170,0,194,255,250,0,170,0,196,255,241,0,170,0,198,255,174,0,170,0,199,255,243,0,170,0,209,255,189,0,170,0,210,255,186,0,170,0,212,255,189,0,170,0,213,255,186,0,170,0,240,255,237,0,171,0,7,255,244,0,171,0,11,0,30,0,171,0,34,255,248,0,171,0,35,255,242,0,171,0,36,255,244,0,171,0,37,255,242,0,171,0,38,255,242,0,171,0,39,255,242,0,171,0,40,255,244,0,171,0,41,255,242,0,171,0,42,255,242,0,171,0,43,255,242,0,171,0,44,255,242,0,171,0,45,255,242,0,171,0,46,255,241,0,171,0,47,255,242,0,171,0,48,255,244,0,171,0,49,255,242,0,171,0,50,255,244,0,171,0,51,255,242,0,171,0,52,255,244,0,171,0,53,255,242,0,171,0,54,255,238,0,171,0,55,255,247,0,171,0,56,255,246,0,171,0,58,255,247,0,171,0,59,255,245,0,171,0,127,255,248,0,171,0,128,255,248,0,171,0,129,255,248,0,171,0,130,255,248,0,171,0,131,255,248,0,171,0,132,255,248,0,171,0,134,255,244,0,171,0,135,255,242,0,171,0,136,255,242,0,171,0,137,255,242,0,171,0,138,255,242,0,171,0,139,255,242,0,171,0,140,255,242,0,171,0,141,255,242,0,171,0,142,255,242,0,171,0,143,255,242,0,171,0,144,255,242,0,171,0,145,255,244,0,171,0,146,255,244,0,171,0,147,255,244,0,171,0,148,255,244,0,171,0,149,255,244,0,171,0,151,255,244,0,171,0,152,255,238,0,171,0,153,255,238,0,171,0,154,255,238,0,171,0,155,255,238,0,171,0,156,255,247,0,171,0,157,255,242,0,171,0,194,255,244,0,171,0,196,255,244,0,171,0,198,255,247,0,171,0,199,255,245,0,171,0,240,0,28,0,172,0,7,255,244,0,172,0,11,0,18,0,172,0,34,255,248,0,172,0,35,255,242,0,172,0,36,255,244,0,172,0,37,255,242,0,172,0,38,255,242,0,172,0,39,255,242,0,172,0,40,255,244,0,172,0,41,255,242,0,172,0,42,255,242,0,172,0,43,255,242,0,172,0,44,255,242,0,172,0,45,255,242,0,172,0,46,255,241,0,172,0,47,255,242,0,172,0,48,255,244,0,172,0,49,255,242,0,172,0,50,255,244,0,172,0,51,255,242,0,172,0,52,255,244,0,172,0,53,255,242,0,172,0,54,255,238,0,172,0,55,255,247,0,172,0,56,255,246,0,172,0,58,255,247,0,172,0,59,255,245,0,172,0,62,0,9,0,172,0,94,0,14,0,172,0,127,255,248,0,172,0,128,255,248,0,172,0,129,255,248,0,172,0,130,255,248,0,172,0,131,255,248,0,172,0,132,255,248,0,172,0,134,255,244,0,172,0,135,255,242,0,172,0,136,255,242,0,172,0,137,255,242,0,172,0,138,255,242,0,172,0,139,255,242,0,172,0,140,255,242,0,172,0,141,255,242,0,172,0,142,255,242,0,172,0,143,255,242,0,172,0,144,255,242,0,172,0,145,255,244,0,172,0,146,255,244,0,172,0,147,255,244,0,172,0,148,255,244,0,172,0,149,255,244,0,172,0,151,255,244,0,172,0,152,255,238,0,172,0,153,255,238,0,172,0,154,255,238,0,172,0,155,255,238,0,172,0,156,255,247,0,172,0,157,255,242,0,172,0,194,255,244,0,172,0,196,255,244,0,172,0,198,255,247,0,172,0,199,255,245,0,172,0,240,0,18,0,173,0,3,0,29,0,173,0,7,255,244,0,173,0,8,0,29,0,173,0,11,0,76,0,173,0,32,0,39,0,173,0,34,255,248,0,173,0,35,255,242,0,173,0,36,255,244,0,173,0,37,255,242,0,173,0,38,255,242,0,173,0,39,255,242,0,173,0,40,255,244,0,173,0,41,255,242,0,173,0,42,255,242,0,173,0,43,255,242,0,173,0,44,255,242,0,173,0,45,255,242,0,173,0,46,255,241,0,173,0,47,255,242,0,173,0,48,255,244,0,173,0,49,255,242,0,173,0,50,255,244,0,173,0,51,255,242,0,173,0,52,255,244,0,173,0,53,255,242,0,173,0,54,255,238,0,173,0,55,255,247,0,173,0,56,255,246,0,173,0,58,255,247,0,173,0,59,255,245,0,173,0,61,0,13,0,173,0,62,0,44,0,173,0,94,0,33,0,173,0,127,255,248,0,173,0,128,255,248,0,173,0,129,255,248,0,173,0,130,255,248,0,173,0,131,255,248,0,173,0,132,255,248,0,173,0,134,255,244,0,173,0,135,255,242,0,173,0,136,255,242,0,173,0,137,255,242,0,173,0,138,255,242,0,173,0,139,255,242,0,173,0,140,255,242,0,173,0,141,255,242,0,173,0,142,255,242,0,173,0,143,255,242,0,173,0,144,255,242,0,173,0,145,255,244,0,173,0,146,255,244,0,173,0,147,255,244,0,173,0,148,255,244,0,173,0,149,255,244,0,173,0,151,255,244,0,173,0,152,255,238,0,173,0,153,255,238,0,173,0,154,255,238,0,173,0,155,255,238,0,173,0,156,255,247,0,173,0,157,255,242,0,173,0,194,255,244,0,173,0,196,255,244,0,173,0,198,255,247,0,173,0,199,255,245,0,173,0,209,0,37,0,173,0,210,0,24,0,173,0,212,0,37,0,173,0,213,0,24,0,173,0,240,0,81,0,174,0,7,255,244,0,174,0,11,0,43,0,174,0,32,0,27,0,174,0,34,255,248,0,174,0,35,255,242,0,174,0,36,255,244,0,174,0,37,255,242,0,174,0,38,255,242,0,174,0,39,255,242,0,174,0,40,255,244,0,174,0,41,255,242,0,174,0,42,255,242,0,174,0,43,255,242,0,174,0,44,255,242,0,174,0,45,255,242,0,174,0,46,255,241,0,174,0,47,255,242,0,174,0,48,255,244,0,174,0,49,255,242,0,174,0,50,255,244,0,174,0,51,255,242,0,174,0,52,255,244,0,174,0,53,255,242,0,174,0,54,255,238,0,174,0,55,255,247,0,174,0,56,255,246,0,174,0,58,255,247,0,174,0,59,255,245,0,174,0,61,0,14,0,174,0,62,0,39,0,174,0,94,0,44,0,174,0,127,255,248,0,174,0,128,255,248,0,174,0,129,255,248,0,174,0,130,255,248,0,174,0,131,255,248,0,174,0,132,255,248,0,174,0,134,255,244,0,174,0,135,255,242,0,174,0,136,255,242,0,174,0,137,255,242,0,174,0,138,255,242,0,174,0,139,255,242,0,174,0,140,255,242,0,174,0,141,255,242,0,174,0,142,255,242,0,174,0,143,255,242,0,174,0,144,255,242,0,174,0,145,255,244,0,174,0,146,255,244,0,174,0,147,255,244,0,174,0,148,255,244,0,174,0,149,255,244,0,174,0,151,255,244,0,174,0,152,255,238,0,174,0,153,255,238,0,174,0,154,255,238,0,174,0,155,255,238,0,174,0,156,255,247,0,174,0,157,255,242,0,174,0,194,255,244,0,174,0,196,255,244,0,174,0,198,255,247,0,174,0,199,255,245,0,174,0,240,0,48,0,175,0,3,255,245,0,175,0,7,255,247,0,175,0,8,255,245,0,175,0,10,255,232,0,175,0,11,255,240,0,175,0,13,255,247,0,175,0,15,255,247,0,175,0,32,255,242,0,175,0,61,255,246,0,175,0,62,255,240,0,175,0,89,255,248,0,175,0,94,255,243,0,175,0,209,255,236,0,175,0,210,255,237,0,175,0,211,255,247,0,175,0,212,255,236,0,175,0,213,255,237,0,175,0,214,255,247,0,175,0,218,255,247,0,175,0,240,255,241,0,176,0,2,255,248,0,176,0,3,255,238,0,176,0,7,255,245,0,176,0,8,255,238,0,176,0,10,255,232,0,176,0,11,255,235,0,176,0,18,255,231,0,176,0,24,255,233,0,176,0,32,255,224,0,176,0,34,255,250,0,176,0,35,255,238,0,176,0,36,255,243,0,176,0,37,255,238,0,176,0,38,255,238,0,176,0,39,255,238,0,176,0,40,255,243,0,176,0,41,255,238,0,176,0,42,255,238,0,176,0,43,255,238,0,176,0,44,255,238,0,176,0,45,255,238,0,176,0,46,255,241,0,176,0,47,255,238,0,176,0,48,255,243,0,176,0,49,255,238,0,176,0,50,255,243,0,176,0,51,255,238,0,176,0,52,255,241,0,176,0,53,255,162,0,176,0,54,255,231,0,176,0,55,255,198,0,176,0,56,255,214,0,176,0,57,255,249,0,176,0,58,255,163,0,176,0,59,255,245,0,176,0,61,255,214,0,176,0,62,255,216,0,176,0,71,255,251,0,176,0,85,255,248,0,176,0,87,255,243,0,176,0,88,255,248,0,176,0,90,255,242,0,176,0,94,255,225,0,176,0,127,255,250,0,176,0,128,255,250,0,176,0,129,255,250,0,176,0,130,255,250,0,176,0,131,255,250,0,176,0,132,255,250,0,176,0,134,255,243,0,176,0,135,255,238,0,176,0,136,255,238,0,176,0,137,255,238,0,176,0,138,255,238,0,176,0,139,255,238,0,176,0,140,255,238,0,176,0,141,255,238,0,176,0,142,255,238,0,176,0,143,255,238,0,176,0,144,255,238,0,176,0,145,255,243,0,176,0,146,255,243,0,176,0,147,255,243,0,176,0,148,255,243,0,176,0,149,255,243,0,176,0,151,255,243,0,176,0,152,255,231,0,176,0,153,255,231,0,176,0,154,255,231,0,176,0,155,255,231,0,176,0,156,255,163,0,176,0,157,255,238,0,176,0,158,255,248,0,176,0,188,255,242,0,176,0,190,255,242,0,176,0,194,255,243,0,176,0,196,255,241,0,176,0,198,255,163,0,176,0,199,255,245,0,176,0,209,255,187,0,176,0,210,255,184,0,176,0,212,255,187,0,176,0,213,255,184,0,176,0,240,255,235,0,177,0,3,255,236,0,177,0,7,255,246,0,177,0,8,255,236,0,177,0,10,255,224,0,177,0,11,255,234,0,177,0,18,255,230,0,177,0,19,255,229,0,177,0,24,255,223,0,177,0,32,255,222,0,177,0,34,255,240,0,177,0,35,255,237,0,177,0,36,255,246,0,177,0,37,255,237,0,177,0,38,255,237,0,177,0,39,255,237,0,177,0,40,255,246,0,177,0,41,255,237,0,177,0,42,255,237,0,177,0,43,255,237,0,177,0,44,255,237,0,177,0,45,255,237,0,177,0,46,255,239,0,177,0,47,255,237,0,177,0,48,255,246,0,177,0,49,255,237,0,177,0,50,255,246,0,177,0,51,255,237,0,177,0,52,255,238,0,177,0,53,255,173,0,177,0,54,255,238,0,177,0,55,255,192,0,177,0,56,255,212,0,177,0,57,255,218,0,177,0,58,255,167,0,177,0,59,255,227,0,177,0,61,255,214,0,177,0,62,255,213,0,177,0,71,255,251,0,177,0,85,255,249,0,177,0,87,255,247,0,177,0,88,255,251,0,177,0,89,255,237,0,177,0,90,255,245,0,177,0,91,255,246,0,177,0,94,255,222,0,177,0,122,255,247,0,177,0,127,255,240,0,177,0,128,255,240,0,177,0,129,255,240,0,177,0,130,255,240,0,177,0,131,255,240,0,177,0,132,255,240,0,177,0,134,255,246,0,177,0,135,255,237,0,177,0,136,255,237,0,177,0,137,255,237,0,177,0,138,255,237,0,177,0,139,255,237,0,177,0,140,255,237,0,177,0,141,255,237,0,177,0,142,255,237,0,177,0,143,255,237,0,177,0,144,255,237,0,177,0,145,255,246,0,177,0,146,255,246,0,177,0,147,255,246,0,177,0,148,255,246,0,177,0,149,255,246,0,177,0,151,255,246,0,177,0,152,255,238,0,177,0,153,255,238,0,177,0,154,255,238,0,177,0,155,255,238,0,177,0,156,255,167,0,177,0,157,255,237,0,177,0,158,255,248,0,177,0,188,255,245,0,177,0,190,255,245,0,177,0,194,255,246,0,177,0,196,255,238,0,177,0,198,255,167,0,177,0,199,255,227,0,177,0,200,255,246,0,177,0,209,255,182,0,177,0,210,255,179,0,177,0,212,255,182,0,177,0,213,255,179,0,177,0,221,255,247,0,177,0,240,255,236,0,178,0,3,255,236,0,178,0,7,255,246,0,178,0,8,255,236,0,178,0,10,255,224,0,178,0,11,255,234,0,178,0,18,255,230,0,178,0,19,255,229,0,178,0,24,255,223,0,178,0,32,255,222,0,178,0,34,255,240,0,178,0,35,255,237,0,178,0,36,255,246,0,178,0,37,255,237,0,178,0,38,255,237,0,178,0,39,255,237,0,178,0,40,255,246,0,178,0,41,255,237,0,178,0,42,255,237,0,178,0,43,255,237,0,178,0,44,255,237,0,178,0,45,255,237,0,178,0,46,255,239,0,178,0,47,255,237,0,178,0,48,255,246,0,178,0,49,255,237,0,178,0,50,255,246,0,178,0,51,255,237,0,178,0,52,255,238,0,178,0,53,255,173,0,178,0,54,255,238,0,178,0,55,255,192,0,178,0,56,255,212,0,178,0,57,255,218,0,178,0,58,255,167,0,178,0,59,255,227,0,178,0,61,255,214,0,178,0,62,255,213,0,178,0,71,255,251,0,178,0,85,255,249,0,178,0,87,255,247,0,178,0,88,255,251,0,178,0,89,255,237,0,178,0,90,255,245,0,178,0,91,255,246,0,178,0,94,255,222,0,178,0,122,255,247,0,178,0,127,255,240,0,178,0,128,255,240,0,178,0,129,255,240,0,178,0,130,255,240,0,178,0,131,255,240,0,178,0,132,255,240,0,178,0,134,255,246,0,178,0,135,255,237,0,178,0,136,255,237,0,178,0,137,255,237,0,178,0,138,255,237,0,178,0,139,255,237,0,178,0,140,255,237,0,178,0,141,255,237,0,178,0,142,255,237,0,178,0,143,255,237,0,178,0,144,255,237,0,178,0,145,255,246,0,178,0,146,255,246,0,178,0,147,255,246,0,178,0,148,255,246,0,178,0,149,255,246,0,178,0,151,255,246,0,178,0,152,255,238,0,178,0,153,255,238,0,178,0,154,255,238,0,178,0,155,255,238,0,178,0,156,255,167,0,178,0,157,255,237,0,178,0,158,255,248,0,178,0,188,255,245,0,178,0,190,255,245,0,178,0,194,255,246,0,178,0,196,255,238,0,178,0,198,255,167,0,178,0,199,255,227,0,178,0,200,255,246,0,178,0,209,255,182,0,178,0,210,255,179,0,178,0,212,255,182,0,178,0,213,255,179,0,178,0,221,255,247,0,178,0,240,255,236,0,179,0,3,255,236,0,179,0,7,255,246,0,179,0,8,255,236,0,179,0,10,255,224,0,179,0,11,255,234,0,179,0,18,255,230,0,179,0,19,255,229,0,179,0,24,255,223,0,179,0,32,255,222,0,179,0,34,255,240,0,179,0,35,255,237,0,179,0,36,255,246,0,179,0,37,255,237,0,179,0,38,255,237,0,179,0,39,255,237,0,179,0,40,255,246,0,179,0,41,255,237,0,179,0,42,255,237,0,179,0,43,255,237,0,179,0,44,255,237,0,179,0,45,255,237,0,179,0,46,255,239,0,179,0,47,255,237,0,179,0,48,255,246,0,179,0,49,255,237,0,179,0,50,255,246,0,179,0,51,255,237,0,179,0,52,255,238,0,179,0,53,255,173,0,179,0,54,255,238,0,179,0,55,255,192,0,179,0,56,255,212,0,179,0,57,255,218,0,179,0,58,255,167,0,179,0,59,255,227,0,179,0,61,255,214,0,179,0,62,255,213,0,179,0,71,255,251,0,179,0,85,255,249,0,179,0,87,255,247,0,179,0,88,255,251,0,179,0,89,255,237,0,179,0,90,255,245,0,179,0,91,255,246,0,179,0,94,255,222,0,179,0,122,255,247,0,179,0,127,255,240,0,179,0,128,255,240,0,179,0,129,255,240,0,179,0,130,255,240,0,179,0,131,255,240,0,179,0,132,255,240,0,179,0,134,255,246,0,179,0,135,255,237,0,179,0,136,255,237,0,179,0,137,255,237,0,179,0,138,255,237,0,179,0,139,255,237,0,179,0,140,255,237,0,179,0,141,255,237,0,179,0,142,255,237,0,179,0,143,255,237,0,179,0,144,255,237,0,179,0,145,255,246,0,179,0,146,255,246,0,179,0,147,255,246,0,179,0,148,255,246,0,179,0,149,255,246,0,179,0,151,255,246,0,179,0,152,255,238,0,179,0,153,255,238,0,179,0,154,255,238,0,179,0,155,255,238,0,179,0,156,255,167,0,179,0,157,255,237,0,179,0,158,255,248,0,179,0,188,255,245,0,179,0,190,255,245,0,179,0,194,255,246,0,179,0,196,255,238,0,179,0,198,255,167,0,179,0,199,255,227,0,179,0,200,255,246,0,179,0,209,255,182,0,179,0,210,255,179,0,179,0,212,255,182,0,179,0,213,255,179,0,179,0,221,255,247,0,179,0,240,255,236,0,180,0,3,255,236,0,180,0,7,255,246,0,180,0,8,255,236,0,180,0,10,255,224,0,180,0,11,255,234,0,180,0,18,255,230,0,180,0,19,255,229,0,180,0,24,255,223,0,180,0,32,255,222,0,180,0,34,255,240,0,180,0,35,255,237,0,180,0,36,255,246,0,180,0,37,255,237,0,180,0,38,255,237,0,180,0,39,255,237,0,180,0,40,255,246,0,180,0,41,255,237,0,180,0,42,255,237,0,180,0,43,255,237,0,180,0,44,255,237,0,180,0,45,255,237,0,180,0,46,255,239,0,180,0,47,255,237,0,180,0,48,255,246,0,180,0,49,255,237,0,180,0,50,255,246,0,180,0,51,255,237,0,180,0,52,255,238,0,180,0,53,255,173,0,180,0,54,255,238,0,180,0,55,255,192,0,180,0,56,255,212,0,180,0,57,255,218,0,180,0,58,255,167,0,180,0,59,255,227,0,180,0,61,255,214,0,180,0,62,255,213,0,180,0,71,255,251,0,180,0,85,255,249,0,180,0,87,255,247,0,180,0,88,255,251,0,180,0,89,255,237,0,180,0,90,255,245,0,180,0,91,255,246,0,180,0,94,255,222,0,180,0,122,255,247,0,180,0,127,255,240,0,180,0,128,255,240,0,180,0,129,255,240,0,180,0,130,255,240,0,180,0,131,255,240,0,180,0,132,255,240,0,180,0,134,255,246,0,180,0,135,255,237,0,180,0,136,255,237,0,180,0,137,255,237,0,180,0,138,255,237,0,180,0,139,255,237,0,180,0,140,255,237,0,180,0,141,255,237,0,180,0,142,255,237,0,180,0,143,255,237,0,180,0,144,255,237,0,180,0,145,255,246,0,180,0,146,255,246,0,180,0,147,255,246,0,180,0,148,255,246,0,180,0,149,255,246,0,180,0,151,255,246,0,180,0,152,255,238,0,180,0,153,255,238,0,180,0,154,255,238,0,180,0,155,255,238,0,180,0,156,255,167,0,180,0,157,255,237,0,180,0,158,255,248,0,180,0,188,255,245,0,180,0,190,255,245,0,180,0,194,255,246,0,180,0,196,255,238,0,180,0,198,255,167,0,180,0,199,255,227,0,180,0,200,255,246,0,180,0,209,255,182,0,180,0,210,255,179,0,180,0,212,255,182,0,180,0,213,255,179,0,180,0,221,255,247,0,180,0,240,255,236,0,181,0,3,255,236,0,181,0,7,255,246,0,181,0,8,255,236,0,181,0,10,255,224,0,181,0,11,255,234,0,181,0,18,255,230,0,181,0,19,255,229,0,181,0,24,255,223,0,181,0,32,255,222,0,181,0,34,255,240,0,181,0,35,255,237,0,181,0,36,255,246,0,181,0,37,255,237,0,181,0,38,255,237,0,181,0,39,255,237,0,181,0,40,255,246,0,181,0,41,255,237,0,181,0,42,255,237,0,181,0,43,255,237,0,181,0,44,255,237,0,181,0,45,255,237,0,181,0,46,255,239,0,181,0,47,255,237,0,181,0,48,255,246,0,181,0,49,255,237,0,181,0,50,255,246,0,181,0,51,255,237,0,181,0,52,255,238,0,181,0,53,255,173,0,181,0,54,255,238,0,181,0,55,255,192,0,181,0,56,255,212,0,181,0,57,255,218,0,181,0,58,255,167,0,181,0,59,255,227,0,181,0,61,255,214,0,181,0,62,255,213,0,181,0,71,255,251,0,181,0,85,255,249,0,181,0,87,255,247,0,181,0,88,255,251,0,181,0,89,255,237,0,181,0,90,255,245,0,181,0,91,255,246,0,181,0,94,255,222,0,181,0,122,255,247,0,181,0,127,255,240,0,181,0,128,255,240,0,181,0,129,255,240,0,181,0,130,255,240,0,181,0,131,255,240,0,181,0,132,255,240,0,181,0,134,255,246,0,181,0,135,255,237,0,181,0,136,255,237,0,181,0,137,255,237,0,181,0,138,255,237,0,181,0,139,255,237,0,181,0,140,255,237,0,181,0,141,255,237,0,181,0,142,255,237,0,181,0,143,255,237,0,181,0,144,255,237,0,181,0,145,255,246,0,181,0,146,255,246,0,181,0,147,255,246,0,181,0,148,255,246,0,181,0,149,255,246,0,181,0,151,255,246,0,181,0,152,255,238,0,181,0,153,255,238,0,181,0,154,255,238,0,181,0,155,255,238,0,181,0,156,255,167,0,181,0,157,255,237,0,181,0,158,255,248,0,181,0,188,255,245,0,181,0,190,255,245,0,181,0,194,255,246,0,181,0,196,255,238,0,181,0,198,255,167,0,181,0,199,255,227,0,181,0,200,255,246,0,181,0,209,255,182,0,181,0,210,255,179,0,181,0,212,255,182,0,181,0,213,255,179,0,181,0,221,255,247,0,181,0,240,255,236,0,183,0,3,255,236,0,183,0,7,255,246,0,183,0,8,255,236,0,183,0,10,255,224,0,183,0,11,255,234,0,183,0,18,255,230,0,183,0,19,255,229,0,183,0,24,255,223,0,183,0,32,255,222,0,183,0,34,255,240,0,183,0,35,255,237,0,183,0,36,255,246,0,183,0,37,255,237,0,183,0,38,255,237,0,183,0,39,255,237,0,183,0,40,255,246,0,183,0,41,255,237,0,183,0,42,255,237,0,183,0,43,255,237,0,183,0,44,255,237,0,183,0,45,255,237,0,183,0,46,255,239,0,183,0,47,255,237,0,183,0,48,255,246,0,183,0,49,255,237,0,183,0,50,255,246,0,183,0,51,255,237,0,183,0,52,255,238,0,183,0,53,255,173,0,183,0,54,255,238,0,183,0,55,255,192,0,183,0,56,255,212,0,183,0,57,255,218,0,183,0,58,255,167,0,183,0,59,255,227,0,183,0,61,255,214,0,183,0,62,255,213,0,183,0,71,255,251,0,183,0,85,255,249,0,183,0,87,255,247,0,183,0,88,255,251,0,183,0,89,255,237,0,183,0,90,255,245,0,183,0,91,255,246,0,183,0,94,255,222,0,183,0,122,255,247,0,183,0,127,255,240,0,183,0,128,255,240,0,183,0,129,255,240,0,183,0,130,255,240,0,183,0,131,255,240,0,183,0,132,255,240,0,183,0,134,255,246,0,183,0,135,255,237,0,183,0,136,255,237,0,183,0,137,255,237,0,183,0,138,255,237,0,183,0,139,255,237,0,183,0,140,255,237,0,183,0,141,255,237,0,183,0,142,255,237,0,183,0,143,255,237,0,183,0,144,255,237,0,183,0,145,255,246,0,183,0,146,255,246,0,183,0,147,255,246,0,183,0,148,255,246,0,183,0,149,255,246,0,183,0,151,255,246,0,183,0,152,255,238,0,183,0,153,255,238,0,183,0,154,255,238,0,183,0,155,255,238,0,183,0,156,255,167,0,183,0,157,255,237,0,183,0,158,255,248,0,183,0,188,255,245,0,183,0,190,255,245,0,183,0,194,255,246,0,183,0,196,255,238,0,183,0,198,255,167,0,183,0,199,255,227,0,183,0,200,255,246,0,183,0,209,255,182,0,183,0,210,255,179,0,183,0,212,255,182,0,183,0,213,255,179,0,183,0,221,255,247,0,183,0,240,255,236,0,184,0,7,255,244,0,184,0,10,255,233,0,184,0,11,255,244,0,184,0,24,255,232,0,184,0,32,255,223,0,184,0,34,255,248,0,184,0,35,255,242,0,184,0,36,255,244,0,184,0,37,255,242,0,184,0,38,255,242,0,184,0,39,255,242,0,184,0,40,255,244,0,184,0,41,255,242,0,184,0,42,255,242,0,184,0,43,255,242,0,184,0,44,255,242,0,184,0,45,255,242,0,184,0,46,255,241,0,184,0,47,255,242,0,184,0,48,255,244,0,184,0,49,255,242,0,184,0,50,255,244,0,184,0,51,255,242,0,184,0,52,255,243,0,184,0,53,255,164,0,184,0,54,255,235,0,184,0,55,255,216,0,184,0,56,255,218,0,184,0,57,255,246,0,184,0,58,255,183,0,184,0,59,255,242,0,184,0,61,255,228,0,184,0,62,255,215,0,184,0,94,255,226,0,184,0,127,255,248,0,184,0,128,255,248,0,184,0,129,255,248,0,184,0,130,255,248,0,184,0,131,255,248,0,184,0,132,255,248,0,184,0,134,255,244,0,184,0,135,255,242,0,184,0,136,255,242,0,184,0,137,255,242,0,184,0,138,255,242,0,184,0,139,255,242,0,184,0,140,255,242,0,184,0,141,255,242,0,184,0,142,255,242,0,184,0,143,255,242,0,184,0,144,255,242,0,184,0,145,255,244,0,184,0,146,255,244,0,184,0,147,255,244,0,184,0,148,255,244,0,184,0,149,255,244,0,184,0,151,255,244,0,184,0,152,255,235,0,184,0,153,255,235,0,184,0,154,255,235,0,184,0,155,255,235,0,184,0,156,255,183,0,184,0,157,255,242,0,184,0,194,255,244,0,184,0,196,255,243,0,184,0,198,255,183,0,184,0,199,255,242,0,184,0,209,255,211,0,184,0,210,255,209,0,184,0,212,255,211,0,184,0,213,255,209,0,184,0,240,255,239,0,185,0,7,255,244,0,185,0,10,255,233,0,185,0,11,255,244,0,185,0,24,255,232,0,185,0,32,255,223,0,185,0,34,255,248,0,185,0,35,255,242,0,185,0,36,255,244,0,185,0,37,255,242,0,185,0,38,255,242,0,185,0,39,255,242,0,185,0,40,255,244,0,185,0,41,255,242,0,185,0,42,255,242,0,185,0,43,255,242,0,185,0,44,255,242,0,185,0,45,255,242,0,185,0,46,255,241,0,185,0,47,255,242,0,185,0,48,255,244,0,185,0,49,255,242,0,185,0,50,255,244,0,185,0,51,255,242,0,185,0,52,255,243,0,185,0,53,255,164,0,185,0,54,255,235,0,185,0,55,255,216,0,185,0,56,255,218,0,185,0,57,255,246,0,185,0,58,255,183,0,185,0,59,255,242,0,185,0,61,255,228,0,185,0,62,255,215,0,185,0,94,255,226,0,185,0,127,255,248,0,185,0,128,255,248,0,185,0,129,255,248,0,185,0,130,255,248,0,185,0,131,255,248,0,185,0,132,255,248,0,185,0,134,255,244,0,185,0,135,255,242,0,185,0,136,255,242,0,185,0,137,255,242,0,185,0,138,255,242,0,185,0,139,255,242,0,185,0,140,255,242,0,185,0,141,255,242,0,185,0,142,255,242,0,185,0,143,255,242,0,185,0,144,255,242,0,185,0,145,255,244,0,185,0,146,255,244,0,185,0,147,255,244,0,185,0,148,255,244,0,185,0,149,255,244,0,185,0,151,255,244,0,185,0,152,255,235,0,185,0,153,255,235,0,185,0,154,255,235,0,185,0,155,255,235,0,185,0,156,255,183,0,185,0,157,255,242,0,185,0,194,255,244,0,185,0,196,255,243,0,185,0,198,255,183,0,185,0,199,255,242,0,185,0,209,255,211,0,185,0,210,255,209,0,185,0,212,255,211,0,185,0,213,255,209,0,185,0,240,255,239,0,186,0,7,255,244,0,186,0,10,255,233,0,186,0,11,255,244,0,186,0,24,255,232,0,186,0,32,255,223,0,186,0,34,255,248,0,186,0,35,255,242,0,186,0,36,255,244,0,186,0,37,255,242,0,186,0,38,255,242,0,186,0,39,255,242,0,186,0,40,255,244,0,186,0,41,255,242,0,186,0,42,255,242,0,186,0,43,255,242,0,186,0,44,255,242,0,186,0,45,255,242,0,186,0,46,255,241,0,186,0,47,255,242,0,186,0,48,255,244,0,186,0,49,255,242,0,186,0,50,255,244,0,186,0,51,255,242,0,186,0,52,255,243,0,186,0,53,255,164,0,186,0,54,255,235,0,186,0,55,255,216,0,186,0,56,255,218,0,186,0,57,255,246,0,186,0,58,255,183,0,186,0,59,255,242,0,186,0,61,255,228,0,186,0,62,255,215,0,186,0,94,255,226,0,186,0,127,255,248,0,186,0,128,255,248,0,186,0,129,255,248,0,186,0,130,255,248,0,186,0,131,255,248,0,186,0,132,255,248,0,186,0,134,255,244,0,186,0,135,255,242,0,186,0,136,255,242,0,186,0,137,255,242,0,186,0,138,255,242,0,186,0,139,255,242,0,186,0,140,255,242,0,186,0,141,255,242,0,186,0,142,255,242,0,186,0,143,255,242,0,186,0,144,255,242,0,186,0,145,255,244,0,186,0,146,255,244,0,186,0,147,255,244,0,186,0,148,255,244,0,186,0,149,255,244,0,186,0,151,255,244,0,186,0,152,255,235,0,186,0,153,255,235,0,186,0,154,255,235,0,186,0,155,255,235,0,186,0,156,255,183,0,186,0,157,255,242,0,186,0,194,255,244,0,186,0,196,255,243,0,186,0,198,255,183,0,186,0,199,255,242,0,186,0,209,255,211,0,186,0,210,255,209,0,186,0,212,255,211,0,186,0,213,255,209,0,186,0,240,255,239,0,187,0,7,255,244,0,187,0,10,255,233,0,187,0,11,255,244,0,187,0,24,255,232,0,187,0,32,255,223,0,187,0,34,255,248,0,187,0,35,255,242,0,187,0,36,255,244,0,187,0,37,255,242,0,187,0,38,255,242,0,187,0,39,255,242,0,187,0,40,255,244,0,187,0,41,255,242,0,187,0,42,255,242,0,187,0,43,255,242,0,187,0,44,255,242,0,187,0,45,255,242,0,187,0,46,255,241,0,187,0,47,255,242,0,187,0,48,255,244,0,187,0,49,255,242,0,187,0,50,255,244,0,187,0,51,255,242,0,187,0,52,255,243,0,187,0,53,255,164,0,187,0,54,255,235,0,187,0,55,255,216,0,187,0,56,255,218,0,187,0,57,255,246,0,187,0,58,255,183,0,187,0,59,255,242,0,187,0,61,255,228,0,187,0,62,255,215,0,187,0,94,255,226,0,187,0,127,255,248,0,187,0,128,255,248,0,187,0,129,255,248,0,187,0,130,255,248,0,187,0,131,255,248,0,187,0,132,255,248,0,187,0,134,255,244,0,187,0,135,255,242,0,187,0,136,255,242,0,187,0,137,255,242,0,187,0,138,255,242,0,187,0,139,255,242,0,187,0,140,255,242,0,187,0,141,255,242,0,187,0,142,255,242,0,187,0,143,255,242,0,187,0,144,255,242,0,187,0,145,255,244,0,187,0,146,255,244,0,187,0,147,255,244,0,187,0,148,255,244,0,187,0,149,255,244,0,187,0,151,255,244,0,187,0,152,255,235,0,187,0,153,255,235,0,187,0,154,255,235,0,187,0,155,255,235,0,187,0,156,255,183,0,187,0,157,255,242,0,187,0,194,255,244,0,187,0,196,255,243,0,187,0,198,255,183,0,187,0,199,255,242,0,187,0,209,255,211,0,187,0,210,255,209,0,187,0,212,255,211,0,187,0,213,255,209,0,187,0,240,255,239,0,188,0,7,255,238,0,188,0,10,255,231,0,188,0,13,255,225,0,188,0,15,255,225,0,188,0,16,255,220,0,188,0,19,255,227,0,188,0,20,255,230,0,188,0,24,255,198,0,188,0,32,255,205,0,188,0,33,255,238,0,188,0,34,255,214,0,188,0,35,255,243,0,188,0,37,255,243,0,188,0,38,255,243,0,188,0,39,255,243,0,188,0,41,255,243,0,188,0,42,255,243,0,188,0,43,255,243,0,188,0,44,255,243,0,188,0,45,255,243,0,188,0,46,255,229,0,188,0,47,255,243,0,188,0,49,255,243,0,188,0,51,255,243,0,188,0,53,255,168,0,188,0,54,255,245,0,188,0,55,255,238,0,188,0,56,255,242,0,188,0,57,255,208,0,188,0,58,255,211,0,188,0,59,255,225,0,188,0,62,255,214,0,188,0,66,255,250,0,188,0,68,255,246,0,188,0,69,255,246,0,188,0,70,255,246,0,188,0,72,255,250,0,188,0,80,255,246,0,188,0,82,255,246,0,188,0,84,255,252,0,188,0,94,255,227,0,188,0,127,255,214,0,188,0,128,255,214,0,188,0,129,255,214,0,188,0,130,255,214,0,188,0,131,255,214,0,188,0,132,255,214,0,188,0,135,255,243,0,188,0,136,255,243,0,188,0,137,255,243,0,188,0,138,255,243,0,188,0,139,255,243,0,188,0,140,255,243,0,188,0,141,255,243,0,188,0,142,255,243,0,188,0,143,255,243,0,188,0,144,255,243,0,188,0,152,255,245,0,188,0,153,255,245,0,188,0,154,255,245,0,188,0,155,255,245,0,188,0,156,255,211,0,188,0,157,255,243,0,188,0,159,255,250,0,188,0,160,255,250,0,188,0,161,255,250,0,188,0,162,255,250,0,188,0,163,255,250,0,188,0,164,255,250,0,188,0,165,255,250,0,188,0,166,255,246,0,188,0,167,255,246,0,188,0,168,255,246,0,188,0,169,255,246,0,188,0,170,255,246,0,188,0,175,255,236,0,188,0,177,255,246,0,188,0,178,255,246,0,188,0,179,255,246,0,188,0,180,255,246,0,188,0,181,255,246,0,188,0,183,255,246,0,188,0,195,255,246,0,188,0,197,255,252,0,188,0,198,255,211,0,188,0,199,255,225,0,188,0,209,255,227,0,188,0,210,255,225,0,188,0,211,255,225,0,188,0,212,255,227,0,188,0,213,255,225,0,188,0,214,255,225,0,188,0,218,255,225,0,189,0,3,255,234,0,189,0,7,255,246,0,189,0,8,255,234,0,189,0,10,255,227,0,189,0,11,255,232,0,189,0,13,255,246,0,189,0,15,255,247,0,189,0,18,255,235,0,189,0,19,255,232,0,189,0,24,255,226,0,189,0,32,255,224,0,189,0,34,255,240,0,189,0,35,255,237,0,189,0,36,255,246,0,189,0,37,255,237,0,189,0,38,255,237,0,189,0,39,255,237,0,189,0,40,255,246,0,189,0,41,255,237,0,189,0,42,255,237,0,189,0,43,255,237,0,189,0,44,255,237,0,189,0,45,255,237,0,189,0,46,255,239,0,189,0,47,255,237,0,189,0,48,255,246,0,189,0,49,255,237,0,189,0,50,255,246,0,189,0,51,255,237,0,189,0,52,255,237,0,189,0,53,255,171,0,189,0,54,255,238,0,189,0,55,255,193,0,189,0,56,255,212,0,189,0,57,255,217,0,189,0,58,255,167,0,189,0,59,255,227,0,189,0,61,255,217,0,189,0,62,255,217,0,189,0,71,255,251,0,189,0,85,255,250,0,189,0,87,255,247,0,189,0,88,255,251,0,189,0,89,255,238,0,189,0,90,255,245,0,189,0,91,255,246,0,189,0,94,255,226,0,189,0,122,255,247,0,189,0,127,255,240,0,189,0,128,255,240,0,189,0,129,255,240,0,189,0,130,255,240,0,189,0,131,255,240,0,189,0,132,255,240,0,189,0,134,255,246,0,189,0,135,255,237,0,189,0,136,255,237,0,189,0,137,255,237,0,189,0,138,255,237,0,189,0,139,255,237,0,189,0,140,255,237,0,189,0,141,255,237,0,189,0,142,255,237,0,189,0,143,255,237,0,189,0,144,255,237,0,189,0,145,255,246,0,189,0,146,255,246,0,189,0,147,255,246,0,189,0,148,255,246,0,189,0,149,255,246,0,189,0,151,255,246,0,189,0,152,255,238,0,189,0,153,255,238,0,189,0,154,255,238,0,189,0,155,255,238,0,189,0,156,255,167,0,189,0,157,255,237,0,189,0,158,255,248,0,189,0,188,255,245,0,189,0,190,255,245,0,189,0,194,255,246,0,189,0,196,255,237,0,189,0,198,255,167,0,189,0,199,255,227,0,189,0,200,255,246,0,189,0,209,255,181,0,189,0,210,255,178,0,189,0,211,255,246,0,189,0,212,255,181,0,189,0,213,255,178,0,189,0,214,255,246,0,189,0,218,255,247,0,189,0,221,255,247,0,189,0,240,255,234,0,190,0,7,255,238,0,190,0,10,255,231,0,190,0,13,255,225,0,190,0,15,255,225,0,190,0,16,255,220,0,190,0,19,255,227,0,190,0,20,255,230,0,190,0,24,255,198,0,190,0,32,255,205,0,190,0,33,255,238,0,190,0,34,255,214,0,190,0,35,255,243,0,190,0,37,255,243,0,190,0,38,255,243,0,190,0,39,255,243,0,190,0,41,255,243,0,190,0,42,255,243,0,190,0,43,255,243,0,190,0,44,255,243,0,190,0,45,255,243,0,190,0,46,255,229,0,190,0,47,255,243,0,190,0,49,255,243,0,190,0,51,255,243,0,190,0,53,255,168,0,190,0,54,255,245,0,190,0,55,255,238,0,190,0,56,255,242,0,190,0,57,255,208,0,190,0,58,255,211,0,190,0,59,255,225,0,190,0,62,255,214,0,190,0,66,255,250,0,190,0,68,255,246,0,190,0,69,255,246,0,190,0,70,255,246,0,190,0,72,255,250,0,190,0,80,255,246,0,190,0,82,255,246,0,190,0,84,255,252,0,190,0,94,255,227,0,190,0,127,255,214,0,190,0,128,255,214,0,190,0,129,255,214,0,190,0,130,255,214,0,190,0,131,255,214,0,190,0,132,255,214,0,190,0,135,255,243,0,190,0,136,255,243,0,190,0,137,255,243,0,190,0,138,255,243,0,190,0,139,255,243,0,190,0,140,255,243,0,190,0,141,255,243,0,190,0,142,255,243,0,190,0,143,255,243,0,190,0,144,255,243,0,190,0,152,255,245,0,190,0,153,255,245,0,190,0,154,255,245,0,190,0,155,255,245,0,190,0,156,255,211,0,190,0,157,255,243,0,190,0,159,255,250,0,190,0,160,255,250,0,190,0,161,255,250,0,190,0,162,255,250,0,190,0,163,255,250,0,190,0,164,255,250,0,190,0,165,255,250,0,190,0,166,255,246,0,190,0,167,255,246,0,190,0,168,255,246,0,190,0,169,255,246,0,190,0,170,255,246,0,190,0,175,255,236,0,190,0,177,255,246,0,190,0,178,255,246,0,190,0,179,255,246,0,190,0,180,255,246,0,190,0,181,255,246,0,190,0,183,255,246,0,190,0,195,255,246,0,190,0,197,255,252,0,190,0,198,255,211,0,190,0,199,255,225,0,190,0,209,255,227,0,190,0,210,255,225,0,190,0,211,255,225,0,190,0,212,255,227,0,190,0,213,255,225,0,190,0,214,255,225,0,190,0,218,255,225,0,193,0,7,255,244,0,193,0,34,255,248,0,193,0,35,255,242,0,193,0,36,255,244,0,193,0,37,255,242,0,193,0,38,255,242,0,193,0,39,255,242,0,193,0,40,255,244,0,193,0,41,255,242,0,193,0,42,255,242,0,193,0,43,255,242,0,193,0,44,255,242,0,193,0,45,255,242,0,193,0,46,255,241,0,193,0,47,255,242,0,193,0,48,255,244,0,193,0,49,255,242,0,193,0,50,255,244,0,193,0,51,255,242,0,193,0,52,255,244,0,193,0,53,255,242,0,193,0,54,255,238,0,193,0,55,255,247,0,193,0,56,255,246,0,193,0,58,255,247,0,193,0,59,255,245,0,193,0,127,255,248,0,193,0,128,255,248,0,193,0,129,255,248,0,193,0,130,255,248,0,193,0,131,255,248,0,193,0,132,255,248,0,193,0,134,255,244,0,193,0,135,255,242,0,193,0,136,255,242,0,193,0,137,255,242,0,193,0,138,255,242,0,193,0,139,255,242,0,193,0,140,255,242,0,193,0,141,255,242,0,193,0,142,255,242,0,193,0,143,255,242,0,193,0,144,255,242,0,193,0,145,255,244,0,193,0,146,255,244,0,193,0,147,255,244,0,193,0,148,255,244,0,193,0,149,255,244,0,193,0,151,255,244,0,193,0,152,255,238,0,193,0,153,255,238,0,193,0,154,255,238,0,193,0,155,255,238,0,193,0,156,255,247,0,193,0,157,255,242,0,193,0,194,255,244,0,193,0,196,255,244,0,193,0,198,255,247,0,193,0,199,255,245,0,194,0,14,255,244,0,194,0,21,255,220,0,194,0,36,255,245,0,194,0,40,255,245,0,194,0,48,255,245,0,194,0,50,255,245,0,194,0,68,255,240,0,194,0,69,255,240,0,194,0,70,255,240,0,194,0,71,255,243,0,194,0,72,255,241,0,194,0,78,255,247,0,194,0,79,255,247,0,194,0,80,255,240,0,194,0,81,255,247,0,194,0,82,255,240,0,194,0,83,255,247,0,194,0,84,255,251,0,194,0,85,255,242,0,194,0,86,255,238,0,194,0,87,255,241,0,194,0,88,255,243,0,194,0,90,255,240,0,194,0,107,255,235,0,194,0,110,255,248,0,194,0,134,255,245,0,194,0,145,255,245,0,194,0,146,255,245,0,194,0,147,255,245,0,194,0,148,255,245,0,194,0,149,255,245,0,194,0,151,255,245,0,194,0,158,255,243,0,194,0,166,255,240,0,194,0,167,255,240,0,194,0,168,255,240,0,194,0,169,255,240,0,194,0,170,255,240,0,194,0,173,0,21,0,194,0,175,255,246,0,194,0,176,255,247,0,194,0,177,255,240,0,194,0,178,255,240,0,194,0,179,255,240,0,194,0,180,255,240,0,194,0,181,255,240,0,194,0,183,255,240,0,194,0,184,255,238,0,194,0,185,255,238,0,194,0,186,255,238,0,194,0,187,255,238,0,194,0,188,255,240,0,194,0,189,255,247,0,194,0,190,255,240,0,194,0,194,255,245,0,194,0,195,255,240,0,194,0,197,255,251,0,194,0,207,255,244,0,194,0,208,255,244,0,194,0,220,255,235,0,195,0,3,255,241,0,195,0,7,255,246,0,195,0,8,255,241,0,195,0,10,255,230,0,195,0,11,255,238,0,195,0,18,255,235,0,195,0,19,255,245,0,195,0,24,255,230,0,195,0,32,255,223,0,195,0,34,255,251,0,195,0,35,255,241,0,195,0,36,255,250,0,195,0,37,255,241,0,195,0,38,255,241,0,195,0,39,255,241,0,195,0,40,255,250,0,195,0,41,255,241,0,195,0,42,255,241,0,195,0,43,255,241,0,195,0,44,255,241,0,195,0,45,255,241,0,195,0,46,255,243,0,195,0,47,255,241,0,195,0,48,255,250,0,195,0,49,255,241,0,195,0,50,255,250,0,195,0,51,255,241,0,195,0,52,255,241,0,195,0,53,255,187,0,195,0,54,255,240,0,195,0,55,255,209,0,195,0,56,255,213,0,195,0,57,255,243,0,195,0,58,255,174,0,195,0,59,255,243,0,195,0,61,255,220,0,195,0,62,255,220,0,195,0,87,255,252,0,195,0,89,255,251,0,195,0,90,255,251,0,195,0,94,255,227,0,195,0,127,255,251,0,195,0,128,255,251,0,195,0,129,255,251,0,195,0,130,255,251,0,195,0,131,255,251,0,195,0,132,255,251,0,195,0,134,255,250,0,195,0,135,255,241,0,195,0,136,255,241,0,195,0,137,255,241,0,195,0,138,255,241,0,195,0,139,255,241,0,195,0,140,255,241,0,195,0,141,255,241,0,195,0,142,255,241,0,195,0,143,255,241,0,195,0,144,255,241,0,195,0,145,255,250,0,195,0,146,255,250,0,195,0,147,255,250,0,195,0,148,255,250,0,195,0,149,255,250,0,195,0,151,255,250,0,195,0,152,255,240,0,195,0,153,255,240,0,195,0,154,255,240,0,195,0,155,255,240,0,195,0,156,255,174,0,195,0,157,255,241,0,195,0,188,255,251,0,195,0,190,255,251,0,195,0,194,255,250,0,195,0,196,255,241,0,195,0,198,255,174,0,195,0,199,255,243,0,195,0,209,255,189,0,195,0,210,255,186,0,195,0,212,255,189,0,195,0,213,255,186,0,195,0,240,255,237,0,196,0,10,255,246,0,196,0,57,255,251,0,196,0,67,255,250,0,196,0,71,255,243,0,196,0,72,255,250,0,196,0,73,255,250,0,196,0,74,255,250,0,196,0,75,255,250,0,196,0,76,255,250,0,196,0,77,255,250,0,196,0,78,255,250,0,196,0,79,255,250,0,196,0,81,255,250,0,196,0,83,255,250,0,196,0,84,255,251,0,196,0,85,255,241,0,196,0,86,255,250,0,196,0,87,255,241,0,196,0,88,255,244,0,196,0,89,255,242,0,196,0,90,255,240,0,196,0,91,255,244,0,196,0,158,255,244,0,196,0,171,255,250,0,196,0,172,255,250,0,196,0,173,255,250,0,196,0,174,255,250,0,196,0,176,255,250,0,196,0,184,255,250,0,196,0,185,255,250,0,196,0,186,255,250,0,196,0,187,255,250,0,196,0,188,255,240,0,196,0,189,255,250,0,196,0,190,255,240,0,196,0,193,255,250,0,196,0,197,255,251,0,196,0,200,255,244,0,197,0,10,255,231,0,197,0,11,255,241,0,197,0,24,255,234,0,197,0,32,255,224,0,197,0,35,255,241,0,197,0,36,255,244,0,197,0,37,255,241,0,197,0,38,255,241,0,197,0,39,255,241,0,197,0,40,255,244,0,197,0,41,255,241,0,197,0,42,255,241,0,197,0,43,255,241,0,197,0,44,255,241,0,197,0,45,255,241,0,197,0,46,255,245,0,197,0,47,255,241,0,197,0,48,255,244,0,197,0,49,255,241,0,197,0,50,255,244,0,197,0,51,255,241,0,197,0,52,255,248,0,197,0,53,255,202,0,197,0,54,255,238,0,197,0,55,255,216,0,197,0,56,255,224,0,197,0,57,255,244,0,197,0,58,255,209,0,197,0,59,255,245,0,197,0,61,255,225,0,197,0,62,255,220,0,197,0,94,255,229,0,197,0,134,255,244,0,197,0,135,255,241,0,197,0,136,255,241,0,197,0,137,255,241,0,197,0,138,255,241,0,197,0,139,255,241,0,197,0,140,255,241,0,197,0,141,255,241,0,197,0,142,255,241,0,197,0,143,255,241,0,197,0,144,255,241,0,197,0,145,255,244,0,197,0,146,255,244,0,197,0,147,255,244,0,197,0,148,255,244,0,197,0,149,255,244,0,197,0,151,255,244,0,197,0,152,255,238,0,197,0,153,255,238,0,197,0,154,255,238,0,197,0,155,255,238,0,197,0,156,255,209,0,197,0,157,255,241,0,197,0,194,255,244,0,197,0,196,255,248,0,197,0,198,255,209,0,197,0,199,255,245,0,197,0,209,255,203,0,197,0,210,255,200,0,197,0,212,255,203,0,197,0,213,255,200,0,197,0,240,255,235,0,198,0,7,255,237,0,198,0,11,0,13,0,198,0,13,255,215,0,198,0,14,255,222,0,198,0,15,255,215,0,198,0,16,255,201,0,198,0,17,255,233,0,198,0,21,255,206,0,198,0,23,255,218,0,198,0,25,255,246,0,198,0,27,255,235,0,198,0,28,255,235,0,198,0,32,0,13,0,198,0,33,255,198,0,198,0,34,255,192,0,198,0,36,255,230,0,198,0,40,255,230,0,198,0,46,255,232,0,198,0,48,255,230,0,198,0,50,255,230,0,198,0,61,0,7,0,198,0,62,0,31,0,198,0,66,255,189,0,198,0,68,255,171,0,198,0,69,255,171,0,198,0,70,255,171,0,198,0,71,255,237,0,198,0,72,255,180,0,198,0,78,255,187,0,198,0,79,255,187,0,198,0,80,255,171,0,198,0,81,255,187,0,198,0,82,255,171,0,198,0,83,255,187,0,198,0,84,255,186,0,198,0,85,255,221,0,198,0,86,255,190,0,198,0,87,255,215,0,198,0,88,255,216,0,198,0,89,255,214,0,198,0,90,255,217,0,198,0,91,255,229,0,198,0,94,0,33,0,198,0,107,255,198,0,198,0,110,255,230,0,198,0,122,255,225,0,198,0,127,255,192,0,198,0,128,255,192,0,198,0,129,255,192,0,198,0,130,255,192,0,198,0,131,255,192,0,198,0,132,255,192,0,198,0,133,255,180,0,198,0,134,255,230,0,198,0,145,255,230,0,198,0,146,255,230,0,198,0,147,255,230,0,198,0,148,255,230,0,198,0,149,255,230,0,198,0,151,255,230,0,198,0,158,255,230,0,198,0,159,255,189,0,198,0,160,255,189,0,198,0,161,255,189,0,198,0,162,255,189,0,198,0,163,255,189,0,198,0,164,255,189,0,198,0,165,255,189,0,198,0,166,255,171,0,198,0,167,255,171,0,198,0,168,255,171,0,198,0,169,255,171,0,198,0,170,255,171,0,198,0,171,0,16,0,198,0,173,0,38,0,198,0,174,0,47,0,198,0,175,255,216,0,198,0,176,255,187,0,198,0,177,255,171,0,198,0,178,255,171,0,198,0,179,255,171,0,198,0,180,255,171,0,198,0,181,255,171,0,198,0,183,255,171,0,198,0,184,255,190,0,198,0,185,255,190,0,198,0,186,255,190,0,198,0,187,255,190,0,198,0,188,255,217,0,198,0,189,255,225,0,198,0,190,255,217,0,198,0,194,255,230,0,198,0,195,255,171,0,198,0,197,255,234,0,198,0,200,255,229,0,198,0,207,255,222,0,198,0,208,255,222,0,198,0,211,255,215,0,198,0,214,255,215,0,198,0,218,255,215,0,198,0,220,255,198,0,198,0,221,255,225,0,198,0,240,0,33,0,199,0,14,255,217,0,199,0,17,255,243,0,199,0,21,255,199,0,199,0,23,255,247,0,199,0,36,255,238,0,199,0,40,255,238,0,199,0,48,255,238,0,199,0,50,255,238,0,199,0,62,0,23,0,199,0,66,255,246,0,199,0,68,255,227,0,199,0,69,255,227,0,199,0,70,255,227,0,199,0,71,255,241,0,199,0,72,255,229,0,199,0,74,255,250,0,199,0,75,255,250,0,199,0,78,255,235,0,199,0,79,255,235,0,199,0,80,255,227,0,199,0,81,255,235,0,199,0,82,255,227,0,199,0,83,255,235,0,199,0,84,255,245,0,199,0,85,255,241,0,199,0,86,255,224,0,199,0,87,255,241,0,199,0,88,255,241,0,199,0,90,255,242,0,199,0,91,255,248,0,199,0,94,0,23,0,199,0,107,255,214,0,199,0,110,255,233,0,199,0,134,255,238,0,199,0,145,255,238,0,199,0,146,255,238,0,199,0,147,255,238,0,199,0,148,255,238,0,199,0,149,255,238,0,199,0,151,255,238,0,199,0,158,255,239,0,199,0,159,255,246,0,199,0,160,255,246,0,199,0,161,255,246,0,199,0,162,255,246,0,199,0,163,255,246,0,199,0,164,255,246,0,199,0,165,255,246,0,199,0,166,255,227,0,199,0,167,255,227,0,199,0,168,255,227,0,199,0,169,255,227,0,199,0,170,255,227,0,199,0,171,0,6,0,199,0,172,255,250,0,199,0,173,0,29,0,199,0,174,0,37,0,199,0,175,255,235,0,199,0,176,255,235,0,199,0,177,255,227,0,199,0,178,255,227,0,199,0,179,255,227,0,199,0,180,255,227,0,199,0,181,255,227,0,199,0,183,255,227,0,199,0,184,255,224,0,199,0,185,255,224,0,199,0,186,255,224,0,199,0,187,255,224,0,199,0,188,255,242,0,199,0,189,255,235,0,199,0,190,255,242,0,199,0,193,255,250,0,199,0,194,255,238,0,199,0,195,255,227,0,199,0,197,255,245,0,199,0,200,255,248,0,199,0,207,255,217,0,199,0,208,255,217,0,199,0,220,255,214,0,199,0,240,0,24,0,200,0,7,255,245,0,200,0,10,255,246,0,200,0,14,255,240,0,200,0,21,255,225,0,200,0,24,255,244,0,200,0,32,255,221,0,200,0,35,255,242,0,200,0,36,255,244,0,200,0,37,255,242,0,200,0,38,255,242,0,200,0,39,255,242,0,200,0,40,255,244,0,200,0,41,255,242,0,200,0,42,255,242,0,200,0,43,255,242,0,200,0,44,255,242,0,200,0,45,255,242,0,200,0,46,255,245,0,200,0,47,255,242,0,200,0,48,255,244,0,200,0,49,255,242,0,200,0,50,255,244,0,200,0,51,255,242,0,200,0,53,255,203,0,200,0,54,255,239,0,200,0,55,255,240,0,200,0,56,255,243,0,200,0,58,255,227,0,200,0,61,255,242,0,200,0,62,255,222,0,200,0,68,255,245,0,200,0,69,255,245,0,200,0,70,255,245,0,200,0,72,255,251,0,200,0,80,255,245,0,200,0,82,255,245,0,200,0,94,255,232,0,200,0,107,255,232,0,200,0,134,255,244,0,200,0,135,255,242,0,200,0,136,255,242,0,200,0,137,255,242,0,200,0,138,255,242,0,200,0,139,255,242,0,200,0,140,255,242,0,200,0,141,255,242,0,200,0,142,255,242,0,200,0,143,255,242,0,200,0,144,255,242,0,200,0,145,255,244,0,200,0,146,255,244,0,200,0,147,255,244,0,200,0,148,255,244,0,200,0,149,255,244,0,200,0,151,255,244,0,200,0,152,255,239,0,200,0,153,255,239,0,200,0,154,255,239,0,200,0,155,255,239,0,200,0,156,255,227,0,200,0,157,255,242,0,200,0,166,255,245,0,200,0,167,255,245,0,200,0,168,255,245,0,200,0,169,255,245,0,200,0,170,255,245,0,200,0,175,255,247,0,200,0,177,255,245,0,200,0,178,255,245,0,200,0,179,255,245,0,200,0,180,255,245,0,200,0,181,255,245,0,200,0,183,255,245,0,200,0,194,255,244,0,200,0,195,255,245,0,200,0,198,255,227,0,200,0,207,255,240,0,200,0,208,255,240,0,200,0,209,255,219,0,200,0,210,255,216,0,200,0,212,255,219,0,200,0,213,255,216,0,200,0,220,255,232,0,200,0,240,255,242,0,207,0,3,255,234,0,207,0,8,255,234,0,207,0,52,255,243,0,207,0,53,255,216,0,207,0,55,255,238,0,207,0,56,255,248,0,207,0,57,255,242,0,207,0,58,255,222,0,207,0,59,255,237,0,207,0,71,255,247,0,207,0,85,255,248,0,207,0,89,255,247,0,207,0,91,255,231,0,207,0,156,255,222,0,207,0,158,255,248,0,207,0,196,255,243,0,207,0,198,255,222,0,207,0,199,255,237,0,207,0,200,255,231,0,207,0,210,255,193,0,207,0,213,255,193,0,208,0,3,255,234,0,208,0,8,255,234,0,208,0,52,255,243,0,208,0,53,255,216,0,208,0,55,255,238,0,208,0,56,255,248,0,208,0,57,255,242,0,208,0,58,255,222,0,208,0,59,255,237,0,208,0,71,255,247,0,208,0,85,255,248,0,208,0,89,255,247,0,208,0,91,255,231,0,208,0,156,255,222,0,208,0,158,255,248,0,208,0,196,255,243,0,208,0,198,255,222,0,208,0,199,255,237,0,208,0,200,255,231,0,208,0,210,255,193,0,208,0,213,255,193,0,209,0,13,255,123,0,209,0,15,255,124,0,209,0,34,255,205,0,209,0,46,255,236,0,209,0,66,255,194,0,209,0,68,255,182,0,209,0,69,255,182,0,209,0,70,255,182,0,209,0,71,255,243,0,209,0,72,255,189,0,209,0,78,255,211,0,209,0,79,255,211,0,209,0,80,255,182,0,209,0,81,255,211,0,209,0,82,255,182,0,209,0,83,255,211,0,209,0,84,255,193,0,209,0,85,255,248,0,209,0,86,255,213,0,209,0,87,255,226,0,209,0,88,255,227,0,209,0,89,255,225,0,209,0,90,255,227,0,209,0,91,255,217,0,209,0,127,255,205,0,209,0,128,255,205,0,209,0,129,255,205,0,209,0,130,255,205,0,209,0,131,255,205,0,209,0,132,255,205,0,209,0,133,255,190,0,209,0,158,255,245,0,209,0,159,255,194,0,209,0,160,255,194,0,209,0,161,255,194,0,209,0,162,255,194,0,209,0,163,255,194,0,209,0,164,255,194,0,209,0,165,255,194,0,209,0,166,255,182,0,209,0,167,255,182,0,209,0,168,255,182,0,209,0,169,255,182,0,209,0,170,255,182,0,209,0,173,0,37,0,209,0,175,255,235,0,209,0,176,255,211,0,209,0,177,255,182,0,209,0,178,255,182,0,209,0,179,255,182,0,209,0,180,255,182,0,209,0,181,255,182,0,209,0,183,255,182,0,209,0,184,255,213,0,209,0,185,255,213,0,209,0,186,255,213,0,209,0,187,255,213,0,209,0,188,255,227,0,209,0,189,255,211,0,209,0,190,255,227,0,209,0,195,255,182,0,209,0,197,255,193,0,209,0,200,255,217,0,209,0,218,255,124,0,210,0,7,255,239,0,210,0,11,0,5,0,210,0,13,255,110,0,210,0,14,255,181,0,210,0,15,255,110,0,210,0,16,255,209,0,210,0,33,255,210,0,210,0,34,255,200,0,210,0,36,255,234,0,210,0,40,255,234,0,210,0,46,255,234,0,210,0,48,255,234,0,210,0,50,255,234,0,210,0,58,0,6,0,210,0,66,255,179,0,210,0,68,255,167,0,210,0,69,255,167,0,210,0,70,255,167,0,210,0,71,255,243,0,210,0,72,255,174,0,210,0,78,255,198,0,210,0,79,255,198,0,210,0,80,255,167,0,210,0,81,255,198,0,210,0,82,255,167,0,210,0,83,255,198,0,210,0,84,255,178,0,210,0,85,255,244,0,210,0,86,255,200,0,210,0,87,255,214,0,210,0,88,255,215,0,210,0,89,255,213,0,210,0,90,255,215,0,210,0,91,255,204,0,210,0,107,255,192,0,210,0,110,255,245,0,210,0,122,255,220,0,210,0,127,255,200,0,210,0,128,255,200,0,210,0,129,255,200,0,210,0,130,255,200,0,210,0,131,255,200,0,210,0,132,255,200,0,210,0,133,255,184,0,210,0,134,255,234,0,210,0,145,255,234,0,210,0,146,255,234,0,210,0,147,255,234,0,210,0,148,255,234,0,210,0,149,255,234,0,210,0,151,255,234,0,210,0,156,0,6,0,210,0,158,255,241,0,210,0,159,255,179,0,210,0,160,255,179,0,210,0,161,255,187,0,210,0,162,255,179,0,210,0,163,255,179,0,210,0,164,255,179,0,210,0,165,255,179,0,210,0,166,255,167,0,210,0,167,255,167,0,210,0,168,255,167,0,210,0,169,255,174,0,210,0,170,255,167,0,210,0,173,0,44,0,210,0,174,0,28,0,210,0,175,255,237,0,210,0,176,255,198,0,210,0,177,255,167,0,210,0,178,255,167,0,210,0,179,255,167,0,210,0,180,255,167,0,210,0,181,255,167,0,210,0,183,255,167,0,210,0,184,255,200,0,210,0,185,255,200,0,210,0,186,255,200,0,210,0,187,255,200,0,210,0,188,255,215,0,210,0,189,255,224,0,210,0,190,255,215,0,210,0,194,255,234,0,210,0,195,255,167,0,210,0,197,255,232,0,210,0,198,0,6,0,210,0,200,255,204,0,210,0,207,255,181,0,210,0,208,255,181,0,210,0,211,255,110,0,210,0,214,255,110,0,210,0,218,255,110,0,210,0,220,255,192,0,210,0,221,255,220,0,210,0,240,0,9,0,211,0,3,255,146,0,211,0,8,255,146,0,211,0,36,255,242,0,211,0,40,255,242,0,211,0,48,255,242,0,211,0,50,255,242,0,211,0,53,255,214,0,211,0,54,255,243,0,211,0,55,255,213,0,211,0,56,255,226,0,211,0,58,255,215,0,211,0,71,255,241,0,211,0,85,255,239,0,211,0,87,255,227,0,211,0,88,255,236,0,211,0,90,255,222,0,211,0,134,255,242,0,211,0,145,255,242,0,211,0,146,255,242,0,211,0,147,255,242,0,211,0,148,255,242,0,211,0,149,255,242,0,211,0,151,255,242,0,211,0,152,255,243,0,211,0,153,255,243,0,211,0,154,255,243,0,211,0,155,255,243,0,211,0,156,255,215,0,211,0,158,255,242,0,211,0,188,255,222,0,211,0,190,255,222,0,211,0,194,255,242,0,211,0,198,255,215,0,211,0,210,255,121,0,211,0,213,255,121,0,212,0,13,255,123,0,212,0,15,255,124,0,212,0,34,255,205,0,212,0,46,255,236,0,212,0,66,255,194,0,212,0,68,255,182,0,212,0,69,255,182,0,212,0,70,255,182,0,212,0,71,255,243,0,212,0,72,255,189,0,212,0,78,255,211,0,212,0,79,255,211,0,212,0,80,255,182,0,212,0,81,255,211,0,212,0,82,255,182,0,212,0,83,255,211,0,212,0,84,255,193,0,212,0,85,255,248,0,212,0,86,255,213,0,212,0,87,255,226,0,212,0,88,255,227,0,212,0,89,255,225,0,212,0,90,255,227,0,212,0,91,255,217,0,212,0,127,255,205,0,212,0,128,255,205,0,212,0,129,255,205,0,212,0,130,255,205,0,212,0,131,255,205,0,212,0,132,255,205,0,212,0,133,255,190,0,212,0,158,255,245,0,212,0,159,255,194,0,212,0,160,255,194,0,212,0,161,255,194,0,212,0,162,255,194,0,212,0,163,255,194,0,212,0,164,255,194,0,212,0,165,255,194,0,212,0,166,255,182,0,212,0,167,255,182,0,212,0,168,255,182,0,212,0,169,255,182,0,212,0,170,255,182,0,212,0,173,0,37,0,212,0,175,255,235,0,212,0,176,255,211,0,212,0,177,255,182,0,212,0,178,255,182,0,212,0,179,255,182,0,212,0,180,255,182,0,212,0,181,255,182,0,212,0,183,255,182,0,212,0,184,255,213,0,212,0,185,255,213,0,212,0,186,255,213,0,212,0,187,255,213,0,212,0,188,255,227,0,212,0,189,255,211,0,212,0,190,255,227,0,212,0,195,255,182,0,212,0,197,255,193,0,212,0,200,255,217,0,212,0,218,255,124,0,213,0,7,255,239,0,213,0,11,0,5,0,213,0,13,255,110,0,213,0,14,255,181,0,213,0,15,255,110,0,213,0,16,255,209,0,213,0,33,255,210,0,213,0,34,255,200,0,213,0,36,255,234,0,213,0,40,255,234,0,213,0,46,255,234,0,213,0,48,255,234,0,213,0,50,255,234,0,213,0,58,0,6,0,213,0,66,255,179,0,213,0,68,255,167,0,213,0,69,255,167,0,213,0,70,255,167,0,213,0,71,255,243,0,213,0,72,255,174,0,213,0,78,255,198,0,213,0,79,255,198,0,213,0,80,255,167,0,213,0,81,255,198,0,213,0,82,255,167,0,213,0,83,255,198,0,213,0,84,255,178,0,213,0,85,255,244,0,213,0,86,255,200,0,213,0,87,255,214,0,213,0,88,255,215,0,213,0,89,255,213,0,213,0,90,255,215,0,213,0,91,255,204,0,213,0,107,255,192,0,213,0,110,255,245,0,213,0,122,255,220,0,213,0,127,255,200,0,213,0,128,255,200,0,213,0,129,255,200,0,213,0,130,255,200,0,213,0,131,255,200,0,213,0,132,255,200,0,213,0,133,255,184,0,213,0,134,255,234,0,213,0,145,255,234,0,213,0,146,255,234,0,213,0,147,255,234,0,213,0,148,255,234,0,213,0,149,255,234,0,213,0,151,255,234,0,213,0,156,0,6,0,213,0,158,255,241,0,213,0,159,255,179,0,213,0,160,255,179,0,213,0,161,255,187,0,213,0,162,255,179,0,213,0,163,255,179,0,213,0,164,255,179,0,213,0,165,255,179,0,213,0,166,255,167,0,213,0,167,255,167,0,213,0,168,255,167,0,213,0,169,255,174,0,213,0,170,255,167,0,213,0,173,0,44,0,213,0,174,0,28,0,213,0,175,255,237,0,213,0,176,255,198,0,213,0,177,255,167,0,213,0,178,255,167,0,213,0,179,255,167,0,213,0,180,255,167,0,213,0,181,255,167,0,213,0,183,255,167,0,213,0,184,255,200,0,213,0,185,255,200,0,213,0,186,255,200,0,213,0,187,255,200,0,213,0,188,255,215,0,213,0,189,255,224,0,213,0,190,255,215,0,213,0,194,255,234,0,213,0,195,255,167,0,213,0,197,255,232,0,213,0,198,0,6,0,213,0,200,255,204,0,213,0,207,255,181,0,213,0,208,255,181,0,213,0,211,255,110,0,213,0,214,255,110,0,213,0,218,255,110,0,213,0,220,255,192,0,213,0,221,255,220,0,213,0,240,0,9,0,214,0,3,255,146,0,214,0,8,255,146,0,214,0,36,255,242,0,214,0,40,255,242,0,214,0,48,255,242,0,214,0,50,255,242,0,214,0,53,255,214,0,214,0,54,255,243,0,214,0,55,255,213,0,214,0,56,255,226,0,214,0,58,255,215,0,214,0,71,255,241,0,214,0,85,255,239,0,214,0,87,255,227,0,214,0,88,255,236,0,214,0,90,255,222,0,214,0,134,255,242,0,214,0,145,255,242,0,214,0,146,255,242,0,214,0,147,255,242,0,214,0,148,255,242,0,214,0,149,255,242,0,214,0,151,255,242,0,214,0,152,255,243,0,214,0,153,255,243,0,214,0,154,255,243,0,214,0,155,255,243,0,214,0,156,255,215,0,214,0,158,255,242,0,214,0,188,255,222,0,214,0,190,255,222,0,214,0,194,255,242,0,214,0,198,255,215,0,214,0,210,255,121,0,214,0,213,255,121,0,220,0,53,255,197,0,220,0,55,255,245,0,220,0,58,255,226,0,220,0,68,255,247,0,220,0,69,255,247,0,220,0,70,255,247,0,220,0,80,255,247,0,220,0,82,255,247,0,220,0,156,255,226,0,220,0,166,255,247,0,220,0,167,255,247,0,220,0,168,255,247,0,220,0,169,255,247,0,220,0,170,255,247,0,220,0,177,255,247,0,220,0,178,255,247,0,220,0,179,255,247,0,220,0,180,255,247,0,220,0,181,255,247,0,220,0,183,255,247,0,220,0,195,255,247,0,220,0,198,255,226,0,220,0,210,255,229,0,220,0,213,255,229,0,221,0,3,255,241,0,221,0,8,255,241,0,221,0,34,255,247,0,221,0,52,255,234,0,221,0,53,255,195,0,221,0,55,255,220,0,221,0,56,255,230,0,221,0,57,255,224,0,221,0,58,255,198,0,221,0,59,255,223,0,221,0,85,255,247,0,221,0,89,255,236,0,221,0,90,255,248,0,221,0,91,255,233,0,221,0,127,255,247,0,221,0,128,255,247,0,221,0,129,255,247,0,221,0,130,255,247,0,221,0,131,255,247,0,221,0,132,255,247,0,221,0,133,255,243,0,221,0,143,0,6,0,221,0,156,255,198,0,221,0,158,255,248,0,221,0,188,255,248,0,221,0,190,255,248,0,221,0,196,255,234,0,221,0,198,255,198,0,221,0,199,255,223,0,221,0,200,255,233,0,221,0,210,255,204,0,221,0,213,255,204,0,240,0,34,255,232,0,240,0,127,255,232,0,240,0,128,255,232,0,240,0,129,255,232,0,240,0,130,255,232,0,240,0,131,255,232,0,240,0,132,255,232,0,240,0,133,255,228,0,240,0,143,0,10,0,240,0,173,0,11,0,0,0,26,0,26,0,128,0,180,1,222,3,150,5,20,7,18,7,50,7,152,7,254,8,126,8,236,9,44,9,76,9,118,9,164,10,242,11,84,12,94,13,186,14,88,15,116,16,222,17,80,18,196,20,20,20,90,20,182,20,234,21,28,21,86,22,64,23,106,24,52,25,156,26,174,27,122,27,230,28,78,29,42,29,170,29,242,30,62,30,238,31,56,32,156,33,74,34,90,35,34,36,114,37,108,39,118,39,180,40,192,41,132,42,144,43,146,44,30,45,24,45,82,45,126,45,186,45,250,46,40,46,116,47,190,48,152,49,132,50,84,51,134,52,34,54,126,55,48,55,150,56,32,56,246,57,70,58,122,59,70,60,44,61,44,62,12,62,124,63,222,64,108,65,32,65,192,66,202,67,216,68,110,69,122,70,22,70,62,70,222,71,82,71,82,71,186,72,170,73,160,74,142,75,104,75,162,77,148,77,202,79,230,80,216,81,64,81,112,81,162,83,120,84,100,84,188,85,156,86,186,86,252,87,166,88,14,88,64,88,106,88,216,89,124,89,248,90,38,90,82,90,128,91,94,91,142,91,180,91,214,91,248,92,44,92,104,93,92,93,104,93,154,93,198,93,226,94,12,94,68,94,88,94,126,94,170,95,162,95,188,95,216,95,254,96,28,96,56,96,100,96,180,98,188,98,230,99,12,99,46,99,92,99,132,100,86,101,182,101,210,101,238,102,6,102,34,102,78,102,110,104,160,104,182,104,206,104,230,105,4,105,26,105,66,105,106,105,134,105,174,107,26,107,44,107,68,107,106,107,134,107,158,107,184,107,248,109,120,109,152,109,194,109,234,110,14,110,32,111,30,111,56,111,86,111,108,111,180,113,68,115,64,115,96,115,124,115,172,115,202,115,232,116,178,117,30,117,112,117,194,118,158,119,90,119,114,119,142,119,188,119,234,120,26,120,112,120,200,121,40,121,166,122,108,122,152,122,236,125,28,125,154,126,18,127,134,127,238,128,186,129,228,130,64,131,176,132,150,132,172,132,192,132,212,132,232,132,254,133,18,133,40,133,60,133,86,133,108,134,206,135,148,136,128,137,136,138,34,138,132,138,236,139,180,140,10,140,76,140,156,141,52,142,108,143,160,144,190,146,12,146,232,147,174,149,108,150,84,152,6,152,82,153,10,153,184,155,6,155,248,156,152,157,86,158,238,159,60,0,1,0,0,1,13,0,106,0,7,0,71,0,4,0,1,0,0,0,0,0,10,0,0,2,0,4,21,0,3,0,1,0,0,0,31,1,122,0,1,0,0,0,0,0,0,0,106,0,0,0,1,0,0,0,0,0,1,0,5,0,106,0,1,0,0,0,0,0,2,0,7,0,111,0,1,0,0,0,0,0,3,0,75,0,118,0,1,0,0,0,0,0,4,0,13,0,193,0,1,0,0,0,0,0,5,0,13,0,206,0,1,0,0,0,0,0,6,0,13,0,219,0,1,0,0,0,0,0,7,0,95,0,232,0,1,0,0,0,0,0,8,0,62,1,71,0,1,0,0,0,0,0,9,0,15,1,133,0,1,0,0,0,0,0,10,0,127,1,148,0,1,0,0,0,0,0,11,0,17,2,19,0,1,0,0,0,0,0,12,0,17,2,36,0,1,0,0,0,0,0,13,0,255,2,53,0,1,0,0,0,0,0,14,0,26,3,52,0,1,0,0,0,0,0,18,0,13,3,78,0,3,0,1,4,9,0,0,0,212,3,91,0,3,0,1,4,9,0,1,0,10,4,47,0,3,0,1,4,9,0,2,0,14,4,57,0,3,0,1,4,9,0,3,0,150,4,71,0,3,0,1,4,9,0,4,0,26,4,221,0,3,0,1,4,9,0,5,0,26,4,247,0,3,0,1,4,9,0,6,0,26,5,17,0,3,0,1,4,9,0,7,0,190,5,43,0,3,0,1,4,9,0,8,0,124,5,233,0,3,0,1,4,9,0,9,0,30,6,101,0,3,0,1,4,9,0,10,0,254,6,131,0,3,0,1,4,9,0,11,0,34,7,129,0,3,0,1,4,9,0,12,0,34,7,163,0,3,0,1,4,9,0,13,1,254,7,197,0,3,0,1,4,9,0,14,0,52,9,195,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,49,49,32,98,121,32,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,46,32,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,32,73,103,105,110,111,32,77,97,114,105,110,105,46,32,119,119,119,46,105,107,101,114,110,46,99,111,109,46,32,65,108,108,32,114,105,103,104,116,115,32,114,101,115,101,114,118,101,100,46,67,97,98,105,110,82,101,103,117,108,97,114,80,97,98,108,111,73,109,112,97,108,108,97,114,105,46,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,73,103,105,110,111,77,97,114,105,110,105,46,119,119,119,46,105,107,101,114,110,46,99,111,109,58,32,67,97,98,105,110,32,66,111,108,100,58,32,50,48,49,48,67,97,98,105,110,32,82,101,103,117,108,97,114,86,101,114,115,105,111,110,32,49,46,48,48,53,67,97,98,105,110,45,82,101,103,117,108,97,114,67,97,98,105,110,32,82,101,103,117,108,97,114,32,105,115,32,97,32,116,114,97,100,101,109,97,114,107,32,111,102,32,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,46,32,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,32,73,103,105,110,111,32,77,97,114,105,110,105,46,32,119,119,119,46,105,107,101,114,110,46,99,111,109,46,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,46,32,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,32,73,103,105,110,111,32,77,97,114,105,110,105,46,32,119,119,119,46,105,107,101,114,110,46,99,111,109,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,49,49,32,98,121,32,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,46,32,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,32,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,49,49,32,98,121,32,73,103,105,110,111,32,77,97,114,105,110,105,46,32,119,119,119,46,105,107,101,114,110,46,99,111,109,32,65,108,108,32,114,105,103,104,116,115,32,114,101,115,101,114,118,101,100,46,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,49,48,44,32,80,97,98,108,111,32,73,109,112,97,108,108,97,114,105,32,40,119,119,119,46,105,109,112,97,108,108,97,114,105,46,99,111,109,124,105,109,112,97,108,108,97,114,105,64,103,109,97,105,108,46,99,111,109,41,44,13,10,119,105,116,104,32,82,101,115,101,114,118,101,100,32,70,111,110,116,32,78,97,109,101,32,67,97,98,105,110,46,13,10,84,104,105,115,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,105,115,32,108,105,99,101,110,115,101,100,32,117,110,100,101,114,32,116,104,101,32,83,73,76,32,79,112,101,110,32,70,111,110,116,32,76,105,99,101,110,115,101,44,32,86,101,114,115,105,111,110,32,49,46,49,46,13,10,84,104,105,115,32,108,105,99,101,110,115,101,32,105,115,32,97,118,97,105,108,97,98,108,101,32,119,105,116,104,32,97,32,70,65,81,32,97,116,58,32,104,116,116,112,58,47,47,115,99,114,105,112,116,115,46,115,105,108,46,111,114,103,47,79,70,76,104,116,116,112,58,47,47,115,99,114,105,112,116,115,46,115,105,108,46,111,114,103,47,79,70,76,67,97,98,105,110,32,82,101,103,117,108,97,114,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,40,0,99,0,41,0,32,0,50,0,48,0,49,0,49,0,32,0,98,0,121,0,32,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,32,0,73,0,103,0,105,0,110,0,111,0,32,0,77,0,97,0,114,0,105,0,110,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,107,0,101,0,114,0,110,0,46,0,99,0,111,0,109,0,46,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32,0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,67,0,97,0,98,0,105,0,110,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,80,0,97,0,98,0,108,0,111,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,73,0,103,0,105,0,110,0,111,0,77,0,97,0,114,0,105,0,110,0,105,0,46,0,119,0,119,0,119,0,46,0,105,0,107,0,101,0,114,0,110,0,46,0,99,0,111,0,109,0,58,0,32,0,67,0,97,0,98,0,105,0,110,0,32,0,66,0,111,0,108,0,100,0,58,0,32,0,50,0,48,0,49,0,48,0,67,0,97,0,98,0,105,0,110,0,32,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,48,0,48,0,53,0,67,0,97,0,98,0,105,0,110,0,45,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,67,0,97,0,98,0,105,0,110,0,32,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,32,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,32,0,73,0,103,0,105,0,110,0,111,0,32,0,77,0,97,0,114,0,105,0,110,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,107,0,101,0,114,0,110,0,46,0,99,0,111,0,109,0,46,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,32,0,73,0,103,0,105,0,110,0,111,0,32,0,77,0,97,0,114,0,105,0,110,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,107,0,101,0,114,0,110,0,46,0,99,0,111,0,109,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,40,0,99,0,41,0,32,0,50,0,48,0,49,0,49,0,32,0,98,0,121,0,32,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,32,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,40,0,99,0,41,0,32,0,50,0,48,0,49,0,49,0,32,0,98,0,121,0,32,0,73,0,103,0,105,0,110,0,111,0,32,0,77,0,97,0,114,0,105,0,110,0,105,0,46,0,32,0,119,0,119,0,119,0,46,0,105,0,107,0,101,0,114,0,110,0,46,0,99,0,111,0,109,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32,0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,40,0,99,0,41,0,32,0,50,0,48,0,49,0,48,0,44,0,32,0,80,0,97,0,98,0,108,0,111,0,32,0,73,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,32,0,40,0,119,0,119,0,119,0,46,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,46,0,99,0,111,0,109,0,124,0,105,0,109,0,112,0,97,0,108,0,108,0,97,0,114,0,105,0,64,0,103,0,109,0,97,0,105,0,108,0,46,0,99,0,111,0,109,0,41,0,44,0,13,0,10,0,119,0,105,0,116,0,104,0,32,0,82,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,32,0,70,0,111,0,110,0,116,0,32,0,78,0,97,0,109,0,101,0,32,0,67,0,97,0,98,0,105,0,110,0,46,0,13,0,10,0,84,0,104,0,105,0,115,0,32,0,70,0,111,0,110,0,116,0,32,0,83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,32,0,105,0,115,0,32,0,108,0,105,0,99,0,101,0,110,0,115,0,101,0,100,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,116,0,104,0,101,0,32,0,83,0,73,0,76,0,32,0,79,0,112,0,101,0,110,0,32,0,70,0,111,0,110,0,116,0,32,0,76,0,105,0,99,0,101,0,110,0,115,0,101,0,44,0,32,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,49,0,46,0,13,0,10,0,84,0,104,0,105,0,115,0,32,0,108,0,105,0,99,0,101,0,110,0,115,0,101,0,32,0,105,0,115,0,32,0,97,0,118,0,97,0,105,0,108,0,97,0,98,0,108,0,101,0,32,0,119,0,105,0,116,0,104,0,32,0,97,0,32,0,70,0,65,0,81,0,32,0,97,0,116,0,58,0,32,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,115,0,99,0,114,0,105,0,112,0,116,0,115,0,46,0,115,0,105,0,108,0,46,0,111,0,114,0,103,0,47,0,79,0,70,0,76,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,115,0,99,0,114,0,105,0,112,0,116,0,115,0,46,0,115,0,105,0,108,0,46,0,111,0,114,0,103,0,47,0,79,0,70,0,76,0,0,0,0,2,0,0,0,0,0,0,255,181,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,13,0,0,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,1,2,0,163,0,132,0,133,0,189,0,150,0,232,0,134,0,142,0,139,0,157,0,169,0,164,1,3,0,138,0,131,0,147,1,4,1,5,0,141,1,6,0,136,1,7,0,222,1,8,0,158,0,170,0,245,0,244,0,246,0,162,0,173,0,201,0,199,0,174,0,98,0,99,0,144,0,100,0,203,0,101,0,200,0,202,0,207,0,204,0,205,0,206,0,233,0,102,0,211,0,208,0,209,0,175,0,103,0,240,0,145,0,214,0,212,0,213,0,104,0,235,0,237,0,137,0,106,0,105,0,107,0,109,0,108,0,110,0,160,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0,234,0,120,0,122,0,121,0,123,0,125,0,124,0,184,0,161,0,127,0,126,0,128,0,129,0,236,0,238,0,186,0,255,1,0,0,215,0,176,0,177,0,228,0,229,0,187,0,230,0,231,0,166,1,9,0,216,0,225,0,221,0,217,0,178,0,179,0,182,0,183,0,196,0,180,0,181,0,197,0,130,0,194,0,135,0,171,0,198,0,190,0,191,1,10,1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,1,26,1,27,0,140,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,7,117,110,105,48,48,65,48,7,117,110,105,48,48,65,68,7,117,110,105,48,48,66,50,7,117,110,105,48,48,66,51,7,117,110,105,48,48,66,53,14,112,101,114,105,111,100,99,101,110,116,101,114,101,100,7,117,110,105,48,48,66,57,7,117,110,105,48,50,51,55,7,117,110,105,50,48,55,48,7,117,110,105,50,48,55,52,7,117,110,105,50,48,55,53,7,117,110,105,50,48,55,54,7,117,110,105,50,48,55,55,7,117,110,105,50,48,55,56,7,117,110,105,50,48,55,57,7,117,110,105,50,48,56,48,7,117,110,105,50,48,56,49,7,117,110,105,50,48,56,50,7,117,110,105,50,48,56,51,7,117,110,105,50,48,56,52,7,117,110,105,50,48,56,53,7,117,110,105,50,48,56,54,7,117,110,105,50,48,56,55,7,117,110,105,50,48,56,56,7,117,110,105,50,48,56,57,4,69,117,114,111,4,66,46,115,99,4,67,46,115,99,4,68,46,115,99,4,69,46,115,99,4,70,46,115,99,4,71,46,115,99,4,72,46,115,99,4,73,46,115,99,4,74,46,115,99,4,75,46,115,99,4,65,46,115,99,4,77,46,115,99,4,78,46,115,99,4,79,46,115,99,5,65,69,46,115,99,4,80,46,115,99,4,81,46,115,99,4,82,46,115,99,4,83,46,115,99,4,84,46,115,99,4,85,46,115,99,4,86,46,115,99,4,87,46,115,99,4,88,46,115,99,4,89,46,115,99,4,90,46,115,99,5,79,69,46,115,99,4,76,46,115,99,0,0,184,0,0,43,0,186,0,1,0,3,0,2,43,1,186,0,4,0,2,0,2,43,1,191,0,4,0,58,0,47,0,37,0,28,0,18,0,0,0,8,43,191,0,5,0,77,0,63,0,50,0,34,0,18,0,0,0,8,43,0,191,0,1,0,79,0,65,0,50,0,34,0,18,0,0,0,8,43,191,0,2,0,66,0,54,0,42,0,32,0,18,0,0,0,8,43,191,0,3,0,95,0,78,0,61,0,44,0,22,0,0,0,8,43,0,186,0,6,0,7,0,7,43,184,0,0,32,69,125,105,24,68,186,0,16,0,8,0,1,115,186,0,144,0,8,0,1,115,186,0,208,0,8,0,1,115,186,0,144,0,10,0,1,115,186,0,240,0,10,0,1,115,186,0,32,0,10,0,1,116,186,0,80,0,10,0,1,116,186,0,127,0,10,0,1,116,186,0,32,0,10,0,1,115,186,0,207,0,12,0,1,115,186,0,239,0,12,0,1,115,186,0,79,0,14,0,1,116,186,0,63,0,14,0,1,115,186,0,175,0,14,0,1,115,186,0,223,0,14,0,1,115,186,0,31,0,14,0,1,116,186,0,127,0,14,0,1,116,186,0,223,0,16,0,1,115,186,0,255,0,16,0,1,115,186,0,111,0,16,0,1,116,186,0,127,0,16,0,1,116,186,0,143,0,16,0,1,116,0,0,1,13,1,1,1,1,50,1,1,46,1,10,10,1,1,1,1,1,1,1,1,1,1,1,1,23,1,1,1,1,1,1,1,1,18,28,1,1,10,1,38,1,1,14,50,50,1,1,9,50,10,1,10,1,1,11,10,14,21,10,1,1,1,1,1,1,1,1,1,1,1,1,1,1,14,24,1,1,13,37,15,1,1,36,36,15,14,1,13,12,10,12,1,1,6,25,6,1,1,30,23,1,1,1,29,1,1,1,1,12,27,1,1,1,4,1,1,1,1,1,1,1,1,1,12,1,25,1,1,1,1,1,1,1,1,1,10,38,38,38,38,50,50,50,50,1,50,10,10,10,10,10,1,10,1,1,1,1,1,1,36,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,39,18,13,13,13,13,1,18,1,10,1,1,8,25,1,14,1,1,1,48,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,40,1,30,1,1,1,50,1,1,1,1,40,33,1,45,28,32,1,1,19,1,1,10,1,45,34,1,15,1,1,15,28,1,17,1,1,1,11,1,12,20,1,0,0,0,0,0,0,42,0,0,1,16,9,11,2,2,2,4,6,5,8,6,2,3,3,4,4,2,4,2,5,6,3,5,5,5,5,5,5,5,5,2,2,4,5,4,4,7,6,5,5,7,5,5,6,6,2,2,5,5,7,6,6,5,6,5,5,5,6,6,9,6,5,5,3,5,3,5,5,3,4,5,4,5,5,3,4,5,2,2,4,2,8,5,5,5,5,3,4,3,5,4,6,4,5,4,3,2,3,4,2,2,4,5,6,6,2,4,4,6,3,5,5,4,6,3,4,3,3,3,5,6,2,3,2,3,5,6,7,8,4,6,6,6,6,6,6,8,5,5,5,5,5,2,2,2,2,7,6,6,6,6,6,6,4,6,7,7,7,7,5,5,5,4,4,4,4,4,4,7,4,5,5,5,5,2,2,2,2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,2,10,8,5,4,5,5,4,3,2,4,4,3,5,5,5,2,2,2,4,3,4,4,4,3,6,11,3,3,4,3,3,3,3,3,3,4,2,3,3,3,3,3,3,3,3,6,7,5,5,6,4,4,5,6,2,3,5,5,6,6,6,7,5,6,5,5,5,6,5,8,5,5,4,8,4,0,10,12,3,2,2,4,7,5,8,6,2,3,3,4,5,2,4,2,5,7,4,5,5,6,5,6,5,6,6,2,2,4,5,4,4,7,6,6,6,7,6,5,7,7,3,3,6,5,8,7,8,6,8,6,6,6,7,6,10,6,6,5,3,5,3,5,6,3,5,6,5,6,5,3,5,6,2,2,5,3,9,6,6,6,6,3,5,3,6,5,7,5,5,5,3,2,3,5,2,2,5,5,6,7,2,5,4,7,3,6,6,4,7,3,5,3,3,3,6,6,2,3,2,4,6,7,7,9,4,6,6,6,6,6,6,9,6,6,6,6,6,3,3,3,3,7,7,8,8,8,8,8,4,8,7,7,7,7,6,6,6,5,5,5,5,5,5,8,5,5,5,5,5,2,2,2,2,5,6,6,6,6,6,6,6,6,6,6,6,6,5,6,5,6,5,2,11,9,6,5,6,5,5,4,2,4,4,3,5,5,6,2,2,2,4,4,4,4,5,3,7,12,3,3,4,3,3,3,3,3,3,4,2,3,3,4,3,3,3,4,3,7,7,5,5,6,5,5,6,6,2,2,5,6,7,6,7,7,5,7,5,5,5,6,6,8,6,5,5,9,4,0,11,13,3,2,3,4,8,6,9,7,2,3,3,5,5,2,5,2,6,8,4,6,6,6,6,6,6,7,6,2,2,4,6,4,5,8,7,7,7,8,6,6,7,8,3,3,6,6,9,8,8,6,8,7,6,6,8,7,11,7,6,6,4,6,4,6,6,3,5,6,5,6,6,4,5,6,2,2,5,3,10,6,6,6,6,4,5,4,6,6,8,6,6,5,3,3,3,5,2,2,5,6,7,7,3,5,5,8,4,7,7,5,8,4,5,3,3,3,7,7,3,3,2,4,7,8,8,10,5,7,7,7,7,7,7,10,7,6,6,6,6,3,3,3,3,8,8,8,8,8,8,8,5,8,8,8,8,8,6,6,6,5,5,5,5,5,5,9,5,6,6,6,6,2,2,2,2,6,6,6,6,6,6,6,7,6,6,6,6,6,6,6,6,7,5,2,12,10,6,5,6,6,5,4,2,5,5,3,6,6,7,2,2,2,4,4,5,5,5,3,7,13,4,4,4,4,3,4,3,4,4,5,3,4,4,4,4,4,4,4,4,8,8,6,6,7,5,5,6,7,3,3,6,6,8,7,8,8,6,8,6,6,5,7,6,9,6,6,6,10,5,0,12,14,3,3,3,5,8,6,10,7,2,3,3,5,6,3,5,2,6,9,4,6,7,7,6,7,6,7,7,2,3,5,6,5,5,9,7,7,7,9,7,6,8,9,3,3,7,6,10,8,9,7,9,7,7,6,9,8,12,7,7,7,4,6,4,6,7,4,6,7,5,7,6,4,6,7,3,3,6,3,11,7,7,7,7,4,5,4,7,6,9,6,6,6,4,3,4,5,3,3,6,6,8,8,3,5,5,9,4,7,7,5,9,4,6,4,4,4,7,7,3,4,3,4,7,9,9,11,5,7,7,7,7,7,7,10,7,7,7,7,7,3,3,3,3,9,8,9,9,9,9,9,5,9,9,9,9,9,7,7,7,6,6,6,6,6,6,10,5,6,6,6,6,3,3,3,3,6,7,7,7,7,7,7,7,7,7,7,7,7,6,7,6,7,5,3,13,11,7,5,7,7,6,4,3,5,5,4,6,6,7,2,2,3,5,5,5,5,6,4,8,14,4,4,5,4,4,4,3,4,4,5,3,4,4,4,4,4,4,4,4,8,9,6,6,8,6,6,7,8,3,3,6,7,9,7,8,9,6,8,6,6,6,8,7,10,6,6,6,11,5,0,13,16,3,3,3,5,9,7,11,8,2,3,3,6,6,3,6,3,7,9,5,7,7,7,7,7,7,8,7,3,3,5,7,5,6,9,8,8,8,9,7,7,9,9,3,3,8,7,11,9,10,7,10,8,8,7,9,9,13,8,7,7,4,7,4,7,7,4,6,7,6,7,7,4,7,7,3,3,6,3,11,7,7,7,7,4,6,4,7,6,9,6,7,6,4,3,4,6,3,3,6,7,8,9,3,6,5,9,5,7,8,6,9,4,6,4,4,4,8,8,3,4,3,5,7,9,9,12,6,8,8,8,8,8,8,11,8,7,7,7,7,3,3,3,3,9,9,10,10,10,10,10,6,10,9,9,9,9,7,7,7,6,6,6,6,6,6,10,6,7,7,7,7,3,3,3,3,7,7,7,7,7,7,7,8,7,7,7,7,7,7,7,7,8,6,3,14,11,8,6,7,7,6,5,3,6,6,4,7,7,8,2,2,3,5,5,6,6,6,4,9,16,4,4,5,4,4,4,4,5,4,6,3,4,4,5,4,5,4,5,5,9,9,7,7,8,6,6,8,8,3,3,7,7,9,8,9,10,7,9,7,7,6,8,7,11,7,7,6,12,6,0,14,17,4,3,3,6,10,7,12,9,3,4,4,6,6,3,6,3,7,10,5,7,8,8,8,8,7,9,8,3,3,6,7,6,6,10,9,8,9,10,8,7,9,10,3,4,8,7,11,10,11,8,11,8,8,7,10,9,14,8,8,8,5,7,5,7,8,4,7,8,6,8,7,5,7,8,3,3,6,3,13,8,8,8,8,5,6,5,7,7,10,7,7,7,4,3,4,6,3,3,7,7,9,9,3,6,6,10,5,8,8,6,10,5,7,4,4,4,8,9,3,4,3,5,8,10,10,12,6,9,9,9,9,9,9,12,9,8,8,8,8,3,3,3,3,10,10,11,11,11,11,11,6,11,10,10,10,10,8,8,8,7,7,7,7,7,7,11,6,7,7,7,7,3,3,3,3,7,8,8,8,8,8,8,8,8,7,7,7,7,7,8,7,9,6,3,15,13,8,6,8,8,7,5,3,6,6,4,7,7,8,3,2,3,6,5,6,6,6,4,9,17,5,5,6,5,4,5,4,5,5,6,3,5,5,5,5,5,5,5,5,10,10,7,8,9,7,6,8,9,3,3,7,7,10,9,10,10,7,10,8,7,7,9,8,12,8,7,7,13,6,0,15,18,4,3,4,6,11,8,13,9,3,4,4,6,7,3,6,3,8,11,5,8,8,8,8,9,8,9,9,3,3,6,8,6,7,11,9,9,9,11,8,8,10,11,4,4,9,8,12,11,12,9,12,9,9,8,11,10,15,9,9,8,5,8,5,8,8,5,7,8,7,8,8,5,7,8,3,3,7,4,13,8,8,8,8,5,6,5,8,7,11,7,8,7,4,3,4,7,3,3,7,8,9,10,3,7,6,11,5,8,9,6,11,5,7,5,5,5,9,9,4,5,3,6,8,11,11,13,7,9,9,9,9,9,9,13,9,8,8,8,8,4,4,4,4,11,11,12,12,12,12,12,7,12,11,11,11,11,9,9,8,7,7,7,7,7,7,12,7,8,8,8,8,3,3,3,3,8,8,8,8,8,8,8,9,9,8,8,8,8,8,8,8,9,7,3,16,13,9,6,9,8,7,5,3,7,7,4,8,8,9,3,3,3,6,6,7,6,7,5,10,18,5,5,6,5,5,5,4,5,5,6,4,5,5,5,5,5,5,6,5,11,11,8,8,9,7,7,9,10,4,4,8,8,11,9,10,11,8,10,8,8,7,9,8,13,8,8,7,14,7,0,16,19,4,4,4,6,11,8,13,10,3,4,4,7,7,3,7,3,9,11,6,8,9,9,9,9,8,10,9,3,3,6,8,6,7,12,10,10,10,12,9,8,11,12,4,4,9,8,13,11,12,9,12,10,9,9,12,10,16,10,9,9,5,8,5,8,9,5,8,9,7,9,8,5,8,9,3,3,7,4,14,9,9,9,9,5,7,5,8,8,12,8,8,8,5,4,5,7,4,4,8,8,10,11,4,7,7,12,6,9,10,7,12,5,8,5,5,5,9,10,4,5,3,6,9,11,12,14,7,10,10,10,10,10,10,14,10,9,9,9,9,4,4,4,4,12,11,12,12,12,12,12,7,12,12,12,12,12,9,9,9,8,8,8,8,8,8,13,7,8,8,8,8,3,3,3,3,8,9,9,9,9,9,9,9,9,8,8,8,8,8,9,8,10,7,3,17,14,9,7,9,9,8,6,3,7,7,5,8,8,10,3,3,3,6,6,7,7,7,5,11,19,5,5,7,5,5,5,5,6,5,7,4,5,5,6,5,6,5,6,6,11,12,9,9,10,8,7,9,10,4,4,8,9,11,10,11,12,8,11,9,8,7,10,9,13,9,8,8,15,7,0,17,20,4,4,4,7,12,9,14,10,3,4,4,7,8,4,7,3,9,12,6,9,9,10,9,10,9,10,10,3,4,7,9,7,8,12,10,10,10,12,9,9,11,13,4,4,10,9,14,12,13,10,13,10,10,9,12,11,17,10,10,9,6,9,6,9,10,5,8,9,8,9,9,6,8,10,4,4,8,4,15,10,9,9,9,5,7,6,9,8,12,8,9,8,5,4,5,8,4,4,8,9,11,11,4,8,7,12,6,10,10,7,12,6,8,5,5,5,10,11,4,5,4,6,10,12,12,15,8,10,10,10,10,10,10,15,10,9,9,9,9,4,4,4,4,12,12,13,13,13,13,13,7,13,12,12,12,12,10,10,9,8,8,8,8,8,8,14,8,9,9,9,9,4,4,4,4,9,10,9,9,9,9,9,10,9,9,9,9,9,9,9,9,10,8,4,18,15,10,7,10,9,8,6,4,8,8,5,9,9,10,3,3,4,7,6,8,7,8,5,11,20,5,5,7,6,5,5,5,6,6,7,4,6,6,6,6,6,6,6,6,12,12,9,9,11,8,8,10,11,4,4,9,9,12,10,11,13,9,11,9,9,8,11,10,14,9,9,8,16,7,0,18,22,5,4,4,7,13,9,15,11,3,5,5,8,8,4,8,4,10,13,6,9,10,10,10,10,9,11,10,4,4,7,9,7,8,13,11,11,11,13,10,9,12,13,5,5,10,9,15,13,14,10,14,11,11,10,13,12,18,11,10,10,6,9,6,9,10,5,9,10,8,10,9,6,9,10,4,4,8,4,16,10,10,10,10,6,7,6,9,9,13,9,9,8,5,4,5,8,4,4,9,9,11,12,4,8,8,13,6,10,11,8,13,6,9,5,6,5,11,11,4,5,4,7,10,13,13,16,8,11,11,11,11,11,11,16,11,10,10,10,10,5,5,5,5,13,13,14,14,14,14,14,8,14,13,13,13,13,10,10,10,9,9,9,9,9,9,14,8,9,9,9,9,4,4,4,4,9,10,10,10,10,10,10,11,10,9,9,9,9,9,10,9,11,8,4,19,16,11,7,10,10,8,6,4,8,8,5,10,9,11,3,3,4,7,7,8,8,8,6,12,22,6,6,7,6,6,6,5,6,6,8,4,6,6,6,6,6,6,7,6,13,13,10,10,11,9,8,11,12,4,4,9,10,13,11,12,13,9,12,10,9,8,11,10,15,10,9,9,17,8,0,19,23,5,4,5,8,13,10,16,12,3,5,5,8,9,4,8,4,10,14,7,10,10,11,10,11,10,12,11,4,4,8,10,8,8,14,12,11,12,14,11,10,13,14,5,5,11,10,15,13,15,11,15,11,11,10,14,12,18,11,11,10,6,10,6,10,11,6,9,11,9,11,10,6,9,11,4,4,9,5,17,11,10,11,11,6,8,6,10,9,14,9,10,9,6,4,6,9,4,4,9,10,12,13,4,9,8,14,7,11,11,8,14,6,9,6,6,6,11,12,5,6,4,7,11,14,14,17,9,12,12,12,12,12,12,16,12,11,11,11,11,5,5,5,5,14,13,15,15,15,15,15,8,15,14,14,14,14,11,11,11,9,9,9,9,9,9,15,9,10,10,10,10,4,4,4,4,10,11,10,10,10,10,10,11,11,10,10,10,10,10,11,10,12,9,4,20,17,11,8,11,10,9,7,4,8,8,6,10,10,11,4,3,4,8,7,8,8,9,6,13,23,6,6,8,6,6,6,6,7,6,8,5,6,6,7,6,7,6,7,7,13,14,10,10,12,9,9,11,12,5,5,10,10,14,12,13,14,10,13,10,10,9,12,11,16,10,10,9,18,8,0,20,24,5,5,5,8,14,10,17,12,4,5,5,9,9,4,8,4,11,14,7,10,11,11,11,11,10,12,11,4,4,8,10,8,9,14,12,12,12,15,11,10,13,15,5,5,12,10,16,14,15,11,15,12,12,11,14,13,20,12,11,11,7,11,7,10,11,6,10,11,9,11,10,7,10,11,4,4,9,5,18,11,11,11,11,6,8,7,10,10,15,9,10,9,6,5,6,9,5,4,10,10,13,13,5,9,8,14,7,11,12,8,14,7,10,6,6,6,12,12,5,6,4,7,11,14,15,18,9,12,12,12,12,12,12,17,12,11,11,11,11,5,5,5,5,15,14,15,15,15,15,15,9,15,15,15,15,15,11,11,11,10,10,10,10,10,10,16,9,10,10,10,10,4,4,4,4,10,11,11,11,11,11,11,12,11,10,10,10,10,10,12,10,12,9,4,21,18,12,8,11,11,9,7,4,9,9,6,11,10,12,4,3,4,8,8,9,8,9,6,14,24,6,6,8,7,6,6,6,7,6,9,5,7,7,7,7,7,7,7,7,14,15,11,11,13,10,9,12,13,5,5,11,11,14,12,13,15,10,13,11,10,9,13,11,17,11,10,10,18,9,0,21,25,5,5,5,8,15,11,18,13,4,5,5,9,10,5,9,4,11,15,7,11,11,12,11,12,11,13,12,4,5,9,11,8,9,15,13,13,13,15,12,11,14,16,5,5,12,11,17,15,16,12,16,13,12,11,15,14,20,13,12,12,7,11,7,11,12,6,10,12,10,12,11,7,10,12,4,4,9,5,18,12,12,12,12,7,9,7,11,10,15,10,11,10,6,5,6,10,5,5,10,11,13,14,5,10,9,15,7,12,13,9,15,7,10,6,7,6,12,13,5,6,5,8,12,15,15,19,9,13,13,13,13,13,13,18,13,12,12,12,12,5,5,5,5,15,15,16,16,16,16,16,9,16,15,15,15,15,12,12,12,10,10,10,10,10,10,17,10,11,11,11,11,4,4,4,4,11,12,12,12,12,12,12,12,12,11,11,11,11,11,12,11,13,10,4,22,19,12,9,12,12,10,7,4,9,9,6,11,11,12,4,4,5,8,8,9,9,10,6,14,25,7,7,9,7,6,7,6,7,7,9,5,7,7,8,7,7,7,8,7,15,15,11,11,13,10,10,12,14,5,5,11,11,15,13,14,16,11,14,11,11,10,13,12,18,11,11,10,19,9,0,22,26,6,5,5,9,15,11,18,13,4,6,6,9,10,5,9,4,12,16,8,12,12,12,12,13,11,13,13,4,5,9,11,9,10,16,14,13,14,16,12,12,15,16,6,6,13,11,18,15,17,13,17,13,13,12,16,14,21,13,12,12,7,12,7,11,12,7,11,12,10,12,11,7,11,12,5,5,10,5,19,12,12,12,12,7,9,7,12,11,16,10,11,10,7,5,7,10,5,5,11,11,14,15,5,10,9,16,8,12,13,9,16,7,11,7,7,7,13,14,5,7,5,8,12,16,16,19,10,14,14,14,14,14,14,19,14,12,12,12,12,6,6,6,6,16,15,17,17,17,17,17,10,17,16,16,16,16,12,13,12,11,11,11,11,11,11,18,10,11,11,11,11,5,5,5,5,11,12,12,12,12,12,12,13,13,12,12,12,12,11,13,11,14,10,5,24,20,13,9,12,12,10,8,5,10,10,6,12,11,13,4,4,5,9,8,10,9,10,7,15,26,7,7,9,7,7,7,6,8,7,9,5,7,7,8,7,8,7,8,8,15,16,12,12,14,11,10,13,14,5,5,12,12,16,14,15,16,11,15,12,11,10,14,12,18,12,11,11,20,10,0,23,28,6,5,6,9,16,12,19,14,4,6,6,10,11,5,10,5,12,16,8,12,13,13,12,13,12,14,13,5,5,9,12,9,10,17,14,14,14,17,13,12,15,17,6,6,13,12,19,16,18,13,18,14,13,12,17,15,22,14,13,13,8,12,8,12,13,7,11,13,10,13,12,8,11,13,5,5,10,5,20,13,13,13,13,7,10,8,12,11,17,11,12,11,7,5,7,10,5,5,11,12,14,16,5,10,10,17,8,13,14,10,17,8,11,7,7,7,14,14,5,7,5,9,13,16,17,20,10,14,14,14,14,14,14,20,14,13,13,13,13,6,6,6,6,17,16,18,18,18,18,18,10,18,17,17,17,17,13,13,13,11,11,11,11,11,11,18,10,12,12,12,12,5,5,5,5,12,13,13,13,13,13,13,14,13,12,12,12,12,12,13,12,14,10,5,25,21,13,10,13,13,11,8,5,10,10,7,12,12,14,4,4,5,9,9,10,10,11,7,16,28,7,7,9,8,7,7,7,8,7,10,5,8,8,8,8,8,8,9,8,16,17,12,12,14,11,11,13,15,6,6,12,12,16,14,15,17,12,15,12,12,11,14,13,19,12,12,11,21,10,0,24,29,6,5,6,10,17,12,20,15,4,6,6,10,11,5,10,5,13,17,9,13,13,13,13,14,12,15,14,5,5,10,12,10,11,17,15,14,15,17,13,13,16,18,6,6,14,12,19,17,18,14,18,14,14,13,17,15,23,14,14,13,8,13,8,12,14,7,12,13,11,13,12,8,12,13,5,5,11,6,21,13,13,13,13,8,10,8,13,12,17,11,12,11,7,6,7,11,5,5,11,12,15,16,6,11,10,17,8,14,14,10,17,8,12,7,7,7,14,15,6,7,5,9,14,17,18,21,11,15,15,15,15,15,15,21,15,13,13,13,13,6,6,6,6,17,17,18,18,18,18,18,11,18,17,17,17,17,14,14,13,12,12,12,12,12,12,19,11,12,12,12,12,5,5,5,5,12,13,13,13,13,13,13,14,14,13,13,13,13,12,14,12,15,11,5,26,21,14,10,14,13,11,8,5,11,11,7,13,12,14,4,4,5,10,9,11,10,11,7,16,29,8,8,10,8,7,8,7,8,8,10,6,8,8,9,8,8,8,9,8,17,17,13,13,15,12,11,14,16,6,6,13,13,17,15,16,18,12,16,13,12,11,15,13,20,13,12,12,22,11,0,25,30,6,6,6,10,18,13,21,15,5,7,7,11,12,5,11,5,13,18,9,13,14,14,14,14,13,15,14,5,5,10,13,10,11,18,15,15,15,18,14,13,17,19,6,6,14,13,20,18,19,14,19,15,15,13,18,16,24,15,14,14,8,13,8,13,14,8,12,14,11,14,13,8,12,14,5,5,11,6,22,14,14,14,14,8,10,8,13,12,18,12,13,12,7,6,7,11,6,6,12,13,16,17,6,11,11,18,9,14,15,11,18,8,12,8,8,8,15,16,6,8,5,9,14,18,18,22,11,15,15,15,15,15,15,22,15,14,14,14,14,6,6,6,6,18,18,19,19,19,19,19,11,19,18,18,18,18,14,14,14,12,12,12,12,12,12,20,11,13,13,13,13,5,5,5,5,13,14,14,14,14,14,14,15,14,13,13,13,13,13,15,13,15,11,5,27,23,15,10,14,14,12,9,5,11,11,7,13,13,15,5,4,5,10,9,11,11,12,8,17,30,8,8,10,8,8,8,7,9,8,11,6,8,8,9,8,9,8,9,9,18,18,13,13,16,12,11,15,16,6,6,13,13,18,15,17,19,13,17,13,13,12,16,14,21,14,13,12,23,11,0,26,31,7,6,6,10,18,13,22,16,5,7,7,11,12,6,11,5,14,19,9,14,14,15,14,15,13,16,15,5,6,11,13,11,11,19,16,16,16,19,14,14,17,19,7,7,15,13,21,18,20,15,20,16,15,14,19,17,25,16,15,14,9,14,9,13,15,8,12,14,12,14,13,9,13,14,6,6,12,6,23,15,14,14,14,8,11,9,14,13,19,12,13,12,8,6,8,12,6,6,12,13,16,18,6,12,11,19,9,15,16,11,19,9,13,8,8,8,15,16,6,8,6,10,15,19,19,23,12,16,16,16,16,16,16,22,16,14,14,14,14,7,7,7,7,19,18,20,20,20,20,20,11,20,19,19,19,19,15,15,14,12,12,12,12,12,12,21,12,13,13,13,13,6,6,6,6,13,15,14,14,14,14,14,15,15,14,14,14,14,13,15,13,16,12,6,28,23,15,11,15,14,12,9,6,12,12,8,14,13,15,5,4,6,10,10,12,11,12,8,18,31,8,8,11,9,8,8,8,9,8,11,6,9,9,9,9,9,9,10,9,18,19,14,14,16,13,12,15,17,6,6,14,14,19,16,17,19,13,17,14,13,12,16,15,22,14,13,13,24,11,0,27,32,7,6,7,11,19,14,23,17,5,7,7,12,13,6,11,6,14,19,10,14,15,15,15,15,14,16,15,6,6,11,14,11,12,20,17,16,17,20,15,14,18,20,7,7,16,14,22,19,21,15,21,16,16,14,20,17,26,16,15,15,9,14,9,14,15,8,13,15,12,15,14,9,13,15,6,6,12,6,24,15,15,15,15,9,11,9,14,13,20,13,14,13,8,6,8,12,6,6,13,14,17,18,6,12,11,19,9,15,16,11,19,9,13,8,8,8,16,17,6,8,6,10,15,19,20,24,12,17,17,17,17,17,17,23,17,15,15,15,15,7,7,7,7,20,19,21,21,21,21,21,12,21,20,20,20,20,15,15,15,13,13,13,13,13,13,22,12,14,14,14,14,6,6,6,6,14,15,15,15,15,15,15,16,15,14,14,14,14,14,16,14,17,12,6,29,24,16,11,15,15,13,9,6,12,12,8,14,14,16,5,5,6,11,10,12,11,12,8,18,32,9,9,11,9,8,9,8,9,9,12,6,9,9,10,9,9,9,10,9,19,20,14,15,17,13,12,16,17,7,7,14,14,19,17,18,20,14,18,15,14,13,17,15,23,15,14,13,25,12,0,28,34,7,6,7,11,20,14,24,17,5,7,7,12,13,6,12,6,15,20,10,15,15,16,15,16,14,17,16,6,6,11,14,11,12,20,17,17,17,20,16,15,19,21,7,7,16,14,23,20,22,16,22,17,16,15,20,18,27,17,16,15,9,15,9,14,16,8,13,16,13,16,14,9,14,15,6,6,13,7,25,16,15,16,16,9,12,9,15,14,20,13,14,13,8,6,8,13,6,6,13,14,18,19,7,13,12,20,10,16,17,12,20,9,14,9,9,8,17,17,7,8,6,10,16,20,20,25,13,17,17,17,17,17,17,24,17,16,16,16,16,7,7,7,7,20,20,22,22,22,22,22,12,22,20,20,20,20,16,16,16,13,13,13,13,13,13,22,13,14,14,14,14,6,6,6,6,14,16,15,15,15,15,15,17,16,15,15,15,15,14,16,14,17,13,6,30,25,16,12,16,15,13,10,6,12,12,8,15,14,17,5,5,6,11,11,12,12,13,9,19,34,9,9,11,9,9,9,8,10,9,12,7,9,9,10,9,10,9,10,10,20,20,15,15,18,14,13,16,18,7,7,15,15,20,17,19,21,14,19,15,14,13,18,16,23,15,14,14,26,12,0,29,35,7,7,7,12,20,15,24,18,5,8,8,12,13,6,12,6,15,21,10,15,16,16,16,16,15,18,17,6,6,12,15,12,13,21,18,17,18,21,16,15,19,22,7,7,17,15,24,20,22,17,22,17,17,15,21,19,28,17,16,16,9,15,9,15,16,9,14,16,13,16,15,10,14,16,6,6,13,7,25,16,16,16,16,9,12,10,15,14,21,14,15,14,9,7,9,13,7,7,14,15,18,20,7,13,12,21,10,16,17,12,21,10,14,9,9,9,17,18,7,9,6,11,16,21,21,26,13,18,18,18,18,18,18,25,18,16,16,16,16,7,7,7,7,21,20,22,22,22,22,22,13,22,21,21,21,21,16,17,16,14,14,14,14,14,14,23,13,15,15,15,15,6,6,6,6,15,16,16,16,16,16,16,17,17,15,15,15,15,15,17,15,18,13,6,31,26,17,12,16,16,14,10,6,13,13,8,15,15,17,5,5,6,11,11,13,12,13,9,20,35,9,9,12,10,9,9,8,10,9,13,7,10,10,10,10,10,10,11,10,20,21,16,16,18,14,13,17,19,7,7,15,15,21,18,19,22,15,19,16,15,14,18,16,24,16,15,14,27,13,0,30,36,8,7,7,12,21,15,25,18,5,8,8,13,14,6,13,6,16,21,11,16,16,17,16,17,15,18,17,6,6,12,15,12,13,22,18,18,18,22,17,16,20,22,8,8,17,15,24,21,23,17,23,18,18,16,22,19,29,18,17,16,10,16,10,15,17,9,14,17,14,17,15,10,15,16,6,6,13,7,26,17,17,17,17,10,12,10,16,15,22,14,15,14,9,7,9,14,7,7,14,15,19,20,7,14,13,22,10,17,18,13,22,10,15,9,9,9,18,19,7,9,6,11,17,22,22,27,13,18,18,18,18,18,18,26,18,17,17,17,17,8,8,8,8,22,21,23,23,23,23,23,13,23,22,22,22,22,17,17,17,14,14,14,14,14,14,24,14,15,15,15,15,6,6,6,6,16,17,17,17,17,17,17,18,17,16,16,16,16,15,17,15,18,14,6,32,27,18,12,17,16,14,11,6,13,13,9,16,15,18,6,5,6,12,11,13,13,14,9,20,36,10,10,12,10,9,10,9,10,10,13,7,10,10,11,10,10,10,11,10,21,22,16,16,19,15,14,17,19,7,7,16,16,21,18,20,22,15,20,16,15,14,19,17,25,16,15,14,28,13,0,31,37,8,7,8,12,22,16,26,19,6,8,8,13,14,7,13,6,16,22,11,16,17,17,17,18,16,19,18,6,7,13,16,13,14,22,19,19,19,23,17,16,21,23,8,8,18,16,25,22,24,18,24,19,18,17,22,20,30,19,18,17,10,16,10,16,18,9,15,17,14,17,16,10,15,17,7,7,14,7,27,17,17,17,17,10,13,10,16,15,22,15,16,15,9,7,9,14,7,7,15,16,19,21,7,14,13,22,11,17,18,13,22,10,15,9,10,9,18,19,7,9,7,11,17,22,23,27,14,19,19,19,19,19,19,27,19,17,17,17,17,8,8,8,8,23,22,24,24,24,24,24,14,24,23,23,23,23,18,18,17,15,15,15,15,15,15,25,14,16,16,16,16,7,7,7,7,16,17,17,17,17,17,17,18,18,16,16,16,16,16,18,16,19,14,7,33,28,18,13,18,17,15,11,7,14,14,9,16,16,18,6,5,7,12,12,14,13,14,9,21,37,10,10,13,10,10,10,9,11,10,13,7,10,10,11,10,11,10,12,11,22,23,17,17,20,15,14,18,20,7,7,16,17,22,19,21,23,16,21,17,16,15,19,17,26,17,16,15,29,14,0,32,38,8,7,8,13,23,16,27,20,6,8,8,14,15,7,14,7,17,23,11,17,18,18,17,18,16,19,18,7,7,13,16,13,14,23,20,19,20,23,18,17,22,24,8,8,18,16,26,23,25,18,25,19,19,17,23,21,31,19,18,18,10,17,10,16,18,10,15,18,15,18,16,11,16,17,7,7,14,8,28,18,18,18,18,10,13,11,17,16,23,15,16,15,10,7,10,15,7,7,15,16,20,22,7,15,14,23,11,18,19,14,23,11,16,10,10,10,19,20,8,10,7,12,18,23,23,28,14,20,20,20,20,20,20,28,20,18,18,18,18,8,8,8,8,23,23,25,25,25,25,25,14,25,23,23,23,23,18,18,18,15,15,15,15,15,15,26,15,16,16,16,16,7,7,7,7,17,18,18,18,18,18,18,19,18,17,17,17,17,16,19,16,20,15,7,34,29,19,13,18,18,15,11,7,14,14,9,17,16,19,6,5,7,13,12,14,14,15,10,22,38,10,10,13,11,10,10,9,11,10,14,8,11,11,11,11,11,11,12,11,23,23,17,17,20,16,15,19,21,8,8,17,17,23,20,21,24,16,21,17,16,15,20,18,27,17,16,15,29,14,0,33,40,8,7,8,13,23,17,28,20,6,9,9,14,15,7,14,7,18,24,12,17,18,18,18,19,17,20,19,7,7,13,17,13,15,24,20,20,20,24,18,17,22,25,8,8,19,17,27,23,25,19,25,20,19,18,24,21,32,20,19,18,11,17,11,17,19,10,16,18,15,18,17,11,16,18,7,7,15,8,29,18,18,18,18,11,14,11,17,16,24,16,17,16,10,8,10,15,7,7,16,17,21,22,8,15,14,24,12,19,20,14,24,11,16,10,10,10,20,21,8,10,7,12,19,24,24,29,15,20,20,20,20,20,20,29,20,18,18,18,18,8,8,8,8,24,23,25,25,25,25,25,14,25,24,24,24,24,19,19,18,16,16,16,16,16,16,26,15,17,17,17,17,7,7,7,7,17,18,18,18,18,18,18,20,19,17,17,17,17,17,19,17,20,15,7,35,30,19,14,19,18,16,12,7,15,15,10,17,17,20,6,6,7,13,13,15,14,15,10,22,40,11,11,13,11,10,11,10,11,11,14,8,11,11,12,11,11,11,12,11,23,24,18,18,21,16,15,19,21,8,8,17,18,24,20,22,24,17,22,18,17,16,21,19,28,18,17,16,30,15,0,34,41,9,8,8,14,24,17,29,21,6,9,9,14,16,7,14,7,18,24,12,18,19,19,18,19,17,21,19,7,7,14,17,14,15,25,21,20,21,25,19,18,23,25,9,9,20,17,28,24,26,19,26,21,20,18,25,22,33,20,19,19,11,18,11,17,19,10,16,19,15,19,17,11,17,18,7,7,15,8,30,19,19,19,19,11,14,11,18,17,25,16,17,16,10,8,10,15,8,8,16,17,21,23,8,16,14,24,12,19,20,14,24,11,17,10,11,10,20,21,8,10,7,13,19,24,25,30,15,21,21,21,21,21,21,29,21,19,19,19,19,9,9,9,9,25,24,26,26,26,26,26,15,26,25,25,25,25,19,19,19,16,16,16,16,16,16,27,15,17,17,17,17,7,7,7,7,18,19,19,19,19,19,19,20,19,18,18,18,18,17,20,17,21,15,7,36,31,20,14,19,19,16,12,7,15,15,10,18,17,20,6,6,7,13,13,15,14,16,10,23,41,11,11,14,11,10,11,10,12,11,15,8,11,11,12,11,12,11,13,12,24,25,18,18,21,17,16,20,22,8,8,18,18,24,21,23,25,17,23,18,17,16,21,19,28,18,17,16,31,15,0,35,42,9,8,8,14,25,18,29,21,6,9,9,15,16,8,15,7,19,25,12,18,19,20,19,20,18,21,20,7,8,14,18,14,15,25,22,21,22,25,19,18,24,26,9,9,20,18,28,25,27,20,27,21,20,19,25,23,34,21,20,19,11,18,11,18,20,11,17,19,16,19,18,12,17,19,7,7,16,8,31,20,19,20,20,11,14,12,18,17,25,17,18,16,10,8,10,16,8,8,17,18,22,24,8,16,15,25,12,20,21,15,25,12,17,11,11,11,21,22,8,11,8,13,20,25,26,31,16,22,22,22,22,22,22,30,22,19,19,19,19,9,9,9,9,25,25,27,27,27,27,27,15,27,25,25,25,25,20,20,20,17,17,17,17,17,17,28,16,18,18,18,18,7,7,7,7,18,20,19,19,19,19,19,21,20,18,18,18,18,18,20,18,22,16,7,37,32,20,14,20,19,16,12,7,16,16,10,18,18,21,7,6,8,14,13,16,15,16,11,24,42,11,11,14,12,11,11,10,12,11,15,8,12,12,13,12,12,12,13,12,25,25,19,19,22,17,16,20,23,8,8,18,19,25,21,23,26,18,23,19,18,16,22,20,29,19,18,17,32,15,0,36,43,9,8,9,14,25,19,30,22,7,9,9,15,17,8,15,7,19,26,13,19,20,20,19,20,18,22,21,7,8,15,18,15,16,26,22,21,22,26,20,19,24,27,9,9,21,18,29,25,28,21,28,22,21,19,26,23,35,22,20,20,12,19,12,18,20,11,17,20,16,20,18,12,18,20,8,8,16,9,32,20,20,20,20,12,15,12,19,18,26,17,18,17,11,8,11,16,8,8,17,18,23,24,8,16,15,26,13,20,21,15,26,12,18,11,11,11,21,22,9,11,8,13,20,26,26,32,16,22,22,22,22,22,22,31,22,20,20,20,20,9,9,9,9,26,25,28,28,28,28,28,16,28,26,26,26,26,20,21,20,17,17,17,17,17,17,29,16,18,18,18,18,8,8,8,8,19,20,20,20,20,20,20,21,21,19,19,19,19,18,21,18,22,16,8,39,32,21,15,20,20,17,13,8,16,16,11,19,18,21,7,6,8,14,14,16,15,17,11,24,43,12,12,15,12,11,12,10,12,12,16,9,12,12,13,12,12,12,13,12,25,26,19,19,23,18,17,21,23,9,9,19,19,26,22,24,27,18,24,19,18,17,23,20,30,19,18,17,33,16,0,37,44,9,8,9,15,26,19,31,23,7,10,10,16,17,8,16,8,20,26,13,19,20,21,20,21,19,23,21,8,8,15,19,15,16,27,23,22,23,27,21,19,25,28,9,9,21,19,30,26,28,21,28,22,22,20,27,24,36,22,21,20,12,19,12,19,21,11,18,21,17,21,19,12,18,20,8,8,17,9,32,21,20,21,21,12,15,12,19,18,27,18,19,17,11,8,11,17,8,8,18,19,23,25,9,17,16,27,13,21,22,16,27,12,18,11,11,11,22,23,9,11,8,14,21,27,27,33,17,23,23,23,23,23,23,32,23,21,21,21,21,9,9,9,9,27,26,28,28,28,28,28,16,28,27,27,27,27,21,21,21,18,18,18,18,18,18,30,17,19,19,19,19,8,8,8,8,19,21,20,20,20,20,20,22,21,19,19,19,19,19,21,19,23,17,8,40,33,22,15,21,20,17,13,8,17,17,11,20,19,22,7,6,8,15,14,17,16,17,11,25,44,12,12,15,12,11,12,11,13,12,16,9,12,12,13,12,13,12,14,13,26,27,20,20,23,18,17,22,24,9,9,19,20,26,23,25,27,19,25,20,19,17,23,21,31,20,19,18,34,16,0,38,46,10,9,9,15,27,20,32,23,7,10,10,16,18,8,16,8,20,27,13,20,21,21,21,22,19,23,22,8,8,15,19,15,17,27,23,23,23,28,21,20,26,28,10,10,22,19,31,27,29,22,29,23,22,20,28,24,37,23,22,21,12,20,12,19,22,12,18,21,17,21,19,13,19,21,8,8,17,9,33,21,21,21,21,12,16,13,20,19,28,18,19,18,11,9,11,17,9,9,18,19,24,26,9,17,16,27,13,21,23,16,27,13,19,12,12,12,22,24,9,12,8,14,21,27,28,34,17,23,23,23,23,23,23,33,23,21,21,21,21,10,10,10,10,28,27,29,29,29,29,29,17,29,28,28,28,28,22,22,21,18,18,18,18,18,18,30,17,19,19,19,19,8,8,8,8,20,21,21,21,21,21,21,23,22,20,20,20,20,19,22,19,23,17,8,41,34,22,16,22,21,18,13,8,17,17,11,20,19,23,7,6,8,15,14,17,16,17,12,26,46,12,12,15,13,12,12,11,13,12,16,9,13,13,14,13,13,13,14,13,27,28,20,20,24,19,17,22,25,9,9,20,20,27,23,25,28,19,25,20,19,18,24,21,32,21,19,18,35,17,0,39,47,10,9,9,16,27,20,33,24,7,10,10,17,18,8,17,8,21,28,14,20,21,22,21,22,20,24,22,8,8,16,20,16,17,28,24,23,24,28,22,20,26,29,10,10,23,20,32,27,30,22,30,24,23,21,28,25,38,23,22,21,13,20,13,20,22,12,19,22,18,22,20,13,19,21,8,8,17,9,34,22,21,22,22,13,16,13,20,19,28,18,20,18,12,9,12,18,9,9,19,20,24,26,9,18,16,28,14,22,23,17,28,13,19,12,12,12,23,24,9,12,8,14,22,28,28,35,18,24,24,24,24,24,24,34,24,22,22,22,22,10,10,10,10,28,27,30,30,30,30,30,17,30,28,28,28,28,22,22,22,19,19,19,19,19,19,31,18,20,20,20,20,8,8,8,8,20,22,21,21,21,21,21,23,22,20,20,20,20,20,23,20,24,18,8,42,35,23,16,22,21,18,14,8,17,17,11,21,20,23,7,7,8,15,15,17,17,18,12,26,47,13,13,16,13,12,13,11,14,13,17,9,13,13,14,13,14,13,15,14,27,28,21,21,25,19,18,23,25,9,9,20,21,28,24,26,29,20,26,21,20,18,24,22,33,21,20,19,36,17,0,40,48,10,9,10,16,28,21,34,24,7,10,10,17,19,9,17,8,21,29,14,21,22,22,22,23,20,24,23,8,9,16,20,16,18,29,25,24,25,29,22,21,27,30,10,10,23,20,32,28,31,23,31,24,23,21,29,26,39,24,23,22,13,21,13,20,23,12,19,22,18,22,20,13,20,22,8,8,18,9,35,22,22,22,22,13,17,13,21,20,29,19,20,19,12,9,12,18,9,9,19,20,25,27,9,18,17,29,14,23,24,17,29,13,20,12,12,12,24,25,10,12,9,15,23,29,29,35,18,25,25,25,25,25,25,35,25,22,22,22,22,10,10,10,10,29,28,31,31,31,31,31,18,31,29,29,29,29,23,23,22,19,19,19,19,19,19,32,18,20,20,20,20,8,8,8,8,21,22,22,22,22,22,22,24,23,21,21,21,21,20,23,20,25,18,8,43,36,23,17,23,22,19,14,8,18,18,12,21,20,24,7,7,9,16,15,18,17,18,12,27,48,13,13,16,13,12,13,12,14,13,17,9,13,13,14,13,14,13,15,14,28,29,21,21,25,20,18,23,26,10,10,21,21,28,25,27,30,20,27,21,20,19,25,22,33,22,20,19,37,18,0,41,49,10,9,10,16,29,21,34,25,7,11,11,17,19,9,17,8,22,29,15,21,22,23,22,23,21,25,23,8,9,17,21,17,18,30,25,24,25,30,23,21,28,31,10,10,24,21,33,29,31,23,31,25,24,22,30,26,40,25,23,23,13,22,13,21,23,12,20,23,19,23,21,14,20,22,9,9,18,10,36,23,23,23,23,13,17,14,21,20,30,19,21,19,12,9,12,19,9,9,20,21,26,28,10,19,17,30,14,23,24,17,30,14,20,12,13,12,24,26,10,12,9,15,23,29,30,36,18,25,25,25,25,25,25,35,25,23,23,23,23,10,10,10,10,30,29,31,31,31,31,31,18,31,30,30,30,30,23,23,23,20,20,20,20,20,20,33,19,21,21,21,21,9,9,9,9,21,23,23,23,23,23,23,24,23,21,21,21,21,21,24,21,25,19,9,44,37,24,17,23,23,19,14,9,18,18,12,22,21,24,8,7,9,16,16,18,17,19,13,28,49,13,13,17,14,13,13,12,14,13,18,10,14,14,15,14,14,14,15,14,29,30,22,22,26,20,19,24,26,10,10,22,22,29,25,27,30,21,27,22,21,19,26,23,34,22,21,20,38,18,0,42,50,11,9,10,17,30,22,35,26,8,11,11,18,19,9,18,9,22,30,15,22,23,23,23,24,21,26,24,9,9,17,21,17,19,30,26,25,26,31,23,22,28,31,11,11,24,21,34,30,32,24,32,25,25,22,30,27,41,25,24,23,14,22,14,21,24,13,20,23,19,23,22,14,21,23,9,9,19,10,37,23,23,23,23,13,17,14,22,21,30,20,21,20,13,10,13,19,9,9,20,21,26,28,10,19,18,30,15,24,25,18,30,14,21,13,13,13,25,26,10,13,9,16,24,30,31,37,19,26,26,26,26,26,26,36,26,23,23,23,23,11,11,11,11,31,30,32,32,32,32,32,18,32,30,30,30,30,24,24,23,20,20,20,20,20,20,34,19,22,22,22,22,9,9,9,9,22,23,23,23,23,23,23,25,24,22,22,22,22,21,24,21,26,19,9,45,38,25,17,24,23,20,15,9,19,19,12,22,21,25,8,7,9,17,16,19,18,19,13,28,50,14,14,17,14,13,14,12,15,14,18,10,14,14,15,14,15,14,16,15,30,31,22,23,26,21,19,24,27,10,10,22,22,30,26,28,31,21,28,23,21,20,26,24,35,23,21,20,39,18,0,43,52,11,10,10,17,30,22,36,26,8,11,11,18,20,9,18,9,23,31,15,23,24,24,23,24,22,26,25,9,9,17,22,17,19,31,26,26,26,31,24,22,29,32,11,11,25,22,35,30,33,25,33,26,25,23,31,28,42,26,24,24,14,23,14,22,24,13,21,24,20,24,22,14,21,23,9,9,19,10,38,24,24,24,24,14,18,14,23,21,31,20,22,20,13,10,13,20,10,10,21,22,27,29,10,20,18,31,15,24,26,18,31,14,21,13,13,13,25,27,10,13,9,16,24,31,31,38,19,26,26,26,26,26,26,37,26,24,24,24,24,11,11,11,11,31,30,33,33,33,33,33,19,33,31,31,31,31,24,25,24,21,21,21,21,21,21,34,20,22,22,22,22,9,9,9,9,22,24,24,24,24,24,24,25,25,23,23,23,23,22,25,22,26,20,9,46,39,25,18,24,24,20,15,9,19,19,13,23,22,26,8,7,9,17,16,19,18,20,13,29,52,14,14,18,14,13,14,12,15,14,19,10,14,14,15,14,15,14,16,15,30,31,23,23,27,21,20,25,28,10,10,23,23,31,26,29,32,22,29,23,22,20,27,24,36,23,22,21,40,19,0,44,53,11,10,11,18,31,23,37,27,8,11,11,19,20,10,19,9,23,31,16,23,24,25,24,25,22,27,25,9,10,18,22,18,19,32,27,26,27,32,24,23,30,33,11,11,25,22,36,31,34,25,34,27,26,23,32,28,43,26,25,24,14,23,14,22,25,13,21,24,20,24,23,15,22,24,9,9,20,10,39,25,24,25,25,14,18,15,23,22,32,21,22,21,13,10,13,20,10,10,21,22,28,30,10,20,19,32,15,25,26,19,32,15,22,13,14,13,26,27,10,13,10,16,25,32,32,39,20,27,27,27,27,27,27,38,27,24,24,24,24,11,11,11,11,32,31,34,34,34,34,34,19,34,32,32,32,32,25,25,25,21,21,21,21,21,21,35,20,23,23,23,23,9,9,9,9,23,25,24,24,24,24,24,26,25,23,23,23,23,22,26,22,27,20,9,47,40,26,18,25,24,21,15,9,20,20,13,23,22,26,8,7,10,17,17,20,19,20,13,30,53,14,14,18,15,14,14,13,15,14,19,10,15,15,16,15,15,15,16,15,31,32,24,24,28,22,20,26,28,11,11,23,24,31,27,29,33,22,29,24,22,21,28,25,37,24,22,21,41,19,0,45,54,11,10,11,18,32,23,38,28,8,12,12,19,21,10,19,9,24,32,16,24,25,25,24,26,23,27,26,9,10,18,23,18,20,32,28,27,28,33,25,24,30,34,11,11,26,23,37,32,35,26,35,27,26,24,33,29,44,27,26,25,15,24,15,23,25,14,22,25,20,25,23,15,22,24,10,10,20,11,39,25,25,25,25,14,19,15,24,22,33,21,23,21,13,10,13,20,10,10,21,23,28,30,10,21,19,32,16,25,27,19,32,15,22,14,14,14,27,28,11,14,10,17,25,32,33,40,20,28,28,28,28,28,28,39,28,25,25,25,25,11,11,11,11,33,32,35,35,35,35,35,20,35,33,33,33,33,26,26,25,22,22,22,22,22,22,36,20,23,23,23,23,10,10,10,10,23,25,25,25,25,25,25,27,26,24,24,24,24,23,26,23,28,20,10,48,41,26,19,26,25,21,16,10,20,20,13,24,23,27,8,8,10,18,17,20,19,21,14,30,54,14,15,18,15,14,14,13,16,15,19,11,15,15,16,15,16,15,17,16,32,33,24,24,28,22,21,26,29,11,11,24,24,32,28,30,33,23,30,24,23,21,28,25,38,24,23,22,41,20,0,46,55,12,10,11,18,32,24,39,28,8,12,12,20,21,10,20,9,24,33,16,24,25,26,25,26,23,28,26,9,10,19,23,19,20,33,28,27,28,33,25,24,31,34,12,12,27,23,37,32,35,26,35,28,27,25,33,30,45,28,26,25,15,24,15,24,26,14,22,26,21,26,24,15,23,25,10,10,21,11,40,26,25,26,26,15,19,16,24,23,33,22,23,22,14,11,14,21,10,10,22,23,29,31,11,21,19,33,16,26,27,20,33,15,23,14,14,14,27,29,11,14,10,17,26,33,34,41,21,28,28,28,28,28,28,40,28,25,25,25,25,12,12,12,12,33,32,35,35,35,35,35,20,35,33,33,33,33,26,26,26,22,22,22,22,22,22,37,21,24,24,24,24,10,10,10,10,24,26,25,25,25,25,25,27,26,24,24,24,24,23,27,23,28,21,10,49,41,27,19,26,25,22,16,10,21,21,13,24,23,27,9,8,10,18,17,21,20,21,14,31,55,15,15,19,15,14,15,13,16,15,20,11,15,16,16,15,16,15,17,16,32,33,25,25,29,23,21,27,30,11,11,24,25,33,28,31,34,23,31,25,24,22,29,26,38,25,23,22,42,20,0,47,56,12,11,11,19,33,24,39,29,9,12,12,20,22,10,20,10,25,34,17,25,26,26,25,27,24,29,27,10,10,19,24,19,21,34,29,28,29,34,26,25,32,35,12,12,27,24,38,33,36,27,36,28,27,25,34,30,46,28,27,26,15,25,15,24,27,14,23,26,21,26,24,16,23,25,10,10,21,11,41,26,26,26,26,15,19,16,25,23,34,22,24,22,14,11,14,21,11,11,22,24,29,32,11,21,20,34,16,26,28,20,34,16,23,14,15,14,28,29,11,14,10,17,26,34,34,42,21,29,29,29,29,29,29,41,29,26,26,26,26,12,12,12,12,34,33,36,36,36,36,36,21,36,34,34,34,34,27,27,26,23,23,23,23,23,23,38,21,24,24,24,24,10,10,10,10,24,26,26,26,26,26,26,28,27,25,25,25,25,24,27,24,29,21,10,50,42,27,19,27,26,22,17,10,21,21,14,25,24,28,9,8,10,19,18,21,20,22,14,32,56,15,15,19,16,14,15,14,16,15,20,11,16,16,17,16,16,16,17,16,33,34,25,25,30,23,22,27,30,11,11,25,25,33,29,31,35,24,31,25,24,22,29,26,39,25,24,23,43,21,0,48,58,12,11,12,19,34,25,40,29,9,13,13,20,22,10,20,10,26,34,17,25,26,27,26,27,24,29,27,10,10,19,24,19,21,35,30,29,30,35,27,25,32,36,12,12,28,24,39,34,37,27,37,29,28,26,35,31,47,29,27,26,16,25,16,25,27,15,23,27,22,27,25,16,24,26,10,10,22,11,42,27,26,27,27,15,20,16,25,24,35,23,24,23,14,11,14,22,11,11,23,24,30,32,11,22,20,35,17,27,29,20,35,16,24,15,15,15,28,30,11,15,10,18,27,34,35,42,22,30,30,30,30,30,30,42,30,27,27,27,27,12,12,12,12,35,34,37,37,37,37,37,21,37,35,35,35,35,27,27,27,23,23,23,23,23,23,38,22,25,25,25,25,10,10,10,10,25,27,26,26,26,26,26,28,27,25,25,25,25,24,28,24,30,22,10,51,43,28,20,27,26,23,17,10,21,21,14,25,24,29,9,8,10,19,18,21,20,22,15,32,58,15,16,20,16,15,15,14,17,16,21,11,16,16,17,16,17,16,18,17,34,35,26,26,30,24,22,28,31,12,12,25,26,34,29,32,36,24,32,26,25,23,30,27,40,26,24,23,44,21,0,49,59,12,11,12,20,35,25,41,30,9,13,13,21,23,11,21,10,26,35,17,26,27,27,27,28,25,30,28,10,11,20,25,20,22,35,30,29,30,36,27,26,33,37,13,13,28,25,40,35,38,28,38,30,29,26,35,32,48,29,28,27,16,26,16,25,28,15,24,27,22,27,25,16,24,27,10,10,22,12,43,27,27,27,27,16,20,17,26,24,36,23,25,23,15,11,15,22,11,11,23,25,31,33,11,22,21,35,17,28,29,21,35,16,24,15,15,15,29,30,12,15,11,18,28,35,36,43,22,30,30,30,30,30,30,42,30,27,27,27,27,13,13,13,13,36,35,38,38,38,38,38,22,38,36,36,36,36,28,28,27,24,24,24,24,24,24,39,22,25,25,25,25,10,10,10,10,25,27,27,27,27,27,27,29,28,26,26,26,26,25,28,25,30,22,10,52,44,29,20,28,27,23,17,10,22,22,14,26,25,29,9,8,11,19,19,22,21,23,15,33,59,16,16,20,16,15,16,14,17,16,21,12,16,17,18,16,17,16,18,17,34,36,26,26,31,24,22,29,32,12,12,26,26,35,30,33,36,25,33,26,25,23,31,27,41,26,25,24,45,22,0,50,60,13,11,12,20,35,26,42,31,9,13,13,21,23,11,21,10,27,36,18,26,27,28,27,28,25,30,29,10,11,20,25,20,22,36,31,30,31,36,28,26,34,37,13,13,29,25,41,35,38,29,38,30,29,27,36,32,49,30,28,27,16,26,16,26,28,15,24,28,23,28,26,17,25,27,11,11,22,12,44,28,28,28,28,16,21,17,26,25,36,24,25,24,15,11,15,23,11,11,24,25,31,34,12,23,21,36,17,28,30,21,36,17,25,15,16,15,30,31,12,15,11,19,28,36,36,44,22,31,31,31,31,31,31,43,31,28,28,28,28,13,13,13,13,36,35,38,38,38,38,38,22,38,36,36,36,36,28,29,28,24,24,24,24,24,24,40,23,26,26,26,26,11,11,11,11,26,28,28,28,28,28,28,30,29,26,26,26,26,25,29,25,31,23,11,54,45,29,21,28,27,24,18,11,22,22,15,26,25,30,9,8,11,20,19,22,21,23,15,34,60,16,16,20,17,15,16,15,17,16,22,12,17,17,18,17,17,17,19,17,35,36,27,27,31,25,23,29,32,12,12,26,27,36,31,33,37,26,33,27,26,24,31,28,42,27,25,24,46,22,0,0,1,0,2,0,2,1,1,1,1,1,0,0,0,0,18,5,230,0,248,8,255,0,8,0,8,255,254,0,9,0,9,255,253,0,10,0,10,255,253,0,11,0,11,255,253,0,12,0,12,255,253,0,13,0,13,255,253,0,14,0,14,255,253,0,15,0,15,255,252,0,16,0,16,255,252,0,17,0,17,255,252,0,18,0,18,255,251,0,19,0,19,255,251,0,20,0,20,255,251,0,21,0,21,255,251,0,22,0,22,255,250,0,23,0,22,255,250,0,24,0,23,255,250,0,25,0,25,255,250,0,26,0,25,255,250,0,27,0,26,255,249,0,28,0,27,255,249,0,29,0,28,255,249,0,30,0,29,255,249,0,31,0,30,255,248,0,32,0,31,255,248,0,33,0,32,255,248,0,34,0,33,255,248,0,35,0,33,255,248,0,36,0,35,255,247,0,37,0,36,255,247,0,38,0,37,255,247,0,39,0,38,255,247,0,40,0,38,255,246,0,41,0,40,255,246,0,42,0,41,255,246,0,43,0,42,255,246,0,44,0,42,255,245,0,45,0,43,255,245,0,46,0,45,255,245,0,47,0,45,255,245,0,48,0,47,255,244,0,49,0,47,255,244,0,50,0,48,255,243,0,51,0,49,255,243,0,52,0,50,255,243,0,53,0,51,255,243,0,54,0,52,255,242,0,55,0,54,255,242,0,56,0,54,255,242,0,57,0,55,255,242,0,58,0,55,255,241,0,59,0,57,255,241,0,60,0,59,255,241,0,61,0,59,255,241,0,62,0,60,255,240,0,63,0,60,255,240,0,64,0,61,255,240,0,65,0,63,255,240,0,66,0,64,255,239,0,67,0,65,255,239,0,68,0,65,255,239,0,69,0,66,255,239,0,70,0,68,255,238,0,71,0,69,255,238,0,72,0,69,255,238,0,73,0,70,255,238,0,74,0,71,255,237,0,75,0,72,255,237,0,76,0,74,255,237,0,77,0,74,255,237,0,78,0,75,255,236,0,79,0,77,255,236,0,80,0,77,255,236,0,81,0,79,255,236,0,82,0,79,255,235,0,83,0,80,255,235,0,84,0,81,255,235,0,85,0,82,255,235,0,86,0,83,255,234,0,87,0,84,255,234,0,88,0,85,255,234,0,89,0,86,255,234,0,90,0,87,255,233,0,91,0,87,255,233,0,92,0,88,255,233,0,93,0,90,255,233,0,94,0,91,255,232,0,95,0,92,255,232,0,96,0,92,255,232,0,97,0,93,255,232,0,98,0,94,255,231,0,99,0,96,255,231,0,100,0,97,255,231,0,101,0,97,255,231,0,102,0,98,255,230,0,103,0,99,255,230,0,104,0,101,255,230,0,105,0,101,255,230,0,106,0,102,255,229,0,107,0,103,255,229,0,108,0,104,255,229,0,109,0,106,255,229,0,110,0,106,255,228,0,111,0,107,255,228,0,112,0,108,255,228,0,113,0,109,255,228,0,114,0,110,255,227,0,115,0,111,255,227,0,116,0,112,255,227,0,117,0,112,255,227,0,118,0,114,255,226,0,119,0,115,255,226,0,120,0,115,255,226,0,121,0,117,255,226,0,122,0,118,255,225,0,123,0,119,255,225,0,124,0,119,255,225,0,125,0,120,255,225,0,126,0,122,255,224,0,127,0,123,255,224,0,128,0,124,255,224,0,129,0,124,255,224,0,130,0,125,255,223,0,131,0,125,255,223,0,132,0,128,255,223,0,133,0,129,255,223,0,134,0,129,255,222,0,135,0,130,255,222,0,136,0,130,255,222,0,137,0,133,255,222,0,138,0,133,255,221,0,139,0,134,255,221,0,140,0,135,255,221,0,141,0,135,255,221,0,142,0,137,255,220,0,143,0,138,255,220,0,144,0,139,255,220,0,145,0,140,255,220,0,146,0,141,255,219,0,147,0,142,255,219,0,148,0,142,255,219,0,149,0,144,255,219,0,150,0,144,255,218,0,151,0,146,255,218,0,152,0,147,255,218,0,153,0,147,255,218,0,154,0,149,255,217,0,155,0,149,255,217,0,156,0,151,255,217,0,157,0,151,255,217,0,158,0,152,255,216,0,159,0,153,255,216,0,160,0,154,255,216,0,161,0,156,255,216,0,162,0,156,255,215,0,163,0,157,255,215,0,164,0,157,255,215,0,165,0,159,255,215,0,166,0,161,255,214,0,167,0,161,255,214,0,168,0,162,255,214,0,169,0,162,255,214,0,170,0,164,255,213,0,171,0,166,255,213,0,172,0,166,255,213,0,173,0,167,255,213,0,174,0,167,255,212,0,175,0,169,255,212,0,176,0,170,255,212,0,177,0,171,255,212,0,178,0,172,255,211,0,179,0,172,255,211,0,180,0,174,255,211,0,181,0,174,255,211,0,182,0,176,255,210,0,183,0,176,255,210,0,184,0,177,255,210,0,185,0,179,255,210,0,186,0,179,255,209,0,187,0,180,255,209,0,188,0,181,255,209,0,189,0,183,255,209,0,190,0,183,255,208,0,191,0,184,255,208,0,192,0,185,255,208,0,193,0,186,255,208,0,194,0,188,255,207,0,195,0,188,255,207,0,196,0,189,255,207,0,197,0,189,255,207,0,198,0,190,255,206,0,199,0,193,255,206,0,200,0,193,255,206,0,201,0,194,255,206,0,202,0,194,255,205,0,203,0,195,255,205,0,204,0,198,255,205,0,205,0,198,255,205,0,206,0,199,255,204,0,207,0,199,255,204,0,208,0,200,255,204,0,209,0,201,255,204,0,210,0,203,255,203,0,211,0,204,255,203,0,212,0,204,255,203,0,213,0,206,255,203,0,214,0,206,255,202,0,215,0,207,255,202,0,216,0,208,255,202,0,217,0,209,255,202,0,218,0,211,255,201,0,219,0,211,255,201,0,220,0,212,255,201,0,221,0,213,255,201,0,222,0,214,255,200,0,223,0,215,255,200,0,224,0,216,255,200,0,225,0,217,255,200,0,226,0,217,255,199,0,227,0,219,255,199,0,228,0,220,255,199,0,229,0,221,255,199,0,230,0,221,255,198,0,231,0,222,255,198,0,232,0,224,255,198,0,233,0,225,255,198,0,234,0,226,255,197,0,235,0,226,255,197,0,236,0,227,255,197,0,237,0,229,255,197,0,238,0,230,255,196,0,239,0,231,255,196,0,240,0,231,255,196,0,241,0,232,255,196,0,242,0,233,255,195,0,243,0,235,255,195,0,244,0,236,255,195,0,245,0,236,255,195,0,246,0,237,255,194,0,247,0,238,255,194,0,248,0,239,255,194,0,249,0,240,255,194,0,250,0,241,255,193,0,251,0,242,255,193,0,252,0,243,255,193,0,253,0,244,255,193,0,254,0,244,255,192,0,255,0,246,255,192,0,248,8,255,0,8,0,8,255,254,0,9,0,9,255,253,0,10,0,10,255,253,0,11,0,11,255,253,0,12,0,12,255,253,0,13,0,13,255,253,0,14,0,14,255,253,0,15,0,15,255,252,0,16,0,16,255,252,0,17,0,17,255,252,0,18,0,18,255,251,0,19,0,19,255,251,0,20,0,20,255,251,0,21,0,21,255,251,0,22,0,22,255,250,0,23,0,22,255,250,0,24,0,23,255,250,0,25,0,25,255,250,0,26,0,25,255,250,0,27,0,26,255,249,0,28,0,27,255,249,0,29,0,28,255,249,0,30,0,29,255,249,0,31,0,30,255,248,0,32,0,31,255,248,0,33,0,32,255,248,0,34,0,33,255,248,0,35,0,33,255,248,0,36,0,35,255,247,0,37,0,36,255,247,0,38,0,37,255,247,0,39,0,38,255,247,0,40,0,38,255,246,0,41,0,40,255,246,0,42,0,41,255,246,0,43,0,42,255,246,0,44,0,42,255,245,0,45,0,43,255,245,0,46,0,45,255,245,0,47,0,45,255,245,0,48,0,47,255,244,0,49,0,47,255,244,0,50,0,48,255,243,0,51,0,49,255,243,0,52,0,50,255,243,0,53,0,51,255,243,0,54,0,52,255,242,0,55,0,54,255,242,0,56,0,54,255,242,0,57,0,55,255,242,0,58,0,55,255,241,0,59,0,57,255,241,0,60,0,59,255,241,0,61,0,59,255,241,0,62,0,60,255,240,0,63,0,60,255,240,0,64,0,61,255,240,0,65,0,63,255,240,0,66,0,64,255,239,0,67,0,65,255,239,0,68,0,65,255,239,0,69,0,66,255,239,0,70,0,68,255,238,0,71,0,69,255,238,0,72,0,69,255,238,0,73,0,70,255,238,0,74,0,71,255,237,0,75,0,72,255,237,0,76,0,74,255,237,0,77,0,74,255,237,0,78,0,75,255,236,0,79,0,77,255,236,0,80,0,77,255,236,0,81,0,79,255,236,0,82,0,79,255,235,0,83,0,80,255,235,0,84,0,81,255,235,0,85,0,82,255,235,0,86,0,83,255,234,0,87,0,84,255,234,0,88,0,85,255,234,0,89,0,86,255,234,0,90,0,87,255,233,0,91,0,87,255,233,0,92,0,88,255,233,0,93,0,90,255,233,0,94,0,91,255,232,0,95,0,92,255,232,0,96,0,92,255,232,0,97,0,93,255,232,0,98,0,94,255,231,0,99,0,96,255,231,0,100,0,97,255,231,0,101,0,97,255,231,0,102,0,98,255,230,0,103,0,99,255,230,0,104,0,101,255,230,0,105,0,101,255,230,0,106,0,102,255,229,0,107,0,103,255,229,0,108,0,104,255,229,0,109,0,106,255,229,0,110,0,106,255,228,0,111,0,107,255,228,0,112,0,108,255,228,0,113,0,109,255,228,0,114,0,110,255,227,0,115,0,111,255,227,0,116,0,112,255,227,0,117,0,112,255,227,0,118,0,114,255,226,0,119,0,115,255,226,0,120,0,115,255,226,0,121,0,117,255,226,0,122,0,118,255,225,0,123,0,119,255,225,0,124,0,119,255,225,0,125,0,120,255,225,0,126,0,122,255,224,0,127,0,123,255,224,0,128,0,124,255,224,0,129,0,124,255,224,0,130,0,125,255,223,0,131,0,125,255,223,0,132,0,128,255,223,0,133,0,129,255,223,0,134,0,129,255,222,0,135,0,130,255,222,0,136,0,130,255,222,0,137,0,133,255,222,0,138,0,133,255,221,0,139,0,134,255,221,0,140,0,135,255,221,0,141,0,135,255,221,0,142,0,137,255,220,0,143,0,138,255,220,0,144,0,139,255,220,0,145,0,140,255,220,0,146,0,141,255,219,0,147,0,142,255,219,0,148,0,142,255,219,0,149,0,144,255,219,0,150,0,144,255,218,0,151,0,146,255,218,0,152,0,147,255,218,0,153,0,147,255,218,0,154,0,149,255,217,0,155,0,149,255,217,0,156,0,151,255,217,0,157,0,151,255,217,0,158,0,152,255,216,0,159,0,153,255,216,0,160,0,154,255,216,0,161,0,156,255,216,0,162,0,156,255,215,0,163,0,157,255,215,0,164,0,157,255,215,0,165,0,159,255,215,0,166,0,161,255,214,0,167,0,161,255,214,0,168,0,162,255,214,0,169,0,162,255,214,0,170,0,164,255,213,0,171,0,166,255,213,0,172,0,166,255,213,0,173,0,167,255,213,0,174,0,167,255,212,0,175,0,169,255,212,0,176,0,170,255,212,0,177,0,171,255,212,0,178,0,172,255,211,0,179,0,172,255,211,0,180,0,174,255,211,0,181,0,174,255,211,0,182,0,176,255,210,0,183,0,176,255,210,0,184,0,177,255,210,0,185,0,179,255,210,0,186,0,179,255,209,0,187,0,180,255,209,0,188,0,181,255,209,0,189,0,183,255,209,0,190,0,183,255,208,0,191,0,184,255,208,0,192,0,185,255,208,0,193,0,186,255,208,0,194,0,188,255,207,0,195,0,188,255,207,0,196,0,189,255,207,0,197,0,189,255,207,0,198,0,190,255,206,0,199,0,193,255,206,0,200,0,193,255,206,0,201,0,194,255,206,0,202,0,194,255,205,0,203,0,195,255,205,0,204,0,198,255,205,0,205,0,198,255,205,0,206,0,199,255,204,0,207,0,199,255,204,0,208,0,200,255,204,0,209,0,201,255,204,0,210,0,203,255,203,0,211,0,204,255,203,0,212,0,204,255,203,0,213,0,206,255,203,0,214,0,206,255,202,0,215,0,207,255,202,0,216,0,208,255,202,0,217,0,209,255,202,0,218,0,211,255,201,0,219,0,211,255,201,0,220,0,212,255,201,0,221,0,213,255,201,0,222,0,214,255,200,0,223,0,215,255,200,0,224,0,216,255,200,0,225,0,217,255,200,0,226,0,217,255,199,0,227,0,219,255,199,0,228,0,220,255,199,0,229,0,221,255,199,0,230,0,221,255,198,0,231,0,222,255,198,0,232,0,224,255,198,0,233,0,225,255,198,0,234,0,226,255,197,0,235,0,226,255,197,0,236,0,227,255,197,0,237,0,229,255,197,0,238,0,230,255,196,0,239,0,231,255,196,0,240,0,231,255,196,0,241,0,232,255,196,0,242,0,233,255,195,0,243,0,235,255,195,0,244,0,236,255,195,0,245,0,236,255,195,0,246,0,237,255,194,0,247,0,238,255,194,0,248,0,239,255,194,0,249,0,240,255,194,0,250,0,241,255,193,0,251,0,242,255,193,0,252,0,243,255,193,0,253,0,244,255,193,0,254,0,244,255,192,0,255,0,246,255,192,0,0, \ No newline at end of file diff --git a/src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf b/src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5f47d734d28db2cf779ab405fde13a61a01cf973 GIT binary patch literal 78464 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 LQP|>Q=KlMCp5cvO literal 0 HcmV?d00001 diff --git a/src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf.h b/src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf.h new file mode 100644 index 000000000..9ac0ebed5 --- /dev/null +++ b/src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf.h @@ -0,0 +1 @@ +0,1,0,0,0,16,1,0,0,4,0,0,71,68,69,70,0,38,2,26,0,0,168,52,0,0,0,30,71,80,79,83,156,208,239,42,0,0,168,84,0,0,0,44,71,83,85,66,199,228,249,144,0,0,168,128,0,0,1,244,79,83,47,50,61,246,88,68,0,0,1,136,0,0,0,78,84,83,73,86,10,196,107,5,0,0,170,116,0,0,136,12,99,109,97,112,59,59,140,99,0,0,10,44,0,0,4,80,103,97,115,112,255,255,0,3,0,0,168,44,0,0,0,8,103,108,121,102,69,37,49,26,0,0,18,168,0,0,108,128,104,101,97,100,232,175,205,231,0,0,1,12,0,0,0,54,104,104,101,97,16,120,9,27,0,0,1,68,0,0,0,36,104,109,116,120,141,12,209,143,0,0,1,216,0,0,8,84,107,101,114,110,81,124,80,67,0,0,127,40,0,0,25,200,108,111,99,97,138,105,166,242,0,0,14,124,0,0,4,44,109,97,120,112,2,35,0,157,0,0,1,104,0,0,0,32,110,97,109,101,105,24,128,141,0,0,152,240,0,0,1,122,112,111,115,116,134,214,81,71,0,0,154,108,0,0,13,191,0,1,0,0,0,1,0,0,164,67,118,21,95,15,60,245,0,11,8,0,0,0,0,0,179,239,122,0,0,0,0,0,204,183,9,93,255,96,254,78,9,138,7,62,0,0,0,9,0,2,0,0,0,0,0,0,0,1,0,0,7,62,254,78,0,67,9,227,255,106,254,212,9,138,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,21,0,1,0,0,2,21,0,107,0,7,0,48,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,3,136,1,144,0,5,0,8,5,154,5,51,0,0,1,27,5,154,5,51,0,0,3,209,0,102,2,18,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,76,32,32,0,64,0,32,251,2,5,211,254,81,1,51,7,62,1,178,0,0,4,100,0,50,0,0,0,0,1,134,0,0,1,244,0,0,1,229,0,150,2,243,0,100,7,101,0,100,4,26,0,100,5,142,0,100,4,251,0,100,1,129,0,100,2,73,0,100,2,73,0,100,3,42,0,100,3,182,0,100,1,129,0,25,2,188,0,100,1,129,0,100,3,212,0,25,5,165,0,110,2,133,0,100,4,121,0,60,4,126,0,100,4,196,0,60,4,151,0,125,4,236,0,100,4,66,0,65,4,216,0,100,4,236,0,100,1,179,0,150,2,23,0,100,4,76,0,100,3,182,0,100,4,76,0,100,4,91,0,100,8,102,0,150,5,192,0,25,5,50,0,170,5,105,0,100,5,220,0,170,4,206,0,170,4,131,0,170,5,105,0,100,6,19,0,170,2,73,0,200,2,178,0,25,5,120,0,170,4,129,0,170,7,48,0,170,6,39,0,170,6,129,0,120,4,239,0,170,6,129,0,120,5,25,0,170,5,10,0,100,4,161,0,50,5,230,0,160,5,192,0,25,7,108,0,50,5,130,0,25,5,20,0,25,5,50,0,125,2,138,0,150,3,212,0,25,2,138,0,50,4,26,0,50,4,26,0,25,2,91,0,100,4,111,0,100,4,164,0,150,4,1,0,100,4,166,0,100,4,106,0,100,2,149,0,150,4,163,0,100,4,181,0,150,2,13,0,170,2,13,0,45,4,157,0,150,1,249,0,160,7,13,0,150,4,181,0,150,4,176,0,100,4,163,0,150,4,163,0,100,2,163,0,150,4,26,0,100,2,163,0,150,4,181,0,150,3,232,0,0,6,3,0,35,4,26,0,25,4,26,0,25,4,16,0,100,2,163,0,100,1,229,0,150,2,163,0,50,3,182,0,100,5,192,0,25,5,192,0,25,5,105,0,100,4,206,0,170,6,39,0,170,6,129,0,120,5,230,0,160,4,111,0,100,4,111,0,100,4,111,0,100,4,111,0,100,4,111,0,100,4,111,0,100,4,1,0,100,4,106,0,100,4,106,0,100,4,106,0,100,4,106,0,100,2,13,0,128,2,13,255,250,2,13,0,13,2,13,255,241,4,181,0,150,4,176,0,100,4,176,0,100,4,176,0,100,4,176,0,100,4,176,0,100,4,181,0,150,4,181,0,150,4,181,0,150,4,181,0,150,4,21,0,50,2,240,0,100,4,26,0,100,4,193,0,100,4,26,0,100,2,118,0,100,3,185,0,0,4,167,0,150,4,139,0,150,6,249,0,150,6,70,0,150,2,91,0,100,2,243,0,100,7,133,0,25,6,89,0,100,3,182,0,100,4,226,0,50,4,181,0,150,2,130,0,100,2,188,0,100,7,41,0,100,4,176,0,100,4,91,0,100,1,229,0,150,4,61,0,100,4,23,0,50,3,241,0,100,3,241,0,50,4,161,0,100,1,242,0,0,5,192,0,25,5,192,0,25,6,129,0,120,8,167,0,100,7,157,0,100,4,176,0,100,6,164,0,100,3,12,0,50,3,12,0,50,1,154,0,50,1,179,0,50,3,217,0,100,4,26,0,25,5,20,0,25,4,115,0,100,2,98,0,100,2,98,0,50,4,21,0,50,1,194,0,100,1,154,0,25,3,12,0,25,8,59,0,100,5,192,0,25,4,206,0,170,5,192,0,25,4,206,0,170,4,206,0,170,2,73,0,158,2,73,0,43,2,73,0,15,2,73,0,24,6,129,0,120,6,129,0,120,6,129,0,120,5,230,0,160,5,230,0,160,5,230,0,160,2,188,0,100,2,188,0,100,2,188,0,100,1,201,0,0,1,129,0,25,5,10,0,100,4,26,0,100,1,229,0,150,5,220,255,226,4,166,0,100,5,20,0,25,4,26,0,25,4,219,0,150,4,163,0,150,3,182,0,100,3,182,0,100,1,72,0,50,2,78,0,50,2,66,0,50,5,162,0,100,5,169,0,100,5,210,0,100,4,109,0,0,1,249,0,10,5,50,0,125,4,16,0,100,3,182,0,100,5,240,0,100,3,182,0,100,3,182,0,100,4,193,0,149,5,70,0,100,6,114,0,150,5,185,0,25,2,77,0,0,6,74,0,120,5,70,0,75,4,26,0,100,5,192,0,25,4,61,0,50,4,246,0,100,4,107,0,150,4,160,0,150,6,188,0,100,2,13,0,170,2,218,0,100,1,149,0,100,2,140,0,100,3,211,0,100,2,68,0,100,2,188,0,100,5,105,0,100,5,50,0,125,4,16,0,100,5,50,0,125,4,16,0,100,5,192,0,25,4,111,0,100,5,105,0,100,4,1,0,100,6,39,0,170,4,181,0,150,5,10,0,100,4,26,0,100,4,206,0,170,4,106,0,100,5,105,0,100,4,1,0,100,5,220,0,170,4,166,0,100,4,206,0,170,4,106,0,100,6,39,0,170,4,181,0,150,5,25,0,170,2,163,0,145,4,161,0,50,2,163,0,150,5,230,0,160,4,181,0,150,5,192,0,25,4,111,0,100,5,192,0,25,4,111,0,100,5,105,0,100,4,1,0,100,5,105,0,100,4,1,0,100,5,220,255,206,4,166,0,100,4,206,0,170,4,106,0,100,4,206,0,170,4,106,0,100,4,206,0,170,4,106,0,100,5,105,0,100,4,163,0,100,5,105,0,100,4,163,0,100,5,105,0,100,4,163,0,100,5,105,0,100,4,163,0,100,6,19,0,170,4,181,0,3,6,19,0,170,4,181,0,150,2,73,0,43,2,13,0,13,2,73,0,43,2,13,0,13,2,73,0,28,2,13,255,254,2,73,0,35,2,13,0,5,2,73,0,190,4,221,0,200,4,26,0,170,2,178,0,25,2,13,0,10,5,120,0,170,4,157,0,150,4,58,0,150,4,129,0,170,1,249,0,51,4,129,0,170,1,249,0,5,4,129,0,170,1,249,0,160,4,129,0,170,1,249,0,160,6,39,0,170,4,181,0,150,5,25,255,106,6,39,0,170,4,181,0,150,6,129,0,120,4,176,0,100,6,129,0,120,4,176,0,100,6,129,0,120,4,176,0,100,5,25,0,170,2,163,0,150,5,25,0,170,2,163,255,254,5,10,0,100,4,26,0,100,5,10,0,100,4,26,0,100,5,10,0,100,4,26,0,100,4,161,0,50,2,163,0,125,4,161,0,50,2,163,0,0,5,230,0,160,4,181,0,150,5,230,0,160,4,181,0,150,5,230,0,160,4,181,0,150,5,230,0,160,4,181,0,150,5,230,0,160,4,181,0,150,7,108,0,50,6,3,0,35,5,20,0,25,4,26,0,25,1,250,0,150,4,206,0,170,5,192,0,25,5,31,0,170,5,50,0,170,4,79,0,170,6,163,0,0,4,206,0,170,8,61,0,25,4,91,0,100,5,245,0,170,5,245,0,170,5,37,0,170,5,244,0,0,7,48,0,170,5,245,0,170,6,129,0,120,5,245,0,170,4,239,0,170,5,105,0,100,4,161,0,50,5,27,0,50,6,188,0,100,5,120,0,25,6,31,0,170,5,128,0,125,7,83,0,170,7,198,0,170,6,174,0,0,6,219,0,170,5,18,0,170,5,95,0,125,7,230,0,170,5,25,0,25,4,111,0,100,4,253,0,125,4,142,0,150,3,80,0,150,5,148,0,0,4,106,0,100,6,184,0,25,3,197,0,100,4,201,0,150,4,201,0,150,4,80,0,150,4,163,0,0,5,180,0,150,4,201,0,150,4,216,0,100,4,201,0,150,4,193,0,150,4,1,0,100,3,157,0,0,4,26,0,25,6,108,0,100,4,76,0,25,5,106,0,150,4,194,0,125,6,99,0,150,6,234,0,150,5,72,0,0,5,230,0,150,4,144,0,150,4,26,0,100,6,166,0,150,4,121,0,25,4,106,0,100,2,23,0,100,2,91,0,100,4,21,0,100,5,192,0,25,1,129,0,100,5,203,255,206,7,16,255,206,3,70,255,206,6,232,255,206,6,117,255,206,6,177,255,206,2,13,255,96,5,192,0,25,5,50,0,170,4,79,0,170,4,206,0,170,5,50,0,125,6,19,0,170,6,129,0,120,2,73,0,200,5,120,0,170,5,192,0,25,7,48,0,170,6,39,0,170,4,172,0,100,6,129,0,120,5,245,0,170,4,239,0,170,4,156,0,100,4,161,0,50,5,20,0,25,6,188,0,100,5,130,0,25,6,154,0,120,2,73,0,15,5,20,0,25,5,89,0,100,3,157,0,100,4,181,0,150,2,13,0,128,4,186,0,150,5,89,0,100,4,172,0,150,4,56,0,35,4,176,0,100,3,157,0,100,3,235,0,100,4,181,0,150,4,221,0,120,2,13,0,170,4,58,0,150,4,97,0,40,4,56,0,40,3,250,0,125,4,176,0,100,4,188,0,135,3,225,0,100,4,253,0,100,3,81,0,0,4,186,0,150,5,225,0,100,4,106,0,40,6,74,0,150,6,139,0,120,2,13,255,241,4,186,0,150,4,176,0,100,4,186,0,150,6,139,0,120,6,242,0,150,7,29,0,150,4,244,0,150,4,107,0,150,6,242,0,150,7,85,0,150,9,210,0,150,7,102,0,150,9,227,0,150,7,78,0,150,9,203,0,150,4,251,0,115,3,86,0,115,4,76,0,115,4,86,0,100,4,141,0,60,4,121,0,155,4,241,0,120,4,36,0,40,4,226,0,115,4,241,0,115,4,106,0,90,4,106,0,90,4,106,0,90,4,106,0,90,4,106,0,90,4,58,0,150,4,58,0,150,6,5,0,170,0,0,0,2,0,1,0,0,0,0,0,20,0,3,0,1,0,0,0,202,0,4,0,182,0,0,0,16,0,16,0,3,0,0,0,126,0,172,0,198,0,214,0,223,0,239,0,255,255,255,0,0,0,32,0,128,0,173,0,199,0,215,0,224,0,240,255,255,255,227,255,226,0,0,255,213,0,0,255,209,0,0,0,1,0,0,0,0,0,12,0,0,0,60,0,0,0,74,0,0,0,223,0,143,0,144,0,224,0,145,0,225,0,226,0,146,0,147,0,227,0,228,0,229,0,230,0,231,0,148,0,149,0,232,0,150,0,151,0,152,0,153,0,154,0,233,0,155,0,234,0,235,0,236,0,172,0,173,0,237,0,248,0,175,0,176,0,207,0,209,0,119,0,193,0,194,0,195,0,196,0,241,0,197,0,198,0,199,0,242,0,243,0,244,0,200,0,245,0,246,0,247,0,4,3,134,0,0,0,118,0,64,0,5,0,54,0,126,1,27,1,48,1,49,1,64,1,72,1,81,1,127,1,146,2,27,2,199,2,201,2,221,3,38,3,126,3,138,3,140,3,147,3,148,3,161,3,168,3,169,3,187,3,192,3,206,4,1,4,79,4,81,32,16,32,20,32,26,32,30,32,34,32,38,32,48,32,58,32,68,32,172,33,34,33,38,34,2,34,6,34,15,34,18,34,26,34,30,34,43,34,72,34,96,34,101,34,242,37,202,224,3,224,9,224,25,224,41,240,0,251,2,255,255,0,0,0,32,0,160,1,28,1,49,1,50,1,65,1,73,1,82,1,146,2,24,2,198,2,201,2,216,3,38,3,126,3,132,3,140,3,142,3,148,3,149,3,163,3,169,3,170,3,188,3,193,4,1,4,16,4,81,32,16,32,19,32,24,32,28,32,32,32,38,32,48,32,57,32,68,32,172,33,34,33,38,34,2,34,6,34,15,34,17,34,25,34,30,34,43,34,72,34,96,34,100,34,242,37,202,224,0,224,5,224,16,224,32,240,0,251,1,255,255,255,227,0,0,0,9,0,0,0,8,0,0,0,2,0,0,255,9,255,68,0,0,253,254,0,0,253,163,254,53,254,48,254,47,254,46,0,0,254,45,254,44,0,0,254,43,0,0,254,41,253,112,253,98,253,97,224,0,224,146,0,0,0,0,0,0,224,120,224,133,224,118,224,169,224,76,223,106,223,194,222,225,222,229,222,214,0,0,0,0,222,194,222,188,222,162,222,127,222,125,221,248,219,34,33,248,33,247,33,241,33,235,16,240,5,237,0,1,0,0,0,116,0,0,1,104,0,0,1,102,0,0,1,114,0,0,0,0,1,200,0,0,1,200,0,0,0,0,0,0,0,0,0,0,1,200,0,0,0,0,1,196,0,0,1,194,0,0,0,0,0,0,0,0,0,0,0,0,1,190,1,194,1,198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,182,1,184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,0,153,0,132,0,133,0,174,0,146,0,204,0,134,0,142,0,139,0,148,0,156,0,154,0,211,0,138,0,199,0,131,0,145,0,214,0,215,0,141,0,147,0,136,0,178,0,200,0,213,0,149,0,157,0,217,0,216,0,218,0,152,0,160,0,184,0,182,0,161,0,98,0,99,0,143,0,100,0,186,0,101,0,183,0,185,0,190,0,187,0,188,0,189,0,205,0,102,0,193,0,191,0,192,0,162,0,103,0,212,0,144,0,196,0,194,0,195,0,104,0,207,0,209,0,137,0,106,0,105,0,107,0,109,0,108,0,110,0,150,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0,206,0,120,0,122,0,121,0,123,0,125,0,124,0,171,0,151,0,127,0,126,0,128,0,129,0,208,0,210,0,172,1,21,1,22,1,23,1,24,0,253,0,254,0,255,1,0,1,25,1,26,1,27,1,28,1,7,1,8,1,9,1,10,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,5,1,6,1,11,1,12,0,241,0,219,0,220,1,1,1,2,1,73,1,74,1,13,1,14,0,163,0,164,1,84,1,85,1,86,1,87,1,15,1,16,1,3,1,4,1,88,1,89,1,90,1,91,0,202,0,203,1,94,1,95,1,17,1,18,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,19,1,20,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,0,173,0,251,0,252,0,249,0,250,0,221,0,222,1,112,0,197,0,247,0,242,0,243,0,244,0,246,0,198,0,245,0,235,0,232,0,147,1,231,1,232,1,233,0,230,0,169,0,170,0,179,0,167,0,168,0,180,0,130,0,177,0,135,0,228,0,211,0,178,0,233,0,0,0,20,0,20,0,20,0,20,0,40,0,62,0,126,0,176,0,236,1,34,1,50,1,76,1,102,1,132,1,156,1,170,1,184,1,196,1,210,1,244,2,4,2,36,2,82,2,112,2,150,2,194,2,214,3,14,3,58,3,78,3,100,3,120,3,140,3,160,3,198,4,16,4,42,4,84,4,116,4,146,4,172,4,194,4,230,4,254,5,12,5,32,5,62,5,80,5,108,5,130,5,164,5,192,5,232,6,10,6,56,6,76,6,104,6,126,6,158,6,190,6,214,6,238,7,2,7,16,7,36,7,56,7,68,7,82,7,130,7,168,7,200,7,238,8,22,8,50,8,98,8,126,8,146,8,172,8,210,8,224,9,10,9,38,9,72,9,108,9,146,9,166,9,208,9,234,10,8,10,28,10,60,10,92,10,120,10,144,10,180,10,194,10,228,11,2,11,14,11,60,11,112,11,124,11,136,11,148,11,160,11,172,11,184,11,196,11,208,11,220,11,232,12,28,12,40,12,52,12,64,12,76,12,88,12,100,12,112,12,124,12,136,12,148,12,160,12,172,12,184,12,196,12,208,12,220,12,232,12,244,13,14,13,44,13,84,13,146,13,210,13,226,13,254,14,48,14,104,14,164,14,204,14,218,14,236,15,20,15,76,15,108,15,150,15,182,15,226,15,254,16,74,16,128,16,166,16,186,16,202,16,250,17,26,17,58,17,82,17,82,17,94,17,106,17,118,17,164,17,230,17,244,18,2,18,24,18,46,18,62,18,78,18,104,18,116,18,128,18,184,18,204,18,222,19,2,19,18,19,32,19,54,19,138,19,150,19,162,19,174,19,186,19,198,19,210,19,222,19,234,19,246,20,2,20,14,20,26,20,38,20,50,20,62,20,80,20,110,20,124,20,152,20,166,20,178,20,190,20,212,20,252,21,54,21,66,21,78,21,108,21,148,21,162,21,188,21,204,21,234,22,20,22,68,22,126,22,196,22,224,22,248,23,4,23,16,23,52,23,104,23,130,23,154,23,206,23,234,23,254,24,36,24,72,24,118,24,142,24,196,24,218,24,246,25,4,25,36,25,68,25,240,25,254,26,18,26,32,26,58,26,78,26,102,26,120,26,162,26,174,26,186,26,198,26,210,26,250,27,56,27,68,27,80,27,92,27,104,27,116,27,128,27,168,27,224,27,236,27,248,28,4,28,50,28,62,28,74,28,86,28,98,28,110,28,122,28,134,28,168,28,180,28,192,28,204,28,216,28,228,28,240,28,252,29,8,29,20,29,32,29,40,29,82,29,94,29,106,29,118,29,130,29,142,29,154,29,166,29,178,29,190,29,202,29,214,29,226,29,238,30,38,30,50,30,62,30,90,30,124,30,136,30,148,30,160,30,172,30,184,30,196,30,222,31,0,31,12,31,24,31,36,31,48,31,80,31,92,31,104,31,134,31,146,31,158,31,170,31,182,31,206,31,228,31,240,31,252,32,8,32,20,32,56,32,86,32,122,32,134,32,146,32,158,32,170,32,182,32,194,32,206,32,218,32,230,32,242,32,254,33,10,33,76,33,138,33,150,33,162,33,174,33,186,33,216,33,250,34,6,34,18,34,30,34,42,34,54,34,66,34,78,34,90,34,134,34,176,34,188,34,200,34,212,34,224,34,246,35,2,35,10,35,42,35,50,35,66,35,102,35,110,35,178,35,224,35,248,36,30,36,70,36,94,36,102,36,126,36,134,36,152,36,160,36,168,36,176,36,210,37,2,37,32,37,56,37,86,37,110,37,138,37,170,37,208,37,238,38,20,38,64,38,98,38,106,38,156,38,196,38,212,38,248,39,0,39,64,39,108,39,132,39,144,39,182,39,206,39,234,40,2,40,36,40,54,40,90,40,98,40,118,40,146,40,196,40,226,40,250,41,24,41,48,41,76,41,108,41,144,41,174,41,212,42,0,42,34,42,46,42,54,42,62,42,86,42,98,42,112,42,144,42,176,42,196,42,236,43,10,43,64,43,76,43,84,43,92,43,108,43,116,43,124,43,132,43,172,43,180,43,188,43,208,43,216,43,224,43,250,44,2,44,20,44,28,44,56,44,64,44,72,44,120,44,128,44,166,44,178,44,190,44,202,44,214,44,226,44,238,44,250,45,38,45,86,45,110,45,152,45,196,45,238,46,10,46,50,46,64,46,94,46,122,46,142,46,192,46,226,47,8,47,50,47,86,47,114,47,142,47,190,47,222,48,4,48,50,48,62,48,74,48,86,48,98,48,110,48,162,48,214,49,6,49,44,49,102,49,158,49,234,50,26,50,94,50,150,50,226,51,4,51,26,51,58,51,102,51,132,51,170,51,214,51,234,52,32,52,76,52,144,52,224,53,50,53,126,53,204,53,234,54,14,54,64,0,2,0,50,0,0,4,50,5,0,0,3,0,7,0,0,51,17,33,17,37,33,17,33,50,4,0,252,32,3,192,252,64,5,0,251,0,32,4,192,0,2,0,150,0,0,1,79,5,150,0,3,0,7,0,0,1,17,35,17,19,21,35,53,1,79,185,185,185,5,150,251,220,4,36,251,35,185,185,0,0,2,0,100,3,227,2,143,5,150,0,3,0,7,0,0,1,3,35,3,35,3,35,3,2,143,30,125,30,185,30,125,30,5,150,254,77,1,179,254,77,1,179,0,0,2,0,100,255,251,7,1,5,150,0,3,0,31,0,0,1,3,33,19,1,19,33,55,33,19,33,55,33,19,51,3,33,19,51,3,33,7,33,3,33,7,33,3,35,19,33,3,3,35,90,1,121,90,252,247,89,254,120,30,1,146,89,254,111,30,1,156,100,180,100,1,122,102,180,101,1,136,30,254,110,89,1,145,30,254,100,90,180,90,254,134,90,3,108,254,134,1,122,252,143,1,93,154,1,122,154,1,139,254,117,1,144,254,112,154,254,134,154,254,163,1,93,254,163,0,0,0,0,1,0,100,0,0,3,182,5,150,0,33,0,0,1,53,51,21,22,23,21,38,35,32,21,20,59,1,32,17,20,5,21,35,53,38,39,53,22,51,50,53,52,43,1,32,17,16,1,213,175,134,132,185,188,254,250,165,150,1,104,254,206,175,166,163,185,189,251,175,150,254,172,4,214,192,194,10,36,160,60,150,140,254,202,251,41,198,191,5,44,160,60,150,140,1,54,1,20,0,0,5,0,100,255,246,5,42,5,160,0,3,0,11,0,19,0,27,0,35,0,0,33,35,1,51,0,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,0,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,1,49,205,3,249,205,251,188,148,144,144,148,130,1,22,1,18,254,238,254,234,3,32,148,144,144,148,130,1,22,1,18,254,238,254,234,5,150,254,117,147,144,144,2,1,4,254,252,254,253,252,207,147,144,144,2,1,4,254,252,254,253,0,2,0,100,255,253,4,251,5,150,0,26,0,34,0,0,19,16,33,50,23,21,38,35,32,21,20,51,33,53,51,23,51,21,35,21,16,33,32,17,52,55,38,5,32,21,20,33,32,17,53,100,1,254,185,175,175,172,254,174,255,1,132,63,102,182,162,253,250,254,17,193,193,1,186,254,255,1,45,1,86,4,21,1,129,50,150,50,230,250,142,142,150,160,254,19,1,141,247,86,85,162,251,249,1,86,158,0,0,1,0,100,3,227,1,29,5,150,0,3,0,0,1,3,35,3,1,29,30,125,30,5,150,254,77,1,179,0,0,0,0,1,0,100,254,132,1,229,5,150,0,9,0,0,1,2,17,16,19,35,2,17,16,19,1,229,200,200,185,200,200,5,150,254,60,254,59,254,59,254,60,1,196,1,197,1,197,1,196,0,0,0,0,1,0,100,254,132,1,229,5,150,0,9,0,0,1,18,17,16,3,35,18,17,16,3,1,29,200,200,185,200,200,5,150,254,60,254,59,254,59,254,60,1,196,1,197,1,197,1,196,0,0,0,0,1,0,100,3,79,2,199,5,150,0,14,0,0,1,51,7,55,23,7,23,7,39,7,39,55,39,55,23,1,72,156,30,209,48,228,159,123,113,113,124,161,230,48,211,5,150,232,101,147,43,170,92,205,204,89,171,42,150,103,0,1,0,100,0,150,3,82,3,132,0,11,0,0,1,17,51,17,33,21,33,17,35,17,33,53,1,144,150,1,44,254,212,150,254,212,2,88,1,44,254,212,150,254,212,1,44,150,0,1,0,25,255,6,1,104,0,185,0,3,0,0,37,3,35,19,1,104,150,185,150,185,254,77,1,179,0,1,0,100,1,194,2,88,2,88,0,3,0,0,1,21,33,53,2,88,254,12,2,88,150,150,0,0,0,1,0,100,0,0,1,29,0,185,0,3,0,0,37,21,35,53,1,29,185,185,185,185,0,1,0,25,0,0,3,187,5,150,0,3,0,0,51,35,1,51,230,205,2,213,205,5,150,0,0,0,0,2,0,110,255,246,5,55,5,160,0,7,0,15,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,49,1,167,1,156,254,100,254,89,195,2,106,2,95,253,161,253,150,140,2,67,2,59,253,197,6,2,215,253,41,253,45,0,0,0,0,1,0,100,0,0,1,179,5,160,0,5,0,0,51,17,35,53,37,17,250,150,1,79,4,227,89,100,250,96,0,0,0,1,0,60,0,0,4,16,5,160,0,16,0,0,51,53,0,17,16,33,34,7,53,54,51,32,17,16,1,33,21,60,3,27,254,172,220,195,195,220,2,13,253,53,2,203,150,2,35,1,67,1,14,110,160,100,254,92,254,142,254,12,150,0,0,1,0,100,255,246,3,247,5,160,0,28,0,0,19,54,51,32,17,20,7,22,21,16,33,34,39,53,22,51,32,17,52,35,33,53,33,50,53,52,33,34,7,100,200,200,2,3,188,188,253,253,200,200,200,200,1,74,252,254,184,1,69,255,254,182,200,200,5,100,60,254,122,236,89,85,240,254,102,60,160,70,1,4,250,150,250,240,70,0,0,0,0,1,0,60,0,0,4,121,5,150,0,14,0,0,33,35,17,33,53,1,51,1,33,17,51,17,23,21,35,3,229,185,253,16,2,63,194,253,192,2,47,185,148,148,1,84,150,3,172,252,84,1,252,254,4,76,74,0,0,0,0,1,0,125,255,246,4,51,5,150,0,21,0,0,19,33,21,33,3,54,51,32,17,16,33,34,39,53,22,51,32,17,16,33,34,7,155,3,96,253,62,24,117,129,2,28,253,208,190,200,200,200,1,109,254,157,225,185,5,150,150,254,70,22,254,102,254,52,60,160,70,1,54,1,4,40,0,2,0,100,255,246,4,146,5,193,0,12,0,22,0,0,19,16,1,23,4,3,54,51,32,17,16,33,32,54,33,32,17,16,33,34,7,6,21,100,2,146,96,254,150,152,131,185,2,2,253,225,253,241,175,1,105,1,97,254,170,214,130,28,2,38,2,44,1,111,127,176,254,209,53,254,62,254,32,150,1,74,1,44,48,60,106,0,0,1,0,65,0,0,3,247,5,150,0,6,0,0,19,33,21,1,35,1,33,65,3,182,253,166,201,2,110,252,255,5,150,150,251,0,5,0,0,0,0,3,0,100,255,246,4,116,5,164,0,15,0,23,0,31,0,0,19,52,55,38,53,16,33,32,17,20,7,22,21,16,33,32,0,53,52,33,32,21,20,33,0,17,52,33,32,21,16,33,100,212,172,1,224,1,224,177,217,253,248,253,248,3,47,254,209,254,225,1,44,1,74,254,169,254,185,1,84,1,168,223,98,105,228,1,110,254,146,228,105,98,223,254,78,3,62,238,232,232,238,253,88,1,22,252,252,254,234,0,0,0,0,2,0,100,255,206,4,146,5,153,0,12,0,22,0,0,1,16,1,39,36,19,6,35,32,17,16,33,32,6,33,32,17,16,33,50,55,54,53,4,146,253,110,96,1,106,152,131,185,253,254,2,31,2,15,175,254,151,254,159,1,86,214,130,28,3,105,253,212,254,145,127,176,1,47,63,1,204,1,224,150,254,182,254,212,48,60,106,0,2,0,150,0,0,1,79,4,26,0,3,0,7,0,0,1,21,35,53,19,21,35,53,1,79,185,185,185,4,26,185,185,252,159,185,185,0,0,0,0,2,0,100,255,6,1,179,4,26,0,3,0,7,0,0,1,21,35,53,19,3,35,19,1,179,185,185,150,185,150,4,26,185,185,252,159,254,77,1,179,0,0,0,0,1,0,100,0,50,3,232,3,232,0,6,0,0,19,53,1,21,9,1,21,100,3,132,253,25,2,231,1,194,150,1,144,150,254,183,254,191,150,0,0,2,0,100,1,44,3,82,2,238,0,3,0,7,0,0,1,21,33,53,1,21,33,53,3,82,253,18,2,238,253,18,1,194,150,150,1,44,150,150,0,1,0,100,0,50,3,232,3,232,0,6,0,0,55,53,9,1,53,1,21,100,2,231,253,25,3,132,50,150,1,65,1,73,150,254,112,150,0,0,0,2,0,100,0,0,3,247,5,150,0,3,0,21,0,0,37,21,35,53,3,54,51,32,17,16,33,35,17,35,17,33,32,53,52,33,34,7,1,179,185,150,210,190,2,3,254,15,83,185,1,9,1,59,254,182,190,210,185,185,185,4,171,50,254,122,254,122,254,232,1,174,240,240,50,0,0,2,0,150,254,132,7,208,5,160,0,39,0,48,0,0,1,16,33,50,23,53,52,33,34,7,53,54,51,32,25,1,20,51,50,17,16,33,32,17,16,33,21,32,17,16,33,32,17,16,33,34,53,6,35,32,0,35,34,21,20,51,50,55,53,2,113,1,170,157,117,254,229,162,170,170,162,1,212,100,205,253,42,253,14,2,173,252,154,3,156,3,158,254,85,241,147,185,254,137,2,78,164,241,190,192,133,1,61,1,67,20,109,171,50,150,50,254,176,253,142,88,2,28,2,238,253,18,252,254,150,3,152,3,132,252,124,253,78,244,94,1,234,170,170,102,218,0,0,1,0,25,0,0,5,167,5,150,0,10,0,0,51,35,1,51,1,35,3,33,55,33,1,217,192,2,95,205,2,98,205,185,254,39,51,1,104,254,245,5,150,250,106,1,194,150,2,136,0,0,0,2,0,170,0,0,4,182,5,150,0,10,0,23,0,0,51,17,33,32,17,20,5,4,17,16,33,39,32,17,52,33,35,53,36,53,52,35,33,17,170,2,98,1,152,254,246,1,28,254,65,11,1,0,254,169,80,1,154,228,254,104,5,150,254,179,244,105,53,254,240,254,89,150,1,4,253,121,55,241,200,251,150,0,0,1,0,100,255,246,4,226,5,160,0,17,0,0,37,6,35,32,17,16,33,50,23,21,38,35,32,17,16,33,50,55,4,226,185,215,253,18,2,238,215,185,185,195,253,183,2,73,195,185,50,60,2,233,2,193,60,160,70,253,213,253,173,70,0,2,0,170,0,0,5,120,5,150,0,6,0,13,0,0,37,32,17,16,41,1,17,7,17,33,32,17,16,33,2,178,2,13,253,243,254,177,185,2,8,2,198,253,58,150,2,92,2,14,251,150,150,5,150,253,92,253,14,0,0,1,0,170,0,0,4,96,5,150,0,11,0,0,1,21,33,17,33,21,33,17,33,21,33,17,4,81,253,18,2,203,253,53,2,253,252,74,5,150,150,254,32,150,254,12,150,5,150,0,0,0,0,1,0,170,0,0,4,81,5,150,0,9,0,0,1,21,33,17,33,21,33,17,35,17,4,81,253,18,2,203,253,53,185,5,150,150,254,32,150,253,118,5,150,0,0,1,0,100,255,246,4,226,5,160,0,19,0,0,37,6,35,32,17,16,33,50,23,21,38,35,32,17,16,33,50,55,17,51,4,226,173,200,252,247,2,238,215,185,185,195,253,183,2,64,92,112,185,56,66,2,233,2,193,60,160,70,253,213,253,173,24,1,230,0,0,0,0,1,0,170,0,0,5,105,5,150,0,11,0,0,51,17,51,17,33,17,51,17,35,17,33,17,170,185,3,77,185,185,252,179,5,150,253,138,2,118,250,106,2,138,253,118,0,0,0,1,0,200,0,0,1,129,5,150,0,3,0,0,1,17,35,17,1,129,185,5,150,250,106,5,150,0,0,1,0,25,0,0,1,254,5,150,0,7,0,0,1,17,16,33,53,32,25,1,1,254,254,27,1,44,5,150,252,6,254,100,150,1,6,3,250,0,0,2,0,170,0,0,5,95,5,150,0,3,0,10,0,0,1,17,35,17,33,9,1,33,1,53,1,1,99,185,4,167,253,124,2,146,254,255,253,185,2,80,5,150,250,106,5,150,253,93,253,13,2,176,112,2,118,0,0,0,0,1,0,170,0,0,4,79,5,150,0,5,0,0,1,17,33,21,33,17,1,99,2,236,252,91,5,150,251,0,150,5,150,0,0,0,0,1,0,170,0,0,6,134,5,150,0,12,0,0,51,17,51,9,1,51,17,35,17,1,35,1,17,170,235,2,13,2,3,225,165,254,4,146,253,252,5,150,251,87,4,169,250,106,4,149,251,107,4,149,251,107,0,1,0,170,0,0,5,125,5,150,0,9,0,0,51,17,51,1,17,51,17,35,1,17,170,185,3,107,175,185,252,149,5,150,251,128,4,128,250,106,4,138,251,118,0,2,0,120,255,246,6,9,5,160,0,7,0,15,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,59,2,11,2,0,254,0,253,245,195,2,206,2,195,253,61,253,50,140,2,67,2,59,253,197,6,2,215,253,41,253,45,0,0,0,0,1,0,170,0,0,4,164,5,150,0,13,0,0,51,17,33,32,17,16,5,39,36,17,52,41,1,17,170,2,68,1,182,253,169,38,1,184,254,254,254,134,5,150,254,129,254,95,92,156,65,1,24,238,251,3,0,2,0,120,254,141,6,9,5,160,0,7,0,18,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,5,19,7,1,32,1,59,2,11,2,0,254,0,253,245,195,2,206,2,195,254,27,232,144,254,202,253,50,140,2,67,2,59,253,197,6,2,215,253,41,253,170,108,254,242,108,1,105,0,0,0,1,0,170,0,0,5,0,5,150,0,16,0,0,51,17,33,32,17,16,5,1,35,1,53,36,53,52,35,33,17,170,2,98,1,152,254,113,1,235,244,254,57,1,154,228,254,104,5,150,254,169,254,233,134,253,94,2,131,121,65,250,198,251,3,0,0,0,0,1,0,100,255,246,4,166,5,160,0,27,0,0,55,53,22,33,32,17,52,33,35,32,17,16,33,50,23,21,38,35,32,17,20,33,51,32,17,16,33,32,150,225,1,5,1,113,254,240,184,254,63,2,63,250,215,215,250,254,122,1,8,184,1,201,253,214,254,251,50,170,80,1,14,230,1,134,1,154,60,170,80,254,252,230,254,122,254,92,0,0,0,1,0,50,0,0,4,111,5,150,0,7,0,0,1,21,33,17,35,17,33,53,4,111,254,62,185,254,62,5,150,150,251,0,5,0,150,0,0,0,0,1,0,160,255,246,5,70,5,150,0,13,0,0,19,17,51,17,16,33,32,25,1,51,17,16,33,32,160,185,1,154,1,154,185,253,173,253,173,2,40,3,110,252,146,254,100,1,156,3,110,252,146,253,206,0,0,1,0,25,0,0,5,167,5,150,0,6,0,0,9,1,35,1,51,9,1,5,167,253,161,205,253,158,195,2,12,1,255,5,150,250,106,5,150,251,42,4,214,0,0,1,0,50,0,0,7,58,5,150,0,12,0,0,19,51,19,1,51,1,19,51,1,35,9,1,35,50,179,201,1,148,185,1,177,227,171,254,243,252,254,108,254,121,249,5,150,251,36,4,220,251,36,4,220,250,106,4,174,251,82,0,0,0,0,1,0,25,0,0,5,95,5,150,0,11,0,0,9,1,51,9,1,51,9,1,35,9,1,35,2,76,253,205,225,1,194,1,194,225,253,206,2,50,225,254,62,254,62,225,2,203,2,203,253,196,2,60,253,53,253,53,2,60,253,196,0,0,0,1,0,25,0,0,4,251,5,150,0,8,0,0,19,51,9,1,51,1,17,35,17,25,205,1,156,1,162,215,253,222,185,5,150,253,21,2,235,252,94,254,12,1,244,0,0,0,0,1,0,125,0,0,4,181,5,150,0,9,0,0,1,21,1,33,21,33,53,1,33,53,4,181,252,167,3,69,251,220,3,116,252,160,5,150,150,251,150,150,150,4,106,150,0,0,0,1,0,150,254,132,2,88,5,150,0,7,0,0,1,21,33,17,33,21,33,17,2,88,254,247,1,9,254,62,5,150,150,250,26,150,7,18,0,0,0,1,0,25,0,0,3,187,5,150,0,3,0,0,19,51,1,35,25,205,2,213,205,5,150,250,106,0,0,1,0,50,254,132,1,244,5,150,0,7,0,0,1,17,33,53,33,17,33,53,1,244,254,62,1,9,254,247,5,150,248,238,150,5,230,150,0,0,0,1,0,50,2,188,3,232,5,150,0,6,0,0,1,51,1,35,9,1,35,1,194,150,1,144,150,254,183,254,191,150,5,150,253,38,2,91,253,165,0,1,0,25,255,106,4,1,0,0,0,3,0,0,33,21,33,53,4,1,252,24,150,150,0,1,0,100,4,167,1,247,5,150,0,3,0,0,1,35,39,51,1,247,164,239,239,4,167,239,0,0,0,2,0,100,0,0,3,217,4,26,0,20,0,29,0,0,19,16,33,50,23,53,52,33,34,7,53,54,51,32,25,1,35,39,6,35,32,1,34,21,20,51,50,55,53,38,100,1,170,137,137,254,229,162,170,170,162,1,212,104,64,157,185,254,137,1,170,241,190,192,133,137,1,61,1,67,20,99,181,50,150,50,254,186,253,44,104,104,1,234,170,170,102,218,20,0,0,2,0,150,0,0,4,64,5,150,0,8,0,19,0,0,37,22,51,32,17,16,33,34,7,3,51,17,54,51,32,17,16,33,34,39,1,79,91,130,1,94,254,195,144,110,185,185,119,136,1,242,253,245,226,189,183,29,1,143,1,81,54,2,82,254,82,50,254,8,253,222,43,0,0,0,0,1,0,100,0,0,3,172,4,26,0,17,0,0,37,6,35,32,17,16,33,50,23,21,38,35,32,17,16,33,50,55,3,172,130,150,253,208,2,48,150,130,130,160,254,147,1,109,160,130,30,30,2,33,1,249,30,150,30,254,157,254,117,30,0,2,0,100,0,0,4,16,5,150,0,8,0,19,0,0,1,38,35,32,17,16,33,50,55,23,6,33,32,17,16,33,50,23,17,51,3,87,112,144,254,195,1,61,144,112,185,191,254,232,254,43,1,242,136,121,185,3,68,54,254,175,254,113,39,130,63,2,34,1,248,50,1,174,0,0,0,2,0,100,0,0,4,7,4,26,0,15,0,20,0,0,1,32,17,20,7,33,16,33,50,55,21,6,35,32,17,16,19,33,2,33,32,2,71,1,192,9,253,31,1,120,179,139,139,199,253,227,185,2,56,6,254,248,254,232,4,26,254,69,63,72,254,190,40,150,40,2,25,2,1,254,88,1,20,0,0,1,0,150,0,0,3,38,5,202,0,15,0,0,51,17,16,33,50,23,21,38,35,34,29,1,33,21,33,17,150,1,176,119,105,99,126,246,1,69,254,187,4,77,1,125,40,150,40,223,59,150,252,124,0,0,0,2,0,100,254,132,4,13,4,26,0,8,0,27,0,0,1,38,35,32,17,16,33,50,55,23,16,33,34,39,53,22,51,32,61,1,6,35,32,17,16,33,50,23,3,84,95,140,254,177,1,61,144,109,185,254,29,194,150,153,193,1,40,118,136,254,14,2,13,213,199,3,104,24,254,149,254,139,54,214,254,132,50,150,50,230,50,50,2,19,2,7,43,0,0,0,0,1,0,150,0,0,4,31,5,150,0,15,0,0,51,17,51,17,54,51,32,25,1,35,17,52,35,34,7,17,150,185,134,193,1,137,185,233,159,143,5,150,254,18,114,254,121,253,109,2,150,234,133,253,5,0,0,2,0,170,0,0,1,99,5,150,0,3,0,7,0,0,1,17,35,17,19,21,35,53,1,99,185,185,185,4,26,251,230,4,26,1,124,175,175,0,0,2,0,45,254,114,1,99,5,150,0,7,0,11,0,0,1,17,16,7,39,54,53,17,19,21,35,53,1,99,155,155,125,185,185,4,26,252,54,254,194,160,105,135,238,3,202,1,124,175,175,0,0,1,0,150,0,0,4,92,5,150,0,20,0,0,51,17,51,17,54,51,32,17,20,5,1,35,1,53,36,53,52,35,34,7,17,150,185,153,200,1,136,254,212,1,80,234,254,178,1,91,220,173,167,5,150,254,50,82,254,209,220,84,254,69,1,189,83,31,189,152,94,252,218,0,0,0,0,1,0,160,0,0,1,89,5,150,0,3,0,0,1,17,35,17,1,89,185,5,150,250,106,5,150,0,0,1,0,150,0,0,6,119,4,26,0,26,0,0,51,17,51,23,54,51,50,23,54,51,32,25,1,35,17,52,35,34,7,17,35,17,52,35,34,7,17,150,125,31,151,178,228,83,171,176,1,106,185,198,148,129,185,196,156,123,4,26,132,132,144,144,254,113,253,117,2,149,235,136,253,8,2,146,238,136,253,8,0,0,0,1,0,150,0,0,4,31,4,26,0,15,0,0,51,17,51,23,54,51,32,25,1,35,17,52,35,34,7,17,150,125,33,161,193,1,137,185,233,159,143,4,26,134,134,254,121,253,109,2,150,234,133,253,5,0,0,2,0,100,0,1,4,76,4,26,0,7,0,15,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,29,1,59,1,59,254,197,254,197,185,1,244,1,244,254,12,254,14,150,1,123,1,115,254,141,4,2,13,253,243,253,244,0,0,0,0,2,0,150,254,132,4,63,4,26,0,8,0,19,0,0,37,22,51,32,17,16,33,34,7,39,54,51,32,17,16,33,34,39,17,35,1,79,109,134,1,71,254,187,140,105,185,209,223,1,249,254,4,126,118,185,214,54,1,137,1,87,24,135,43,254,13,253,217,50,254,82,0,2,0,100,254,132,4,13,4,26,0,8,0,19,0,0,1,38,35,32,17,16,33,50,55,19,35,17,6,35,32,17,16,33,50,23,3,84,95,140,254,177,1,61,144,109,185,185,118,136,254,14,2,13,213,199,3,104,24,254,149,254,139,54,253,174,1,174,50,2,19,2,7,43,0,0,0,1,0,150,0,0,2,128,4,26,0,9,0,0,51,17,51,23,54,51,21,34,7,17,150,125,33,138,194,188,117,4,26,134,134,154,133,253,5,0,0,1,0,100,0,0,3,182,4,26,0,27,0,0,55,53,22,51,50,53,52,43,1,32,17,16,33,50,23,21,38,35,32,21,20,59,1,32,17,16,33,34,140,185,189,251,175,150,254,172,1,181,188,185,185,188,254,250,165,150,1,104,254,76,189,50,160,60,150,140,1,54,1,44,50,160,60,150,140,254,202,254,212,0,0,1,0,150,0,0,2,78,4,196,0,13,0,0,19,51,23,33,21,35,17,20,59,1,21,35,32,17,150,116,40,1,28,255,127,128,176,254,248,4,196,170,150,253,165,147,150,1,27,0,0,0,0,1,0,150,0,0,4,31,4,26,0,15,0,0,1,17,35,39,6,35,32,25,1,51,17,20,51,50,55,17,4,31,127,32,191,193,254,150,185,232,159,144,4,26,251,230,134,134,1,135,2,147,253,106,234,133,2,251,0,0,0,1,0,0,0,0,3,232,4,26,0,6,0,0,17,51,9,1,51,1,35,200,1,45,1,43,200,254,85,172,4,26,252,201,3,55,251,230,0,0,0,1,0,35,0,0,5,224,4,26,0,12,0,0,19,51,19,1,51,1,19,51,1,35,9,1,35,35,187,186,1,17,167,1,36,168,196,254,238,169,254,211,254,226,173,4,26,252,201,3,55,252,201,3,55,251,230,3,17,252,239,0,0,0,0,1,0,25,0,0,4,1,4,26,0,11,0,0,9,1,51,9,1,51,9,1,35,9,1,35,1,162,254,119,215,1,29,1,29,215,254,120,1,136,215,254,227,254,227,215,2,13,2,13,254,131,1,125,253,243,253,243,1,125,254,131,0,0,0,1,0,25,254,124,4,2,4,26,0,10,0,0,19,51,9,1,51,1,2,7,39,54,55,25,201,1,41,1,51,196,254,76,116,232,71,176,80,4,26,252,204,3,52,251,199,254,226,71,131,77,174,0,0,0,0,1,0,100,0,0,3,172,4,26,0,9,0,0,19,33,21,1,33,21,33,53,1,33,120,3,52,253,141,2,95,252,204,2,123,253,153,4,26,150,253,8,140,140,2,248,0,0,0,1,0,100,254,132,2,113,5,150,0,18,0,0,1,6,17,16,7,22,17,16,23,35,38,17,16,35,53,50,17,16,55,2,113,130,210,210,130,185,130,210,210,130,5,150,176,254,210,254,160,75,75,254,160,254,210,176,176,1,46,1,96,150,1,96,1,46,176,0,0,0,0,1,0,150,254,132,1,79,5,150,0,3,0,0,1,17,35,17,1,79,185,5,150,248,238,7,18,0,0,1,0,50,254,132,2,63,5,150,0,18,0,0,19,22,17,16,51,21,34,17,16,7,35,54,17,16,55,38,17,16,39,235,130,210,210,130,185,130,210,210,130,5,150,176,254,210,254,160,150,254,160,254,210,176,176,1,46,1,96,75,75,1,96,1,46,176,0,1,0,100,1,154,3,82,2,129,0,17,0,0,19,54,51,50,23,22,51,50,55,21,6,35,34,39,38,35,34,7,100,58,104,86,117,117,90,109,69,58,104,86,117,117,90,109,69,2,68,61,41,40,60,150,60,40,41,61,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,142,1,103,1,124,0,2,0,25,0,0,5,167,7,43,0,7,0,26,0,0,1,50,53,52,35,34,21,20,1,35,1,51,38,53,52,51,50,21,20,7,1,35,3,33,55,33,1,2,226,134,134,138,254,129,192,2,95,3,125,228,224,125,2,98,205,185,254,39,51,1,104,254,245,5,210,137,134,134,137,250,46,5,150,40,155,210,210,156,40,250,107,1,194,150,2,136,0,1,0,100,254,90,4,226,5,160,0,34,0,0,5,36,17,16,33,50,23,21,38,35,32,17,16,33,50,55,21,6,43,1,7,50,21,20,35,34,39,53,22,51,50,53,52,43,1,2,193,253,163,2,238,215,185,185,195,253,183,2,73,195,185,185,215,16,36,214,241,108,108,108,108,108,83,183,2,68,2,157,2,193,60,160,70,253,213,253,173,70,160,60,67,172,173,50,108,50,65,64,0,0,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,141,1,155,1,124,255,255,0,170,0,0,5,125,7,18,2,34,0,49,0,0,0,3,0,198,1,182,1,124,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,142,1,199,1,124,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,142,1,122,1,124,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,141,1,52,0,0,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,67,0,194,0,0,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,197,0,223,0,0,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,142,0,185,0,0,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,198,0,193,0,0,255,255,0,100,0,0,3,217,6,35,2,34,0,68,0,0,0,3,0,244,0,237,0,0,0,1,0,100,254,90,3,182,4,26,0,34,0,0,37,36,17,16,33,50,23,21,38,35,32,17,16,33,50,55,21,6,43,1,7,50,21,20,35,34,39,53,22,51,50,53,52,43,1,2,18,254,82,2,58,150,130,130,130,254,107,1,149,130,130,130,150,12,41,214,241,108,108,108,108,108,83,183,9,63,1,217,1,249,30,150,30,254,157,254,117,30,150,30,77,172,173,50,108,50,65,64,0,0,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,141,1,75,0,0,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,67,0,197,0,0,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,197,0,225,0,0,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,142,0,198,0,0,255,255,0,128,0,0,2,19,5,150,2,34,0,241,0,0,0,2,0,141,28,0,0,0,255,255,255,250,0,0,1,141,5,150,2,34,0,241,0,0,0,2,0,67,150,0,0,0,255,255,0,13,0,0,2,1,5,150,2,34,0,241,1,0,0,2,0,197,169,0,0,0,255,255,255,241,0,0,2,28,5,150,2,34,0,241,0,0,0,2,0,142,141,0,0,0,255,255,0,150,0,0,4,31,5,150,2,34,0,81,0,0,0,3,0,198,0,253,0,0,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,141,1,110,0,0,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,67,0,231,0,0,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,197,0,250,0,0,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,142,0,223,0,0,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,198,0,250,0,0,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,141,1,112,0,0,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,67,0,234,0,0,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,197,0,253,0,0,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,142,0,225,0,0,0,1,0,50,254,132,3,227,5,150,0,11,0,0,1,17,33,21,33,17,35,17,33,53,33,17,2,103,1,124,254,132,185,254,132,1,124,5,150,254,132,150,251,0,5,0,150,1,124,0,0,0,0,2,0,100,3,143,2,140,5,150,0,7,0,15,0,0,18,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,230,148,144,144,148,130,1,22,1,18,254,238,254,234,4,1,147,144,144,2,1,4,254,252,254,253,0,0,0,1,0,100,0,0,3,182,5,150,0,23,0,0,1,53,51,21,22,23,21,38,35,32,17,16,33,50,55,21,6,7,21,35,53,36,17,16,2,58,175,108,97,130,130,254,107,1,149,130,130,97,108,175,254,42,4,212,194,192,6,22,150,30,254,157,254,117,30,150,22,6,192,195,45,1,239,1,203,0,0,1,0,100,255,222,4,93,5,160,0,40,0,0,55,54,53,52,2,53,16,33,32,23,21,38,33,32,17,20,23,33,21,33,22,21,20,7,54,51,50,23,22,51,50,55,21,6,35,34,39,38,35,34,7,100,186,154,2,46,1,14,157,158,254,236,254,158,45,1,120,254,188,49,64,22,29,91,160,61,60,145,138,120,164,94,107,129,117,153,133,122,75,216,117,1,92,149,1,157,100,180,130,254,251,144,85,150,134,100,137,101,4,43,17,98,170,84,28,32,56,0,0,0,0,2,0,100,255,246,3,182,5,160,0,35,0,45,0,0,55,53,22,51,50,53,52,43,1,32,17,52,55,38,53,16,33,50,23,21,38,35,32,21,20,59,1,32,17,20,7,22,21,16,33,34,2,59,1,50,53,52,43,1,34,21,150,175,189,251,195,110,254,152,122,122,1,201,168,175,175,168,254,220,195,110,1,124,120,120,254,76,189,50,195,110,195,195,110,195,40,160,60,150,130,1,44,138,58,80,144,1,44,50,160,60,150,130,254,215,130,72,64,157,254,212,2,66,136,157,144,0,0,1,0,100,1,254,2,18,3,172,0,7,0,0,19,52,51,50,21,20,35,34,100,215,215,215,215,2,213,215,215,215,0,1,0,0,254,78,3,185,5,150,0,13,0,0,1,17,32,17,16,41,1,21,35,17,35,17,35,17,1,187,254,69,1,187,1,254,150,100,160,254,78,3,204,1,192,1,188,90,249,18,6,238,249,18,0,0,0,1,0,150,0,0,4,87,5,147,0,32,0,0,51,17,16,33,32,17,21,4,21,20,31,1,22,21,16,33,35,53,51,50,53,52,47,1,38,53,52,37,52,35,32,25,1,150,1,208,1,174,254,208,93,93,185,254,118,182,184,197,88,98,165,1,32,246,254,240,3,191,1,212,254,135,85,93,145,91,36,35,72,191,254,210,150,152,91,38,43,72,168,218,118,227,254,191,252,68,0,3,0,150,2,96,3,245,5,170,0,16,0,24,0,32,0,0,1,17,51,50,21,20,7,23,35,39,53,54,53,52,43,1,17,6,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,148,229,153,150,184,91,171,154,86,153,250,1,101,1,104,254,152,254,155,73,1,174,1,177,254,79,254,94,2,244,2,24,128,105,50,253,241,45,25,94,74,254,33,92,1,105,1,113,254,143,2,1,171,254,85,254,97,0,0,0,0,3,0,150,255,246,6,99,5,160,0,7,0,15,0,33,0,0,54,33,32,17,16,33,32,17,39,16,33,32,17,16,33,32,1,6,35,32,17,16,33,50,23,21,38,35,32,17,16,33,50,55,255,2,111,2,140,253,136,253,125,105,2,236,2,225,253,31,253,20,4,9,125,165,254,96,1,160,165,125,125,151,254,187,1,69,151,125,80,2,127,2,119,253,137,4,2,205,253,51,253,35,1,90,51,1,187,1,160,51,98,58,254,187,254,160,58,0,0,0,0,2,0,150,2,245,5,176,5,150,0,7,0,20,0,0,1,21,35,17,35,17,35,53,1,17,51,27,1,51,17,35,17,3,35,3,17,2,149,212,87,212,2,88,110,248,242,106,78,239,69,243,5,150,71,253,166,2,90,71,253,95,2,161,253,207,2,49,253,95,2,31,253,225,2,31,253,225,0,0,0,1,0,100,4,167,1,247,5,150,0,3,0,0,1,51,7,35,1,8,239,239,164,5,150,239,0,0,0,2,0,100,4,236,2,143,5,150,0,3,0,7,0,0,1,21,35,53,35,21,35,53,2,143,185,185,185,5,150,170,170,170,170,0,0,1,0,25,0,0,7,8,5,150,0,18,0,0,1,23,33,3,35,1,33,21,33,19,33,21,33,19,33,21,33,9,1,3,44,58,254,53,194,192,2,95,4,124,252,136,210,2,131,253,194,226,1,147,253,220,253,244,254,246,2,88,150,254,62,5,150,150,254,32,150,254,12,150,4,214,253,130,0,0,0,3,0,100,255,246,5,245,5,160,0,6,0,13,0,31,0,0,1,38,35,32,17,16,31,1,22,51,32,17,16,39,55,22,17,16,33,34,39,7,35,55,38,17,16,33,50,23,55,51,4,75,113,168,253,245,109,118,118,178,2,0,111,112,194,253,61,240,159,54,197,122,190,2,206,228,155,50,198,4,205,61,253,197,254,248,144,104,67,2,67,1,10,142,148,182,254,132,253,45,81,71,161,180,1,116,2,215,76,66,0,0,0,2,0,100,0,0,3,82,4,26,0,11,0,15,0,0,1,17,51,17,33,21,33,17,35,17,33,53,1,21,33,53,1,144,150,1,44,254,212,150,254,212,2,238,253,18,2,238,1,44,254,212,150,254,212,1,44,150,253,168,150,150,0,0,0,1,0,50,0,0,4,176,5,150,0,22,0,0,19,51,9,1,51,1,33,21,33,21,33,21,33,17,35,17,33,53,33,53,33,53,33,50,205,1,106,1,112,215,254,79,1,57,254,136,1,120,254,136,185,254,163,1,93,254,163,1,31,5,150,253,141,2,115,253,68,150,111,150,254,193,1,63,150,111,150,0,0,0,0,1,0,150,254,132,4,31,4,26,0,17,0,0,1,17,35,39,6,35,34,39,17,35,17,51,17,16,51,50,55,17,4,31,127,32,191,173,130,67,185,185,232,159,144,4,26,251,230,134,134,80,254,52,5,150,253,156,254,228,133,2,251,0,0,2,0,100,3,138,2,30,5,150,0,20,0,29,0,0,19,52,51,50,23,53,52,35,34,7,53,54,51,50,21,17,35,39,6,35,34,36,35,34,21,20,51,50,55,53,100,213,79,58,142,80,86,86,80,234,46,38,68,92,198,1,39,82,121,106,96,56,4,45,161,10,50,86,26,76,24,168,254,156,36,36,250,86,90,42,124,0,0,2,0,100,3,138,2,88,5,150,0,7,0,15,0,0,18,51,50,53,52,35,34,21,7,16,51,50,17,16,35,34,193,157,158,158,157,93,250,250,250,248,3,212,190,186,186,2,1,6,254,250,254,250,0,0,0,3,0,100,0,0,6,198,4,26,0,8,0,13,0,47,0,0,1,34,21,20,51,50,55,53,38,37,33,2,33,32,3,6,35,32,17,16,33,50,23,53,52,33,34,7,53,54,51,32,23,54,51,32,17,20,7,33,16,33,50,55,21,6,35,32,2,14,241,190,192,133,137,1,69,2,56,6,254,248,254,232,83,223,225,254,137,1,170,137,137,254,229,162,170,170,162,1,40,109,121,243,1,192,9,253,31,1,120,169,149,139,199,254,232,1,234,170,170,102,218,20,136,1,20,253,14,148,1,61,1,67,20,99,181,50,150,50,130,130,254,69,63,72,254,190,40,150,40,0,0,0,0,3,0,100,0,0,4,89,4,26,0,6,0,13,0,31,0,0,1,38,35,32,17,20,31,1,22,51,32,17,52,39,55,22,21,16,33,34,39,7,35,55,38,3,16,33,50,23,55,51,3,3,69,102,254,197,49,115,63,88,1,59,38,118,105,254,12,148,104,36,197,105,119,1,1,244,163,110,42,198,3,93,39,254,141,150,91,109,29,1,123,128,84,155,131,240,253,244,46,47,138,131,1,0,2,13,56,56,0,2,0,100,254,132,3,247,4,26,0,3,0,21,0,0,1,53,51,21,19,6,35,32,17,16,33,51,17,51,17,33,32,21,20,33,50,55,2,168,185,150,210,190,253,253,1,241,83,185,254,247,254,197,1,74,190,210,3,97,185,185,251,85,50,1,134,1,134,1,24,254,82,240,240,50,0,2,0,150,254,132,1,79,4,26,0,3,0,7,0,0,19,17,51,17,3,53,51,21,150,185,185,185,254,132,4,36,251,220,4,221,185,185,0,0,0,1,0,100,2,138,3,217,4,26,0,5,0,0,19,33,17,35,53,33,100,3,117,150,253,33,4,26,254,112,250,0,0,1,0,50,254,128,3,229,5,154,0,27,0,0,1,38,35,34,15,1,51,7,35,3,2,33,34,39,53,22,51,50,55,19,35,55,51,55,18,33,50,23,3,229,31,27,171,43,24,210,30,210,164,73,254,194,32,34,31,27,171,43,164,190,30,190,24,73,1,62,32,34,5,0,6,216,120,150,252,204,254,148,4,150,6,216,3,52,150,120,1,108,4,0,0,0,0,2,0,100,0,150,3,191,3,132,0,5,0,11,0,0,9,1,51,9,1,35,9,1,51,9,1,35,1,243,1,2,202,254,254,1,2,202,253,111,1,2,202,254,254,1,2,202,2,13,1,119,254,137,254,137,1,119,1,119,254,137,254,137,0,2,0,50,0,150,3,141,3,132,0,5,0,11,0,0,55,35,9,1,51,1,19,35,9,1,51,1,252,202,1,2,254,254,202,1,2,141,202,1,2,254,254,202,1,2,150,1,119,1,119,254,137,254,137,1,119,1,119,254,137,0,0,0,0,3,0,100,0,0,4,61,0,185,0,3,0,7,0,11,0,0,37,21,35,53,33,21,35,53,33,21,35,53,1,29,185,2,73,185,2,73,185,185,185,185,185,185,185,185,0,0,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,67,1,111,1,124,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,198,1,130,1,124,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,198,1,227,1,124,0,2,0,100,0,0,8,42,5,150,0,7,0,24,0,0,36,33,32,17,16,33,32,17,7,16,41,1,21,33,22,19,33,21,33,2,7,33,21,33,32,1,39,2,11,2,0,254,0,253,245,195,2,206,4,233,252,249,195,30,2,3,253,253,30,195,3,22,251,8,253,50,150,2,57,2,49,253,207,6,2,205,150,148,254,180,150,254,155,143,150,0,0,3,0,100,0,0,7,58,4,26,0,7,0,12,0,36,0,0,37,32,17,16,33,32,17,16,1,33,2,33,32,3,6,33,32,3,16,33,32,23,54,33,32,17,20,7,33,16,33,50,55,21,6,35,32,2,88,1,59,254,197,254,197,3,51,2,56,6,254,248,254,232,109,121,254,220,254,14,2,1,244,1,28,123,118,1,21,1,192,9,253,31,1,120,179,139,139,199,254,195,150,1,123,1,115,254,141,254,133,1,220,1,20,253,76,209,2,12,2,13,199,199,254,69,63,72,254,190,40,150,40,0,0,1,0,100,1,194,4,76,2,88,0,3,0,0,1,21,33,53,4,76,252,24,2,88,150,150,0,0,0,1,0,100,1,194,6,64,2,88,0,3,0,0,1,21,33,53,6,64,250,36,2,88,150,150,0,0,0,2,0,50,3,227,2,243,5,150,0,3,0,7,0,0,1,3,35,19,35,3,35,19,2,243,150,185,150,185,150,185,150,5,150,254,77,1,179,254,77,1,179,0,0,2,0,50,3,227,2,243,5,150,0,3,0,7,0,0,1,3,35,19,35,3,35,19,2,243,150,185,150,185,150,185,150,5,150,254,77,1,179,254,77,1,179,0,0,1,0,50,3,227,1,129,5,150,0,3,0,0,1,3,35,19,1,129,150,185,150,5,150,254,77,1,179,0,0,0,0,1,0,50,3,227,1,129,5,150,0,3,0,0,1,3,35,19,1,129,150,185,150,5,150,254,77,1,179,0,0,0,0,3,0,100,0,150,3,117,3,132,0,3,0,7,0,11,0,0,1,21,33,53,1,21,35,53,19,21,35,53,3,117,252,239,1,229,185,185,185,2,88,150,150,254,212,150,150,2,88,150,150,0,255,255,0,25,254,124,4,2,5,150,2,34,0,92,0,0,0,3,0,142,0,148,0,0,255,255,0,25,0,0,4,251,7,18,2,34,0,60,0,0,0,3,0,142,1,17,1,124,0,2,0,100,0,61,4,15,3,220,0,27,0,35,0,0,19,39,55,23,54,51,50,23,55,23,7,22,21,20,7,23,7,39,6,35,34,39,7,39,55,38,53,52,23,20,51,50,53,52,35,34,216,116,109,125,108,134,124,101,128,110,118,58,68,128,110,128,108,125,124,119,116,109,116,57,163,245,245,245,245,2,244,120,112,121,68,68,121,112,120,83,148,139,93,120,112,123,60,60,123,112,120,103,129,137,133,246,246,244,0,0,0,1,0,100,0,150,2,48,3,132,0,5,0,0,19,1,51,9,1,35,100,1,2,202,254,254,1,2,202,2,13,1,119,254,137,254,137,0,0,0,0,1,0,50,0,150,1,254,3,132,0,5,0,0,55,35,9,1,51,1,252,202,1,2,254,254,202,1,2,150,1,119,1,119,254,137,0,1,0,50,254,132,3,227,5,150,0,19,0,0,1,17,33,21,33,17,33,21,33,17,35,17,33,53,33,17,33,53,33,17,2,103,1,124,254,132,1,124,254,132,185,254,132,1,124,254,132,1,124,5,150,254,132,150,253,18,150,254,132,1,124,150,2,238,150,1,124,0,0,1,0,100,1,144,1,94,2,138,0,7,0,0,19,52,51,50,21,20,35,34,100,125,125,125,125,2,13,125,125,125,0,1,0,25,255,6,1,104,0,185,0,3,0,0,37,3,35,19,1,104,150,185,150,185,254,77,1,179,0,2,0,25,255,6,2,218,0,185,0,3,0,7,0,0,37,3,35,19,35,3,35,19,2,218,150,185,150,185,150,185,150,185,254,77,1,179,254,77,1,179,0,0,0,7,0,100,255,246,7,215,5,160,0,3,0,11,0,19,0,27,0,35,0,43,0,51,0,0,33,35,1,51,0,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,0,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,36,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,1,49,205,3,249,205,251,188,148,144,144,148,130,1,22,1,18,254,238,254,234,5,205,148,144,144,148,130,1,22,1,18,254,238,254,234,253,213,148,144,144,148,130,1,22,1,18,254,238,254,234,5,150,254,117,147,144,144,2,1,4,254,252,254,253,252,207,147,144,144,2,1,4,254,252,254,253,114,147,144,144,2,1,4,254,252,254,253,0,0,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,197,1,130,1,124,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,197,1,39,1,124,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,141,1,246,1,124,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,142,1,12,1,124,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,67,1,20,1,124,255,255,0,158,0,0,2,49,7,18,2,34,0,44,0,0,0,3,0,141,0,58,1,124,255,255,0,43,0,0,2,31,7,18,2,34,0,44,1,0,0,3,0,197,255,199,1,124,255,255,0,15,0,0,2,58,7,18,2,34,0,44,0,0,0,3,0,142,255,171,1,124,255,255,0,24,0,0,1,171,7,18,2,34,0,44,0,0,0,3,0,67,255,180,1,124,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,141,2,86,1,124,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,197,1,227,1,124,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,67,1,208,1,124,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,141,2,9,1,124,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,197,1,149,1,124,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,67,1,130,1,124,0,1,0,100,4,146,2,88,5,150,0,6,0,0,1,51,19,35,39,7,35,1,19,150,175,150,100,100,150,5,150,254,252,160,160,0,0,1,0,100,4,204,2,88,5,150,0,17,0,0,19,54,51,50,23,22,51,50,55,21,6,35,34,39,38,35,34,7,100,60,70,52,58,58,56,75,71,60,70,52,58,58,56,75,71,5,104,46,26,26,46,150,46,26,26,46,0,1,0,100,5,0,2,88,5,150,0,3,0,0,1,21,33,53,2,88,254,12,5,150,150,150,0,0,0,1,0,0,254,90,1,201,0,75,0,16,0,0,17,22,51,50,53,52,43,1,19,51,7,50,21,20,35,34,39,108,108,108,83,183,131,135,81,214,241,108,108,254,248,50,65,64,1,4,152,172,173,50,0,0,0,1,0,25,254,132,1,104,255,156,0,3,0,0,5,3,35,19,1,104,150,185,150,100,254,232,1,24,255,255,0,100,255,246,4,166,7,18,2,34,0,54,0,0,0,3,0,247,1,39,1,124,255,255,0,100,0,0,3,182,5,150,2,34,0,86,0,0,0,3,0,247,0,175,0,0,0,2,0,150,254,132,1,79,5,150,0,3,0,7,0,0,1,17,35,17,19,17,35,17,1,79,185,184,184,1,94,253,38,2,218,4,56,253,38,2,218,0,0,0,0,2,255,226,0,0,5,120,5,150,0,10,0,21,0,0,19,17,33,32,17,16,41,1,17,35,53,41,1,21,33,17,33,32,17,16,41,1,170,2,8,2,198,253,58,253,248,200,1,129,1,109,254,147,1,79,2,13,253,243,254,177,3,32,2,118,253,92,253,14,2,138,150,150,254,12,2,92,2,14,0,2,0,100,255,246,4,66,5,150,0,9,0,34,0,0,1,52,39,38,35,32,17,16,33,32,3,22,17,16,33,32,17,16,33,50,23,38,39,5,53,55,38,43,1,53,51,50,23,55,21,3,137,18,80,214,254,200,1,57,1,55,21,206,254,15,254,19,1,208,177,119,49,98,254,229,161,90,115,206,208,241,158,240,2,64,126,118,90,254,142,254,112,4,87,211,254,52,253,178,2,38,1,254,90,141,79,119,119,68,32,150,100,100,119,0,255,255,0,25,0,0,4,251,7,18,2,34,0,60,0,0,0,3,0,141,1,160,1,124,255,255,0,25,254,124,4,2,5,150,2,34,0,92,0,0,0,3,0,141,1,35,0,0,0,1,0,150,0,0,4,144,5,150,0,15,0,0,51,17,51,17,33,32,17,16,5,39,36,53,52,35,33,17,150,185,1,169,1,152,253,199,38,1,154,228,254,104,5,150,254,204,254,169,254,125,92,156,65,250,198,252,55,0,0,2,0,150,254,132,4,63,5,150,0,8,0,21,0,0,37,22,51,32,17,16,33,34,7,3,51,17,54,51,32,17,16,33,34,39,17,35,1,79,109,134,1,71,254,187,140,105,185,185,96,151,1,249,254,4,126,118,185,214,54,1,137,1,87,24,2,46,254,113,19,254,13,253,217,50,254,82,0,0,0,1,0,100,1,194,3,82,2,88,0,3,0,0,1,21,33,53,3,82,253,18,2,88,150,150,0,0,0,1,0,100,0,207,2,224,3,75,0,11,0,0,1,39,55,23,55,23,7,23,7,39,7,39,1,56,212,106,212,212,106,212,212,106,212,212,106,2,13,212,106,212,212,106,212,212,106,212,212,106,0,1,0,50,2,198,1,22,5,146,0,5,0,0,19,17,35,53,55,17,126,76,228,2,198,2,39,75,90,253,52,0,0,1,0,50,2,198,2,28,5,150,0,16,0,0,19,53,36,53,52,35,34,7,53,54,51,32,21,20,5,33,21,50,1,81,110,110,97,97,110,1,7,254,225,1,31,2,198,135,213,152,85,55,140,50,220,175,190,135,0,0,0,1,0,50,2,194,2,16,5,150,0,28,0,0,19,54,51,32,21,20,7,22,21,20,33,34,39,53,22,51,50,53,52,43,1,53,51,50,53,52,35,34,7,50,100,100,1,22,94,94,254,234,100,100,100,100,126,86,164,162,88,126,100,100,5,120,30,214,98,45,43,100,224,30,140,36,90,76,134,76,80,36,0,0,0,3,0,100,0,0,5,62,5,150,0,3,0,9,0,26,0,0,33,35,1,51,1,17,35,53,55,17,1,53,36,53,52,35,34,7,53,54,51,32,21,20,5,33,21,1,29,185,3,117,185,252,52,74,227,1,245,1,82,110,110,98,98,110,1,6,254,224,1,32,5,150,253,48,2,39,75,90,253,52,253,58,135,213,152,85,55,140,50,220,175,190,135,0,0,0,0,3,0,100,255,252,5,69,5,150,0,3,0,9,0,38,0,0,33,35,1,51,1,17,35,53,55,17,5,54,51,32,21,20,7,22,21,20,33,34,39,53,22,51,50,53,52,43,1,53,51,50,53,52,35,34,7,1,29,185,3,117,185,252,52,74,227,2,9,100,100,1,21,94,94,254,235,100,100,100,100,124,86,164,163,87,124,100,100,5,150,253,48,2,39,75,90,253,52,20,30,214,98,45,43,100,224,30,140,36,90,76,134,76,80,36,0,3,0,100,0,0,5,110,5,150,0,3,0,18,0,47,0,0,33,35,1,51,19,35,53,33,53,19,51,3,51,17,51,17,23,21,35,1,54,51,32,21,20,7,22,21,20,33,34,39,53,22,51,50,53,52,43,1,53,51,50,53,52,35,34,7,1,120,185,3,117,185,55,152,254,170,218,162,213,175,152,74,74,251,64,100,100,1,21,94,94,254,235,100,100,100,100,124,86,164,163,87,124,100,100,5,150,250,106,150,134,1,174,254,82,1,8,254,248,38,96,4,226,30,214,98,45,43,100,224,30,140,36,90,76,134,76,80,36,0,0,1,0,0,0,0,4,59,5,150,0,13,0,0,19,17,51,17,37,21,5,17,33,21,33,17,7,53,150,185,1,67,254,189,2,236,252,91,150,2,200,2,206,253,186,238,180,238,253,250,150,2,20,110,180,0,0,1,0,10,0,0,1,239,5,150,0,11,0,0,19,17,51,17,55,21,7,17,35,17,7,53,160,185,150,150,185,150,2,201,2,205,253,189,111,180,111,253,97,2,21,111,180,0,255,255,0,125,0,0,4,181,7,18,2,34,0,61,0,0,0,3,0,247,1,59,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,93,0,0,0,3,0,247,0,170,0,0,0,1,0,100,0,0,3,82,4,26,0,19,0,0,1,35,53,33,55,33,53,33,19,51,3,51,21,33,7,33,21,33,3,35,1,15,171,1,1,86,254,169,1,173,171,150,171,171,254,255,86,1,87,254,83,171,150,1,44,150,150,150,1,44,254,212,150,150,150,254,212,0,0,3,0,100,0,230,5,140,3,52,0,15,0,23,0,31,0,0,19,16,33,50,23,54,51,32,17,16,33,34,39,6,35,32,1,52,35,34,7,22,51,50,32,51,50,55,38,35,34,21,100,1,64,200,140,140,200,1,64,254,192,200,140,140,200,254,192,4,131,155,130,120,120,130,155,252,34,155,130,120,120,130,155,2,13,1,39,170,170,254,217,254,217,170,170,1,39,145,145,145,145,145,145,0,0,2,0,100,0,0,3,82,4,46,0,3,0,10,0,0,37,21,33,53,17,53,1,21,13,1,21,3,82,253,18,2,238,253,185,2,71,150,150,150,1,194,150,1,64,160,239,231,160,0,0,0,0,2,0,100,0,0,3,82,4,46,0,3,0,10,0,0,37,21,33,61,2,45,1,53,1,21,3,82,253,18,2,71,253,185,2,238,150,150,150,130,160,231,239,160,254,192,150,0,0,2,0,149,255,246,4,191,5,160,0,21,0,30,0,0,0,7,53,54,51,32,17,20,7,2,33,32,17,52,55,18,33,51,54,53,16,35,19,35,32,3,6,21,20,51,32,2,25,184,218,244,1,144,33,142,254,12,254,121,14,87,2,34,234,15,251,203,233,254,150,54,10,236,1,45,5,10,140,170,120,254,66,129,165,253,58,1,55,59,70,1,181,82,66,1,19,253,178,254,242,49,41,200,0,1,0,100,254,132,4,226,5,150,0,11,0,0,19,33,21,33,9,1,33,21,33,53,9,1,100,4,126,252,74,2,28,253,228,3,182,251,130,2,23,253,233,5,150,150,253,48,252,234,150,150,3,22,2,208,0,1,0,150,254,132,5,220,5,150,0,7,0,0,1,17,35,17,33,17,35,17,5,220,175,252,34,185,5,150,248,238,6,124,249,132,7,18,0,0,0,1,0,25,255,251,5,85,4,26,0,22,0,0,19,54,51,33,21,35,17,20,51,50,55,21,6,35,32,25,1,33,17,35,17,34,7,25,140,150,4,26,245,175,15,15,41,37,254,200,254,77,185,150,140,3,222,60,150,253,188,171,1,150,5,1,69,2,68,252,123,3,133,60,0,0,0,1,0,0,255,106,2,77,6,124,0,19,0,0,1,34,17,20,23,19,22,21,16,33,53,50,17,52,39,3,38,53,16,33,2,77,222,1,38,1,254,105,222,1,38,1,1,151,5,230,254,186,26,28,253,18,30,29,254,41,150,1,70,26,28,2,238,30,29,1,215,0,0,1,0,120,0,0,5,210,5,170,0,23,0,0,51,53,33,0,17,16,33,32,17,16,1,33,21,33,53,0,17,16,33,32,17,16,1,21,135,1,49,254,192,2,173,2,173,254,192,1,49,253,218,1,124,254,12,254,12,1,124,150,1,14,1,124,2,138,253,118,254,132,254,242,150,150,1,14,1,124,1,244,254,12,254,132,254,242,150,0,0,0,0,1,0,75,255,249,5,70,7,62,0,8,0,0,19,33,19,1,51,1,35,1,35,75,1,109,242,1,232,180,253,168,165,254,232,230,4,26,252,218,6,74,248,187,3,139,0,0,0,2,0,100,0,250,3,182,3,32,0,17,0,35,0,0,1,21,6,35,34,39,38,35,34,7,53,54,51,50,23,22,51,50,19,21,6,35,34,39,38,35,34,7,53,54,51,50,23,22,51,50,3,182,111,109,109,106,106,104,103,102,112,108,109,106,106,104,104,101,111,109,109,106,106,104,103,102,112,108,109,106,106,104,104,1,194,150,50,50,50,50,150,50,50,50,1,94,150,50,50,50,50,150,50,50,50,0,0,2,0,25,0,0,5,167,5,150,0,3,0,6,0,0,51,1,51,1,37,9,1,25,2,95,206,2,97,254,246,254,59,254,63,5,150,250,106,150,4,64,251,192,0,2,0,50,0,0,4,11,5,150,0,5,0,9,0,0,1,51,9,1,35,1,51,9,2,1,194,185,1,144,254,112,185,254,112,185,1,52,1,51,254,205,5,150,253,53,253,53,2,203,253,203,2,53,2,53,0,1,0,100,0,0,4,146,5,150,0,3,0,0,33,35,1,51,1,29,185,3,117,185,5,150,0,0,0,1,0,150,0,0,3,193,5,222,0,17,0,0,1,17,35,17,16,33,50,23,21,38,35,32,29,1,33,17,35,17,1,79,185,1,186,139,155,149,146,255,0,2,114,185,3,142,252,114,4,77,1,145,60,150,60,233,69,251,230,3,142,0,0,1,0,150,0,0,4,0,5,222,0,17,0,0,1,38,35,32,29,1,33,21,33,17,35,17,16,33,50,23,17,35,3,71,110,88,254,206,1,59,254,197,185,1,236,179,203,185,5,53,19,243,59,150,252,124,4,77,1,145,72,250,106,0,0,4,0,100,255,210,6,88,5,196,0,18,0,82,0,94,0,106,0,0,1,53,39,17,51,19,51,3,35,7,39,35,3,51,19,51,17,7,21,3,55,23,55,23,55,23,55,23,55,23,55,23,51,21,23,7,23,7,23,7,23,7,23,7,23,7,23,7,21,35,7,39,7,39,7,39,7,39,7,39,7,39,7,39,35,53,39,55,39,55,39,55,39,55,39,55,39,55,39,55,53,51,55,5,32,0,17,16,0,33,32,0,17,16,0,6,0,21,20,0,35,34,0,53,52,0,51,4,157,253,135,51,115,38,249,80,79,250,38,114,51,136,253,9,37,89,53,81,68,68,81,53,89,37,94,20,97,94,19,89,36,81,54,68,69,55,82,37,89,19,94,97,20,94,37,89,53,81,68,68,81,53,89,37,95,19,97,95,19,90,37,80,55,69,69,55,82,37,89,19,94,97,19,1,167,254,250,254,142,1,114,1,6,1,6,1,114,254,142,23,1,82,254,174,239,239,254,174,1,82,239,1,76,102,13,2,28,254,112,1,255,43,43,254,1,1,144,253,228,13,102,3,230,89,37,80,53,67,67,53,80,37,89,19,96,96,19,94,37,90,52,82,67,69,82,52,90,37,94,19,96,96,19,89,37,80,53,67,67,53,80,37,89,19,96,96,19,94,39,88,53,81,69,67,82,54,88,37,94,19,96,96,2,254,142,254,251,254,249,254,142,1,114,1,7,1,5,1,114,54,254,173,238,240,254,173,1,83,240,238,1,83,0,0,0,1,0,170,0,0,1,99,4,26,0,3,0,0,1,17,35,17,1,99,185,4,26,251,230,4,26,0,0,1,0,100,4,146,2,118,5,150,0,9,0,0,19,51,20,51,50,53,51,16,33,32,100,135,130,130,135,254,247,254,247,5,150,150,150,254,252,0,0,1,0,100,4,216,1,49,5,150,0,3,0,0,1,21,35,53,1,49,205,5,150,190,190,0,0,0,0,2,0,100,4,128,2,40,6,35,0,7,0,15,0,0,18,51,50,53,52,35,34,21,7,52,51,50,21,20,35,34,190,138,134,134,138,90,228,224,224,228,4,202,137,134,134,2,210,210,209,0,0,2,0,100,4,167,3,111,5,150,0,3,0,7,0,0,1,51,7,35,37,51,7,35,1,8,239,239,164,2,28,239,239,164,5,150,239,239,239,0,0,1,0,100,254,86,1,224,0,0,0,13,0,0,33,6,21,20,51,50,55,21,6,35,34,53,52,55,1,204,202,85,85,52,61,88,231,165,126,102,68,20,130,20,173,131,122,0,0,1,0,100,4,146,2,88,5,150,0,6,0,0,19,51,23,55,51,3,35,100,150,100,100,150,175,150,5,150,160,160,254,252,0,0,0,1,0,100,255,246,4,226,5,160,0,24,0,0,37,6,35,32,17,16,33,50,23,21,38,35,32,3,33,21,33,21,33,21,33,18,33,50,55,4,226,185,215,253,18,2,238,215,185,185,195,254,14,87,3,5,252,231,3,25,252,251,77,1,252,195,185,50,60,2,233,2,193,60,160,70,254,164,150,110,150,254,120,70,255,255,0,125,0,0,4,181,7,18,2,34,0,61,0,0,0,3,0,243,1,207,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,93,0,0,0,3,0,243,1,62,0,0,255,255,0,125,0,0,4,181,7,18,2,34,0,61,0,0,0,3,0,141,1,175,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,93,0,0,0,3,0,141,1,30,0,0,0,1,0,25,254,86,5,187,5,150,0,22,0,0,51,35,1,51,1,6,21,20,51,50,55,21,6,35,34,53,52,55,3,33,55,33,1,217,192,2,95,205,2,98,202,85,85,52,61,88,231,155,185,254,39,51,1,104,254,245,5,150,250,106,126,102,68,20,130,20,173,131,122,1,194,150,2,136,0,0,0,2,0,100,254,86,3,237,4,26,0,8,0,41,0,0,1,34,21,20,51,50,55,53,38,19,53,6,35,32,17,16,33,50,23,53,52,33,34,7,53,54,51,32,25,1,6,21,20,51,50,55,21,6,35,34,53,52,2,14,241,190,192,133,137,154,157,185,254,137,1,170,137,137,254,229,162,170,170,162,1,212,202,85,85,52,61,88,231,1,234,170,170,102,218,20,254,22,104,104,1,61,1,67,20,99,181,50,150,50,254,186,253,44,126,102,68,20,130,20,173,131,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,38,0,0,0,3,0,141,1,185,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,70,0,0,0,3,0,141,1,35,0,0,255,255,0,170,0,0,5,125,7,18,2,34,0,49,0,0,0,3,0,141,2,41,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,81,0,0,0,3,0,141,1,112,0,0,255,255,0,100,255,246,4,166,7,18,2,34,0,54,0,0,0,3,0,141,1,155,1,124,255,255,0,100,0,0,3,182,5,150,2,34,0,86,0,0,0,3,0,141,1,35,0,0,0,1,0,170,254,86,4,116,5,150,0,24,0,0,41,1,17,33,21,33,17,33,21,33,17,33,21,6,21,20,51,50,55,21,6,35,34,53,52,3,157,253,13,3,167,253,18,2,203,253,53,2,253,202,85,85,52,61,88,231,5,150,150,254,32,150,254,12,150,126,102,68,20,130,20,173,131,0,0,0,0,2,0,100,254,86,4,7,4,26,0,4,0,33,0,0,1,33,2,33,32,1,6,35,32,17,16,33,32,17,20,7,33,16,33,50,55,21,6,21,20,51,50,55,21,6,35,34,53,52,1,29,2,56,6,254,238,254,242,1,215,63,70,253,227,1,217,1,202,9,253,31,1,120,179,139,202,85,85,52,61,88,231,2,114,1,20,252,136,14,2,25,2,1,254,67,62,71,254,190,40,150,166,102,68,20,130,20,173,123,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,38,0,0,0,3,0,247,1,160,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,70,0,0,0,3,0,247,0,238,0,0,255,255,0,170,0,0,5,120,7,18,2,34,0,39,0,0,0,3,0,247,1,119,1,124,0,3,0,100,0,0,5,195,5,150,0,8,0,19,0,23,0,0,1,38,35,32,17,16,33,50,55,23,6,33,32,17,16,33,50,23,17,51,33,3,35,19,3,87,112,144,254,195,1,61,144,112,185,191,254,232,254,43,1,242,136,121,185,1,179,150,185,150,3,68,54,254,175,254,113,39,130,63,2,34,1,248,50,1,174,254,77,1,179,0,0,0,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,247,1,39,1,124,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,247,0,235,0,0,255,255,0,170,0,0,5,125,7,18,2,34,0,49,0,0,0,3,0,247,1,182,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,81,0,0,0,3,0,247,0,253,0,0,255,255,0,170,0,0,5,0,7,18,2,34,0,53,0,0,0,3,0,247,1,9,1,124,255,255,0,145,0,0,2,133,5,150,2,34,0,85,0,0,0,2,0,247,45,0,0,0,255,255,0,50,0,0,4,111,7,18,2,34,0,55,0,0,0,3,0,247,0,243,1,124,0,2,0,150,0,0,3,207,5,150,0,13,0,17,0,0,19,51,23,33,21,35,17,20,59,1,21,35,32,17,1,3,35,19,150,116,40,1,28,255,127,128,176,254,248,3,57,150,185,150,4,196,170,150,253,165,147,150,1,27,4,123,254,77,1,179,0,0,255,255,0,160,255,246,5,70,7,57,2,34,0,56,0,0,0,3,0,244,1,173,1,22,255,255,0,150,0,0,4,31,6,35,2,34,0,88,0,0,0,3,0,244,1,21,0,0,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,199,1,130,1,124,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,199,0,193,0,0,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,242,1,115,1,124,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,242,0,198,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,38,0,0,0,3,0,197,1,199,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,70,0,0,0,3,0,197,1,9,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,38,0,0,0,3,0,243,2,121,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,70,0,0,0,3,0,243,1,187,0,0,255,255,255,206,0,0,5,100,5,150,2,2,0,205,236,0,0,2,0,100,0,0,4,16,5,150,0,8,0,23,0,0,1,38,35,32,17,16,33,50,55,23,6,33,32,17,16,33,50,23,53,33,53,33,53,51,3,87,112,144,254,195,1,61,144,112,185,191,254,232,254,43,1,242,136,121,253,33,2,223,185,3,68,54,254,175,254,113,39,130,63,2,34,1,248,50,140,150,140,0,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,199,1,39,1,124,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,199,0,216,0,0,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,242,1,24,1,124,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,242,0,201,0,0,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,243,1,187,1,124,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,243,1,127,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,42,0,0,0,3,0,197,1,179,1,124,255,255,0,100,254,132,4,13,5,150,2,34,0,74,0,0,0,3,0,197,1,13,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,42,0,0,0,3,0,242,1,164,1,124,255,255,0,100,254,132,4,13,5,150,2,34,0,74,0,0,0,3,0,242,0,244,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,42,0,0,0,3,0,243,2,121,1,124,255,255,0,100,254,132,4,13,5,150,2,34,0,74,0,0,0,3,0,243,1,170,0,0,255,255,0,100,254,132,4,226,5,160,2,34,0,42,0,0,0,3,0,201,1,227,0,0,0,3,0,100,254,132,4,13,5,150,0,8,0,27,0,31,0,0,1,38,35,32,17,16,33,50,55,23,16,33,34,39,53,22,51,32,61,1,6,35,32,17,16,33,50,23,11,1,35,19,3,84,95,140,254,177,1,61,144,109,185,254,29,194,150,153,193,1,40,118,136,254,14,2,13,213,199,230,150,185,150,3,104,24,254,149,254,139,54,214,254,132,50,150,50,230,50,50,2,19,2,7,43,1,167,254,232,1,24,0,0,0,255,255,0,170,0,0,5,105,7,18,2,34,0,43,0,0,0,3,0,197,1,172,1,124,255,255,0,3,0,0,4,31,7,43,2,34,0,75,0,0,0,3,0,197,255,159,1,149,0,2,0,170,0,0,5,105,5,150,0,11,0,15,0,0,1,53,51,17,35,17,33,17,35,17,51,29,2,33,53,4,176,185,185,252,179,185,185,3,77,4,176,230,250,106,2,138,253,118,5,150,230,150,250,250,0,1,0,150,0,0,4,31,5,150,0,19,0,0,1,21,54,51,32,25,1,35,17,52,35,34,7,17,35,17,51,21,33,21,1,79,134,193,1,137,185,233,159,143,185,185,2,208,4,116,204,114,254,121,253,109,2,150,234,133,253,5,5,150,140,150,0,0,255,255,0,43,0,0,2,31,7,18,2,34,0,44,1,0,0,3,0,198,255,199,1,124,255,255,0,13,0,0,2,1,5,150,2,34,0,241,1,0,0,2,0,198,169,0,0,0,255,255,0,43,0,0,2,31,7,18,2,34,0,44,1,0,0,3,0,199,255,199,1,124,255,255,0,13,0,0,2,1,5,150,2,34,0,241,1,0,0,2,0,199,169,0,0,0,255,255,0,28,0,0,2,46,7,18,2,34,0,44,1,0,0,3,0,242,255,184,1,124,255,255,255,254,0,0,2,16,5,150,2,34,0,241,1,0,0,2,0,242,154,0,0,0,0,1,0,35,254,86,1,159,5,150,0,15,0,0,51,17,51,17,6,21,20,51,50,55,21,6,35,34,53,52,200,185,192,85,85,52,61,88,231,5,150,250,106,126,102,68,20,130,20,173,131,0,0,2,0,5,254,86,1,129,5,150,0,3,0,19,0,0,1,21,35,53,25,1,51,17,6,21,20,51,50,55,21,6,35,34,53,52,1,99,185,185,192,85,85,52,61,88,231,5,150,175,175,250,106,4,26,251,230,126,102,68,20,130,20,173,131,0,0,0,255,255,0,190,0,0,1,139,7,18,2,34,0,44,0,0,0,3,0,243,0,90,1,124,255,255,0,200,0,0,4,71,5,150,0,34,0,44,0,0,0,3,0,45,2,73,0,0,255,255,0,170,254,114,3,112,5,150,0,34,0,76,0,0,0,3,0,77,2,13,0,0,255,255,0,25,0,0,2,156,7,18,2,34,0,45,0,0,0,3,0,197,0,68,1,124,0,2,0,10,254,114,1,254,5,150,0,7,0,14,0,0,1,17,16,7,39,54,53,17,19,51,19,35,39,7,35,1,99,155,155,125,15,150,175,150,100,100,150,4,26,252,54,254,194,160,105,135,238,3,202,1,124,254,252,160,160,0,0,0,255,255,0,170,254,132,5,95,5,150,2,34,0,46,0,0,0,3,0,201,1,224,0,0,255,255,0,150,254,132,4,92,5,150,2,34,0,78,0,0,0,3,0,201,1,85,0,0,0,2,0,150,0,0,4,58,4,26,0,6,0,10,0,0,9,2,35,1,53,9,1,17,51,17,4,52,254,56,1,206,237,254,118,1,141,253,70,185,4,26,254,23,253,207,1,249,103,1,186,251,230,4,26,251,230,0,0,0,255,255,0,170,0,0,4,79,7,18,2,34,0,47,0,0,0,3,0,141,0,72,1,124,255,255,0,51,0,0,1,198,7,43,2,34,0,79,0,0,0,3,0,141,255,207,1,149,255,255,0,170,254,132,4,79,5,150,2,34,0,47,0,0,0,3,0,201,1,138,0,0,255,255,0,5,254,132,1,89,5,150,2,34,0,79,0,0,0,2,0,201,236,0,0,0,0,2,0,170,0,0,4,79,5,150,0,5,0,9,0,0,1,17,33,21,33,17,33,3,35,19,1,99,2,236,252,91,2,198,150,185,150,5,150,251,0,150,5,150,254,77,1,179,0,2,0,160,0,0,3,12,5,150,0,3,0,7,0,0,1,17,35,17,33,3,35,19,1,89,185,2,108,150,185,150,5,150,250,106,5,150,254,77,1,179,0,0,255,255,0,170,0,0,4,79,5,150,2,34,0,47,0,0,0,3,0,178,1,222,0,190,255,255,0,160,0,0,2,223,5,150,0,34,0,79,0,0,0,3,0,178,1,129,0,60,255,255,0,170,254,132,5,125,5,150,2,34,0,49,0,0,0,3,0,201,2,33,0,0,255,255,0,150,254,132,4,31,4,26,2,34,0,81,0,0,0,3,0,201,1,104,0,0,0,2,255,106,0,0,4,131,5,150,0,15,0,19,0,0,51,17,51,23,54,51,32,25,1,35,17,52,35,34,7,17,11,1,35,19,250,125,33,161,193,1,137,185,233,159,143,250,150,185,150,4,26,134,134,254,121,253,109,2,150,234,133,253,5,5,150,254,77,1,179,0,0,1,0,170,254,114,5,125,5,150,0,13,0,0,37,1,17,35,17,51,1,17,51,17,16,7,39,54,4,193,252,152,175,185,3,107,175,155,155,104,4,4,134,251,118,5,150,251,128,4,128,250,186,254,194,160,105,113,0,0,0,1,0,150,254,114,4,31,4,26,0,19,0,0,1,52,35,34,7,17,35,17,51,23,54,51,32,25,1,16,7,39,54,53,3,102,233,159,143,185,125,33,161,193,1,137,155,155,125,2,150,234,133,253,5,4,26,134,134,254,121,253,189,254,194,160,105,135,238,0,0,0,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,199,1,227,1,124,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,199,0,250,0,0,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,242,1,212,1,124,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,242,0,235,0,0,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,245,1,147,1,124,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,245,0,171,0,0,255,255,0,170,0,0,5,0,7,18,2,34,0,53,0,0,0,3,0,141,1,135,1,124,255,255,0,150,0,0,2,152,5,150,2,34,0,85,0,0,0,3,0,141,0,161,0,0,255,255,0,170,254,132,5,0,5,150,2,34,0,53,0,0,0,3,0,201,1,187,0,0,255,255,255,254,254,132,2,128,4,26,2,34,0,85,0,0,0,2,0,201,229,0,0,0,255,255,0,100,255,246,4,166,7,18,2,34,0,54,0,0,0,3,0,197,1,39,1,124,255,255,0,100,0,0,3,182,5,150,2,34,0,86,0,0,0,3,0,197,0,175,0,0,0,1,0,100,254,90,4,166,5,160,0,44,0,0,5,38,39,53,22,33,32,17,52,33,35,32,17,16,33,50,23,21,38,35,32,17,20,33,51,32,17,16,33,35,7,50,21,20,35,34,39,53,22,51,50,53,52,43,1,1,239,182,163,225,1,5,1,113,254,240,184,254,63,2,63,250,215,215,250,254,122,1,8,184,1,201,253,214,10,36,214,241,108,108,108,108,108,83,183,5,11,44,170,80,1,14,230,1,134,1,154,60,170,80,254,252,230,254,122,254,92,67,172,173,50,108,50,65,64,0,0,0,0,1,0,100,254,90,3,182,4,26,0,43,0,0,37,38,39,53,22,51,50,53,52,43,1,32,17,16,33,50,23,21,38,35,32,21,20,59,1,32,17,16,5,7,50,21,20,35,34,39,53,22,51,50,53,52,43,1,1,164,141,139,185,189,251,175,150,254,172,1,181,188,185,185,188,254,250,165,150,1,104,254,113,41,214,241,108,108,108,108,108,83,183,3,9,38,160,60,150,140,1,54,1,44,50,160,60,150,140,254,202,254,225,12,78,172,173,50,108,50,65,64,0,0,255,255,0,100,254,132,4,166,5,160,2,34,0,54,0,0,0,3,0,201,1,147,0,0,255,255,0,100,254,132,3,182,4,26,2,34,0,86,0,0,0,3,0,201,1,27,0,0,255,255,0,50,254,132,4,111,5,150,0,34,0,55,0,0,0,3,0,201,1,62,0,0,255,255,0,125,254,132,2,78,4,196,0,34,0,87,0,0,0,2,0,201,100,0,0,0,0,1,0,50,0,0,4,111,5,150,0,15,0,0,1,17,33,53,33,21,33,17,33,21,33,17,35,17,33,53,1,244,254,62,4,61,254,62,1,194,254,62,185,254,62,3,22,1,234,150,150,254,22,150,253,128,2,128,150,0,0,1,0,0,0,0,2,78,4,196,0,21,0,0,19,17,51,23,33,21,35,17,51,21,35,21,20,59,1,21,35,32,17,53,35,53,150,116,40,1,28,255,255,255,127,128,176,254,248,150,2,121,2,75,170,150,254,245,150,186,147,150,1,27,200,150,0,0,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,198,1,149,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,198,0,253,0,0,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,199,1,149,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,199,0,253,0,0,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,242,1,134,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,242,0,238,0,0,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,245,1,60,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,245,0,163,0,0,0,1,0,160,254,86,5,70,5,150,0,26,0,0,5,36,25,1,51,17,16,33,32,25,1,51,17,16,5,6,21,20,51,50,55,21,6,35,34,53,52,2,193,253,223,185,1,154,1,154,185,254,65,193,85,85,52,61,88,231,9,23,2,26,3,110,252,146,254,100,1,156,3,110,252,146,254,25,65,126,102,68,20,130,20,173,126,0,0,1,0,150,254,86,4,51,4,26,0,27,0,0,33,53,6,35,32,25,1,51,17,20,51,50,55,17,51,17,6,21,20,51,50,55,21,6,35,34,53,52,3,102,165,193,254,150,185,232,159,144,185,202,85,85,52,61,88,231,134,134,1,135,2,147,253,106,234,133,2,251,251,230,126,102,68,20,130,20,173,131,0,0,255,255,0,50,0,0,7,58,7,18,2,34,0,58,0,0,0,3,0,197,2,88,1,124,255,255,0,35,0,0,5,224,5,150,2,34,0,90,0,0,0,3,0,197,1,164,0,0,255,255,0,25,0,0,4,251,7,18,2,34,0,60,0,0,0,3,0,197,1,44,1,124,255,255,0,25,254,124,4,2,5,150,2,34,0,92,0,0,0,3,0,197,0,176,0,0,0,1,0,150,0,0,3,38,5,202,0,11,0,0,51,17,16,33,50,23,21,38,35,34,21,17,150,1,156,129,115,109,136,226,4,77,1,125,40,150,40,223,251,171,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,142,1,12,1,124,255,255,0,25,0,0,5,167,5,150,2,2,0,36,0,0,0,1,0,170,0,0,4,162,5,150,0,17,0,0,1,21,33,17,33,50,53,16,33,35,53,51,32,17,16,41,1,17,4,147,252,209,1,151,238,254,220,188,197,1,212,254,106,253,158,5,150,150,251,153,249,1,12,150,254,105,254,99,5,150,255,255,0,170,0,0,4,182,5,150,2,2,0,37,0,0,0,1,0,170,0,0,4,79,5,150,0,5,0,0,51,17,33,21,33,17,170,3,165,253,20,5,150,150,251,0,0,0,0,2,0,0,254,132,6,88,5,150,0,4,0,18,0,0,37,33,17,33,16,1,17,51,32,17,53,33,17,51,17,35,17,33,17,1,242,2,244,254,42,252,240,184,1,159,3,72,185,185,251,25,150,4,106,252,85,253,47,2,18,4,106,150,251,0,253,238,1,124,254,132,255,255,0,170,0,0,4,96,5,150,2,2,0,40,0,0,0,3,0,25,0,0,8,36,5,150,0,16,0,20,0,37,0,0,33,0,38,35,53,50,0,59,1,21,35,34,0,7,30,1,9,1,17,35,17,1,0,54,55,38,0,43,1,53,51,50,0,51,21,34,6,1,7,68,254,173,176,78,160,1,71,188,107,79,108,254,244,115,75,180,1,94,252,87,185,252,87,1,94,180,75,115,254,244,108,79,107,188,1,71,160,78,176,254,173,2,28,153,133,2,92,160,254,39,39,13,199,253,222,5,150,250,106,5,150,250,106,2,34,199,13,39,1,217,160,253,164,133,153,253,228,0,0,1,0,100,255,246,3,247,5,160,0,28,0,0,19,54,51,32,17,20,7,22,21,16,33,34,39,53,22,51,32,17,52,35,33,53,33,50,53,52,33,34,7,100,200,200,2,3,188,188,253,253,200,200,200,200,1,74,252,254,184,1,69,255,254,182,200,200,5,100,60,254,122,236,89,85,240,254,102,60,160,70,1,4,250,150,250,240,70,0,0,0,0,1,0,170,0,0,5,75,5,150,0,9,0,0,33,17,1,35,17,51,17,1,51,17,4,156,252,199,185,175,3,57,185,4,158,251,98,5,150,251,98,4,158,250,106,0,0,0,0,2,0,170,0,0,5,75,6,248,0,9,0,19,0,0,33,17,1,35,17,51,17,1,51,17,1,51,20,51,50,53,51,16,33,32,4,156,252,199,185,175,3,57,185,252,159,135,140,140,135,254,237,254,237,4,158,251,98,5,150,251,98,4,158,250,106,6,248,160,160,254,242,0,0,0,0,2,0,170,0,0,5,12,5,150,0,16,0,20,0,0,33,0,38,35,53,50,0,59,1,21,35,34,0,7,30,1,9,1,17,35,17,4,44,254,173,176,78,160,1,71,188,107,79,108,254,244,115,75,180,1,94,252,87,185,2,28,153,133,2,92,160,254,39,39,13,199,253,222,5,150,250,106,5,150,0,1,0,0,0,0,5,74,5,150,0,11,0,0,53,32,25,1,33,17,35,17,33,17,16,33,1,158,3,172,185,253,198,253,169,150,2,138,2,118,250,106,5,0,254,32,252,224,255,255,0,170,0,0,6,134,5,150,2,2,0,48,0,0,0,1,0,170,0,0,5,75,5,150,0,11,0,0,51,17,51,17,33,17,51,17,35,17,33,17,170,185,3,47,185,185,252,209,5,150,253,148,2,108,250,106,2,148,253,108,0,0,255,255,0,120,255,246,6,9,5,160,2,2,0,50,0,0,0,1,0,170,0,0,5,75,5,150,0,7,0,0,51,17,33,17,35,17,33,17,170,4,161,185,252,209,5,150,250,106,5,0,251,0,255,255,0,170,0,0,4,164,5,150,2,2,0,51,0,0,255,255,0,100,255,246,4,226,5,160,2,2,0,38,0,0,255,255,0,50,0,0,4,111,5,150,2,2,0,55,0,0,0,1,0,50,0,0,5,2,5,150,0,14,0,0,9,1,2,33,34,39,53,22,51,50,55,1,51,9,1,5,2,254,19,114,254,237,128,108,106,127,154,63,253,204,195,1,207,1,126,5,150,251,118,254,244,70,150,70,121,4,135,252,43,3,213,0,0,0,0,3,0,100,0,0,6,88,5,150,0,13,0,18,0,23,0,0,37,36,17,16,37,53,51,21,4,17,16,5,21,35,25,1,4,17,16,1,17,36,17,16,3,2,253,98,2,158,184,2,158,253,98,184,254,36,2,148,1,220,113,37,2,51,2,55,37,113,112,34,253,197,253,200,33,112,1,8,3,134,36,254,101,254,94,3,98,252,120,34,1,166,1,159,0,0,0,1,0,25,0,0,5,95,5,150,0,11,0,0,51,35,9,1,51,9,1,51,9,1,35,1,250,225,2,50,253,206,225,1,194,1,194,225,253,206,2,50,225,254,62,2,203,2,203,253,196,2,60,253,53,253,53,2,60,0,0,1,0,170,254,132,5,187,5,150,0,11,0,0,51,17,51,17,33,17,51,17,51,17,35,17,170,185,2,230,185,185,185,5,150,251,0,5,0,251,0,253,238,1,124,0,0,0,0,1,0,125,0,0,4,214,5,150,0,15,0,0,1,17,35,17,6,35,32,25,1,51,17,16,33,50,55,17,4,214,185,196,233,254,13,185,1,83,229,175,5,150,250,106,2,122,114,1,225,1,173,254,80,254,188,133,2,111,0,1,0,170,0,0,6,169,5,150,0,11,0,0,51,17,51,17,33,17,51,17,33,17,51,17,170,185,1,234,185,1,234,185,5,150,251,0,5,0,251,0,5,0,250,106,0,0,0,1,0,170,254,132,7,98,5,150,0,15,0,0,51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,170,185,1,234,185,1,234,185,185,185,5,150,251,0,5,0,251,0,5,0,251,0,253,238,1,124,0,1,0,0,0,0,6,74,5,150,0,17,0,0,1,17,33,50,53,16,33,35,53,51,32,17,16,41,1,17,33,53,2,255,1,152,238,254,220,188,198,1,223,254,94,253,158,253,186,5,150,251,3,249,1,12,150,254,105,254,99,5,0,150,0,2,0,170,0,0,6,49,5,150,0,15,0,19,0,0,1,17,33,50,53,16,33,35,53,51,32,17,16,41,1,17,1,17,51,17,1,99,1,152,238,254,220,188,198,1,223,254,94,253,158,4,206,185,5,150,251,3,249,1,12,150,254,105,254,99,5,150,250,106,5,150,250,106,0,0,0,1,0,170,0,0,4,174,5,150,0,15,0,0,1,17,33,50,53,16,33,35,53,51,32,17,16,41,1,17,1,99,1,152,238,254,220,188,197,1,224,254,94,253,158,5,150,251,3,249,1,12,150,254,105,254,99,5,150,0,0,1,0,125,255,246,4,251,5,160,0,20,0,0,55,22,51,32,19,33,53,33,2,33,34,7,53,54,51,32,17,16,33,34,39,125,185,195,2,30,40,252,134,3,123,33,253,218,195,185,185,215,2,238,253,18,215,185,210,70,1,254,150,1,234,70,160,60,253,63,253,23,60,0,0,0,0,2,0,170,255,246,7,130,5,160,0,14,0,22,0,0,51,17,51,17,33,18,33,32,17,16,33,32,3,33,17,37,32,17,16,33,32,17,16,170,184,1,149,34,2,40,2,65,253,191,253,206,25,254,108,3,223,1,126,254,130,254,119,5,150,253,138,2,128,253,41,253,45,2,148,253,118,140,2,67,2,59,253,197,253,189,0,0,0,1,0,25,0,0,4,111,5,150,0,16,0,0,33,17,33,34,21,20,5,21,1,35,1,36,17,16,41,1,17,3,182,254,104,228,1,154,254,47,234,1,240,254,108,1,172,2,78,4,253,198,250,65,131,253,135,2,137,139,1,23,1,107,250,106,0,0,255,255,0,100,0,0,3,217,4,26,2,2,0,68,0,0,0,2,0,125,255,246,4,142,6,3,0,18,0,26,0,0,1,16,33,32,25,1,16,33,32,55,21,6,33,32,17,54,51,32,17,1,32,17,16,33,32,17,16,4,142,253,250,253,245,2,32,1,36,171,153,254,199,254,161,129,214,1,252,253,250,1,76,254,190,254,169,2,8,253,238,2,18,1,69,2,73,109,163,96,254,87,195,254,4,254,110,1,124,1,118,254,138,254,132,0,0,2,0,150,0,0,4,42,4,26,0,12,0,23,0,0,37,50,53,52,43,1,53,36,53,52,35,33,17,7,17,33,32,17,20,7,22,21,16,33,2,196,156,243,80,1,54,128,254,124,185,2,78,1,52,196,214,254,165,150,160,150,121,35,174,110,253,18,150,4,26,254,249,163,79,53,179,254,199,0,0,1,0,150,0,0,3,80,4,26,0,5,0,0,51,17,33,21,33,17,150,2,186,253,255,4,26,150,252,124,0,0,0,2,0,0,254,132,5,73,4,26,0,4,0,18,0,0,37,33,17,33,16,1,17,51,50,17,53,33,17,51,17,35,17,33,17,1,198,2,17,254,142,253,155,184,244,2,228,185,185,252,40,150,2,238,253,209,253,47,2,18,2,238,150,252,124,253,238,1,124,254,132,0,255,255,0,100,0,0,4,7,4,26,2,2,0,72,0,0,0,3,0,25,0,0,6,159,4,33,0,16,0,20,0,37,0,0,33,39,38,35,53,50,18,59,1,21,35,34,2,7,22,27,1,1,17,35,17,1,19,18,55,38,2,43,1,53,51,50,18,51,21,34,15,1,5,201,147,148,138,160,157,188,107,79,108,102,125,118,165,166,253,24,185,253,27,166,165,118,125,102,108,79,107,188,157,160,138,148,147,246,247,123,1,183,166,254,220,49,21,254,249,254,248,4,33,251,223,4,33,251,223,1,8,1,7,21,49,1,36,166,254,73,123,247,246,0,0,1,0,100,255,246,3,97,4,36,0,28,0,0,19,54,51,32,17,20,7,22,21,16,33,34,39,53,22,51,50,53,52,35,33,53,33,50,53,52,35,34,7,100,200,150,1,159,138,138,254,97,150,200,200,150,230,152,254,184,1,69,155,230,150,200,3,232,60,254,220,154,79,75,150,254,192,60,160,70,170,150,150,158,142,70,0,0,0,1,0,150,0,0,4,51,4,26,0,9,0,0,33,17,1,35,17,51,17,1,51,17,3,132,253,203,185,175,2,53,185,3,44,252,212,4,26,252,212,3,44,251,230,0,0,0,255,255,0,150,0,0,4,51,5,150,2,34,1,154,0,0,0,3,0,242,0,248,0,0,0,2,0,150,0,0,4,55,4,26,0,16,0,20,0,0,33,39,38,35,53,50,18,59,1,21,35,34,2,7,22,27,1,1,17,35,17,3,97,147,148,138,160,157,188,107,79,108,102,125,118,165,166,253,24,185,246,247,123,1,178,160,254,219,49,21,254,249,254,248,4,26,251,230,4,26,0,1,0,0,0,0,4,13,4,26,0,11,0,0,53,50,25,1,33,17,35,17,33,17,16,33,237,3,32,185,254,82,254,90,150,1,14,2,118,251,230,3,132,254,32,254,92,0,0,1,0,150,0,0,5,30,4,26,0,12,0,0,51,17,51,9,1,51,17,35,17,1,35,1,17,150,235,1,99,1,89,225,165,254,174,146,254,166,4,26,252,191,3,65,251,230,3,35,252,221,3,35,252,221,0,1,0,150,0,0,4,51,4,26,0,11,0,0,51,17,51,17,33,17,51,17,35,17,33,17,150,185,2,43,185,185,253,213,4,26,254,72,1,184,251,230,1,204,254,52,0,0,0,2,0,100,255,246,4,116,4,36,0,7,0,15,0,0,19,16,33,32,17,16,33,32,54,33,32,17,16,33,32,17,100,2,8,2,8,253,248,253,250,183,1,79,1,79,254,177,254,177,2,13,2,23,253,233,253,233,150,1,133,1,125,254,131,0,0,0,0,1,0,150,0,0,4,51,4,26,0,7,0,0,51,17,33,17,35,17,33,17,150,3,157,185,253,213,4,26,251,230,3,132,252,124,0,2,0,150,254,132,4,93,4,26,0,8,0,19,0,0,37,22,51,32,17,16,33,34,7,39,54,51,32,17,16,33,34,39,17,35,1,79,109,134,1,101,254,157,140,105,185,209,223,2,23,253,230,126,118,185,214,54,1,137,1,87,24,135,43,254,13,253,217,50,254,82,255,255,0,100,0,0,3,172,4,26,2,2,0,70,0,0,0,1,0,0,0,0,3,157,4,26,0,7,0,0,1,21,33,17,35,17,33,53,3,157,254,142,185,254,142,4,26,150,252,124,3,132,150,0,0,0,0,1,0,25,254,124,4,2,4,26,0,10,0,0,19,51,9,1,51,1,2,7,39,54,55,25,201,1,41,1,51,196,254,76,116,232,71,176,80,4,26,252,204,3,52,251,199,254,226,71,131,77,174,0,0,0,0,3,0,100,254,132,6,8,5,150,0,13,0,18,0,23,0,0,5,36,17,16,37,17,51,17,4,17,16,5,17,35,25,1,4,17,16,1,17,36,17,16,2,218,253,138,2,118,184,2,118,253,138,184,254,76,2,108,1,180,7,34,1,240,1,244,34,1,117,254,140,31,254,8,254,12,31,254,140,2,12,2,250,33,254,168,254,161,2,217,253,4,30,1,100,1,92,0,0,0,0,1,0,25,0,0,4,51,4,26,0,11,0,0,51,35,9,1,51,9,1,51,9,1,35,1,240,215,1,162,254,94,215,1,54,1,54,215,254,94,1,162,215,254,202,2,13,2,13,254,122,1,134,253,243,253,243,1,134,0,0,1,0,150,254,132,5,6,4,26,0,11,0,0,51,17,51,17,33,17,51,17,51,17,35,17,150,185,2,69,185,185,185,4,26,252,124,3,132,252,124,253,238,1,124,0,0,0,0,1,0,125,0,0,4,44,4,26,0,15,0,0,1,17,35,17,6,35,32,25,1,51,17,20,51,50,55,17,4,44,185,146,203,254,103,185,249,199,125,4,26,251,230,1,158,114,1,155,1,83,254,170,254,133,1,207,0,0,0,1,0,150,0,0,5,205,4,26,0,11,0,0,51,17,51,17,33,17,51,17,33,17,51,17,150,185,1,134,185,1,134,185,4,26,252,124,3,132,252,124,3,132,251,230,0,0,0,1,0,150,254,132,6,134,4,26,0,15,0,0,51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,150,185,1,134,185,1,134,185,185,185,4,26,252,124,3,132,252,124,3,132,252,124,253,238,1,124,0,1,0,0,0,0,4,228,4,26,0,17,0,0,1,17,33,50,53,52,43,1,53,51,32,17,16,41,1,17,33,53,2,57,1,42,198,182,178,188,1,103,254,144,254,12,254,128,4,26,252,127,169,137,150,254,216,254,199,3,132,150,0,0,0,2,0,150,0,0,5,80,4,26,0,3,0,19,0,0,33,17,51,17,1,17,33,50,53,52,43,1,53,51,32,17,16,41,1,17,4,151,185,251,255,1,62,178,182,178,187,1,104,254,164,253,248,4,26,251,230,4,26,252,127,169,137,150,254,216,254,199,4,26,0,0,0,1,0,150,0,0,3,250,4,26,0,15,0,0,1,17,33,50,53,52,43,1,53,51,32,17,16,41,1,17,1,79,1,62,178,182,178,187,1,104,254,164,253,248,4,26,252,127,169,137,150,254,216,254,199,4,26,0,0,0,0,1,0,100,0,0,3,182,4,26,0,20,0,0,55,22,51,32,19,33,53,33,2,33,34,7,53,54,51,32,17,16,33,34,39,100,130,130,1,103,41,253,172,2,85,36,254,147,130,130,130,150,2,58,253,198,150,130,180,30,1,55,150,1,33,30,150,30,254,7,253,223,30,0,0,0,0,2,0,150,255,246,6,66,4,36,0,7,0,22,0,0,37,32,17,16,33,32,17,16,5,17,51,17,33,18,33,32,17,16,33,32,3,33,17,4,121,1,6,254,250,254,239,253,46,184,1,90,37,1,172,1,201,254,55,254,73,27,254,167,140,1,133,1,125,254,131,254,123,140,4,26,254,72,1,194,253,231,253,235,1,214,254,52,0,1,0,25,0,0,3,227,4,26,0,16,0,0,33,17,33,34,21,20,5,21,1,35,1,36,53,16,41,1,17,3,42,254,154,138,1,64,254,137,234,1,150,254,198,1,82,2,28,3,129,118,140,65,131,254,69,1,213,97,211,1,17,251,230,0,0,0,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,142,0,188,0,0,255,255,0,100,255,6,1,179,4,26,2,2,0,30,0,0,255,255,0,100,4,167,1,247,5,150,2,2,0,141,0,0,0,3,0,100,4,167,3,177,5,150,0,3,0,7,0,11,0,0,1,21,35,53,33,21,35,53,33,51,7,35,3,177,185,254,37,185,1,108,239,239,164,5,150,170,170,170,170,239,255,255,0,25,0,0,5,167,5,150,0,34,1,180,0,0,2,2,1,191,0,0,0,0,0,1,0,100,3,97,1,29,4,26,0,3,0,0,1,21,35,53,1,29,185,4,26,185,185,0,0,0,0,2,255,206,0,0,5,93,5,150,0,3,0,15,0,0,19,51,7,35,37,21,33,17,33,21,33,17,33,21,33,17,114,239,239,164,5,128,253,18,2,203,253,53,2,253,252,74,5,150,239,239,150,254,32,150,254,12,150,5,150,0,0,0,0,2,255,206,0,0,6,102,5,150,0,3,0,15,0,0,19,51,7,35,1,17,51,17,33,17,51,17,35,17,33,17,114,239,239,164,1,217,185,3,77,185,185,252,179,5,150,239,251,89,5,150,253,138,2,118,250,106,2,138,253,118,0,0,0,2,255,206,0,0,2,126,5,150,0,3,0,7,0,0,19,51,7,35,37,17,35,17,114,239,239,164,2,176,185,5,150,239,239,250,106,5,150,0,0,3,255,206,255,246,6,112,5,160,0,3,0,11,0,19,0,0,19,51,7,35,0,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,114,239,239,164,1,212,2,11,2,0,254,0,253,245,195,2,206,2,195,253,61,253,50,5,150,239,251,229,2,67,2,59,253,197,6,2,215,253,41,253,45,0,0,2,255,206,0,0,6,92,5,150,0,3,0,12,0,0,19,51,7,35,37,51,9,1,51,1,17,35,17,114,239,239,164,1,172,205,1,156,1,162,215,253,222,185,5,150,239,239,253,21,2,235,252,94,254,12,1,244,0,0,0,2,255,206,0,0,6,57,5,170,0,3,0,27,0,0,19,51,7,35,1,53,33,0,17,16,33,32,17,16,1,33,21,33,53,0,17,16,33,32,17,16,1,21,114,239,239,164,1,32,1,49,254,192,2,173,2,173,254,192,1,49,253,218,1,124,254,12,254,12,1,124,5,150,239,251,89,150,1,14,1,124,2,138,253,118,254,132,254,242,150,150,1,14,1,124,1,244,254,12,254,132,254,242,150,0,0,0,255,255,255,96,0,0,2,173,5,150,2,34,1,228,0,0,0,3,1,181,254,252,0,0,255,255,0,25,0,0,5,167,5,150,2,2,0,36,0,0,255,255,0,170,0,0,4,182,5,150,2,2,0,37,0,0,0,1,0,170,0,0,4,79,5,150,0,5,0,0,51,17,33,21,33,17,170,3,165,253,20,5,150,150,251,0,0,0,255,255,0,170,0,0,4,96,5,150,2,2,0,40,0,0,255,255,0,125,0,0,4,181,5,150,2,2,0,61,0,0,255,255,0,170,0,0,5,105,5,150,2,2,0,43,0,0,0,3,0,120,255,246,6,9,5,160,0,7,0,15,0,19,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,33,21,33,1,59,2,11,2,0,254,0,253,245,195,2,206,2,195,253,61,253,50,1,117,2,163,253,93,140,2,67,2,59,253,197,6,2,215,253,41,253,45,3,55,150,255,255,0,200,0,0,1,129,5,150,2,2,0,44,0,0,255,255,0,170,0,0,5,95,5,150,2,2,0,46,0,0,0,1,0,25,0,0,5,167,5,150,0,6,0,0,51,1,51,1,35,9,1,25,2,95,205,2,98,205,253,254,254,1,5,150,250,106,4,214,251,42,255,255,0,170,0,0,6,134,5,150,2,2,0,48,0,0,255,255,0,170,0,0,5,125,5,150,2,2,0,49,0,0,0,3,0,100,0,0,4,72,5,150,0,3,0,7,0,11,0,0,55,33,21,33,17,33,21,33,19,33,21,33,100,3,228,252,28,3,228,252,28,60,3,108,252,148,160,160,5,150,160,254,55,160,255,255,0,120,255,246,6,9,5,160,2,2,0,50,0,0,0,1,0,170,0,0,5,75,5,150,0,7,0,0,51,17,33,17,35,17,33,17,170,4,161,185,252,209,5,150,250,106,5,0,251,0,255,255,0,170,0,0,4,164,5,150,2,2,0,51,0,0,0,1,0,100,0,0,4,56,5,150,0,11,0,0,19,33,21,33,9,1,33,21,33,53,9,1,100,3,212,252,254,1,154,254,102,3,2,252,44,1,149,254,107,5,150,150,253,238,253,168,150,150,2,88,2,18,255,255,0,50,0,0,4,111,5,150,2,2,0,55,0,0,255,255,0,25,0,0,4,251,5,150,2,2,0,60,0,0,0,3,0,100,0,0,6,88,5,150,0,13,0,18,0,23,0,0,37,36,17,16,37,53,51,21,4,17,16,5,21,35,25,1,4,17,16,1,17,36,17,16,3,2,253,98,2,158,184,2,158,253,98,184,254,36,2,148,1,220,113,37,2,51,2,55,37,113,112,34,253,197,253,200,33,112,1,8,3,134,36,254,101,254,94,3,98,252,120,34,1,166,1,159,0,0,255,255,0,25,0,0,5,95,5,150,2,2,0,59,0,0,0,1,0,120,0,0,6,34,5,150,0,19,0,0,1,17,51,17,36,25,1,51,17,16,5,17,35,17,36,25,1,51,17,16,2,241,184,1,192,185,253,135,184,253,135,185,2,61,3,89,252,167,34,1,125,1,186,254,70,253,237,35,254,90,1,166,35,2,19,1,186,254,70,254,131,0,255,255,0,15,0,0,2,58,7,18,2,34,1,198,0,0,0,3,0,142,255,171,1,124,255,255,0,25,0,0,4,251,7,18,2,34,1,209,0,0,0,3,0,142,1,17,1,124,255,255,0,100,0,0,5,9,5,150,2,34,1,220,0,0,0,3,1,180,1,164,0,0,255,255,0,100,255,246,3,57,5,150,2,34,1,224,0,0,0,3,1,180,0,228,0,0,255,255,0,150,254,132,4,31,5,150,2,34,1,226,0,0,0,3,1,180,1,112,0,0,255,255,0,128,0,0,2,19,5,150,2,34,1,228,0,0,0,2,1,180,28,0,0,0,255,255,0,150,255,236,4,36,5,150,2,34,1,238,0,0,0,2,1,181,83,0,0,0,0,2,0,100,0,0,5,9,4,26,0,13,0,21,0,0,19,16,33,32,27,1,51,3,19,35,3,2,33,32,54,33,50,19,2,35,32,17,100,1,194,1,75,113,108,187,198,184,190,106,126,254,209,254,64,183,1,9,235,120,120,235,254,247,2,13,2,13,254,188,1,68,253,240,253,246,1,74,254,182,150,1,123,1,115,254,141,0,0,1,0,150,254,150,4,97,5,150,0,28,0,0,19,17,16,33,32,17,16,7,4,17,16,33,34,39,53,22,51,50,53,16,37,53,36,53,52,35,32,25,1,150,1,238,1,154,251,1,62,254,98,136,106,107,137,227,254,141,1,62,246,254,210,254,150,4,209,2,47,254,176,254,250,63,37,254,161,254,129,60,150,60,233,1,52,1,118,54,232,186,254,100,251,50,0,1,0,35,254,132,4,11,4,26,0,8,0,0,19,51,9,1,51,1,17,35,17,35,195,1,46,1,52,195,254,96,185,4,26,252,177,3,79,251,230,254,132,1,124,0,0,0,0,2,0,100,255,246,4,76,5,150,0,13,0,21,0,0,4,33,32,17,16,33,38,39,53,33,21,33,0,19,7,16,33,32,17,16,33,32,4,76,254,5,254,19,2,3,165,236,3,17,254,15,2,73,13,185,254,190,254,200,1,57,1,65,10,2,28,1,254,123,117,150,150,254,197,254,87,4,1,108,254,142,254,122,0,1,0,100,255,246,3,57,4,36,0,28,0,0,1,38,35,34,21,20,59,1,21,35,34,21,20,51,50,55,21,6,35,32,17,52,55,38,53,16,33,50,23,3,57,150,170,210,245,195,198,252,220,170,150,150,170,254,107,218,208,1,149,160,150,3,82,60,132,158,150,180,150,60,160,50,1,44,200,55,59,174,1,26,50,0,0,0,0,1,0,100,254,112,3,185,5,150,0,22,0,0,1,33,21,0,17,16,59,1,32,21,20,5,39,54,53,52,43,1,32,17,16,1,33,1,47,2,138,253,95,218,181,1,8,254,193,70,216,86,181,254,109,2,99,254,104,5,150,150,254,79,254,86,254,241,223,206,121,138,69,118,75,1,161,1,193,1,158,0,0,0,0,1,0,150,254,132,4,31,4,26,0,15,0,0,51,17,51,23,54,51,32,25,1,35,17,52,35,34,7,17,150,125,33,191,193,1,107,185,233,159,143,4,26,134,134,254,121,251,241,4,18,234,133,253,5,0,0,3,0,120,255,246,4,101,5,160,0,4,0,9,0,17,0,0,1,18,33,32,19,39,2,33,32,3,7,16,33,32,17,16,33,32,1,60,13,1,43,1,33,12,2,25,254,238,254,228,26,198,1,252,1,241,254,15,254,4,2,158,253,238,2,18,150,1,214,254,42,107,2,215,253,41,253,45,0,0,0,1,0,170,0,0,1,99,4,26,0,3,0,0,1,17,35,17,1,99,185,4,26,251,230,4,26,0,0,2,0,150,0,0,4,58,4,26,0,6,0,10,0,0,9,2,35,1,53,9,1,17,51,17,4,52,254,56,1,206,237,254,118,1,141,253,70,185,4,26,254,23,253,207,1,249,103,1,186,251,230,4,26,251,230,0,0,0,0,1,0,40,0,0,4,47,5,158,0,10,0,0,1,38,39,55,22,19,1,35,9,1,35,1,206,90,166,71,242,116,1,180,206,254,199,254,201,201,4,12,194,67,141,71,254,226,251,199,3,62,252,194,0,0,0,1,0,40,0,0,4,16,4,26,0,6,0,0,19,51,9,1,51,1,35,40,200,1,45,1,43,200,254,85,172,4,26,252,201,3,55,251,230,0,0,1,0,125,254,112,3,200,5,150,0,32,0,0,1,51,21,35,34,21,20,59,1,21,35,32,17,16,59,1,32,21,20,5,39,54,53,52,43,1,32,17,16,37,38,53,16,2,109,244,243,222,223,232,222,254,184,218,181,1,8,254,193,70,216,86,181,254,109,1,13,179,5,150,150,164,194,150,254,161,254,241,223,206,121,138,69,118,75,1,161,1,76,99,54,220,1,52,0,0,0,2,0,100,0,1,4,76,4,26,0,7,0,15,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,29,1,59,1,59,254,197,254,197,185,1,244,1,244,254,12,254,14,150,1,123,1,115,254,141,4,2,13,253,243,253,244,0,0,0,0,2,0,135,254,132,4,88,4,26,0,8,0,19,0,0,37,22,51,32,17,16,33,32,17,2,33,32,17,16,33,34,39,17,35,17,1,64,109,154,1,91,254,197,254,217,185,1,226,1,239,253,240,146,118,185,224,64,1,134,1,90,254,166,1,244,254,12,253,218,60,254,72,3,162,0,0,1,0,100,254,132,3,175,4,26,0,23,0,0,1,38,35,32,17,20,31,1,4,21,16,33,53,32,53,52,47,1,36,17,16,33,50,23,3,146,112,133,254,123,206,157,1,44,254,72,1,1,141,199,254,192,2,57,133,112,3,82,50,254,153,233,64,45,74,230,254,237,150,121,96,44,61,79,1,110,2,1,50,0,0,2,0,100,0,1,4,203,4,26,0,7,0,18,0,0,36,33,32,17,16,33,32,17,7,16,41,1,21,33,22,21,16,33,32,1,29,1,59,1,59,254,207,254,187,185,1,254,2,105,254,251,134,254,12,254,14,150,1,123,1,115,254,141,4,2,13,150,129,246,253,244,0,1,0,0,255,252,3,6,4,26,0,15,0,0,17,33,21,33,17,20,51,50,55,21,6,35,32,25,1,33,3,6,254,197,216,14,15,41,36,254,159,254,238,4,26,150,253,238,221,1,150,4,1,118,2,18,0,1,0,150,255,236,4,36,4,26,0,13,0,0,19,17,51,17,16,33,32,25,1,51,17,16,33,32,150,185,1,14,1,14,185,254,57,254,57,1,172,2,110,253,146,254,214,1,42,2,110,253,146,254,64,0,0,2,0,100,254,132,5,125,4,26,0,18,0,25,0,0,1,51,6,17,16,5,17,16,33,32,17,16,5,17,35,17,36,17,16,0,17,16,35,34,21,17,1,24,205,200,1,109,1,108,1,135,253,198,185,253,218,4,96,203,182,4,26,225,254,237,254,112,20,2,13,1,139,254,12,253,218,20,254,152,1,104,20,2,38,1,19,253,93,1,144,1,94,245,253,243,0,1,0,40,254,132,4,66,4,26,0,11,0,0,9,1,51,9,1,51,9,1,35,9,1,35,1,207,254,89,205,1,64,1,64,205,254,90,1,166,205,254,192,254,192,205,1,79,2,203,253,226,2,30,253,53,253,53,2,30,253,226,0,0,0,1,0,150,254,132,5,180,4,26,0,19,0,0,37,17,51,17,36,25,1,51,17,16,5,17,35,17,36,25,1,51,17,16,2,200,186,1,121,185,253,206,186,253,206,185,144,3,138,252,118,38,1,100,2,0,254,0,254,4,37,254,139,1,117,37,1,252,2,0,254,0,254,156,0,0,0,1,0,120,0,0,6,19,4,26,0,26,0,0,19,51,6,17,16,51,50,17,51,16,51,50,17,16,39,51,22,17,16,33,34,3,2,35,32,17,16,250,185,130,215,225,185,225,215,130,185,130,254,112,235,85,80,235,254,112,4,26,225,254,237,254,112,2,163,253,93,1,144,1,19,225,225,254,237,253,218,1,63,254,193,2,38,1,19,0,0,0,255,255,255,241,0,0,2,28,5,150,2,34,1,228,0,0,0,2,0,142,141,0,0,0,255,255,0,150,255,236,4,36,5,150,2,34,1,238,0,0,0,3,0,142,0,228,0,0,255,255,0,100,0,1,4,76,5,150,2,34,1,233,0,0,0,3,1,180,1,110,0,0,255,255,0,150,255,236,4,36,5,150,2,34,1,238,0,0,0,3,1,180,1,115,0,0,255,255,0,120,0,0,6,19,5,150,2,34,1,242,0,0,0,3,1,180,2,91,0,0,0,1,0,150,0,0,6,72,5,222,0,33,0,0,1,17,35,17,33,17,35,17,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,21,38,35,32,29,1,6,72,185,254,61,185,254,60,185,1,126,89,85,79,96,196,1,196,1,186,139,155,149,146,255,0,4,26,251,230,3,142,252,114,3,142,252,114,4,87,1,125,40,150,40,213,79,51,1,145,60,150,60,233,69,0,0,1,0,150,0,0,6,125,5,222,0,33,0,0,1,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,17,35,17,38,35,32,29,1,33,21,33,17,35,3,19,254,60,185,1,126,89,85,79,96,196,1,196,1,236,179,203,185,110,88,254,206,1,59,254,197,185,3,142,252,114,4,87,1,125,40,150,40,213,79,51,1,145,72,250,106,5,53,19,243,59,140,252,114,0,0,1,0,150,0,0,5,133,5,212,0,31,0,0,1,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,21,38,35,34,29,1,33,21,33,17,35,3,19,254,60,185,1,126,89,85,79,96,196,1,196,1,156,119,95,89,126,226,1,59,254,197,185,3,142,252,114,4,77,1,125,40,150,40,213,69,61,1,125,40,150,40,223,69,140,252,114,0,1,0,150,254,114,3,193,5,222,0,21,0,0,1,33,17,35,17,16,33,50,23,21,38,35,32,29,1,33,17,16,7,39,54,53,3,8,254,71,185,1,186,139,155,149,146,255,0,2,114,155,155,125,3,142,252,114,4,77,1,145,60,150,60,233,69,252,54,254,194,160,105,135,238,0,0,1,0,150,254,114,6,72,5,222,0,37,0,0,1,53,16,33,50,23,21,38,35,32,29,1,33,17,16,7,39,54,53,17,33,17,35,17,33,17,35,17,16,33,50,23,21,38,35,34,29,1,3,19,1,186,139,155,149,146,255,0,2,124,155,155,125,254,61,185,254,60,185,1,126,89,85,79,96,196,4,26,51,1,145,60,150,60,233,69,252,54,254,194,160,105,135,238,3,62,252,114,3,142,252,114,4,87,1,125,40,150,40,213,79,0,0,2,0,150,0,0,6,241,5,222,0,8,0,33,0,0,37,22,51,32,17,16,33,34,7,3,38,35,32,29,1,33,21,33,17,35,17,16,33,50,23,17,54,51,32,17,16,33,34,39,4,0,91,130,1,94,254,195,144,110,185,110,88,254,206,1,59,254,197,185,1,236,179,203,119,136,1,242,253,245,226,189,183,29,1,143,1,81,54,1,241,19,243,59,150,252,124,4,77,1,145,72,254,82,50,254,8,253,222,43,0,0,0,2,0,150,0,0,9,110,5,222,0,8,0,49,0,0,37,22,51,32,17,16,33,34,7,37,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,17,54,51,32,17,16,33,34,39,17,38,35,32,29,1,33,21,33,17,35,6,125,91,130,1,94,254,195,144,110,252,150,254,60,185,1,126,89,85,79,96,196,1,196,1,236,179,203,119,136,1,242,253,245,226,189,110,88,254,206,1,59,254,197,185,183,29,1,143,1,81,54,74,252,114,4,87,1,125,40,150,40,213,79,51,1,145,72,254,82,50,254,8,253,222,43,5,10,19,243,59,140,252,114,0,0,0,1,0,150,0,0,6,208,5,222,0,29,0,0,1,38,35,32,29,1,33,21,33,17,35,17,16,33,50,23,17,54,51,32,25,1,35,17,52,35,34,7,17,35,3,71,110,88,254,206,1,59,254,197,185,1,236,179,203,134,193,1,137,185,233,159,143,185,5,53,19,243,59,150,252,124,4,77,1,145,72,254,18,114,254,121,253,109,2,150,234,133,253,5,0,0,0,1,0,150,0,0,9,77,5,222,0,45,0,0,1,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,17,54,51,32,25,1,35,17,52,35,34,7,17,35,17,38,35,32,29,1,33,21,33,17,35,3,19,254,60,185,1,126,89,85,79,96,196,1,196,1,236,179,203,134,193,1,137,185,233,159,143,185,110,88,254,206,1,59,254,197,185,3,142,252,114,4,87,1,125,40,150,40,213,79,51,1,145,72,254,18,114,254,121,253,109,2,150,234,133,253,5,5,53,19,243,59,140,252,114,0,0,0,1,0,150,0,0,7,13,5,222,0,34,0,0,1,38,35,32,29,1,33,21,33,17,35,17,16,33,50,23,17,54,51,32,17,20,5,1,35,1,53,36,53,52,35,34,7,17,35,3,71,110,88,254,206,1,59,254,197,185,1,236,179,203,153,200,1,136,254,212,1,80,234,254,178,1,91,220,173,167,185,5,53,19,243,59,150,252,124,4,77,1,145,72,254,50,82,254,209,220,84,254,69,1,189,83,31,189,152,94,252,218,0,1,0,150,0,0,9,138,5,222,0,50,0,0,1,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,17,54,51,32,17,20,5,1,35,1,53,36,53,52,35,34,7,17,35,17,38,35,32,29,1,33,21,33,17,35,3,19,254,60,185,1,126,89,85,79,96,196,1,196,1,236,179,203,153,200,1,136,254,212,1,80,234,254,178,1,91,220,173,167,185,110,88,254,206,1,59,254,197,185,3,142,252,114,4,87,1,125,40,150,40,213,79,51,1,145,72,254,50,82,254,209,220,84,254,69,1,189,83,31,189,152,94,252,218,5,53,19,243,59,140,252,114,0,2,0,115,255,246,4,136,4,36,0,7,0,15,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,54,1,77,1,66,254,190,254,179,195,2,16,2,5,253,251,253,240,140,1,133,1,125,254,131,6,2,25,253,231,253,235,0,0,0,0,1,0,115,0,0,3,21,4,26,0,9,0,0,37,17,35,53,37,17,51,21,33,53,1,109,250,1,179,239,253,94,150,2,199,99,90,252,124,150,150,0,0,0,0,1,0,115,0,0,3,247,4,36,0,16,0,0,51,53,0,53,52,33,34,7,53,54,51,32,17,16,1,33,21,115,2,153,254,242,200,195,195,200,1,199,253,221,2,85,150,1,81,243,180,110,160,100,254,182,254,222,254,222,150,0,0,0,0,1,0,100,254,232,3,197,4,26,0,28,0,0,19,54,51,32,17,20,7,22,21,16,33,34,39,53,22,51,32,53,52,35,33,53,33,50,53,52,33,34,7,100,200,180,1,229,188,188,254,27,180,200,200,180,1,44,252,254,234,1,19,255,254,212,180,200,3,222,60,254,132,186,89,85,190,254,112,60,160,70,250,200,150,200,230,70,0,1,0,60,254,232,4,81,4,25,0,14,0,0,1,35,17,33,53,1,51,1,33,17,51,17,23,21,35,3,189,185,253,56,2,33,194,253,222,2,7,185,148,148,254,232,1,53,150,3,102,252,154,1,222,254,34,76,74,0,0,1,0,155,254,222,4,21,4,26,0,21,0,0,19,33,21,33,3,54,51,32,17,16,33,34,39,53,22,51,32,17,52,33,34,7,205,2,252,253,161,33,117,99,1,244,253,208,180,150,150,190,1,109,254,197,195,195,4,26,150,254,110,22,254,122,254,92,60,160,70,1,14,240,50,0,0,2,0,120,255,246,4,126,5,93,0,12,0,22,0,0,19,16,1,23,4,7,54,51,32,17,16,33,32,54,33,32,17,16,33,34,7,6,21,120,2,146,96,254,170,152,111,155,1,248,253,245,254,5,175,1,85,1,77,254,180,184,130,28,2,8,1,250,1,91,127,176,213,43,254,72,254,42,150,1,64,1,34,48,40,136,0,0,0,1,0,40,254,232,3,202,4,26,0,6,0,0,19,33,21,1,35,1,33,40,3,162,253,156,211,2,120,253,29,4,26,150,251,100,4,156,0,0,0,3,0,115,255,246,4,111,5,64,0,15,0,23,0,31,0,0,19,52,55,38,53,16,33,32,17,20,7,4,21,16,33,32,0,53,52,33,32,21,20,33,0,53,52,33,32,21,20,33,115,252,212,1,214,1,214,217,1,1,254,2,254,2,3,27,254,219,254,235,1,34,1,64,254,179,254,195,1,74,1,118,223,108,95,208,1,80,254,176,208,95,108,223,254,128,3,12,238,182,182,238,253,138,238,242,242,238,0,2,0,115,254,187,4,121,4,34,0,12,0,22,0,0,1,16,1,39,36,55,6,35,32,17,16,33,32,6,33,32,17,16,33,50,55,54,53,4,121,253,110,96,1,86,152,111,155,254,8,2,11,1,251,175,254,171,254,179,1,76,184,130,28,2,16,254,6,254,165,127,176,213,43,1,184,1,214,150,254,192,254,222,48,40,136,0,0,2,0,90,254,112,4,66,4,26,0,38,0,46,0,0,1,50,23,55,51,21,35,22,23,16,33,34,39,6,21,20,51,33,32,21,16,33,34,39,53,22,51,32,53,52,35,33,34,53,52,55,38,53,16,18,33,50,53,52,35,32,21,2,45,133,97,146,157,186,84,1,254,67,72,112,75,89,1,88,1,81,254,0,242,211,214,243,1,67,149,254,149,243,120,125,185,1,1,252,252,254,255,4,26,50,50,150,79,134,254,140,30,63,61,71,245,254,207,90,170,110,155,95,184,124,103,89,178,1,116,253,188,215,215,215,0,3,0,90,254,112,4,66,5,150,0,38,0,46,0,53,0,0,1,50,23,55,51,21,35,22,23,16,33,34,39,6,21,20,51,33,32,21,16,33,34,39,53,22,51,32,53,52,35,33,34,53,52,55,38,53,16,18,33,50,53,52,35,32,21,19,51,19,35,39,7,35,2,45,133,97,146,157,186,84,1,254,67,72,112,75,89,1,88,1,81,254,0,242,211,214,243,1,67,149,254,149,243,120,125,185,1,1,252,252,254,255,188,150,175,150,100,100,150,4,26,50,50,150,79,134,254,140,30,63,61,71,245,254,207,90,170,110,155,95,184,124,103,89,178,1,116,253,188,215,215,215,2,233,254,252,160,160,0,0,0,3,0,90,254,112,4,66,5,150,0,38,0,46,0,56,0,0,1,50,23,55,51,21,35,22,23,16,33,34,39,6,21,20,51,33,32,21,16,33,34,39,53,22,51,32,53,52,35,33,34,53,52,55,38,53,16,18,33,50,53,52,35,32,21,3,51,20,51,50,53,51,16,33,32,2,45,133,97,146,157,186,84,1,254,67,72,112,75,89,1,88,1,81,254,0,242,211,214,243,1,67,149,254,149,243,120,125,185,1,1,252,252,254,255,10,135,130,130,135,254,247,254,247,4,26,50,50,150,79,134,254,140,30,63,61,71,245,254,207,90,170,110,155,95,184,124,103,89,178,1,116,253,188,215,215,215,2,233,150,150,254,252,0,0,3,0,90,254,112,4,66,5,150,0,38,0,46,0,50,0,0,1,50,23,55,51,21,35,22,23,16,33,34,39,6,21,20,51,33,32,21,16,33,34,39,53,22,51,32,53,52,35,33,34,53,52,55,38,53,16,18,33,50,53,52,35,32,21,1,21,35,53,2,45,133,97,146,157,186,84,1,254,67,72,112,75,89,1,88,1,81,254,0,242,211,214,243,1,67,149,254,149,243,120,125,185,1,1,252,252,254,255,1,96,205,4,26,50,50,150,79,134,254,140,30,63,61,71,245,254,207,90,170,110,155,95,184,124,103,89,178,1,116,253,188,215,215,215,2,233,190,190,0,0,0,0,3,0,90,254,112,4,66,5,150,0,38,0,46,0,50,0,0,1,50,23,55,51,21,35,22,23,16,33,34,39,6,21,20,51,33,32,21,16,33,34,39,53,22,51,32,53,52,35,33,34,53,52,55,38,53,16,18,33,50,53,52,35,32,21,1,3,35,19,2,45,133,97,146,157,186,84,1,254,67,72,112,75,89,1,88,1,81,254,0,242,211,214,243,1,67,149,254,149,243,120,125,185,1,1,252,252,254,255,1,213,150,185,150,4,26,50,50,150,79,134,254,140,30,63,61,71,245,254,207,90,170,110,155,95,184,124,103,89,178,1,116,253,188,215,215,215,2,233,254,232,1,24,0,0,0,0,2,0,150,0,0,4,58,5,150,0,6,0,10,0,0,9,2,35,1,53,9,1,17,51,17,4,52,254,56,1,206,237,254,118,1,141,253,70,185,4,26,254,23,253,207,1,249,103,1,186,251,230,5,150,250,106,0,0,0,0,3,0,150,254,132,4,58,5,150,0,3,0,7,0,14,0,0,51,17,51,17,5,3,35,19,9,2,35,1,53,1,150,185,1,100,150,185,150,2,58,254,56,1,206,237,254,118,1,141,5,150,250,106,100,254,232,1,24,4,126,254,23,253,207,1,249,103,1,186,0,0,0,1,0,170,255,254,5,161,5,170,0,28,0,0,51,17,16,33,50,5,21,1,4,17,16,33,34,39,53,22,51,32,17,52,37,35,53,1,38,35,32,25,1,170,2,153,233,1,76,254,76,1,221,254,18,176,156,157,177,1,41,254,167,136,1,182,184,184,254,32,3,142,2,28,80,130,254,79,5,254,130,254,90,70,160,80,1,16,251,1,128,1,204,40,254,132,252,104,0,0,0,0,0,1,0,0,25,196,0,1,4,73,24,0,0,10,1,182,0,23,0,26,255,106,0,25,0,26,255,106,0,25,0,28,255,156,0,26,0,23,255,106,0,26,0,25,255,156,0,28,0,26,255,206,0,36,0,55,255,106,0,36,0,57,255,106,0,36,0,60,255,81,0,36,0,173,255,81,0,36,0,207,255,81,0,36,1,17,255,106,0,36,1,94,255,106,0,36,1,96,255,106,0,36,1,110,255,81,0,41,0,36,255,106,0,41,0,98,255,106,0,41,0,99,255,106,0,41,0,143,255,106,0,41,0,160,255,106,0,41,0,161,255,106,0,41,0,182,255,106,0,41,0,184,255,106,0,41,0,253,255,106,0,41,1,21,255,106,0,41,1,23,255,106,0,46,0,38,255,106,0,46,0,42,255,106,0,46,0,50,255,106,0,46,0,52,255,106,0,46,0,100,255,106,0,46,0,103,255,106,0,46,0,144,255,106,0,46,0,162,255,106,0,46,0,163,255,106,0,46,0,191,255,106,0,46,0,192,255,106,0,46,0,193,255,106,0,46,0,255,255,106,0,46,1,7,255,106,0,46,1,25,255,106,0,46,1,27,255,106,0,46,1,37,255,106,0,46,1,39,255,106,0,46,1,41,255,106,0,46,1,43,255,106,0,46,1,78,255,106,0,46,1,80,255,106,0,46,1,82,255,106,0,47,0,38,255,106,0,47,0,42,255,106,0,47,0,50,255,106,0,47,0,52,255,106,0,47,0,55,254,212,0,47,0,57,255,56,0,47,0,60,255,31,0,47,0,100,255,106,0,47,0,103,255,106,0,47,0,144,255,106,0,47,0,162,255,106,0,47,0,163,255,106,0,47,0,173,255,31,0,47,0,191,255,106,0,47,0,192,255,106,0,47,0,193,255,106,0,47,0,207,255,31,0,47,0,255,255,106,0,47,1,7,255,106,0,47,1,17,254,212,0,47,1,25,255,106,0,47,1,27,255,106,0,47,1,37,255,106,0,47,1,39,255,106,0,47,1,41,255,106,0,47,1,43,255,106,0,47,1,78,255,106,0,47,1,80,255,106,0,47,1,82,255,106,0,47,1,94,254,212,0,47,1,96,254,212,0,47,1,110,255,31,0,51,0,36,255,106,0,51,0,45,255,156,0,51,0,98,255,106,0,51,0,99,255,106,0,51,0,143,255,106,0,51,0,160,255,106,0,51,0,161,255,106,0,51,0,182,255,106,0,51,0,184,255,106,0,51,0,253,255,106,0,51,1,21,255,106,0,51,1,23,255,106,0,51,1,60,255,156,0,54,0,54,255,156,0,54,1,3,255,156,0,55,0,36,255,106,0,55,0,45,255,131,0,55,0,68,255,106,0,55,0,70,255,106,0,55,0,71,255,106,0,55,0,72,255,106,0,55,0,74,255,106,0,55,0,80,255,116,0,55,0,81,255,106,0,55,0,82,255,106,0,55,0,83,255,106,0,55,0,84,255,106,0,55,0,85,255,106,0,55,0,86,255,106,0,55,0,87,255,106,0,55,0,88,255,106,0,55,0,89,255,106,0,55,0,90,255,106,0,55,0,91,255,106,0,55,0,92,255,106,0,55,0,93,255,106,0,55,0,98,255,106,0,55,0,99,255,106,0,55,0,105,255,106,0,55,0,106,255,106,0,55,0,107,255,106,0,55,0,108,255,106,0,55,0,109,255,106,0,55,0,110,255,106,0,55,0,111,255,106,0,55,0,112,255,106,0,55,0,113,255,106,0,55,0,114,255,106,0,55,0,115,255,106,0,55,0,121,255,106,0,55,0,122,255,106,0,55,0,123,255,106,0,55,0,124,255,106,0,55,0,125,255,106,0,55,0,126,255,106,0,55,0,127,255,106,0,55,0,128,255,106,0,55,0,129,255,106,0,55,0,143,255,106,0,55,0,150,255,106,0,55,0,151,255,106,0,55,0,160,255,106,0,55,0,161,255,106,0,55,0,164,255,106,0,55,0,182,255,106,0,55,0,184,255,106,0,55,0,250,255,106,0,55,0,252,255,106,0,55,0,253,255,106,0,55,0,254,255,106,0,55,1,0,255,106,0,55,1,2,255,106,0,55,1,4,255,106,0,55,1,6,255,106,0,55,1,8,255,106,0,55,1,10,255,106,0,55,1,12,255,106,0,55,1,14,255,106,0,55,1,16,255,106,0,55,1,18,255,106,0,55,1,20,255,106,0,55,1,21,255,106,0,55,1,22,255,106,0,55,1,23,255,106,0,55,1,24,255,106,0,55,1,26,255,106,0,55,1,28,255,106,0,55,1,32,255,106,0,55,1,34,255,106,0,55,1,36,255,106,0,55,1,38,255,106,0,55,1,40,255,106,0,55,1,42,255,106,0,55,1,44,255,106,0,55,1,60,255,131,0,55,1,64,255,106,0,55,1,74,255,106,0,55,1,77,255,106,0,55,1,79,255,106,0,55,1,81,255,106,0,55,1,83,255,106,0,55,1,85,255,106,0,55,1,87,255,106,0,55,1,89,255,106,0,55,1,91,255,106,0,55,1,93,255,106,0,55,1,95,255,106,0,55,1,97,255,106,0,55,1,99,255,106,0,55,1,101,255,106,0,55,1,103,255,106,0,55,1,105,255,106,0,55,1,107,255,106,0,55,1,109,255,106,0,55,1,111,255,106,0,57,0,36,255,106,0,57,0,68,255,156,0,57,0,70,255,131,0,57,0,71,255,131,0,57,0,72,255,131,0,57,0,74,255,131,0,57,0,80,255,156,0,57,0,81,255,156,0,57,0,82,255,131,0,57,0,83,255,156,0,57,0,84,255,131,0,57,0,85,255,156,0,57,0,86,255,131,0,57,0,93,255,156,0,57,0,98,255,106,0,57,0,99,255,106,0,57,0,105,255,156,0,57,0,106,255,156,0,57,0,107,255,156,0,57,0,108,255,156,0,57,0,109,255,156,0,57,0,110,255,156,0,57,0,111,255,131,0,57,0,112,255,131,0,57,0,113,255,131,0,57,0,114,255,131,0,57,0,115,255,131,0,57,0,120,255,156,0,57,0,121,255,131,0,57,0,122,255,131,0,57,0,123,255,131,0,57,0,124,255,131,0,57,0,125,255,131,0,57,0,143,255,106,0,57,0,150,255,156,0,57,0,151,255,131,0,57,0,160,255,106,0,57,0,161,255,106,0,57,0,164,255,131,0,57,0,182,255,106,0,57,0,184,255,106,0,57,0,250,255,156,0,57,0,252,255,156,0,57,0,253,255,106,0,57,0,254,255,156,0,57,1,2,255,156,0,57,1,4,255,131,0,57,1,6,255,131,0,57,1,8,255,131,0,57,1,10,255,131,0,57,1,12,255,131,0,57,1,14,255,156,0,57,1,16,255,156,0,57,1,20,255,156,0,57,1,21,255,106,0,57,1,22,255,131,0,57,1,23,255,106,0,57,1,24,255,131,0,57,1,26,255,131,0,57,1,28,255,131,0,57,1,32,255,131,0,57,1,34,255,131,0,57,1,36,255,131,0,57,1,38,255,131,0,57,1,40,255,131,0,57,1,42,255,131,0,57,1,44,255,131,0,57,1,64,255,156,0,57,1,74,255,156,0,57,1,77,255,156,0,57,1,79,255,131,0,57,1,81,255,131,0,57,1,83,255,131,0,57,1,85,255,156,0,57,1,87,255,156,0,57,1,89,255,131,0,57,1,91,255,131,0,57,1,93,255,131,0,57,1,99,255,156,0,57,1,101,255,156,0,57,1,103,255,156,0,57,1,105,255,156,0,57,1,107,255,156,0,60,0,36,255,106,0,60,0,68,255,106,0,60,0,70,255,106,0,60,0,71,255,106,0,60,0,72,255,106,0,60,0,74,255,106,0,60,0,80,255,156,0,60,0,81,255,156,0,60,0,82,255,106,0,60,0,83,255,156,0,60,0,84,255,106,0,60,0,85,255,156,0,60,0,86,255,106,0,60,0,88,255,156,0,60,0,91,255,156,0,60,0,93,255,156,0,60,0,98,255,81,0,60,0,99,255,81,0,60,0,105,255,106,0,60,0,106,255,106,0,60,0,107,255,106,0,60,0,108,255,106,0,60,0,109,255,106,0,60,0,110,255,106,0,60,0,111,255,106,0,60,0,112,255,106,0,60,0,113,255,106,0,60,0,114,255,106,0,60,0,115,255,106,0,60,0,120,255,156,0,60,0,121,255,106,0,60,0,122,255,106,0,60,0,123,255,106,0,60,0,124,255,106,0,60,0,125,255,106,0,60,0,126,255,156,0,60,0,127,255,156,0,60,0,128,255,156,0,60,0,129,255,156,0,60,0,143,255,81,0,60,0,150,255,106,0,60,0,151,255,106,0,60,0,160,255,81,0,60,0,161,255,81,0,60,0,164,255,106,0,60,0,182,255,81,0,60,0,184,255,81,0,60,0,250,255,156,0,60,0,252,255,156,0,60,0,253,255,81,0,60,0,254,255,106,0,60,1,0,255,106,0,60,1,2,255,156,0,60,1,4,255,106,0,60,1,6,255,106,0,60,1,8,255,106,0,60,1,10,255,106,0,60,1,12,255,106,0,60,1,14,255,156,0,60,1,16,255,156,0,60,1,18,255,156,0,60,1,20,255,156,0,60,1,21,255,81,0,60,1,22,255,106,0,60,1,23,255,81,0,60,1,24,255,106,0,60,1,26,255,106,0,60,1,28,255,106,0,60,1,32,255,106,0,60,1,34,255,106,0,60,1,36,255,106,0,60,1,38,255,106,0,60,1,40,255,106,0,60,1,42,255,106,0,60,1,44,255,106,0,60,1,64,255,156,0,60,1,74,255,156,0,60,1,77,255,156,0,60,1,79,255,106,0,60,1,81,255,106,0,60,1,83,255,106,0,60,1,85,255,156,0,60,1,87,255,156,0,60,1,89,255,106,0,60,1,91,255,106,0,60,1,93,255,106,0,60,1,95,255,156,0,60,1,97,255,156,0,60,1,99,255,156,0,60,1,101,255,156,0,60,1,103,255,156,0,60,1,105,255,156,0,60,1,107,255,156,0,98,0,55,255,106,0,98,0,57,255,106,0,98,0,60,255,81,0,98,0,173,255,81,0,98,0,207,255,81,0,98,1,17,255,106,0,98,1,94,255,106,0,98,1,96,255,106,0,98,1,110,255,81,0,99,0,55,255,106,0,99,0,57,255,106,0,99,0,60,255,81,0,99,0,173,255,81,0,99,0,207,255,81,0,99,1,17,255,106,0,99,1,94,255,106,0,99,1,96,255,106,0,99,1,110,255,81,0,160,0,55,255,106,0,160,0,57,255,106,0,160,0,60,255,81,0,160,0,173,255,81,0,160,0,207,255,81,0,160,1,17,255,106,0,160,1,94,255,106,0,160,1,96,255,106,0,160,1,110,255,81,0,161,0,55,255,106,0,161,0,57,255,106,0,161,0,60,255,81,0,161,0,173,255,81,0,161,0,207,255,81,0,161,1,17,255,106,0,161,1,94,255,106,0,161,1,96,255,106,0,161,1,110,255,81,0,173,0,36,255,81,0,173,0,68,255,106,0,173,0,70,255,106,0,173,0,71,255,106,0,173,0,72,255,106,0,173,0,74,255,106,0,173,0,80,255,156,0,173,0,81,255,156,0,173,0,82,255,106,0,173,0,83,255,156,0,173,0,84,255,106,0,173,0,85,255,156,0,173,0,86,255,106,0,173,0,88,255,156,0,173,0,91,255,156,0,173,0,93,255,156,0,173,0,98,255,81,0,173,0,99,255,81,0,173,0,105,255,106,0,173,0,106,255,106,0,173,0,107,255,106,0,173,0,108,255,106,0,173,0,109,255,106,0,173,0,110,255,106,0,173,0,111,255,106,0,173,0,112,255,106,0,173,0,113,255,106,0,173,0,114,255,106,0,173,0,115,255,106,0,173,0,120,255,156,0,173,0,121,255,106,0,173,0,122,255,106,0,173,0,123,255,106,0,173,0,124,255,106,0,173,0,125,255,106,0,173,0,126,255,156,0,173,0,127,255,156,0,173,0,128,255,156,0,173,0,129,255,156,0,173,0,143,255,81,0,173,0,150,255,106,0,173,0,151,255,106,0,173,0,160,255,81,0,173,0,161,255,81,0,173,0,164,255,106,0,173,0,182,255,81,0,173,0,184,255,81,0,173,0,250,255,156,0,173,0,252,255,156,0,173,0,253,255,81,0,173,0,254,255,106,0,173,1,0,255,106,0,173,1,2,255,156,0,173,1,4,255,106,0,173,1,6,255,106,0,173,1,8,255,106,0,173,1,10,255,106,0,173,1,12,255,106,0,173,1,14,255,156,0,173,1,16,255,156,0,173,1,18,255,156,0,173,1,20,255,156,0,173,1,21,255,81,0,173,1,22,255,106,0,173,1,23,255,81,0,173,1,24,255,106,0,173,1,26,255,106,0,173,1,28,255,106,0,173,1,32,255,106,0,173,1,34,255,106,0,173,1,36,255,106,0,173,1,38,255,106,0,173,1,40,255,106,0,173,1,42,255,106,0,173,1,44,255,106,0,173,1,64,255,156,0,173,1,74,255,156,0,173,1,77,255,156,0,173,1,79,255,106,0,173,1,81,255,106,0,173,1,83,255,106,0,173,1,85,255,156,0,173,1,87,255,156,0,173,1,89,255,106,0,173,1,91,255,106,0,173,1,93,255,106,0,173,1,95,255,156,0,173,1,97,255,156,0,173,1,99,255,156,0,173,1,101,255,156,0,173,1,103,255,156,0,173,1,105,255,156,0,173,1,107,255,156,0,182,0,55,255,106,0,182,0,57,255,106,0,182,0,60,255,81,0,182,0,173,255,81,0,182,0,207,255,81,0,182,1,17,255,106,0,182,1,94,255,106,0,182,1,96,255,106,0,182,1,110,255,81,0,184,0,55,255,106,0,184,0,57,255,106,0,184,0,60,255,81,0,184,0,173,255,81,0,184,0,207,255,81,0,184,1,17,255,106,0,184,1,94,255,106,0,184,1,96,255,106,0,184,1,110,255,81,0,207,0,36,255,81,0,207,0,68,255,106,0,207,0,70,255,106,0,207,0,71,255,106,0,207,0,72,255,106,0,207,0,74,255,106,0,207,0,80,255,156,0,207,0,81,255,156,0,207,0,82,255,106,0,207,0,83,255,156,0,207,0,84,255,106,0,207,0,85,255,156,0,207,0,86,255,106,0,207,0,88,255,156,0,207,0,91,255,156,0,207,0,93,255,156,0,207,0,98,255,81,0,207,0,99,255,81,0,207,0,105,255,106,0,207,0,106,255,106,0,207,0,107,255,106,0,207,0,108,255,106,0,207,0,109,255,106,0,207,0,110,255,106,0,207,0,111,255,106,0,207,0,112,255,106,0,207,0,113,255,106,0,207,0,114,255,106,0,207,0,115,255,106,0,207,0,120,255,156,0,207,0,121,255,106,0,207,0,122,255,106,0,207,0,123,255,106,0,207,0,124,255,106,0,207,0,125,255,106,0,207,0,126,255,156,0,207,0,127,255,156,0,207,0,128,255,156,0,207,0,129,255,156,0,207,0,143,255,81,0,207,0,150,255,106,0,207,0,151,255,106,0,207,0,160,255,81,0,207,0,161,255,81,0,207,0,164,255,106,0,207,0,182,255,81,0,207,0,184,255,81,0,207,0,250,255,156,0,207,0,252,255,156,0,207,0,253,255,81,0,207,0,254,255,106,0,207,1,0,255,106,0,207,1,2,255,156,0,207,1,4,255,106,0,207,1,6,255,106,0,207,1,8,255,106,0,207,1,10,255,106,0,207,1,12,255,106,0,207,1,14,255,156,0,207,1,16,255,156,0,207,1,18,255,156,0,207,1,20,255,156,0,207,1,21,255,81,0,207,1,22,255,106,0,207,1,23,255,81,0,207,1,24,255,106,0,207,1,26,255,106,0,207,1,28,255,106,0,207,1,32,255,106,0,207,1,34,255,106,0,207,1,36,255,106,0,207,1,38,255,106,0,207,1,40,255,106,0,207,1,42,255,106,0,207,1,44,255,106,0,207,1,64,255,156,0,207,1,74,255,156,0,207,1,77,255,156,0,207,1,79,255,106,0,207,1,81,255,106,0,207,1,83,255,106,0,207,1,85,255,156,0,207,1,87,255,156,0,207,1,89,255,106,0,207,1,91,255,106,0,207,1,93,255,106,0,207,1,95,255,156,0,207,1,97,255,156,0,207,1,99,255,156,0,207,1,101,255,156,0,207,1,103,255,156,0,207,1,105,255,156,0,207,1,107,255,156,0,219,0,38,255,106,0,219,0,42,255,106,0,219,0,50,255,106,0,219,0,52,255,106,0,219,0,55,254,212,0,219,0,57,254,212,0,219,0,60,254,224,0,219,0,100,255,106,0,219,0,103,255,106,0,219,0,144,255,106,0,219,0,162,255,106,0,219,0,163,255,106,0,219,0,173,255,31,0,219,0,191,255,106,0,219,0,192,255,106,0,219,0,193,255,106,0,219,0,207,255,31,0,219,1,17,254,212,0,219,1,94,254,212,0,219,1,96,254,212,0,219,1,110,255,31,0,253,0,55,255,131,0,253,0,57,255,106,0,253,0,60,255,81,0,253,0,173,255,81,0,253,0,207,255,81,0,253,1,17,255,106,0,253,1,94,255,106,0,253,1,96,255,106,0,253,1,110,255,81,1,3,0,54,255,160,1,17,0,36,255,106,1,17,0,45,255,131,1,17,0,68,255,106,1,17,0,70,255,106,1,17,0,71,255,106,1,17,0,72,255,106,1,17,0,74,255,106,1,17,0,80,255,116,1,17,0,81,255,106,1,17,0,82,255,106,1,17,0,83,255,106,1,17,0,84,255,106,1,17,0,85,255,106,1,17,0,86,255,106,1,17,0,87,255,106,1,17,0,88,255,106,1,17,0,89,255,106,1,17,0,90,255,106,1,17,0,91,255,106,1,17,0,92,255,106,1,17,0,93,255,106,1,17,0,98,255,106,1,17,0,99,255,106,1,17,0,105,255,106,1,17,0,106,255,106,1,17,0,107,255,106,1,17,0,108,255,106,1,17,0,109,255,106,1,17,0,110,255,106,1,17,0,111,255,106,1,17,0,112,255,106,1,17,0,113,255,106,1,17,0,114,255,106,1,17,0,115,255,106,1,17,0,121,255,106,1,17,0,122,255,106,1,17,0,123,255,106,1,17,0,124,255,106,1,17,0,125,255,106,1,17,0,126,255,106,1,17,0,127,255,106,1,17,0,128,255,106,1,17,0,129,255,106,1,17,0,143,255,106,1,17,0,150,255,106,1,17,0,151,255,106,1,17,0,160,255,106,1,17,0,161,255,106,1,17,0,164,255,106,1,17,0,182,255,106,1,17,0,184,255,106,1,17,0,250,255,106,1,17,0,252,255,106,1,17,0,253,255,106,1,17,0,254,255,106,1,17,1,0,255,106,1,17,1,2,255,106,1,17,1,4,255,106,1,17,1,6,255,106,1,17,1,8,255,106,1,17,1,10,255,106,1,17,1,12,255,106,1,17,1,14,255,106,1,17,1,16,255,106,1,17,1,18,255,106,1,17,1,20,255,106,1,17,1,21,255,106,1,17,1,22,255,106,1,17,1,23,255,106,1,17,1,24,255,106,1,17,1,26,255,106,1,17,1,28,255,106,1,17,1,32,255,106,1,17,1,34,255,106,1,17,1,36,255,106,1,17,1,38,255,106,1,17,1,40,255,106,1,17,1,42,255,106,1,17,1,44,255,106,1,17,1,60,255,131,1,17,1,64,255,106,1,17,1,74,255,106,1,17,1,77,255,106,1,17,1,79,255,106,1,17,1,81,255,106,1,17,1,83,255,106,1,17,1,85,255,106,1,17,1,87,255,106,1,17,1,89,255,106,1,17,1,91,255,106,1,17,1,93,255,106,1,17,1,95,255,106,1,17,1,97,255,106,1,17,1,99,255,106,1,17,1,101,255,106,1,17,1,103,255,106,1,17,1,105,255,106,1,17,1,107,255,106,1,17,1,109,255,106,1,17,1,111,255,106,1,21,0,55,255,106,1,21,0,57,255,106,1,21,0,60,255,81,1,21,0,173,255,81,1,21,0,207,255,81,1,21,1,17,255,106,1,21,1,94,255,106,1,21,1,96,255,106,1,21,1,110,255,81,1,23,0,55,255,106,1,23,0,57,255,106,1,23,0,60,255,81,1,23,0,173,255,81,1,23,0,207,255,81,1,23,1,17,255,106,1,23,1,94,255,106,1,23,1,96,255,106,1,23,1,110,255,81,1,62,0,38,255,106,1,62,0,42,255,106,1,62,0,50,255,106,1,62,0,52,255,106,1,62,0,100,255,106,1,62,0,103,255,106,1,62,0,144,255,106,1,62,0,162,255,106,1,62,0,163,255,106,1,62,0,191,255,106,1,62,0,192,255,106,1,62,0,193,255,106,1,62,0,255,255,106,1,62,1,7,255,106,1,62,1,25,255,106,1,62,1,27,255,106,1,62,1,37,255,106,1,62,1,39,255,106,1,62,1,41,255,106,1,62,1,43,255,106,1,62,1,78,255,106,1,62,1,80,255,106,1,62,1,82,255,106,1,65,0,38,255,106,1,65,0,42,255,106,1,65,0,50,255,106,1,65,0,52,255,106,1,65,0,55,254,212,1,65,0,60,255,31,1,65,0,100,255,106,1,65,0,103,255,106,1,65,0,144,255,106,1,65,0,162,255,106,1,65,0,163,255,106,1,65,0,173,255,31,1,65,0,191,255,106,1,65,0,192,255,106,1,65,0,193,255,106,1,65,0,207,255,31,1,65,1,17,254,212,1,65,1,25,255,106,1,65,1,27,255,106,1,65,1,37,255,106,1,65,1,39,255,106,1,65,1,41,255,106,1,65,1,43,255,106,1,65,1,78,255,106,1,65,1,80,255,106,1,65,1,82,255,106,1,65,1,94,254,212,1,65,1,96,254,212,1,65,1,110,255,31,1,67,0,38,255,106,1,67,0,42,255,106,1,67,0,55,254,212,1,67,0,100,255,106,1,67,0,103,255,106,1,67,0,144,255,106,1,67,0,162,255,106,1,67,0,163,255,106,1,67,0,173,255,31,1,67,0,191,255,106,1,67,0,192,255,106,1,67,0,193,255,106,1,67,0,207,255,31,1,67,0,255,255,106,1,67,1,7,255,106,1,67,1,17,254,212,1,67,1,25,255,106,1,67,1,27,255,106,1,67,1,37,255,106,1,67,1,39,255,106,1,67,1,41,255,106,1,67,1,43,255,106,1,67,1,78,255,106,1,67,1,80,255,106,1,67,1,82,255,106,1,67,1,94,254,212,1,67,1,96,254,212,1,67,1,110,255,31,1,69,0,55,255,56,1,69,0,173,255,31,1,69,0,207,255,31,1,69,1,17,255,56,1,69,1,94,255,56,1,69,1,96,255,56,1,69,1,110,255,31,1,71,0,55,254,212,1,71,0,173,255,31,1,71,0,207,255,31,1,71,1,17,254,212,1,71,1,94,254,212,1,71,1,96,254,212,1,71,1,110,255,31,1,94,0,36,255,106,1,94,0,45,255,131,1,94,0,68,255,106,1,94,0,70,255,106,1,94,0,71,255,106,1,94,0,72,255,106,1,94,0,74,255,106,1,94,0,80,255,116,1,94,0,81,255,106,1,94,0,82,255,106,1,94,0,83,255,106,1,94,0,84,255,106,1,94,0,85,255,106,1,94,0,86,255,106,1,94,0,87,255,106,1,94,0,88,255,106,1,94,0,89,255,106,1,94,0,90,255,106,1,94,0,91,255,106,1,94,0,92,255,106,1,94,0,93,255,106,1,94,0,98,255,106,1,94,0,99,255,106,1,94,0,105,255,106,1,94,0,106,255,106,1,94,0,107,255,106,1,94,0,108,255,106,1,94,0,109,255,106,1,94,0,110,255,106,1,94,0,111,255,106,1,94,0,112,255,106,1,94,0,113,255,106,1,94,0,114,255,106,1,94,0,115,255,106,1,94,0,121,255,106,1,94,0,122,255,106,1,94,0,123,255,106,1,94,0,124,255,106,1,94,0,125,255,106,1,94,0,126,255,106,1,94,0,127,255,106,1,94,0,128,255,106,1,94,0,129,255,106,1,94,0,143,255,106,1,94,0,150,255,106,1,94,0,151,255,106,1,94,0,160,255,106,1,94,0,161,255,106,1,94,0,164,255,106,1,94,0,182,255,106,1,94,0,184,255,106,1,94,0,250,255,106,1,94,0,252,255,106,1,94,0,253,255,106,1,94,0,254,255,106,1,94,1,0,255,106,1,94,1,2,255,106,1,94,1,4,255,106,1,94,1,6,255,106,1,94,1,8,255,106,1,94,1,10,255,106,1,94,1,12,255,106,1,94,1,14,255,106,1,94,1,16,255,106,1,94,1,18,255,106,1,94,1,20,255,106,1,94,1,21,255,106,1,94,1,22,255,106,1,94,1,23,255,106,1,94,1,24,255,106,1,94,1,26,255,106,1,94,1,28,255,106,1,94,1,32,255,106,1,94,1,34,255,106,1,94,1,36,255,106,1,94,1,38,255,106,1,94,1,40,255,106,1,94,1,42,255,106,1,94,1,44,255,106,1,94,1,60,255,131,1,94,1,64,255,106,1,94,1,74,255,106,1,94,1,77,255,106,1,94,1,79,255,106,1,94,1,81,255,106,1,94,1,83,255,106,1,94,1,85,255,106,1,94,1,87,255,106,1,94,1,89,255,106,1,94,1,91,255,106,1,94,1,93,255,106,1,94,1,95,255,106,1,94,1,97,255,106,1,94,1,99,255,106,1,94,1,101,255,106,1,94,1,103,255,106,1,94,1,105,255,106,1,94,1,107,255,106,1,94,1,109,255,106,1,94,1,111,255,106,1,96,0,36,255,106,1,96,0,45,255,131,1,96,0,98,255,106,1,96,0,99,255,106,1,96,0,143,255,106,1,96,0,160,255,106,1,96,0,161,255,106,1,96,0,182,255,106,1,96,0,184,255,106,1,96,0,253,255,106,1,96,1,21,255,106,1,96,1,23,255,106,1,96,1,60,255,131,1,110,0,36,255,81,1,110,0,68,255,106,1,110,0,70,255,106,1,110,0,71,255,106,1,110,0,72,255,106,1,110,0,74,255,106,1,110,0,80,255,156,1,110,0,81,255,156,1,110,0,82,255,106,1,110,0,83,255,156,1,110,0,84,255,106,1,110,0,85,255,156,1,110,0,86,255,106,1,110,0,88,255,156,1,110,0,91,255,156,1,110,0,93,255,156,1,110,0,98,255,81,1,110,0,99,255,81,1,110,0,105,255,106,1,110,0,106,255,106,1,110,0,107,255,106,1,110,0,108,255,106,1,110,0,109,255,106,1,110,0,110,255,106,1,110,0,111,255,106,1,110,0,112,255,106,1,110,0,113,255,106,1,110,0,114,255,106,1,110,0,115,255,106,1,110,0,120,255,156,1,110,0,121,255,106,1,110,0,122,255,106,1,110,0,123,255,106,1,110,0,124,255,106,1,110,0,125,255,106,1,110,0,126,255,156,1,110,0,127,255,156,1,110,0,128,255,156,1,110,0,129,255,156,1,110,0,143,255,81,1,110,0,150,255,106,1,110,0,151,255,106,1,110,0,160,255,81,1,110,0,161,255,81,1,110,0,164,255,106,1,110,0,182,255,81,1,110,0,184,255,81,1,110,0,250,255,156,1,110,0,252,255,156,1,110,0,253,255,81,1,110,0,254,255,106,1,110,1,0,255,106,1,110,1,2,255,156,1,110,1,4,255,106,1,110,1,6,255,106,1,110,1,8,255,106,1,110,1,10,255,106,1,110,1,12,255,106,1,110,1,14,255,156,1,110,1,16,255,156,1,110,1,18,255,156,1,110,1,20,255,156,1,110,1,21,255,81,1,110,1,22,255,106,1,110,1,23,255,81,1,110,1,24,255,106,1,110,1,26,255,106,1,110,1,28,255,106,1,110,1,32,255,106,1,110,1,34,255,106,1,110,1,36,255,106,1,110,1,38,255,106,1,110,1,40,255,106,1,110,1,42,255,106,1,110,1,44,255,106,1,110,1,64,255,156,1,110,1,74,255,156,1,110,1,77,255,156,1,110,1,79,255,106,1,110,1,81,255,106,1,110,1,83,255,106,1,110,1,85,255,156,1,110,1,87,255,156,1,110,1,89,255,106,1,110,1,91,255,106,1,110,1,93,255,106,1,110,1,95,255,156,1,110,1,97,255,156,1,110,1,99,255,156,1,110,1,101,255,156,1,110,1,103,255,156,1,110,1,105,255,156,1,110,1,107,255,156,1,114,1,132,255,106,1,114,1,137,255,106,1,114,1,140,255,56,1,117,1,114,255,31,1,117,1,118,254,187,1,117,1,125,255,81,1,118,1,128,255,206,1,118,1,131,255,206,1,118,1,134,255,206,1,128,1,118,255,106,1,130,1,114,255,106,1,130,1,118,254,187,1,130,1,125,255,81,1,132,1,114,255,106,1,132,1,118,255,56,1,132,1,125,255,156,1,133,1,114,255,106,1,133,1,118,255,6,1,133,1,125,255,106,1,134,1,118,255,6,1,136,1,128,255,206,1,136,1,131,255,206,1,136,1,134,255,206,1,139,1,128,255,206,1,139,1,131,255,206,1,139,1,134,255,206,1,140,1,133,255,181,1,140,1,137,255,131,1,142,1,133,255,181,1,142,1,137,255,131,1,143,1,118,255,106,1,144,1,118,255,156,1,149,1,150,255,106,1,160,1,150,255,156,1,165,1,150,255,156,1,166,1,150,255,156,0,0,0,16,0,198,0,1,0,0,0,0,0,0,0,19,0,12,0,1,0,0,0,0,0,1,0,9,0,0,0,1,0,0,0,0,0,2,0,7,0,41,0,1,0,0,0,0,0,3,0,31,0,0,0,1,0,0,0,0,0,4,0,17,0,31,0,1,0,0,0,0,0,5,0,12,0,48,0,1,0,0,0,0,0,6,0,17,0,31,0,1,0,0,0,0,0,9,0,12,0,19,0,3,0,1,4,9,0,0,0,38,0,84,0,3,0,1,4,9,0,1,0,18,0,60,0,3,0,1,4,9,0,2,0,14,0,142,0,3,0,1,4,9,0,3,0,62,0,60,0,3,0,1,4,9,0,4,0,34,0,122,0,3,0,1,4,9,0,5,0,24,0,156,0,3,0,1,4,9,0,6,0,34,0,122,0,3,0,1,4,9,0,9,0,24,0,98,83,97,110,115,97,116,105,111,110,32,45,32,169,32,50,48,49,49,32,66,101,114,110,100,32,77,111,110,116,97,103,83,97,110,115,97,116,105,111,110,32,82,101,103,117,108,97,114,86,101,114,115,105,111,110,32,49,46,51,49,0,83,0,97,0,110,0,115,0,97,0,116,0,105,0,111,0,110,0,32,0,45,0,32,0,169,0,32,0,50,0,48,0,49,0,49,0,32,0,66,0,101,0,114,0,110,0,100,0,32,0,77,0,111,0,110,0,116,0,97,0,103,0,83,0,97,0,110,0,115,0,97,0,116,0,105,0,111,0,110,0,32,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,51,0,49,0,0,0,2,0,0,0,0,0,0,255,92,0,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,21,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,144,0,145,0,147,0,150,0,151,0,157,0,158,0,160,0,161,0,162,0,163,0,164,0,166,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0,176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,186,0,187,0,189,0,190,0,191,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0,201,0,202,0,203,0,204,0,205,0,206,0,207,0,208,0,209,0,211,0,212,0,213,0,214,0,216,0,217,0,218,0,222,1,2,0,228,0,229,0,232,0,233,0,234,0,235,0,236,0,237,0,238,0,239,0,240,0,241,0,242,0,243,0,244,0,245,0,246,0,226,0,227,0,230,0,231,0,143,0,146,0,148,0,149,0,152,0,153,0,154,0,155,0,156,0,159,0,165,0,167,0,168,0,185,0,188,0,192,0,193,1,3,0,215,0,219,0,220,0,221,0,223,0,224,0,225,1,4,1,5,1,6,1,7,1,8,1,9,1,10,0,253,0,254,1,11,1,12,1,13,1,14,1,15,1,16,0,255,1,0,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,1,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,45,0,248,0,249,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,1,91,1,92,1,93,1,94,0,251,0,252,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,1,113,1,114,1,115,1,116,1,117,1,118,1,119,1,120,1,121,1,122,1,123,1,124,1,125,1,126,1,127,1,128,1,129,1,130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,1,138,1,139,1,140,1,141,1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151,1,152,1,153,1,154,1,155,1,156,1,157,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,1,176,1,177,1,178,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213,1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1,226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238,1,239,1,240,1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1,251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,10,99,111,109,109,97,99,99,101,110,116,7,77,84,46,115,105,103,110,4,69,117,114,111,4,90,100,111,116,4,122,100,111,116,6,90,97,99,117,116,101,6,122,97,99,117,116,101,7,65,111,103,111,110,101,107,7,97,111,103,111,110,101,107,6,78,97,99,117,116,101,6,110,97,99,117,116,101,6,83,97,99,117,116,101,6,115,97,99,117,116,101,7,69,111,103,111,110,101,107,7,101,111,103,111,110,101,107,6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,69,99,97,114,111,110,6,101,99,97,114,111,110,6,78,99,97,114,111,110,6,110,99,97,114,111,110,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,84,99,97,114,111,110,6,116,99,97,114,111,110,5,85,114,105,110,103,5,117,114,105,110,103,7,65,109,97,99,114,111,110,7,97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97,98,114,101,118,101,11,67,99,105,114,99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,10,67,100,111,116,97,99,99,101,110,116,10,99,100,111,116,97,99,99,101,110,116,6,68,99,114,111,97,116,7,69,109,97,99,114,111,110,7,101,109,97,99,114,111,110,6,69,98,114,101,118,101,6,101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110,116,10,101,100,111,116,97,99,99,101,110,116,11,71,99,105,114,99,117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108,101,120,10,71,100,111,116,97,99,99,101,110,116,10,103,100,111,116,97,99,99,101,110,116,12,71,99,111,109,109,97,97,99,99,101,110,116,12,103,99,111,109,109,97,97,99,99,101,110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104,99,105,114,99,117,109,102,108,101,120,4,72,98,97,114,4,104,98,97,114,6,73,116,105,108,100,101,6,105,116,105,108,100,101,7,73,109,97,99,114,111,110,7,105,109,97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101,118,101,7,73,111,103,111,110,101,107,7,105,111,103,111,110,101,107,10,73,100,111,116,97,99,99,101,110,116,2,73,74,2,105,106,11,74,99,105,114,99,117,109,102,108,101,120,11,106,99,105,114,99,117,109,102,108,101,120,12,75,99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109,109,97,97,99,99,101,110,116,12,107,103,114,101,101,110,108,97,110,100,105,99,6,76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97,99,99,101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97,114,111,110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,12,78,99,111,109,109,97,97,99,99,101,110,116,12,110,99,111,109,109,97,97,99,99,101,110,116,11,110,97,112,111,115,116,114,111,112,104,101,3,69,110,103,3,101,110,103,7,79,109,97,99,114,111,110,7,111,109,97,99,114,111,110,6,79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104,117,110,103,97,114,117,109,108,97,117,116,13,111,104,117,110,103,97,114,117,109,108,97,117,116,6,82,97,99,117,116,101,6,114,97,99,117,116,101,12,82,99,111,109,109,97,97,99,99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110,116,11,83,99,105,114,99,117,109,102,108,101,120,11,115,99,105,114,99,117,109,102,108,101,120,12,83,99,111,109,109,97,97,99,99,101,110,116,12,115,99,111,109,109,97,97,99,99,101,110,116,12,84,99,111,109,109,97,97,99,99,101,110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,4,84,98,97,114,4,116,98,97,114,6,85,116,105,108,100,101,6,117,116,105,108,100,101,7,85,109,97,99,114,111,110,7,117,109,97,99,114,111,110,6,85,98,114,101,118,101,6,117,98,114,101,118,101,13,85,104,117,110,103,97,114,117,109,108,97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,85,111,103,111,110,101,107,7,117,111,103,111,110,101,107,11,87,99,105,114,99,117,109,102,108,101,120,11,119,99,105,114,99,117,109,102,108,101,120,11,89,99,105,114,99,117,109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101,120,5,108,111,110,103,115,9,97,102,105,105,49,48,48,50,51,9,97,102,105,105,49,48,48,49,55,9,97,102,105,105,49,48,48,49,56,9,97,102,105,105,49,48,48,49,57,9,97,102,105,105,49,48,48,50,48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105,49,48,48,50,50,9,97,102,105,105,49,48,48,50,52,9,97,102,105,105,49,48,48,50,53,9,97,102,105,105,49,48,48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102,105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50,57,9,97,102,105,105,49,48,48,51,48,9,97,102,105,105,49,48,48,51,49,9,97,102,105,105,49,48,48,51,50,9,97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48,48,51,52,9,97,102,105,105,49,48,48,51,53,9,97,102,105,105,49,48,48,51,54,9,97,102,105,105,49,48,48,51,55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105,49,48,48,51,57,9,97,102,105,105,49,48,48,52,48,9,97,102,105,105,49,48,48,52,49,9,97,102,105,105,49,48,48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102,105,105,49,48,48,52,52,9,97,102,105,105,49,48,48,52,53,9,97,102,105,105,49,48,48,52,54,9,97,102,105,105,49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9,97,102,105,105,49,48,48,52,57,9,97,102,105,105,49,48,48,54,53,9,97,102,105,105,49,48,48,54,54,9,97,102,105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54,56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105,49,48,48,55,48,9,97,102,105,105,49,48,48,55,50,9,97,102,105,105,49,48,48,55,51,9,97,102,105,105,49,48,48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102,105,105,49,48,48,55,54,9,97,102,105,105,49,48,48,55,55,9,97,102,105,105,49,48,48,55,56,9,97,102,105,105,49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9,97,102,105,105,49,48,48,56,49,9,97,102,105,105,49,48,48,56,50,9,97,102,105,105,49,48,48,56,51,9,97,102,105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56,53,9,97,102,105,105,49,48,48,56,54,9,97,102,105,105,49,48,48,56,55,9,97,102,105,105,49,48,48,56,56,9,97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48,48,57,48,9,97,102,105,105,49,48,48,57,49,9,97,102,105,105,49,48,48,57,50,9,97,102,105,105,49,48,48,57,51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105,49,48,48,57,53,9,97,102,105,105,49,48,48,57,54,9,97,102,105,105,49,48,48,57,55,9,97,102,105,105,49,48,48,55,49,7,117,110,105,48,51,55,69,5,116,111,110,111,115,13,100,105,101,114,101,115,105,115,116,111,110,111,115,10,65,108,112,104,97,116,111,110,111,115,9,97,110,111,116,101,108,101,105,97,12,69,112,115,105,108,111,110,116,111,110,111,115,8,69,116,97,116,111,110,111,115,9,73,111,116,97,116,111,110,111,115,12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111,110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,17,105,111,116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,5,65,108,112,104,97,4,66,101,116,97,5,71,97,109,109,97,7,69,112,115,105,108,111,110,4,90,101,116,97,3,69,116,97,5,84,104,101,116,97,4,73,111,116,97,5,75,97,112,112,97,6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111,110,2,80,105,3,82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112,115,105,108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,12,73,111,116,97,100,105,101,114,101,115,105,115,15,85,112,115,105,108,111,110,100,105,101,114,101,115,105,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108,111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,9,105,111,116,97,116,111,110,111,115,20,117,112,115,105,108,111,110,100,105,101,114,101,115,105,115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116,97,5,103,97,109,109,97,5,100,101,108,116,97,7,101,112,115,105,108,111,110,4,122,101,116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112,97,6,108,97,109,98,100,97,2,110,117,2,120,105,7,111,109,105,99,114,111,110,3,114,104,111,6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97,117,7,117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111,109,101,103,97,12,105,111,116,97,100,105,101,114,101,115,105,115,15,117,112,115,105,108,111,110,100,105,101,114,101,115,105,115,12,111,109,105,99,114,111,110,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111,115,10,111,109,101,103,97,116,111,110,111,115,3,102,102,105,3,102,102,108,2,102,102,2,102,106,3,102,102,106,2,102,98,3,102,102,98,2,102,104,3,102,102,104,2,102,107,3,102,102,107,8,122,101,114,111,46,111,115,102,7,111,110,101,46,111,115,102,7,116,119,111,46,111,115,102,9,116,104,114,101,101,46,111,115,102,8,102,111,117,114,46,111,115,102,8,102,105,118,101,46,111,115,102,7,115,105,120,46,111,115,102,9,115,101,118,101,110,46,111,115,102,9,101,105,103,104,116,46,111,115,102,8,110,105,110,101,46,111,115,102,5,103,46,97,108,116,15,103,99,105,114,99,117,109,102,108,101,120,46,97,108,116,10,103,98,114,101,118,101,46,97,108,116,14,103,100,111,116,97,99,99,101,110,116,46,97,108,116,10,103,99,111,109,109,97,46,97,108,116,5,107,46,97,108,116,10,107,99,111,109,109,97,46,97,108,116,14,103,101,114,109,97,110,100,98,108,115,46,99,97,112,0,0,0,0,1,255,255,0,2,0,1,0,0,0,12,0,0,0,22,0,0,0,2,0,1,0,0,2,20,0,1,0,4,0,0,0,1,0,0,0,0,0,1,0,0,0,10,0,40,0,42,0,1,108,97,116,110,0,8,0,10,0,1,122,122,48,49,0,16,0,0,255,255,0,0,0,0,255,255,0,0,0,0,0,0,0,1,0,0,0,10,0,62,0,198,0,1,108,97,116,110,0,8,0,10,0,1,122,122,48,49,0,28,0,0,255,255,0,6,0,1,0,0,0,2,0,3,0,4,0,5,0,0,255,255,0,5,0,6,0,7,0,8,0,9,0,10,0,11,108,105,103,97,0,68,111,110,117,109,0,74,115,97,108,116,0,80,115,115,48,49,0,88,115,115,48,50,0,94,115,115,48,51,0,100,122,122,48,49,0,106,122,122,48,50,0,112,122,122,48,51,0,118,122,122,48,52,0,124,122,122,48,53,0,130,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,2,0,2,0,3,0,0,0,1,0,2,0,0,0,1,0,3,0,0,0,1,0,4,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,2,0,0,0,1,0,3,0,0,0,1,0,4,0,5,0,12,0,20,0,28,0,36,0,44,0,4,0,0,0,1,0,40,0,1,0,0,0,1,0,164,0,1,0,0,0,1,0,192,0,1,0,0,0,1,0,234,0,1,0,0,0,1,0,244,0,1,0,126,0,1,0,8,0,13,0,28,0,34,0,42,0,48,0,56,0,62,0,70,0,76,0,84,0,90,0,98,0,104,0,112,0,238,0,2,0,76,1,248,0,3,0,73,0,76,0,239,0,2,0,79,1,249,0,3,0,73,0,79,1,251,0,2,0,77,1,252,0,3,0,73,0,77,1,253,0,2,0,69,1,254,0,3,0,73,0,69,1,255,0,2,0,75,2,0,0,3,0,73,0,75,2,1,0,2,0,78,2,2,0,3,0,73,0,78,1,250,0,2,0,73,0,1,0,1,0,73,0,2,0,26,0,10,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,0,2,0,1,0,19,0,28,0,0,0,2,0,16,0,5,2,13,2,14,2,15,2,16,2,17,0,2,0,5,0,74,0,74,0,0,1,38,1,38,0,1,1,40,1,40,0,2,1,42,1,42,0,3,1,44,1,44,0,4,0,2,0,10,0,2,2,18,2,19,0,1,0,2,0,78,1,63,0,2,0,8,0,1,2,20,0,1,0,1,0,137,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,48,34,32,73,68,32,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,34,32,73,68,32,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,34,32,73,68,32,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,34,32,73,68,32,51,32,85,78,73,67,79,68,69,32,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,34,32,73,68,32,52,32,85,78,73,67,79,68,69,32,51,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,34,32,73,68,32,53,32,85,78,73,67,79,68,69,32,51,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,34,32,73,68,32,54,32,85,78,73,67,79,68,69,32,51,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,34,32,73,68,32,55,32,85,78,73,67,79,68,69,32,51,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,34,32,73,68,32,56,32,85,78,73,67,79,68,69,32,51,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,34,32,73,68,32,57,32,85,78,73,67,79,68,69,32,51,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,34,32,73,68,32,49,48,32,85,78,73,67,79,68,69,32,51,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,34,32,73,68,32,49,49,32,85,78,73,67,79,68,69,32,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,34,32,73,68,32,49,50,32,85,78,73,67,79,68,69,32,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,34,32,73,68,32,49,51,32,85,78,73,67,79,68,69,32,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,34,32,73,68,32,49,52,32,85,78,73,67,79,68,69,32,52,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,34,32,73,68,32,49,53,32,85,78,73,67,79,68,69,32,52,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,34,32,73,68,32,49,54,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,50,68,44,85,43,50,48,49,48,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,34,32,73,68,32,49,55,32,85,78,73,67,79,68,69,32,52,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,34,32,73,68,32,49,56,32,85,78,73,67,79,68,69,32,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,34,32,73,68,32,49,57,32,85,78,73,67,79,68,69,32,52,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,34,32,73,68,32,50,48,32,85,78,73,67,79,68,69,32,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,34,32,73,68,32,50,49,32,85,78,73,67,79,68,69,32,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,34,32,73,68,32,50,50,32,85,78,73,67,79,68,69,32,53,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,34,32,73,68,32,50,51,32,85,78,73,67,79,68,69,32,53,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,34,32,73,68,32,50,52,32,85,78,73,67,79,68,69,32,53,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,34,32,73,68,32,50,53,32,85,78,73,67,79,68,69,32,53,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,34,32,73,68,32,50,54,32,85,78,73,67,79,68,69,32,53,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,34,32,73,68,32,50,55,32,85,78,73,67,79,68,69,32,53,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,34,32,73,68,32,50,56,32,85,78,73,67,79,68,69,32,53,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,34,32,73,68,32,50,57,32,85,78,73,67,79,68,69,32,53,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,34,32,73,68,32,51,48,32,85,78,73,67,79,68,69,32,53,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,34,32,73,68,32,51,49,32,85,78,73,67,79,68,69,32,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,34,32,73,68,32,51,50,32,85,78,73,67,79,68,69,32,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,34,32,73,68,32,51,51,32,85,78,73,67,79,68,69,32,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,34,32,73,68,32,51,52,32,85,78,73,67,79,68,69,32,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,34,32,73,68,32,51,53,32,85,78,73,67,79,68,69,32,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,34,32,73,68,32,51,54,32,85,78,73,67,79,68,69,32,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,34,32,73,68,32,51,55,32,85,78,73,67,79,68,69,32,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,34,32,73,68,32,51,56,32,85,78,73,67,79,68,69,32,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,34,32,73,68,32,51,57,32,85,78,73,67,79,68,69,32,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,34,32,73,68,32,52,48,32,85,78,73,67,79,68,69,32,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,34,32,73,68,32,52,49,32,85,78,73,67,79,68,69,32,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,34,32,73,68,32,52,50,32,85,78,73,67,79,68,69,32,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,34,32,73,68,32,52,51,32,85,78,73,67,79,68,69,32,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,34,32,73,68,32,52,52,32,85,78,73,67,79,68,69,32,55,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,34,32,73,68,32,52,53,32,85,78,73,67,79,68,69,32,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,34,32,73,68,32,52,54,32,85,78,73,67,79,68,69,32,55,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,34,32,73,68,32,52,55,32,85,78,73,67,79,68,69,32,55,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,34,32,73,68,32,52,56,32,85,78,73,67,79,68,69,32,55,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,34,32,73,68,32,52,57,32,85,78,73,67,79,68,69,32,55,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,34,32,73,68,32,53,48,32,85,78,73,67,79,68,69,32,55,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,34,32,73,68,32,53,49,32,85,78,73,67,79,68,69,32,56,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,34,32,73,68,32,53,50,32,85,78,73,67,79,68,69,32,56,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,51,34,32,73,68,32,53,51,32,85,78,73,67,79,68,69,32,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,52,34,32,73,68,32,53,52,32,85,78,73,67,79,68,69,32,56,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,53,34,32,73,68,32,53,53,32,85,78,73,67,79,68,69,32,56,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,54,34,32,73,68,32,53,54,32,85,78,73,67,79,68,69,32,56,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,55,34,32,73,68,32,53,55,32,85,78,73,67,79,68,69,32,56,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,56,34,32,73,68,32,53,56,32,85,78,73,67,79,68,69,32,56,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,57,34,32,73,68,32,53,57,32,85,78,73,67,79,68,69,32,56,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,48,34,32,73,68,32,54,48,32,85,78,73,67,79,68,69,32,56,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,49,34,32,73,68,32,54,49,32,85,78,73,67,79,68,69,32,57,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,50,34,32,73,68,32,54,50,32,85,78,73,67,79,68,69,32,57,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,51,34,32,73,68,32,54,51,32,85,78,73,67,79,68,69,32,57,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,52,34,32,73,68,32,54,52,32,85,78,73,67,79,68,69,32,57,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,53,34,32,73,68,32,54,53,32,85,78,73,67,79,68,69,32,57,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,54,34,32,73,68,32,54,54,32,85,78,73,67,79,68,69,32,57,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,55,34,32,73,68,32,54,55,32,85,78,73,67,79,68,69,32,57,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,56,34,32,73,68,32,54,56,32,85,78,73,67,79,68,69,32,57,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,57,34,32,73,68,32,54,57,32,85,78,73,67,79,68,69,32,57,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,48,34,32,73,68,32,55,48,32,85,78,73,67,79,68,69,32,57,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,49,34,32,73,68,32,55,49,32,85,78,73,67,79,68,69,32,49,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,50,34,32,73,68,32,55,50,32,85,78,73,67,79,68,69,32,49,48,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,73,68,32,55,51,32,85,78,73,67,79,68,69,32,49,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,52,34,32,73,68,32,55,52,32,85,78,73,67,79,68,69,32,49,48,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,53,34,32,73,68,32,55,53,32,85,78,73,67,79,68,69,32,49,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,54,34,32,73,68,32,55,54,32,85,78,73,67,79,68,69,32,49,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,55,34,32,73,68,32,55,55,32,85,78,73,67,79,68,69,32,49,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,56,34,32,73,68,32,55,56,32,85,78,73,67,79,68,69,32,49,48,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,57,34,32,73,68,32,55,57,32,85,78,73,67,79,68,69,32,49,48,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,48,34,32,73,68,32,56,48,32,85,78,73,67,79,68,69,32,49,48,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,49,34,32,73,68,32,56,49,32,85,78,73,67,79,68,69,32,49,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,50,34,32,73,68,32,56,50,32,85,78,73,67,79,68,69,32,49,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,51,34,32,73,68,32,56,51,32,85,78,73,67,79,68,69,32,49,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,52,34,32,73,68,32,56,52,32,85,78,73,67,79,68,69,32,49,49,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,53,34,32,73,68,32,56,53,32,85,78,73,67,79,68,69,32,49,49,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,54,34,32,73,68,32,56,54,32,85,78,73,67,79,68,69,32,49,49,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,55,34,32,73,68,32,56,55,32,85,78,73,67,79,68,69,32,49,49,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,56,34,32,73,68,32,56,56,32,85,78,73,67,79,68,69,32,49,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,57,34,32,73,68,32,56,57,32,85,78,73,67,79,68,69,32,49,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,48,34,32,73,68,32,57,48,32,85,78,73,67,79,68,69,32,49,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,49,34,32,73,68,32,57,49,32,85,78,73,67,79,68,69,32,49,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,50,34,32,73,68,32,57,50,32,85,78,73,67,79,68,69,32,49,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,51,34,32,73,68,32,57,51,32,85,78,73,67,79,68,69,32,49,50,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,52,34,32,73,68,32,57,52,32,85,78,73,67,79,68,69,32,49,50,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,53,34,32,73,68,32,57,53,32,85,78,73,67,79,68,69,32,49,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,54,34,32,73,68,32,57,54,32,85,78,73,67,79,68,69,32,49,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,55,34,32,73,68,32,57,55,32,85,78,73,67,79,68,69,32,49,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,56,34,32,73,68,32,57,56,32,85,78,73,67,79,68,69,32,49,57,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,57,34,32,73,68,32,57,57,32,85,78,73,67,79,68,69,32,49,57,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,48,34,32,73,68,32,49,48,48,32,85,78,73,67,79,68,69,32,49,57,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,49,34,32,73,68,32,49,48,49,32,85,78,73,67,79,68,69,32,50,48,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,50,34,32,73,68,32,49,48,50,32,85,78,73,67,79,68,69,32,50,48,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,51,34,32,73,68,32,49,48,51,32,85,78,73,67,79,68,69,32,50,49,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,52,34,32,73,68,32,49,48,52,32,85,78,73,67,79,68,69,32,50,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,53,34,32,73,68,32,49,48,53,32,85,78,73,67,79,68,69,32,50,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,54,34,32,73,68,32,49,48,54,32,85,78,73,67,79,68,69,32,50,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,55,34,32,73,68,32,49,48,55,32,85,78,73,67,79,68,69,32,50,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,56,34,32,73,68,32,49,48,56,32,85,78,73,67,79,68,69,32,50,50,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,57,34,32,73,68,32,49,48,57,32,85,78,73,67,79,68,69,32,50,50,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,48,34,32,73,68,32,49,49,48,32,85,78,73,67,79,68,69,32,50,50,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,49,34,32,73,68,32,49,49,49,32,85,78,73,67,79,68,69,32,50,51,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,50,34,32,73,68,32,49,49,50,32,85,78,73,67,79,68,69,32,50,51,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,51,34,32,73,68,32,49,49,51,32,85,78,73,67,79,68,69,32,50,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,52,34,32,73,68,32,49,49,52,32,85,78,73,67,79,68,69,32,50,51,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,53,34,32,73,68,32,49,49,53,32,85,78,73,67,79,68,69,32,50,51,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,54,34,32,73,68,32,49,49,54,32,85,78,73,67,79,68,69,32,50,51,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,55,34,32,73,68,32,49,49,55,32,85,78,73,67,79,68,69,32,50,51,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,56,34,32,73,68,32,49,49,56,32,85,78,73,67,79,68,69,32,50,51,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,57,34,32,73,68,32,49,49,57,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,69,70,44,85,43,70,56,70,70,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,48,34,32,73,68,32,49,50,48,32,85,78,73,67,79,68,69,32,50,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,49,34,32,73,68,32,49,50,49,32,85,78,73,67,79,68,69,32,50,52,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,50,34,32,73,68,32,49,50,50,32,85,78,73,67,79,68,69,32,50,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,51,34,32,73,68,32,49,50,51,32,85,78,73,67,79,68,69,32,50,52,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,52,34,32,73,68,32,49,50,52,32,85,78,73,67,79,68,69,32,50,52,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,53,34,32,73,68,32,49,50,53,32,85,78,73,67,79,68,69,32,50,52,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,54,34,32,73,68,32,49,50,54,32,85,78,73,67,79,68,69,32,50,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,55,34,32,73,68,32,49,50,55,32,85,78,73,67,79,68,69,32,50,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,56,34,32,73,68,32,49,50,56,32,85,78,73,67,79,68,69,32,50,53,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,57,34,32,73,68,32,49,50,57,32,85,78,73,67,79,68,69,32,50,53,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,48,34,32,73,68,32,49,51,48,32,85,78,73,67,79,68,69,32,56,50,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,49,34,32,73,68,32,49,51,49,32,85,78,73,67,79,68,69,32,49,55,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,50,34,32,73,68,32,49,51,50,32,85,78,73,67,79,68,69,32,49,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,51,34,32,73,68,32,49,51,51,32,85,78,73,67,79,68,69,32,49,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,52,34,32,73,68,32,49,51,52,32,85,78,73,67,79,68,69,32,49,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,53,34,32,73,68,32,49,51,53,32,85,78,73,67,79,68,69,32,56,50,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,54,34,32,73,68,32,49,51,54,32,85,78,73,67,79,68,69,32,49,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,55,34,32,73,68,32,49,51,55,32,85,78,73,67,79,68,69,32,50,50,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,56,34,32,73,68,32,49,51,56,32,85,78,73,67,79,68,69,32,49,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,57,34,32,73,68,32,49,51,57,32,85,78,73,67,79,68,69,32,49,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,48,34,32,73,68,32,49,52,48,32,85,78,73,67,79,68,69,32,56,52,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,49,34,32,73,68,32,49,52,49,32,85,78,73,67,79,68,69,32,49,56,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,50,34,32,73,68,32,49,52,50,32,85,78,73,67,79,68,69,32,49,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,51,34,32,73,68,32,49,52,51,32,85,78,73,67,79,68,69,32,49,57,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,52,34,32,73,68,32,49,52,52,32,85,78,73,67,79,68,69,32,50,49,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,53,34,32,73,68,32,49,52,53,32,85,78,73,67,79,68,69,32,49,55,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,54,34,32,73,68,32,49,52,54,32,85,78,73,67,79,68,69,32,49,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,55,34,32,73,68,32,49,52,55,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,66,53,44,85,43,48,51,66,67,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,56,34,32,73,68,32,49,52,56,32,85,78,73,67,79,68,69,32,49,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,57,34,32,73,68,32,49,52,57,32,85,78,73,67,79,68,69,32,49,56,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,48,34,32,73,68,32,49,53,48,32,85,78,73,67,79,68,69,32,50,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,49,34,32,73,68,32,49,53,49,32,85,78,73,67,79,68,69,32,50,52,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,50,34,32,73,68,32,49,53,50,32,85,78,73,67,79,68,69,32,49,57,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,51,34,32,73,68,32,49,53,51,32,85,78,73,67,79,68,69,32,49,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,52,34,32,73,68,32,49,53,52,32,85,78,73,67,79,68,69,32,49,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,53,34,32,73,68,32,49,53,53,32,85,78,73,67,79,68,69,32,52,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,54,34,32,73,68,32,49,53,54,32,85,78,73,67,79,68,69,32,49,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,55,34,32,73,68,32,49,53,55,32,85,78,73,67,79,68,69,32,49,56,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,56,34,32,73,68,32,49,53,56,32,85,78,73,67,79,68,69,32,56,50,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,57,34,32,73,68,32,49,53,57,32,85,78,73,67,79,68,69,32,49,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,48,34,32,73,68,32,49,54,48,32,85,78,73,67,79,68,69,32,49,57,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,49,34,32,73,68,32,49,54,49,32,85,78,73,67,79,68,69,32,49,57,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,50,34,32,73,68,32,49,54,50,32,85,78,73,67,79,68,69,32,50,49,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,51,34,32,73,68,32,49,54,51,32,85,78,73,67,79,68,69,32,51,51,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,52,34,32,73,68,32,49,54,52,32,85,78,73,67,79,68,69,32,51,51,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,53,34,32,73,68,32,49,54,53,32,85,78,73,67,79,68,69,32,56,50,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,54,34,32,73,68,32,49,54,54,32,85,78,73,67,79,68,69,32,56,50,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,55,34,32,73,68,32,49,54,55,32,85,78,73,67,79,68,69,32,56,50,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,56,34,32,73,68,32,49,54,56,32,85,78,73,67,79,68,69,32,56,50,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,57,34,32,73,68,32,49,54,57,32,85,78,73,67,79,68,69,32,56,50,49,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,48,34,32,73,68,32,49,55,48,32,85,78,73,67,79,68,69,32,56,50,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,49,34,32,73,68,32,49,55,49,32,85,78,73,67,79,68,69,32,50,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,50,34,32,73,68,32,49,55,50,32,85,78,73,67,79,68,69,32,50,53,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,51,34,32,73,68,32,49,55,51,32,85,78,73,67,79,68,69,32,51,55,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,52,34,32,73,68,32,49,55,52,32,85,78,73,67,79,68,69,32,49,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,53,34,32,73,68,32,49,55,53,32,85,78,73,67,79,68,69,32,56,50,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,54,34,32,73,68,32,49,55,54,32,85,78,73,67,79,68,69,32,56,50,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,55,34,32,73,68,32,49,55,55,32,85,78,73,67,79,68,69,32,56,50,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,56,34,32,73,68,32,49,55,56,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,66,55,44,85,43,50,50,49,57,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,57,34,32,73,68,32,49,55,57,32,85,78,73,67,79,68,69,32,56,50,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,48,34,32,73,68,32,49,56,48,32,85,78,73,67,79,68,69,32,56,50,50,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,49,34,32,73,68,32,49,56,49,32,85,78,73,67,79,68,69,32,56,50,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,50,34,32,73,68,32,49,56,50,32,85,78,73,67,79,68,69,32,49,57,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,51,34,32,73,68,32,49,56,51,32,85,78,73,67,79,68,69,32,50,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,52,34,32,73,68,32,49,56,52,32,85,78,73,67,79,68,69,32,49,57,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,53,34,32,73,68,32,49,56,53,32,85,78,73,67,79,68,69,32,50,48,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,54,34,32,73,68,32,49,56,54,32,85,78,73,67,79,68,69,32,50,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,55,34,32,73,68,32,49,56,55,32,85,78,73,67,79,68,69,32,50,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,56,34,32,73,68,32,49,56,56,32,85,78,73,67,79,68,69,32,50,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,57,34,32,73,68,32,49,56,57,32,85,78,73,67,79,68,69,32,50,48,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,48,34,32,73,68,32,49,57,48,32,85,78,73,67,79,68,69,32,50,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,49,34,32,73,68,32,49,57,49,32,85,78,73,67,79,68,69,32,50,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,50,34,32,73,68,32,49,57,50,32,85,78,73,67,79,68,69,32,50,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,51,34,32,73,68,32,49,57,51,32,85,78,73,67,79,68,69,32,50,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,52,34,32,73,68,32,49,57,52,32,85,78,73,67,79,68,69,32,50,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,53,34,32,73,68,32,49,57,53,32,85,78,73,67,79,68,69,32,50,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,54,34,32,73,68,32,49,57,54,32,85,78,73,67,79,68,69,32,50,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,55,34,32,73,68,32,49,57,55,32,85,78,73,67,79,68,69,32,55,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,56,34,32,73,68,32,49,57,56,32,85,78,73,67,79,68,69,32,55,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,57,34,32,73,68,32,49,57,57,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,65,70,44,85,43,48,50,67,57,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,48,34,32,73,68,32,50,48,48,32,85,78,73,67,79,68,69,32,49,56,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,49,34,32,73,68,32,50,48,49,32,85,78,73,67,79,68,69,32,56,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,50,34,32,73,68,32,50,48,50,32,85,78,73,67,79,68,69,32,51,53,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,51,34,32,73,68,32,50,48,51,32,85,78,73,67,79,68,69,32,51,53,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,52,34,32,73,68,32,50,48,52,32,85,78,73,67,79,68,69,32,49,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,53,34,32,73,68,32,50,48,53,32,85,78,73,67,79,68,69,32,50,48,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,54,34,32,73,68,32,50,48,54,32,85,78,73,67,79,68,69,32,50,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,55,34,32,73,68,32,50,48,55,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,68,68,44,85,43,70,66,48,49,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,56,34,32,73,68,32,50,48,56,32,85,78,73,67,79,68,69,32,50,53,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,57,34,32,73,68,32,50,48,57,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,68,69,44,85,43,70,66,48,50,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,48,34,32,73,68,32,50,49,48,32,85,78,73,67,79,68,69,32,50,53,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,49,34,32,73,68,32,50,49,49,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,65,68,44,85,43,50,50,49,50,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,50,34,32,73,68,32,50,49,50,32,85,78,73,67,79,68,69,32,50,49,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,51,34,32,73,68,32,50,49,51,32,85,78,73,67,79,68,69,32,49,56,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,52,34,32,73,68,32,50,49,52,32,85,78,73,67,79,68,69,32,49,55,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,53,34,32,73,68,32,50,49,53,32,85,78,73,67,79,68,69,32,49,55,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,54,34,32,73,68,32,50,49,54,32,85,78,73,67,79,68,69,32,49,56,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,55,34,32,73,68,32,50,49,55,32,85,78,73,67,79,68,69,32,49,56,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,56,34,32,73,68,32,50,49,56,32,85,78,73,67,79,68,69,32,49,57,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,57,34,32,73,68,32,50,49,57,32,85,78,73,67,79,68,69,32,51,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,48,34,32,73,68,32,50,50,48,32,85,78,73,67,79,68,69,32,51,50,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,49,34,32,73,68,32,50,50,49,32,85,78,73,67,79,68,69,32,51,56,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,50,34,32,73,68,32,50,50,50,32,85,78,73,67,79,68,69,32,51,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,51,34,32,73,68,32,50,50,51,32,85,78,73,67,79,68,69,32,56,56,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,52,34,32,73,68,32,50,50,52,32,85,78,73,67,79,68,69,32,56,55,51,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,53,34,32,73,68,32,50,50,53,32,85,78,73,67,79,68,69,32,56,56,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,54,34,32,73,68,32,50,50,54,32,85,78,73,67,79,68,69,32,56,56,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,55,34,32,73,68,32,50,50,55,32,85,78,73,67,79,68,69,32,56,55,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,56,34,32,73,68,32,50,50,56,32,85,78,73,67,79,68,69,32,56,55,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,57,34,32,73,68,32,50,50,57,32,85,78,73,67,79,68,69,32,56,55,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,48,34,32,73,68,32,50,51,48,32,85,78,73,67,79,68,69,32,57,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,49,34,32,73,68,32,50,51,49,32,85,78,73,67,79,68,69,32,56,55,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,50,34,32,73,68,32,50,51,50,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,51,65,57,44,85,43,50,49,50,54,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,51,34,32,73,68,32,50,51,51,32,85,78,73,67,79,68,69,32,56,55,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,52,34,32,73,68,32,50,51,52,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,50,50,52,56,44,85,43,50,50,70,50,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,53,34,32,73,68,32,50,51,53,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,51,57,52,44,85,43,50,50,48,54,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,54,34,32,73,68,32,50,51,54,32,85,78,73,67,79,68,69,32,57,54,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,55,34,32,73,68,32,50,51,55,32,85,78,73,67,79,68,69,32,56,50,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,56,34,32,73,68,32,50,51,56,32,85,78,73,67,79,68,69,32,54,49,52,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,57,34,32,73,68,32,50,51,57,32,85,78,73,67,79,68,69,32,54,49,52,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,48,34,32,73,68,32,50,52,48,32,85,78,73,67,79,68,69,32,54,49,52,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,49,34,32,73,68,32,50,52,49,32,85,78,73,67,79,68,69,32,51,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,50,34,32,73,68,32,50,52,50,32,85,78,73,67,79,68,69,32,55,50,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,51,34,32,73,68,32,50,52,51,32,85,78,73,67,79,68,69,32,55,50,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,52,34,32,73,68,32,50,52,52,32,85,78,73,67,79,68,69,32,55,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,53,34,32,73,68,32,50,52,53,32,85,78,73,67,79,68,69,32,55,51,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,54,34,32,73,68,32,50,52,54,32,85,78,73,67,79,68,69,32,55,51,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,55,34,32,73,68,32,50,52,55,32,85,78,73,67,79,68,69,32,55,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,56,34,32,73,68,32,50,52,56,32,85,78,73,67,79,68,69,32,56,51,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,57,34,32,73,68,32,50,52,57,32,85,78,73,67,79,68,69,32,51,55,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,48,34,32,73,68,32,50,53,48,32,85,78,73,67,79,68,69,32,51,56,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,49,34,32,73,68,32,50,53,49,32,85,78,73,67,79,68,69,32,51,55,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,50,34,32,73,68,32,50,53,50,32,85,78,73,67,79,68,69,32,51,55,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,51,34,32,73,68,32,50,53,51,32,85,78,73,67,79,68,69,32,50,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,52,34,32,73,68,32,50,53,52,32,85,78,73,67,79,68,69,32,50,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,53,34,32,73,68,32,50,53,53,32,85,78,73,67,79,68,69,32,50,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,54,34,32,73,68,32,50,53,54,32,85,78,73,67,79,68,69,32,50,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,55,34,32,73,68,32,50,53,55,32,85,78,73,67,79,68,69,32,51,50,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,56,34,32,73,68,32,50,53,56,32,85,78,73,67,79,68,69,32,51,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,57,34,32,73,68,32,50,53,57,32,85,78,73,67,79,68,69,32,51,52,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,48,34,32,73,68,32,50,54,48,32,85,78,73,67,79,68,69,32,51,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,49,34,32,73,68,32,50,54,49,32,85,78,73,67,79,68,69,32,50,56,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,50,34,32,73,68,32,50,54,50,32,85,78,73,67,79,68,69,32,50,56,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,51,34,32,73,68,32,50,54,51,32,85,78,73,67,79,68,69,32,50,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,52,34,32,73,68,32,50,54,52,32,85,78,73,67,79,68,69,32,50,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,53,34,32,73,68,32,50,54,53,32,85,78,73,67,79,68,69,32,50,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,54,34,32,73,68,32,50,54,54,32,85,78,73,67,79,68,69,32,50,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,55,34,32,73,68,32,50,54,55,32,85,78,73,67,79,68,69,32,50,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,56,34,32,73,68,32,50,54,56,32,85,78,73,67,79,68,69,32,50,56,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,57,34,32,73,68,32,50,54,57,32,85,78,73,67,79,68,69,32,51,50,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,48,34,32,73,68,32,50,55,48,32,85,78,73,67,79,68,69,32,51,50,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,49,34,32,73,68,32,50,55,49,32,85,78,73,67,79,68,69,32,51,52,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,50,34,32,73,68,32,50,55,50,32,85,78,73,67,79,68,69,32,51,52,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,51,34,32,73,68,32,50,55,51,32,85,78,73,67,79,68,69,32,51,53,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,52,34,32,73,68,32,50,55,52,32,85,78,73,67,79,68,69,32,51,53,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,53,34,32,73,68,32,50,55,53,32,85,78,73,67,79,68,69,32,51,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,54,34,32,73,68,32,50,55,54,32,85,78,73,67,79,68,69,32,51,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,55,34,32,73,68,32,50,55,55,32,85,78,73,67,79,68,69,32,50,53,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,56,34,32,73,68,32,50,55,56,32,85,78,73,67,79,68,69,32,50,53,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,57,34,32,73,68,32,50,55,57,32,85,78,73,67,79,68,69,32,50,53,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,48,34,32,73,68,32,50,56,48,32,85,78,73,67,79,68,69,32,50,53,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,49,34,32,73,68,32,50,56,49,32,85,78,73,67,79,68,69,32,50,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,50,34,32,73,68,32,50,56,50,32,85,78,73,67,79,68,69,32,50,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,51,34,32,73,68,32,50,56,51,32,85,78,73,67,79,68,69,32,50,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,52,34,32,73,68,32,50,56,52,32,85,78,73,67,79,68,69,32,50,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,53,34,32,73,68,32,50,56,53,32,85,78,73,67,79,68,69,32,50,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,54,34,32,73,68,32,50,56,54,32,85,78,73,67,79,68,69,32,50,55,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,55,34,32,73,68,32,50,56,55,32,85,78,73,67,79,68,69,32,50,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,56,34,32,73,68,32,50,56,56,32,85,78,73,67,79,68,69,32,50,55,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,57,34,32,73,68,32,50,56,57,32,85,78,73,67,79,68,69,32,50,55,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,48,34,32,73,68,32,50,57,48,32,85,78,73,67,79,68,69,32,50,55,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,49,34,32,73,68,32,50,57,49,32,85,78,73,67,79,68,69,32,50,55,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,50,34,32,73,68,32,50,57,50,32,85,78,73,67,79,68,69,32,50,55,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,51,34,32,73,68,32,50,57,51,32,85,78,73,67,79,68,69,32,50,56,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,52,34,32,73,68,32,50,57,52,32,85,78,73,67,79,68,69,32,50,56,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,53,34,32,73,68,32,50,57,53,32,85,78,73,67,79,68,69,32,50,56,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,54,34,32,73,68,32,50,57,54,32,85,78,73,67,79,68,69,32,50,56,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,55,34,32,73,68,32,50,57,55,32,85,78,73,67,79,68,69,32,50,56,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,56,34,32,73,68,32,50,57,56,32,85,78,73,67,79,68,69,32,50,56,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,57,34,32,73,68,32,50,57,57,32,85,78,73,67,79,68,69,32,50,57,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,48,34,32,73,68,32,51,48,48,32,85,78,73,67,79,68,69,32,50,57,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,49,34,32,73,68,32,51,48,49,32,85,78,73,67,79,68,69,32,50,57,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,50,34,32,73,68,32,51,48,50,32,85,78,73,67,79,68,69,32,50,57,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,51,34,32,73,68,32,51,48,51,32,85,78,73,67,79,68,69,32,50,57,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,52,34,32,73,68,32,51,48,52,32,85,78,73,67,79,68,69,32,50,57,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,53,34,32,73,68,32,51,48,53,32,85,78,73,67,79,68,69,32,50,57,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,54,34,32,73,68,32,51,48,54,32,85,78,73,67,79,68,69,32,50,57,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,55,34,32,73,68,32,51,48,55,32,85,78,73,67,79,68,69,32,50,57,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,56,34,32,73,68,32,51,48,56,32,85,78,73,67,79,68,69,32,50,57,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,57,34,32,73,68,32,51,48,57,32,85,78,73,67,79,68,69,32,51,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,48,34,32,73,68,32,51,49,48,32,85,78,73,67,79,68,69,32,51,48,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,49,34,32,73,68,32,51,49,49,32,85,78,73,67,79,68,69,32,51,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,50,34,32,73,68,32,51,49,50,32,85,78,73,67,79,68,69,32,51,48,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,51,34,32,73,68,32,51,49,51,32,85,78,73,67,79,68,69,32,51,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,52,34,32,73,68,32,51,49,52,32,85,78,73,67,79,68,69,32,51,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,53,34,32,73,68,32,51,49,53,32,85,78,73,67,79,68,69,32,51,48,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,54,34,32,73,68,32,51,49,54,32,85,78,73,67,79,68,69,32,51,48,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,55,34,32,73,68,32,51,49,55,32,85,78,73,67,79,68,69,32,51,48,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,56,34,32,73,68,32,51,49,56,32,85,78,73,67,79,68,69,32,51,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,57,34,32,73,68,32,51,49,57,32,85,78,73,67,79,68,69,32,51,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,48,34,32,73,68,32,51,50,48,32,85,78,73,67,79,68,69,32,51,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,49,34,32,73,68,32,51,50,49,32,85,78,73,67,79,68,69,32,51,49,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,50,34,32,73,68,32,51,50,50,32,85,78,73,67,79,68,69,32,51,49,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,51,34,32,73,68,32,51,50,51,32,85,78,73,67,79,68,69,32,51,49,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,52,34,32,73,68,32,51,50,52,32,85,78,73,67,79,68,69,32,51,49,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,53,34,32,73,68,32,51,50,53,32,85,78,73,67,79,68,69,32,51,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,54,34,32,73,68,32,51,50,54,32,85,78,73,67,79,68,69,32,51,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,55,34,32,73,68,32,51,50,55,32,85,78,73,67,79,68,69,32,51,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,56,34,32,73,68,32,51,50,56,32,85,78,73,67,79,68,69,32,51,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,57,34,32,73,68,32,51,50,57,32,85,78,73,67,79,68,69,32,51,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,48,34,32,73,68,32,51,51,48,32,85,78,73,67,79,68,69,32,51,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,49,34,32,73,68,32,51,51,49,32,85,78,73,67,79,68,69,32,51,50,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,50,34,32,73,68,32,51,51,50,32,85,78,73,67,79,68,69,32,51,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,51,34,32,73,68,32,51,51,51,32,85,78,73,67,79,68,69,32,51,51,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,52,34,32,73,68,32,51,51,52,32,85,78,73,67,79,68,69,32,51,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,53,34,32,73,68,32,51,51,53,32,85,78,73,67,79,68,69,32,51,51,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,54,34,32,73,68,32,51,51,54,32,85,78,73,67,79,68,69,32,51,51,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,55,34,32,73,68,32,51,51,55,32,85,78,73,67,79,68,69,32,51,51,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,56,34,32,73,68,32,51,51,56,32,85,78,73,67,79,68,69,32,51,51,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,57,34,32,73,68,32,51,51,57,32,85,78,73,67,79,68,69,32,51,51,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,48,34,32,73,68,32,51,52,48,32,85,78,73,67,79,68,69,32,51,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,49,34,32,73,68,32,51,52,49,32,85,78,73,67,79,68,69,32,51,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,50,34,32,73,68,32,51,52,50,32,85,78,73,67,79,68,69,32,51,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,51,34,32,73,68,32,51,52,51,32,85,78,73,67,79,68,69,32,51,52,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,52,34,32,73,68,32,51,52,52,32,85,78,73,67,79,68,69,32,51,52,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,53,34,32,73,68,32,51,52,53,32,85,78,73,67,79,68,69,32,51,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,54,34,32,73,68,32,51,52,54,32,85,78,73,67,79,68,69,32,51,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,55,34,32,73,68,32,51,52,55,32,85,78,73,67,79,68,69,32,51,53,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,56,34,32,73,68,32,51,52,56,32,85,78,73,67,79,68,69,32,53,51,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,57,34,32,73,68,32,51,52,57,32,85,78,73,67,79,68,69,32,53,51,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,48,34,32,73,68,32,51,53,48,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,49,54,50,44,85,43,48,50,49,65,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,49,34,32,73,68,32,51,53,49,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,49,54,51,44,85,43,48,50,49,66,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,50,34,32,73,68,32,51,53,50,32,85,78,73,67,79,68,69,32,51,53,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,51,34,32,73,68,32,51,53,51,32,85,78,73,67,79,68,69,32,51,53,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,52,34,32,73,68,32,51,53,52,32,85,78,73,67,79,68,69,32,51,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,53,34,32,73,68,32,51,53,53,32,85,78,73,67,79,68,69,32,51,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,54,34,32,73,68,32,51,53,54,32,85,78,73,67,79,68,69,32,51,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,55,34,32,73,68,32,51,53,55,32,85,78,73,67,79,68,69,32,51,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,56,34,32,73,68,32,51,53,56,32,85,78,73,67,79,68,69,32,51,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,57,34,32,73,68,32,51,53,57,32,85,78,73,67,79,68,69,32,51,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,48,34,32,73,68,32,51,54,48,32,85,78,73,67,79,68,69,32,51,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,49,34,32,73,68,32,51,54,49,32,85,78,73,67,79,68,69,32,51,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,50,34,32,73,68,32,51,54,50,32,85,78,73,67,79,68,69,32,51,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,51,34,32,73,68,32,51,54,51,32,85,78,73,67,79,68,69,32,51,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,52,34,32,73,68,32,51,54,52,32,85,78,73,67,79,68,69,32,51,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,53,34,32,73,68,32,51,54,53,32,85,78,73,67,79,68,69,32,51,55,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,54,34,32,73,68,32,51,54,54,32,85,78,73,67,79,68,69,32,51,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,55,34,32,73,68,32,51,54,55,32,85,78,73,67,79,68,69,32,51,55,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,56,34,32,73,68,32,51,54,56,32,85,78,73,67,79,68,69,32,51,56,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,57,34,32,73,68,32,51,54,57,32,85,78,73,67,79,68,69,32,49,48,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,48,34,32,73,68,32,51,55,48,32,85,78,73,67,79,68,69,32,49,48,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,49,34,32,73,68,32,51,55,49,32,85,78,73,67,79,68,69,32,49,48,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,50,34,32,73,68,32,51,55,50,32,85,78,73,67,79,68,69,32,49,48,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,51,34,32,73,68,32,51,55,51,32,85,78,73,67,79,68,69,32,49,48,52,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,52,34,32,73,68,32,51,55,52,32,85,78,73,67,79,68,69,32,49,48,52,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,53,34,32,73,68,32,51,55,53,32,85,78,73,67,79,68,69,32,49,48,52,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,54,34,32,73,68,32,51,55,54,32,85,78,73,67,79,68,69,32,49,48,52,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,55,34,32,73,68,32,51,55,55,32,85,78,73,67,79,68,69,32,49,48,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,56,34,32,73,68,32,51,55,56,32,85,78,73,67,79,68,69,32,49,48,52,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,57,34,32,73,68,32,51,55,57,32,85,78,73,67,79,68,69,32,49,48,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,48,34,32,73,68,32,51,56,48,32,85,78,73,67,79,68,69,32,49,48,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,49,34,32,73,68,32,51,56,49,32,85,78,73,67,79,68,69,32,49,48,53,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,50,34,32,73,68,32,51,56,50,32,85,78,73,67,79,68,69,32,49,48,53,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,51,34,32,73,68,32,51,56,51,32,85,78,73,67,79,68,69,32,49,48,53,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,52,34,32,73,68,32,51,56,52,32,85,78,73,67,79,68,69,32,49,48,53,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,53,34,32,73,68,32,51,56,53,32,85,78,73,67,79,68,69,32,49,48,53,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,54,34,32,73,68,32,51,56,54,32,85,78,73,67,79,68,69,32,49,48,53,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,55,34,32,73,68,32,51,56,55,32,85,78,73,67,79,68,69,32,49,48,53,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,56,34,32,73,68,32,51,56,56,32,85,78,73,67,79,68,69,32,49,48,53,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,57,34,32,73,68,32,51,56,57,32,85,78,73,67,79,68,69,32,49,48,53,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,48,34,32,73,68,32,51,57,48,32,85,78,73,67,79,68,69,32,49,48,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,49,34,32,73,68,32,51,57,49,32,85,78,73,67,79,68,69,32,49,48,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,50,34,32,73,68,32,51,57,50,32,85,78,73,67,79,68,69,32,49,48,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,51,34,32,73,68,32,51,57,51,32,85,78,73,67,79,68,69,32,49,48,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,52,34,32,73,68,32,51,57,52,32,85,78,73,67,79,68,69,32,49,48,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,53,34,32,73,68,32,51,57,53,32,85,78,73,67,79,68,69,32,49,48,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,54,34,32,73,68,32,51,57,54,32,85,78,73,67,79,68,69,32,49,48,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,55,34,32,73,68,32,51,57,55,32,85,78,73,67,79,68,69,32,49,48,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,56,34,32,73,68,32,51,57,56,32,85,78,73,67,79,68,69,32,49,48,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,57,34,32,73,68,32,51,57,57,32,85,78,73,67,79,68,69,32,49,48,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,48,34,32,73,68,32,52,48,48,32,85,78,73,67,79,68,69,32,49,48,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,49,34,32,73,68,32,52,48,49,32,85,78,73,67,79,68,69,32,49,48,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,50,34,32,73,68,32,52,48,50,32,85,78,73,67,79,68,69,32,49,48,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,51,34,32,73,68,32,52,48,51,32,85,78,73,67,79,68,69,32,49,48,55,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,52,34,32,73,68,32,52,48,52,32,85,78,73,67,79,68,69,32,49,48,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,53,34,32,73,68,32,52,48,53,32,85,78,73,67,79,68,69,32,49,48,55,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,54,34,32,73,68,32,52,48,54,32,85,78,73,67,79,68,69,32,49,48,55,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,55,34,32,73,68,32,52,48,55,32,85,78,73,67,79,68,69,32,49,48,55,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,56,34,32,73,68,32,52,48,56,32,85,78,73,67,79,68,69,32,49,48,55,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,57,34,32,73,68,32,52,48,57,32,85,78,73,67,79,68,69,32,49,48,55,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,48,34,32,73,68,32,52,49,48,32,85,78,73,67,79,68,69,32,49,48,56,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,49,34,32,73,68,32,52,49,49,32,85,78,73,67,79,68,69,32,49,48,56,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,50,34,32,73,68,32,52,49,50,32,85,78,73,67,79,68,69,32,49,48,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,51,34,32,73,68,32,52,49,51,32,85,78,73,67,79,68,69,32,49,48,56,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,52,34,32,73,68,32,52,49,52,32,85,78,73,67,79,68,69,32,49,48,56,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,53,34,32,73,68,32,52,49,53,32,85,78,73,67,79,68,69,32,49,48,56,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,54,34,32,73,68,32,52,49,54,32,85,78,73,67,79,68,69,32,49,48,56,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,55,34,32,73,68,32,52,49,55,32,85,78,73,67,79,68,69,32,49,48,56,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,56,34,32,73,68,32,52,49,56,32,85,78,73,67,79,68,69,32,49,48,56,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,57,34,32,73,68,32,52,49,57,32,85,78,73,67,79,68,69,32,49,48,56,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,48,34,32,73,68,32,52,50,48,32,85,78,73,67,79,68,69,32,49,48,57,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,49,34,32,73,68,32,52,50,49,32,85,78,73,67,79,68,69,32,49,48,57,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,50,34,32,73,68,32,52,50,50,32,85,78,73,67,79,68,69,32,49,48,57,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,51,34,32,73,68,32,52,50,51,32,85,78,73,67,79,68,69,32,49,48,57,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,52,34,32,73,68,32,52,50,52,32,85,78,73,67,79,68,69,32,49,48,57,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,53,34,32,73,68,32,52,50,53,32,85,78,73,67,79,68,69,32,49,48,57,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,54,34,32,73,68,32,52,50,54,32,85,78,73,67,79,68,69,32,49,48,57,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,55,34,32,73,68,32,52,50,55,32,85,78,73,67,79,68,69,32,49,48,57,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,56,34,32,73,68,32,52,50,56,32,85,78,73,67,79,68,69,32,49,48,57,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,57,34,32,73,68,32,52,50,57,32,85,78,73,67,79,68,69,32,49,48,57,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,48,34,32,73,68,32,52,51,48,32,85,78,73,67,79,68,69,32,49,49,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,49,34,32,73,68,32,52,51,49,32,85,78,73,67,79,68,69,32,49,49,48,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,50,34,32,73,68,32,52,51,50,32,85,78,73,67,79,68,69,32,49,49,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,51,34,32,73,68,32,52,51,51,32,85,78,73,67,79,68,69,32,49,49,48,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,52,34,32,73,68,32,52,51,52,32,85,78,73,67,79,68,69,32,49,49,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,53,34,32,73,68,32,52,51,53,32,85,78,73,67,79,68,69,32,56,57,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,54,34,32,73,68,32,52,51,54,32,85,78,73,67,79,68,69,32,57,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,55,34,32,73,68,32,52,51,55,32,85,78,73,67,79,68,69,32,57,48,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,56,34,32,73,68,32,52,51,56,32,85,78,73,67,79,68,69,32,57,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,57,34,32,73,68,32,52,51,57,32,85,78,73,67,79,68,69,32,57,48,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,48,34,32,73,68,32,52,52,48,32,85,78,73,67,79,68,69,32,57,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,49,34,32,73,68,32,52,52,49,32,85,78,73,67,79,68,69,32,57,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,50,34,32,73,68,32,52,52,50,32,85,78,73,67,79,68,69,32,57,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,51,34,32,73,68,32,52,52,51,32,85,78,73,67,79,68,69,32,57,48,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,52,34,32,73,68,32,52,52,52,32,85,78,73,67,79,68,69,32,57,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,53,34,32,73,68,32,52,52,53,32,85,78,73,67,79,68,69,32,57,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,54,34,32,73,68,32,52,52,54,32,85,78,73,67,79,68,69,32,57,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,55,34,32,73,68,32,52,52,55,32,85,78,73,67,79,68,69,32,57,49,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,56,34,32,73,68,32,52,52,56,32,85,78,73,67,79,68,69,32,57,49,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,57,34,32,73,68,32,52,52,57,32,85,78,73,67,79,68,69,32,57,49,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,48,34,32,73,68,32,52,53,48,32,85,78,73,67,79,68,69,32,57,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,49,34,32,73,68,32,52,53,49,32,85,78,73,67,79,68,69,32,57,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,50,34,32,73,68,32,52,53,50,32,85,78,73,67,79,68,69,32,57,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,51,34,32,73,68,32,52,53,51,32,85,78,73,67,79,68,69,32,57,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,52,34,32,73,68,32,52,53,52,32,85,78,73,67,79,68,69,32,57,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,53,34,32,73,68,32,52,53,53,32,85,78,73,67,79,68,69,32,57,50,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,54,34,32,73,68,32,52,53,54,32,85,78,73,67,79,68,69,32,57,50,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,55,34,32,73,68,32,52,53,55,32,85,78,73,67,79,68,69,32,57,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,56,34,32,73,68,32,52,53,56,32,85,78,73,67,79,68,69,32,57,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,57,34,32,73,68,32,52,53,57,32,85,78,73,67,79,68,69,32,57,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,48,34,32,73,68,32,52,54,48,32,85,78,73,67,79,68,69,32,57,50,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,49,34,32,73,68,32,52,54,49,32,85,78,73,67,79,68,69,32,57,50,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,50,34,32,73,68,32,52,54,50,32,85,78,73,67,79,68,69,32,57,50,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,51,34,32,73,68,32,52,54,51,32,85,78,73,67,79,68,69,32,57,51,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,52,34,32,73,68,32,52,54,52,32,85,78,73,67,79,68,69,32,57,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,53,34,32,73,68,32,52,54,53,32,85,78,73,67,79,68,69,32,57,51,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,54,34,32,73,68,32,52,54,54,32,85,78,73,67,79,68,69,32,57,51,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,55,34,32,73,68,32,52,54,55,32,85,78,73,67,79,68,69,32,57,51,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,56,34,32,73,68,32,52,54,56,32,85,78,73,67,79,68,69,32,57,51,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,57,34,32,73,68,32,52,54,57,32,85,78,73,67,79,68,69,32,57,51,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,48,34,32,73,68,32,52,55,48,32,85,78,73,67,79,68,69,32,57,51,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,49,34,32,73,68,32,52,55,49,32,85,78,73,67,79,68,69,32,57,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,50,34,32,73,68,32,52,55,50,32,85,78,73,67,79,68,69,32,57,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,51,34,32,73,68,32,52,55,51,32,85,78,73,67,79,68,69,32,57,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,52,34,32,73,68,32,52,55,52,32,85,78,73,67,79,68,69,32,57,52,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,53,34,32,73,68,32,52,55,53,32,85,78,73,67,79,68,69,32,57,52,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,54,34,32,73,68,32,52,55,54,32,85,78,73,67,79,68,69,32,57,52,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,55,34,32,73,68,32,52,55,55,32,85,78,73,67,79,68,69,32,57,52,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,56,34,32,73,68,32,52,55,56,32,85,78,73,67,79,68,69,32,57,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,57,34,32,73,68,32,52,55,57,32,85,78,73,67,79,68,69,32,57,52,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,48,34,32,73,68,32,52,56,48,32,85,78,73,67,79,68,69,32,57,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,49,34,32,73,68,32,52,56,49,32,85,78,73,67,79,68,69,32,57,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,50,34,32,73,68,32,52,56,50,32,85,78,73,67,79,68,69,32,57,53,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,51,34,32,73,68,32,52,56,51,32,85,78,73,67,79,68,69,32,57,53,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,52,34,32,73,68,32,52,56,52,32,85,78,73,67,79,68,69,32,57,53,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,53,34,32,73,68,32,52,56,53,32,85,78,73,67,79,68,69,32,57,53,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,54,34,32,73,68,32,52,56,54,32,85,78,73,67,79,68,69,32,57,53,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,55,34,32,73,68,32,52,56,55,32,85,78,73,67,79,68,69,32,57,53,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,56,34,32,73,68,32,52,56,56,32,85,78,73,67,79,68,69,32,57,53,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,57,34,32,73,68,32,52,56,57,32,85,78,73,67,79,68,69,32,57,53,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,48,34,32,73,68,32,52,57,48,32,85,78,73,67,79,68,69,32,57,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,49,34,32,73,68,32,52,57,49,32,85,78,73,67,79,68,69,32,57,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,50,34,32,73,68,32,52,57,50,32,85,78,73,67,79,68,69,32,57,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,51,34,32,73,68,32,52,57,51,32,85,78,73,67,79,68,69,32,57,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,52,34,32,73,68,32,52,57,52,32,85,78,73,67,79,68,69,32,57,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,53,34,32,73,68,32,52,57,53,32,85,78,73,67,79,68,69,32,57,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,54,34,32,73,68,32,52,57,54,32,85,78,73,67,79,68,69,32,57,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,55,34,32,73,68,32,52,57,55,32,85,78,73,67,79,68,69,32,57,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,56,34,32,73,68,32,52,57,56,32,85,78,73,67,79,68,69,32,57,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,57,34,32,73,68,32,52,57,57,32,85,78,73,67,79,68,69,32,57,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,48,34,32,73,68,32,53,48,48,32,85,78,73,67,79,68,69,32,57,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,49,34,32,73,68,32,53,48,49,32,85,78,73,67,79,68,69,32,57,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,50,34,32,73,68,32,53,48,50,32,85,78,73,67,79,68,69,32,57,55,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,51,34,32,73,68,32,53,48,51,32,85,78,73,67,79,68,69,32,57,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,52,34,32,73,68,32,53,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,53,34,32,73,68,32,53,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,54,34,32,73,68,32,53,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,55,34,32,73,68,32,53,48,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,56,34,32,73,68,32,53,48,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,57,34,32,73,68,32,53,48,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,48,34,32,73,68,32,53,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,49,34,32,73,68,32,53,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,50,34,32,73,68,32,53,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,51,34,32,73,68,32,53,49,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,52,34,32,73,68,32,53,49,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,53,34,32,73,68,32,53,49,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,54,34,32,73,68,32,53,49,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,55,34,32,73,68,32,53,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,56,34,32,73,68,32,53,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,57,34,32,73,68,32,53,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,48,34,32,73,68,32,53,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,49,34,32,73,68,32,53,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,50,34,32,73,68,32,53,50,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,51,34,32,73,68,32,53,50,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,52,34,32,73,68,32,53,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,53,34,32,73,68,32,53,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,54,34,32,73,68,32,53,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,55,34,32,73,68,32,53,50,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,56,34,32,73,68,32,53,50,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,57,34,32,73,68,32,53,50,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,51,48,34,32,73,68,32,53,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,51,49,34,32,73,68,32,53,51,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,51,50,34,32,73,68,32,53,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,83,67,82,73,80,84,32,78,65,77,69,32,34,76,97,116,105,110,34,32,84,65,71,32,34,108,97,116,110,34,13,13,68,69,70,95,76,65,78,71,83,89,83,32,78,65,77,69,32,34,68,101,102,97,117,108,116,34,32,84,65,71,32,34,100,102,108,116,34,13,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,79,108,100,115,116,121,108,101,32,70,105,103,117,114,101,115,34,32,84,65,71,32,34,111,110,117,109,34,13,32,76,79,79,75,85,80,32,34,79,108,100,115,116,121,108,101,32,70,105,103,117,114,101,115,34,13,69,78,68,95,70,69,65,84,85,82,69,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,83,116,97,110,100,97,114,100,32,76,105,103,97,116,117,114,101,115,34,32,84,65,71,32,34,108,105,103,97,34,13,32,76,79,79,75,85,80,32,34,83,116,97,110,100,97,114,116,32,76,105,103,97,116,117,114,101,115,34,13,69,78,68,95,70,69,65,84,85,82,69,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,83,116,121,108,105,115,116,105,99,32,65,108,116,101,114,110,97,116,101,115,34,32,84,65,71,32,34,115,97,108,116,34,13,32,76,79,79,75,85,80,32,34,65,108,116,32,103,34,32,76,79,79,75,85,80,32,34,65,108,116,32,107,34,13,69,78,68,95,70,69,65,84,85,82,69,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,83,116,121,108,105,115,116,105,99,32,83,101,116,32,49,34,32,84,65,71,32,34,115,115,48,49,34,13,32,76,79,79,75,85,80,32,34,65,108,116,32,103,34,13,69,78,68,95,70,69,65,84,85,82,69,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,83,116,121,108,105,115,116,105,99,32,83,101,116,32,50,34,32,84,65,71,32,34,115,115,48,50,34,13,32,76,79,79,75,85,80,32,34,65,108,116,32,107,34,13,69,78,68,95,70,69,65,84,85,82,69,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,83,116,121,108,105,115,116,105,99,32,83,101,116,32,51,34,32,84,65,71,32,34,115,115,48,51,34,13,32,76,79,79,75,85,80,32,34,67,97,112,105,116,97,108,32,223,34,13,69,78,68,95,70,69,65,84,85,82,69,13,69,78,68,95,76,65,78,71,83,89,83,13,69,78,68,95,83,67,82,73,80,84,13,68,69,70,95,76,79,79,75,85,80,32,34,83,116,97,110,100,97,114,116,32,76,105,103,97,116,117,114,101,115,34,32,80,82,79,67,69,83,83,95,66,65,83,69,32,80,82,79,67,69,83,83,95,77,65,82,75,83,32,65,76,76,32,68,73,82,69,67,84,73,79,78,32,76,84,82,13,73,78,95,67,79,78,84,69,88,84,13,69,78,68,95,67,79,78,84,69,88,84,13,65,83,95,83,85,66,83,84,73,84,85,84,73,79,78,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,54,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,50,51,56,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,54,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,52,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,50,51,57,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,53,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,55,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,55,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,55,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,56,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,54,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,57,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,54,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,48,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,53,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,49,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,53,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,50,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,56,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,51,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,56,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,52,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,54,34,13,69,78,68,95,83,85,66,13,69,78,68,95,83,85,66,83,84,73,84,85,84,73,79,78,13,68,69,70,95,76,79,79,75,85,80,32,34,79,108,100,115,116,121,108,101,32,70,105,103,117,114,101,115,34,32,80,82,79,67,69,83,83,95,66,65,83,69,32,80,82,79,67,69,83,83,95,77,65,82,75,83,32,65,76,76,32,68,73,82,69,67,84,73,79,78,32,76,84,82,13,73,78,95,67,79,78,84,69,88,84,13,69,78,68,95,67,79,78,84,69,88,84,13,65,83,95,83,85,66,83,84,73,84,85,84,73,79,78,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,49,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,53,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,48,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,54,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,49,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,55,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,50,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,56,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,51,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,57,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,52,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,48,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,53,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,49,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,54,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,50,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,55,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,51,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,56,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,52,34,13,69,78,68,95,83,85,66,13,69,78,68,95,83,85,66,83,84,73,84,85,84,73,79,78,13,68,69,70,95,76,79,79,75,85,80,32,34,65,108,116,32,103,34,32,80,82,79,67,69,83,83,95,66,65,83,69,32,80,82,79,67,69,83,83,95,77,65,82,75,83,32,65,76,76,32,68,73,82,69,67,84,73,79,78,32,76,84,82,13,73,78,95,67,79,78,84,69,88,84,13,69,78,68,95,67,79,78,84,69,88,84,13,65,83,95,83,85,66,83,84,73,84,85,84,73,79,78,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,52,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,53,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,57,52,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,54,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,57,54,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,55,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,57,56,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,56,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,51,48,48,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,57,34,13,69,78,68,95,83,85,66,13,69,78,68,95,83,85,66,83,84,73,84,85,84,73,79,78,13,68,69,70,95,76,79,79,75,85,80,32,34,65,108,116,32,107,34,32,80,82,79,67,69,83,83,95,66,65,83,69,32,80,82,79,67,69,83,83,95,77,65,82,75,83,32,65,76,76,32,68,73,82,69,67,84,73,79,78,32,76,84,82,13,73,78,95,67,79,78,84,69,88,84,13,69,78,68,95,67,79,78,84,69,88,84,13,65,83,95,83,85,66,83,84,73,84,85,84,73,79,78,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,56,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,51,48,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,51,49,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,51,49,34,13,69,78,68,95,83,85,66,13,69,78,68,95,83,85,66,83,84,73,84,85,84,73,79,78,13,68,69,70,95,76,79,79,75,85,80,32,34,67,97,112,105,116,97,108,32,223,34,32,80,82,79,67,69,83,83,95,66,65,83,69,32,80,82,79,67,69,83,83,95,77,65,82,75,83,32,65,76,76,32,68,73,82,69,67,84,73,79,78,32,76,84,82,13,73,78,95,67,79,78,84,69,88,84,13,69,78,68,95,67,79,78,84,69,88,84,13,65,83,95,83,85,66,83,84,73,84,85,84,73,79,78,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,49,51,55,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,51,50,34,13,69,78,68,95,83,85,66,13,69,78,68,95,83,85,66,83,84,73,84,85,84,73,79,78,13,71,82,73,68,95,80,80,69,77,32,50,48,13,80,82,69,83,69,78,84,65,84,73,79,78,95,80,80,69,77,32,55,50,13,80,80,79,83,73,84,73,79,78,73,78,71,95,80,80,69,77,32,49,52,52,13,67,77,65,80,95,70,79,82,77,65,84,32,49,32,48,32,52,13,67,77,65,80,95,70,79,82,77,65,84,32,51,32,49,32,52,32,69,78,68,13,13,0,0,0,0,0, \ No newline at end of file From 10934fd87b890221a413e481ff051212558bafd2 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 9 Jan 2020 19:46:22 +0100 Subject: [PATCH 166/192] SDK/CameraComponent: Fix SetProjectionScale implementation --- SDK/include/NDK/Components/CameraComponent.inl | 13 ++++++++++++- SDK/src/NDK/Components/CameraComponent.cpp | 12 ------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/SDK/include/NDK/Components/CameraComponent.inl b/SDK/include/NDK/Components/CameraComponent.inl index c8b9226f2..e059a68b1 100644 --- a/SDK/include/NDK/Components/CameraComponent.inl +++ b/SDK/include/NDK/Components/CameraComponent.inl @@ -161,12 +161,23 @@ namespace Ndk InvalidateProjectionMatrix(); } + /*! + * \brief Sets the camera projection scale + * + * \param scale New projection scale + */ + inline void CameraComponent::SetProjectionScale(const Nz::Vector3f& scale) + { + m_projectionScale = scale; + + InvalidateProjectionMatrix(); + } + /*! * \brief Sets the projection type of the camera * * \param projectionType Projection type of the camera */ - inline void CameraComponent::SetProjectionType(Nz::ProjectionType projectionType) { m_projectionType = projectionType; diff --git a/SDK/src/NDK/Components/CameraComponent.cpp b/SDK/src/NDK/Components/CameraComponent.cpp index 31dde3ae2..4a599ab9e 100644 --- a/SDK/src/NDK/Components/CameraComponent.cpp +++ b/SDK/src/NDK/Components/CameraComponent.cpp @@ -165,18 +165,6 @@ namespace Ndk m_entity->Invalidate(); // Invalidate the entity to make it passes through RenderSystem validation } - /*! - * \brief Sets the camera projection scale - * - * \param scale New projection scale - */ - inline void CameraComponent::SetProjectionScale(const Nz::Vector3f& scale) - { - m_projectionScale = scale; - - InvalidateProjectionMatrix(); - } - /*! * \brief Operation to perform when component is attached to an entity */ From db78c9c948203903d3e6abe9da5b48060d1d9e1e Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 9 Jan 2020 22:42:28 +0100 Subject: [PATCH 167/192] Renderer/Texture: Remove Image constructor --- ChangeLog.md | 1 + include/Nazara/Renderer/Texture.hpp | 1 - src/Nazara/Renderer/Texture.cpp | 6 ------ 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5777c2052..3dddfd311 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -217,6 +217,7 @@ Nazara Engine: - SegmentCollider2D: Add support for neighbors (aka "ghost vertices"), allowing to prevent seams collisions - ⚠ OBJLoader flips UV by default, fixing a lot of models UV - On Windows, Thread::Set(Current)Name now uses `SetThreadDescription` Win32 function if possible instead of triggering a debugger exception. MinGW builds will use this if available too. +- ⚠ Removed Texture(const Image\*) constructor, use Texture::LoadFromImage instead Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Renderer/Texture.hpp b/include/Nazara/Renderer/Texture.hpp index 6d33dcdd5..b4108f357 100644 --- a/include/Nazara/Renderer/Texture.hpp +++ b/include/Nazara/Renderer/Texture.hpp @@ -38,7 +38,6 @@ namespace Nz public: Texture() = default; Texture(ImageType type, PixelFormatType format, unsigned int width, unsigned int height, unsigned int depth = 1, UInt8 levelCount = 1); - explicit Texture(const Image* image); Texture(const Texture&) = delete; Texture(Texture&&) = delete; ~Texture(); diff --git a/src/Nazara/Renderer/Texture.cpp b/src/Nazara/Renderer/Texture.cpp index 483f60709..a03dc558a 100644 --- a/src/Nazara/Renderer/Texture.cpp +++ b/src/Nazara/Renderer/Texture.cpp @@ -54,12 +54,6 @@ namespace Nz Create(type, format, width, height, depth, levelCount); } - Texture::Texture(const Image* image) - { - ErrorFlags flags(ErrorFlag_ThrowException); - LoadFromImage(image); - } - Texture::~Texture() { OnTextureRelease(this); From d3ad92f063bb3963a97ce2f1bc2f06bd162511c8 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 18 Jan 2020 16:31:57 +0100 Subject: [PATCH 168/192] Update default font (Sansation => OpenSans) Sansation was too sci-fi... --- ChangeLog.md | 2 +- License-Cabin.txt | 95 --------- License-OpenSans.txt | 201 ++++++++++++++++++ src/Nazara/Utility/Font.cpp | 2 +- .../Resources/Fonts/OpenSans-Regular.ttf | Bin 0 -> 217360 bytes .../Resources/Fonts/OpenSans-Regular.ttf.h | 1 + .../Resources/Fonts/Sansation_Regular.ttf | Bin 78464 -> 0 bytes .../Resources/Fonts/Sansation_Regular.ttf.h | 1 - 8 files changed, 204 insertions(+), 98 deletions(-) delete mode 100644 License-Cabin.txt create mode 100644 License-OpenSans.txt create mode 100644 src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf create mode 100644 src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf.h delete mode 100644 src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf delete mode 100644 src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf.h diff --git a/ChangeLog.md b/ChangeLog.md index 3dddfd311..23ce656dd 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -21,7 +21,7 @@ Miscellaneous: - ⚠ Appveyor nightlies are now compiled with VS2017 - Set libraries' rpath to current folder (.) - Add ReleaseWithDebug target -- ⚠ **Default font has been changed from Cabin to Sansation** +- ⚠ **Default font has been changed from Cabin to OpenSans** Nazara Engine: - VertexMapper:GetComponentPtr no longer throw an error if component is disabled or incompatible with template type, instead a null pointer is returned. diff --git a/License-Cabin.txt b/License-Cabin.txt deleted file mode 100644 index ce98ff4b5..000000000 --- a/License-Cabin.txt +++ /dev/null @@ -1,95 +0,0 @@ -Copyright (c) 2011, Pablo Impallari (www.impallari.com|impallari@gmail.com), -Copyright (c) 2011, Igino Marini. (www.ikern.com|mail@iginomarini.com), -with Reserved Font Name Cabin. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/License-OpenSans.txt b/License-OpenSans.txt new file mode 100644 index 000000000..989e2c59e --- /dev/null +++ b/License-OpenSans.txt @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index 7526e71bf..a61311fb0 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -14,7 +14,7 @@ namespace Nz namespace { const UInt8 r_sansationRegular[] = { - #include + #include }; } diff --git a/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf b/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..db433349b7047f72f40072630c1bc110620bf09e GIT binary patch literal 217360 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 !}#gv~NV!5|5YF|kE)J0y^zWbk4>=%|6F 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 literal 0 HcmV?d00001 diff --git a/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf.h b/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf.h new file mode 100644 index 000000000..292846b19 --- /dev/null +++ b/src/Nazara/Utility/Resources/Fonts/OpenSans-Regular.ttf.h @@ -0,0 +1 @@ +0,1,0,0,0,19,1,0,0,4,0,48,68,83,73,71,158,18,68,29,0,3,59,156,0,0,21,116,71,68,69,70,0,38,3,175,0,3,55,124,0,0,0,30,71,80,79,83,11,55,15,55,0,3,55,156,0,0,0,56,71,83,85,66,14,43,61,183,0,3,55,212,0,0,3,198,79,83,47,50,161,62,158,201,0,0,1,184,0,0,0,96,99,109,97,112,41,171,47,104,0,0,16,180,0,0,4,26,99,118,116,32,15,77,24,164,0,0,29,144,0,0,0,162,102,112,103,109,126,97,182,17,0,0,20,208,0,0,7,180,103,97,115,112,0,21,0,35,0,3,55,108,0,0,0,16,103,108,121,102,116,56,153,75,0,0,37,140,0,1,47,180,104,101,97,100,247,118,226,166,0,0,1,60,0,0,0,54,104,104,101,97,13,204,9,115,0,0,1,116,0,0,0,36,104,109,116,120,232,53,60,221,0,0,2,24,0,0,14,154,107,101,114,110,84,43,9,126,0,1,85,64,0,1,182,54,108,111,99,97,41,20,220,241,0,0,30,52,0,0,7,86,109,97,120,112,5,67,2,10,0,0,1,152,0,0,0,32,110,97,109,101,115,176,136,133,0,3,11,120,0,0,5,199,112,111,115,116,2,67,239,108,0,3,17,64,0,0,38,43,112,114,101,112,67,183,150,164,0,0,28,132,0,0,1,9,0,1,0,0,0,1,25,154,33,199,245,95,95,15,60,245,0,9,8,0,0,0,0,0,201,53,49,139,0,0,0,0,201,232,76,76,251,154,253,213,9,162,8,98,0,0,0,9,0,2,0,0,0,0,0,0,0,1,0,0,8,141,253,168,0,0,9,172,251,154,254,123,9,162,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,163,0,1,0,0,3,170,0,138,0,22,0,86,0,5,0,2,0,16,0,47,0,92,0,0,1,14,0,248,0,3,0,1,0,3,4,182,1,144,0,5,0,8,5,154,5,51,0,0,1,31,5,154,5,51,0,0,3,209,0,102,1,241,8,2,2,11,6,6,3,5,4,2,2,4,224,0,2,239,64,0,32,91,0,0,0,40,0,0,0,0,49,65,83,67,0,64,0,32,255,253,6,31,254,20,0,132,8,141,2,88,32,0,1,159,0,0,0,0,4,72,5,182,0,0,0,32,0,3,4,205,0,193,0,0,0,0,4,20,0,0,2,20,0,0,2,35,0,152,3,53,0,133,5,43,0,51,4,147,0,131,6,150,0,104,5,215,0,113,1,197,0,133,2,94,0,82,2,94,0,61,4,106,0,86,4,147,0,104,1,246,0,63,2,147,0,84,2,33,0,152,2,240,0,20,4,147,0,102,4,147,0,188,4,147,0,100,4,147,0,94,4,147,0,43,4,147,0,133,4,147,0,117,4,147,0,94,4,147,0,104,4,147,0,106,2,33,0,152,2,33,0,63,4,147,0,104,4,147,0,119,4,147,0,104,3,111,0,27,7,49,0,121,5,16,0,0,5,47,0,201,5,12,0,125,5,213,0,201,4,115,0,201,4,33,0,201,5,211,0,125,5,231,0,201,2,170,0,84,2,35,255,96,4,233,0,201,4,39,0,201,7,57,0,201,6,8,0,201,6,59,0,125,4,209,0,201,6,59,0,125,4,242,0,201,4,100,0,106,4,109,0,18,5,211,0,186,4,195,0,0,7,104,0,27,4,158,0,8,4,123,0,0,4,145,0,82,2,162,0,166,2,240,0,23,2,162,0,51,4,86,0,49,3,150,255,252,4,158,1,137,4,115,0,94,4,231,0,176,3,207,0,115,4,231,0,115,4,125,0,115,2,182,0,29,4,98,0,39,4,233,0,176,2,6,0,162,2,6,255,145,4,51,0,176,2,6,0,176,7,113,0,176,4,233,0,176,4,213,0,115,4,231,0,176,4,231,0,115,3,68,0,176,3,209,0,106,2,211,0,31,4,233,0,164,4,2,0,0,6,57,0,23,4,49,0,39,4,8,0,2,3,190,0,82,3,8,0,61,4,104,1,238,3,8,0,72,4,147,0,104,2,20,0,0,2,35,0,152,4,147,0,190,4,147,0,63,4,147,0,123,4,147,0,31,4,104,1,238,4,33,0,123,4,158,1,53,6,168,0,100,2,213,0,70,3,250,0,82,4,147,0,104,2,147,0,84,6,168,0,100,4,0,255,250,3,109,0,127,4,147,0,104,2,199,0,49,2,199,0,33,4,158,1,137,4,244,0,176,5,61,0,113,2,33,0,152,1,209,0,37,2,199,0,76,3,0,0,66,3,250,0,80,6,61,0,75,6,61,0,46,6,61,0,26,3,111,0,51,5,16,0,0,5,16,0,0,5,16,0,0,5,16,0,0,5,16,0,0,5,16,0,0,6,252,255,254,5,12,0,125,4,115,0,201,4,115,0,201,4,115,0,201,4,115,0,201,2,170,0,60,2,170,0,84,2,170,255,255,2,170,0,60,5,199,0,47,6,8,0,201,6,59,0,125,6,59,0,125,6,59,0,125,6,59,0,125,6,59,0,125,4,147,0,133,6,59,0,125,5,211,0,186,5,211,0,186,5,211,0,186,5,211,0,186,4,123,0,0,4,227,0,201,4,250,0,176,4,115,0,94,4,115,0,94,4,115,0,94,4,115,0,94,4,115,0,94,4,115,0,94,6,221,0,94,3,207,0,115,4,125,0,115,4,125,0,115,4,125,0,115,4,125,0,115,2,6,255,218,2,6,0,169,2,6,255,179,2,6,255,236,4,197,0,113,4,233,0,176,4,213,0,115,4,213,0,115,4,213,0,115,4,213,0,115,4,213,0,115,4,147,0,104,4,213,0,115,4,233,0,164,4,233,0,164,4,233,0,164,4,233,0,164,4,8,0,2,4,231,0,176,4,8,0,2,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,12,0,125,3,207,0,115,5,12,0,125,3,207,0,115,5,12,0,125,3,207,0,115,5,12,0,125,3,207,0,115,5,213,0,201,4,231,0,115,5,199,0,47,4,231,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,5,211,0,125,4,98,0,39,5,211,0,125,4,98,0,39,5,211,0,125,4,98,0,39,5,211,0,125,4,98,0,39,5,231,0,201,4,233,0,176,5,231,0,0,4,233,0,20,2,170,255,226,2,6,255,144,2,170,0,42,2,6,255,218,2,170,0,30,2,6,255,204,2,170,0,84,2,6,0,53,2,170,0,84,2,6,0,176,4,205,0,84,4,12,0,162,2,35,255,96,2,6,255,145,4,233,0,201,4,51,0,176,4,37,0,176,4,39,0,201,2,6,0,163,4,39,0,201,2,6,0,89,4,39,0,201,2,6,0,176,4,39,0,201,2,131,0,176,4,47,0,29,2,23,255,252,6,8,0,201,4,233,0,176,6,8,0,201,4,233,0,176,6,8,0,201,4,233,0,176,5,115,0,1,6,8,0,201,4,233,0,176,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,7,98,0,125,7,137,0,113,4,242,0,201,3,68,0,176,4,242,0,201,3,68,0,96,4,242,0,201,3,68,0,130,4,100,0,106,3,209,0,106,4,100,0,106,3,209,0,106,4,100,0,106,3,209,0,106,4,100,0,106,3,209,0,106,4,109,0,18,2,211,0,31,4,109,0,18,2,211,0,31,4,109,0,18,2,211,0,31,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,7,104,0,27,6,57,0,23,4,123,0,0,4,8,0,2,4,123,0,0,4,145,0,82,3,190,0,82,4,145,0,82,3,190,0,82,4,145,0,82,3,190,0,82,2,143,0,176,4,158,0,195,5,20,0,0,4,115,0,94,6,252,255,254,6,221,0,94,6,59,0,125,4,213,0,115,4,100,0,106,3,209,0,106,4,188,1,12,4,188,1,12,4,178,1,45,4,188,1,37,2,6,0,162,4,158,1,111,1,147,0,37,4,188,1,8,4,158,0,231,4,158,1,252,4,158,1,27,5,16,0,0,2,33,0,152,4,242,255,212,6,125,255,212,3,152,255,228,6,129,255,228,5,133,255,212,6,129,255,228,2,182,255,233,5,16,0,0,5,47,0,201,4,41,0,201,4,147,0,39,4,115,0,201,4,145,0,82,5,231,0,201,6,59,0,125,2,170,0,84,4,233,0,201,4,211,0,0,7,57,0,201,6,8,0,201,4,109,0,72,6,59,0,125,5,213,0,201,4,209,0,201,4,137,0,74,4,109,0,18,4,123,0,0,6,98,0,106,4,158,0,8,6,94,0,109,6,66,0,80,2,170,0,60,4,123,0,0,4,227,0,115,3,205,0,90,4,233,0,176,2,182,0,168,4,223,0,164,4,227,0,115,5,6,0,176,4,25,0,10,4,164,0,113,3,205,0,90,3,221,0,115,4,233,0,176,4,188,0,115,2,182,0,168,4,37,0,176,4,70,255,242,4,244,0,176,4,86,0,0,3,205,0,113,4,213,0,115,5,51,0,25,4,213,0,166,3,219,0,115,4,231,0,115,3,201,0,18,4,223,0,164,5,190,0,115,4,94,255,236,6,6,0,164,6,47,0,115,2,182,0,9,4,223,0,164,4,213,0,115,4,223,0,164,6,47,0,115,4,115,0,201,5,223,0,18,4,41,0,201,5,29,0,125,4,100,0,106,2,170,0,84,2,170,0,60,2,35,255,96,7,111,0,0,7,160,0,201,5,223,0,18,4,229,0,201,4,248,0,27,5,213,0,201,5,16,0,0,4,231,0,201,5,47,0,201,4,41,0,201,5,119,0,14,4,115,0,201,6,193,0,2,4,166,0,74,6,25,0,203,6,25,0,203,4,229,0,201,5,162,0,0,7,57,0,201,5,231,0,201,6,59,0,125,5,213,0,201,4,209,0,201,5,12,0,125,4,109,0,18,4,248,0,27,6,98,0,106,4,158,0,8,5,229,0,201,5,143,0,170,8,66,0,201,8,68,0,201,5,129,0,18,6,211,0,201,5,37,0,201,5,10,0,61,8,102,0,201,5,23,0,51,4,115,0,94,4,197,0,119,4,141,0,176,3,109,0,176,4,147,0,41,4,125,0,115,5,227,0,4,3,221,0,68,5,18,0,176,5,18,0,176,4,39,0,176,4,145,0,16,5,225,0,176,5,18,0,176,4,213,0,115,4,248,0,176,4,231,0,176,3,207,0,115,3,188,0,41,4,8,0,2,5,184,0,113,4,49,0,39,5,2,0,176,4,221,0,156,7,31,0,176,7,45,0,176,5,143,0,41,6,41,0,176,4,188,0,176,3,240,0,57,6,166,0,176,4,113,0,37,4,125,0,115,4,233,0,20,3,109,0,176,3,240,0,115,3,209,0,106,2,6,0,162,2,6,255,236,2,6,255,145,6,178,0,16,7,23,0,176,4,233,0,20,4,39,0,176,4,8,0,2,4,248,0,176,4,55,0,201,3,109,0,176,7,104,0,27,6,57,0,23,7,104,0,27,6,57,0,23,7,104,0,27,6,57,0,23,4,123,0,0,4,8,0,2,4,0,0,82,8,0,0,82,8,0,0,82,3,74,255,252,1,92,0,25,1,92,0,25,1,246,0,63,1,92,0,25,2,205,0,25,2,205,0,25,3,61,0,25,4,4,0,123,4,20,0,123,3,2,0,164,6,70,0,152,9,158,0,100,1,197,0,133,3,37,0,133,2,111,0,82,2,111,0,80,3,227,0,152,1,10,254,121,3,39,0,109,4,147,0,98,4,147,0,68,6,27,0,154,4,184,0,63,6,152,0,141,4,41,0,119,8,39,0,201,6,53,0,37,6,66,0,80,4,244,0,102,6,61,0,71,6,61,0,32,6,61,0,71,6,61,0,106,4,166,0,102,4,147,0,39,5,233,0,201,5,12,0,76,4,147,0,104,4,100,0,37,5,164,0,119,3,18,0,12,4,147,0,98,4,147,0,104,4,147,0,104,4,147,0,104,4,170,0,111,4,188,0,29,4,188,0,29,4,158,0,219,2,6,255,145,4,0,1,137,4,0,1,113,4,0,1,129,2,199,0,39,2,199,0,20,2,199,0,59,2,199,0,41,2,199,0,57,2,199,0,51,2,199,0,35,4,0,0,0,8,0,0,0,4,0,0,0,8,0,0,0,2,170,0,0,2,0,0,0,1,86,0,0,4,121,0,0,2,33,0,0,1,154,0,0,0,205,0,0,0,0,0,0,0,0,0,0,8,0,0,84,8,0,0,84,2,6,255,145,1,92,0,25,4,250,0,10,4,133,0,0,6,184,0,18,7,57,0,201,7,113,0,176,5,16,0,0,4,115,0,94,6,82,254,223,2,170,0,117,3,51,0,152,7,117,0,29,7,117,0,29,6,61,0,125,4,223,0,115,6,37,0,186,5,82,0,164,0,0,252,83,0,0,253,13,0,0,252,25,0,0,253,8,0,0,253,59,4,115,0,201,6,25,0,203,4,125,0,115,5,18,0,176,8,23,0,133,6,141,0,0,5,102,0,23,5,14,0,23,7,90,0,201,5,227,0,176,5,109,0,0,4,131,0,10,7,94,0,201,6,33,0,176,5,197,0,20,5,35,0,12,7,203,0,201,6,197,0,176,4,168,0,63,3,221,0,25,6,94,0,109,6,6,0,164,6,61,0,125,4,213,0,115,5,2,0,0,4,12,0,0,5,2,0,0,4,12,0,0,9,172,0,125,8,125,0,115,6,141,0,125,5,66,0,115,7,254,0,125,6,119,0,115,7,223,0,94,6,141,0,0,5,29,0,125,3,231,0,115,4,223,0,106,4,117,0,203,4,158,0,248,4,158,1,223,4,158,1,225,7,233,0,41,7,166,0,41,6,41,0,201,5,37,0,176,4,231,0,47,4,188,0,20,4,227,0,201,4,231,0,176,4,55,0,47,3,109,0,18,5,35,0,201,4,51,0,176,7,31,0,2,6,61,0,4,4,166,0,74,3,221,0,68,5,74,0,201,4,92,0,176,4,233,0,201,4,68,0,176,4,233,0,47,4,35,0,20,5,131,0,16,4,236,0,41,5,248,0,201,5,47,0,176,6,129,0,201,5,227,0,176,8,137,0,201,6,236,0,176,6,59,0,125,5,31,0,115,5,12,0,125,3,207,0,115,4,109,0,16,3,188,0,41,4,123,0,0,4,2,0,0,4,123,0,0,4,2,0,0,4,244,0,8,4,86,0,39,6,215,0,16,5,188,0,41,5,137,0,170,4,223,0,156,5,143,0,170,4,205,0,156,5,143,0,201,4,174,0,176,6,180,0,61,5,70,0,51,6,180,0,61,5,70,0,51,2,170,0,84,6,193,0,2,5,227,0,4,5,131,0,201,4,100,0,176,5,166,0,0,4,147,0,16,5,209,0,201,4,238,0,176,5,246,0,201,5,57,0,176,5,143,0,170,4,221,0,156,7,59,0,201,5,227,0,176,2,170,0,84,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,6,252,255,254,6,221,0,94,4,115,0,201,4,125,0,115,5,215,0,117,4,121,0,102,5,215,0,117,4,121,0,102,6,193,0,2,5,227,0,4,4,166,0,74,3,221,0,68,4,170,0,74,3,233,0,27,6,25,0,203,5,18,0,176,6,25,0,203,5,18,0,176,6,59,0,125,4,213,0,115,6,61,0,125,4,213,0,115,6,61,0,125,4,213,0,115,5,10,0,61,3,240,0,57,4,248,0,27,4,8,0,2,4,248,0,27,4,8,0,2,4,248,0,27,4,8,0,2,5,143,0,170,4,221,0,156,4,55,0,201,3,109,0,176,6,211,0,201,6,41,0,176,4,55,0,47,3,109,0,18,4,248,0,8,4,82,0,39,4,158,0,6,4,49,0,39,4,231,0,131,4,231,0,115,7,49,0,131,7,43,0,115,7,59,0,78,6,106,0,80,5,0,0,78,4,47,0,80,7,217,0,0,6,207,0,16,8,25,0,201,7,78,0,176,6,12,0,125,5,31,0,115,5,174,0,16,5,45,0,41,4,170,0,111,3,205,0,90,5,154,0,0,4,145,0,16,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,45,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,5,16,0,0,4,115,0,94,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,93,4,125,0,74,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,4,115,0,201,4,125,0,115,2,170,0,84,2,6,0,123,2,170,0,84,2,6,0,157,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,97,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,6,59,0,125,4,213,0,115,6,61,0,125,4,223,0,115,6,61,0,125,4,223,0,115,6,61,0,125,4,223,0,115,6,61,0,125,4,223,0,115,6,61,0,125,4,223,0,115,5,211,0,186,4,233,0,164,5,211,0,186,4,233,0,164,6,37,0,186,5,82,0,164,6,37,0,186,5,82,0,164,6,37,0,186,5,82,0,164,6,37,0,186,5,82,0,164,6,37,0,186,5,82,0,164,4,123,0,0,4,8,0,2,4,123,0,0,4,8,0,2,4,123,0,0,4,8,0,2,4,231,0,115,0,0,251,229,0,0,252,113,0,0,251,154,0,0,252,113,0,0,252,104,0,0,252,121,0,0,252,121,0,0,252,121,0,0,252,104,1,164,0,49,1,164,0,25,1,164,0,25,3,45,0,52,4,137,0,115,2,244,0,45,4,20,0,41,4,147,0,94,4,143,0,23,4,147,0,133,4,147,0,117,4,147,0,94,4,147,0,104,4,147,0,106,5,109,0,29,6,90,0,92,4,109,0,18,2,211,0,31,4,231,0,113,4,231,0,113,4,231,0,113,4,231,0,113,4,231,0,113,2,59,0,201,2,59,0,5,2,59,0,179,2,59,255,199,2,59,0,5,2,59,255,171,2,59,255,243,2,59,255,231,2,59,0,86,2,59,0,187,4,94,0,201,2,229,255,228,2,59,0,201,0,5,0,201,0,5,0,201,0,201,0,153,0,184,0,0,0,0,0,1,0,3,0,1,0,0,0,12,0,4,4,14,0,0,0,176,0,128,0,6,0,48,0,72,0,73,0,126,0,203,0,207,1,39,1,50,1,97,1,127,1,146,1,161,1,176,1,240,1,255,2,27,2,55,2,188,2,199,2,201,2,221,2,243,3,1,3,3,3,9,3,15,3,35,3,138,3,140,3,161,3,170,3,206,3,210,3,214,4,13,4,79,4,95,4,134,4,145,4,191,4,207,5,19,30,1,30,63,30,133,30,199,30,202,30,241,30,249,31,77,32,11,32,21,32,30,32,34,32,38,32,48,32,51,32,58,32,60,32,68,32,112,32,121,32,127,32,164,32,167,32,172,33,5,33,19,33,22,33,32,33,34,33,38,33,46,33,94,34,2,34,6,34,15,34,18,34,26,34,30,34,43,34,72,34,96,34,101,37,202,251,4,254,255,255,253,255,255,0,0,0,32,0,73,0,74,0,160,0,204,0,208,1,40,1,51,1,98,1,146,1,160,1,175,1,240,1,250,2,24,2,55,2,188,2,198,2,201,2,216,2,243,3,0,3,3,3,9,3,15,3,35,3,132,3,140,3,142,3,163,3,171,3,209,3,214,4,0,4,14,4,80,4,96,4,136,4,146,4,192,4,208,30,0,30,62,30,128,30,160,30,200,30,203,30,242,31,77,32,0,32,19,32,23,32,32,32,38,32,48,32,50,32,57,32,60,32,68,32,112,32,116,32,127,32,163,32,167,32,171,33,5,33,19,33,22,33,32,33,34,33,38,33,46,33,91,34,2,34,6,34,15,34,17,34,26,34,30,34,43,34,72,34,96,34,100,37,202,251,0,254,255,255,252,255,255,255,227,0,0,255,227,255,194,0,0,255,194,0,0,255,194,0,0,255,176,0,191,0,178,0,97,255,73,0,0,0,0,255,150,254,133,254,132,254,118,255,104,255,99,255,98,255,93,0,103,255,68,0,0,253,207,0,0,0,0,253,205,254,130,254,127,0,0,253,154,0,0,254,12,0,0,254,9,0,0,254,9,228,88,228,24,227,122,228,125,0,0,228,125,0,0,227,13,226,66,225,239,225,238,225,237,225,234,225,225,225,224,225,219,225,218,225,211,225,203,225,200,225,153,225,118,225,116,0,0,225,24,225,11,225,9,226,110,224,254,224,251,224,244,224,200,224,37,224,34,224,26,224,25,224,18,224,15,224,3,223,231,223,208,223,205,220,105,0,0,3,79,2,83,0,1,0,0,0,174,0,0,0,0,0,170,0,0,0,174,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,234,1,16,0,0,0,0,0,0,1,24,0,0,1,48,0,0,1,76,0,0,1,92,0,0,0,0,0,0,0,0,0,0,1,112,0,0,1,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,60,0,0,0,0,0,0,3,150,3,151,3,152,3,153,3,154,3,155,0,235,3,156,0,237,3,157,0,239,3,158,0,241,3,159,0,243,3,160,3,143,3,144,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,1,73,1,74,1,36,1,37,1,84,1,85,1,86,1,87,1,88,1,89,3,161,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,3,162,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,1,113,1,114,1,115,1,116,1,117,1,118,3,163,2,104,1,156,1,157,1,158,1,159,1,160,3,164,3,165,1,163,1,164,1,165,1,166,1,167,2,105,2,106,1,234,1,235,1,236,1,237,1,238,1,239,1,240,1,241,1,242,1,243,1,244,1,245,2,107,1,246,1,247,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,1,248,1,249,3,166,2,202,2,203,2,204,2,205,2,206,2,207,2,208,2,209,2,210,2,211,2,212,2,213,2,214,2,215,3,167,3,168,3,70,3,169,2,0,2,1,3,111,3,112,3,113,3,114,3,115,3,116,3,117,2,28,3,141,2,52,2,53,2,93,2,94,0,0,64,71,91,90,89,88,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,49,48,47,46,45,44,40,39,38,37,36,35,34,33,31,24,20,17,16,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,44,32,176,1,96,69,176,3,37,32,17,70,97,35,69,35,97,72,45,44,32,69,24,104,68,45,44,69,35,70,96,176,32,97,32,176,70,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,32,96,32,176,38,97,176,32,97,176,4,38,35,72,72,45,44,69,35,70,96,176,64,97,32,176,102,96,176,4,38,35,72,72,45,44,69,35,70,35,97,176,64,96,32,176,38,97,176,64,97,176,4,38,35,72,72,45,44,1,16,32,60,0,60,45,44,32,69,35,32,176,205,68,35,32,184,1,90,81,88,35,32,176,141,68,35,89,32,176,237,81,88,35,32,176,77,68,35,89,32,176,4,38,81,88,35,32,176,13,68,35,89,33,33,45,44,32,32,69,24,104,68,32,176,1,96,32,69,176,70,118,104,138,69,96,68,45,44,1,177,11,10,67,35,67,101,10,45,44,0,177,10,11,67,35,67,11,45,44,0,176,40,35,112,177,1,40,62,1,176,40,35,112,177,2,40,69,58,177,2,0,8,13,45,44,32,69,176,3,37,69,97,100,176,80,81,88,69,68,27,33,33,89,45,44,73,176,14,35,68,45,44,32,69,176,0,67,96,68,45,44,1,176,6,67,176,7,67,101,10,45,44,32,105,176,64,97,176,0,139,32,177,44,192,138,140,184,16,0,98,96,43,12,100,35,100,97,92,88,176,3,97,89,45,44,138,3,69,138,138,135,176,17,43,176,41,35,68,176,41,122,228,24,45,44,69,101,176,44,35,68,69,176,43,35,68,45,44,75,82,88,69,68,27,33,33,89,45,44,75,81,88,69,68,27,33,33,89,45,44,1,176,5,37,16,35,32,138,245,0,176,1,96,35,237,236,45,44,1,176,5,37,16,35,32,138,245,0,176,1,97,35,237,236,45,44,1,176,6,37,16,245,0,237,236,45,44,176,2,67,176,1,82,88,33,33,33,33,33,27,70,35,70,96,138,138,70,35,32,70,138,96,138,97,184,255,128,98,35,32,16,35,138,177,12,12,138,112,69,96,32,176,0,80,88,176,1,97,184,255,186,139,27,176,70,140,89,176,16,96,104,1,58,89,45,44,32,69,176,3,37,70,82,75,176,19,81,91,88,176,2,37,70,32,104,97,176,3,37,176,3,37,63,35,33,56,27,33,17,89,45,44,32,69,176,3,37,70,80,88,176,2,37,70,32,104,97,176,3,37,176,3,37,63,35,33,56,27,33,17,89,45,44,0,176,7,67,176,6,67,11,45,44,33,33,12,100,35,100,139,184,64,0,98,45,44,33,176,128,81,88,12,100,35,100,139,184,32,0,98,27,178,0,64,47,43,89,176,2,96,45,44,33,176,192,81,88,12,100,35,100,139,184,21,85,98,27,178,0,128,47,43,89,176,2,96,45,44,12,100,35,100,139,184,64,0,98,96,35,33,45,44,75,83,88,138,176,4,37,73,100,35,69,105,176,64,139,97,176,128,98,176,32,97,106,176,14,35,68,35,16,176,14,246,27,33,35,138,18,17,32,57,47,89,45,44,75,83,88,32,176,3,37,73,100,105,32,176,5,38,176,6,37,73,100,35,97,176,128,98,176,32,97,106,176,14,35,68,176,4,38,16,176,14,246,138,16,176,14,35,68,176,14,246,176,14,35,68,176,14,237,27,138,176,4,38,17,18,32,57,35,32,57,47,47,89,45,44,69,35,69,96,35,69,96,35,69,96,35,118,104,24,176,128,98,32,45,44,176,72,43,45,44,32,69,176,0,84,88,176,64,68,32,69,176,64,97,68,27,33,33,89,45,44,69,177,48,47,69,35,69,97,96,176,1,96,105,68,45,44,75,81,88,176,47,35,112,176,20,35,66,27,33,33,89,45,44,75,81,88,32,176,3,37,69,105,83,88,68,27,33,33,89,27,33,33,89,45,44,69,176,20,67,176,0,96,99,176,1,96,105,68,45,44,176,47,69,68,45,44,69,35,32,69,138,96,68,45,44,69,35,69,96,68,45,44,75,35,81,88,185,0,51,255,224,177,52,32,27,179,51,0,52,0,89,68,68,45,44,176,22,67,88,176,3,38,69,138,88,100,102,176,31,96,27,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,89,35,88,101,89,176,41,35,68,35,16,176,41,224,27,33,33,33,33,33,89,45,44,176,2,67,84,88,75,83,35,75,81,90,88,56,27,33,33,89,27,33,33,33,33,89,45,44,176,22,67,88,176,4,37,69,100,176,32,96,102,32,88,27,33,176,64,89,176,1,97,35,88,27,101,89,176,41,35,68,176,5,37,176,8,37,8,32,88,2,27,3,89,176,4,37,16,176,5,37,32,70,176,4,37,35,66,60,176,4,37,176,7,37,8,176,7,37,16,176,6,37,32,70,176,4,37,176,1,96,35,66,60,32,88,1,27,0,89,176,4,37,16,176,5,37,176,41,224,176,41,32,69,101,68,176,7,37,16,176,6,37,176,41,224,176,5,37,176,8,37,8,32,88,2,27,3,89,176,5,37,176,3,37,67,72,176,4,37,176,7,37,8,176,6,37,176,3,37,176,1,96,67,72,27,33,89,33,33,33,33,33,33,33,45,44,2,176,4,37,32,32,70,176,4,37,35,66,176,5,37,8,176,3,37,69,72,33,33,33,33,45,44,2,176,3,37,32,176,4,37,8,176,2,37,67,72,33,33,33,45,44,69,35,32,69,24,32,176,0,80,32,88,35,101,35,89,35,104,32,176,64,80,88,33,176,64,89,35,88,101,89,138,96,68,45,44,75,83,35,75,81,90,88,32,69,138,96,68,27,33,33,89,45,44,75,84,88,32,69,138,96,68,27,33,33,89,45,44,75,83,35,75,81,90,88,56,27,33,33,89,45,44,176,0,33,75,84,88,56,27,33,33,89,45,44,176,2,67,84,88,176,70,43,27,33,33,33,33,89,45,44,176,2,67,84,88,176,71,43,27,33,33,33,89,45,44,176,2,67,84,88,176,72,43,27,33,33,33,33,89,45,44,176,2,67,84,88,176,73,43,27,33,33,33,89,45,44,32,138,8,35,75,83,138,75,81,90,88,35,56,27,33,33,89,45,44,0,176,2,37,73,176,0,83,88,32,176,64,56,17,27,33,89,45,44,1,70,35,70,96,35,70,97,35,32,16,32,70,138,97,184,255,128,98,138,177,64,64,138,112,69,96,104,58,45,44,32,138,35,73,100,138,35,83,88,60,27,33,89,45,44,75,82,88,125,27,122,89,45,44,176,18,0,75,1,75,84,66,45,44,177,2,0,66,177,35,1,136,81,177,64,1,136,83,90,88,185,16,0,0,32,136,84,88,178,2,1,2,67,96,66,89,177,36,1,136,81,88,185,32,0,0,64,136,84,88,178,2,2,2,67,96,66,177,36,1,136,84,88,178,2,32,2,67,96,66,0,75,1,75,82,88,178,2,8,2,67,96,66,89,27,185,64,0,0,128,136,84,88,178,2,4,2,67,96,66,89,185,64,0,0,128,99,184,1,0,136,84,88,178,2,8,2,67,96,66,89,185,64,0,1,0,99,184,2,0,136,84,88,178,2,16,2,67,96,66,89,177,38,1,136,81,88,185,64,0,2,0,99,184,4,0,136,84,88,178,2,64,2,67,96,66,89,185,64,0,4,0,99,184,8,0,136,84,88,178,2,128,2,67,96,66,89,89,89,89,89,89,177,0,2,67,84,88,64,10,5,64,8,64,9,64,12,2,13,2,27,177,1,2,67,84,88,178,5,64,8,186,1,0,0,9,1,0,179,12,1,13,1,27,177,128,2,67,82,88,178,5,64,8,184,1,128,177,9,64,27,178,5,64,8,186,1,128,0,9,1,64,89,185,64,0,0,128,136,85,185,64,0,2,0,99,184,4,0,136,85,90,88,179,12,0,13,1,27,179,12,0,13,1,89,89,89,66,66,66,66,66,45,44,69,24,104,35,75,81,88,35,32,69,32,100,176,64,80,88,124,89,104,138,96,89,68,45,44,176,0,22,176,2,37,176,2,37,1,176,1,35,62,0,176,2,35,62,177,1,2,6,12,176,10,35,101,66,176,11,35,66,1,176,1,35,63,0,176,2,35,63,177,1,2,6,12,176,6,35,101,66,176,7,35,66,176,1,22,1,45,44,176,128,176,2,67,80,176,1,176,2,67,84,91,88,33,35,16,176,32,26,201,27,138,16,237,89,45,44,176,89,43,45,44,138,16,229,45,64,153,9,33,72,32,85,32,1,30,85,31,72,3,85,31,30,1,15,30,63,30,175,30,3,77,75,38,31,76,75,51,31,75,70,37,31,38,52,16,85,37,51,36,85,25,19,255,31,7,4,255,31,6,3,255,31,74,73,51,31,73,70,37,31,19,51,18,85,5,1,3,85,4,51,3,85,31,3,1,15,3,63,3,175,3,3,71,70,25,31,235,70,1,35,51,34,85,28,51,27,85,22,51,21,85,17,1,15,85,16,51,15,85,15,15,79,15,2,31,15,207,15,2,15,15,255,15,2,6,2,1,0,85,1,51,0,85,111,0,127,0,175,0,239,0,4,16,0,1,128,22,1,5,1,184,1,144,177,84,83,43,43,75,184,7,255,82,75,176,9,80,91,176,1,136,176,37,83,176,1,136,176,64,81,90,176,6,136,176,0,85,90,91,88,177,1,1,142,89,133,141,141,0,66,29,75,176,50,83,88,176,32,29,89,75,176,100,83,88,176,16,29,177,22,0,66,89,115,115,43,43,94,115,116,117,43,43,43,43,43,116,43,115,116,43,43,43,43,43,43,43,43,43,43,43,43,43,115,116,43,43,43,24,94,0,0,0,6,20,0,23,0,78,5,182,0,23,0,117,5,182,5,205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,72,0,20,0,145,0,0,255,236,0,0,0,0,255,236,0,0,0,0,255,236,0,0,254,20,255,236,0,0,5,182,0,19,252,148,255,237,254,133,255,234,254,169,255,236,0,24,254,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,139,0,129,0,221,0,152,0,143,0,142,0,153,0,136,0,129,1,15,0,138,0,0,0,0,0,31,0,31,0,31,0,31,0,81,0,119,0,255,1,123,1,236,2,106,2,131,2,174,2,217,3,21,3,65,3,95,3,116,3,150,3,175,3,241,4,26,4,91,4,185,4,251,5,70,5,163,5,197,6,52,6,145,6,199,6,251,7,27,7,68,7,100,7,187,8,65,8,128,8,219,9,25,9,85,9,138,9,184,10,8,10,57,10,108,10,148,10,195,10,225,11,31,11,86,11,156,11,217,12,44,12,121,12,204,12,240,13,36,13,75,13,143,13,191,13,230,14,18,14,54,14,79,14,114,14,147,14,169,14,200,15,36,15,121,15,180,16,7,16,84,16,148,17,40,17,102,17,148,17,210,18,16,18,39,18,127,18,185,18,250,19,79,19,163,19,214,20,40,20,104,20,165,20,204,21,23,21,71,21,128,21,172,21,238,22,6,22,75,22,133,22,133,22,182,23,1,23,83,23,161,23,245,24,26,24,149,24,203,25,71,25,148,25,207,25,237,25,245,26,127,26,149,26,205,26,217,27,19,27,99,27,130,27,193,27,241,28,19,28,69,28,108,28,165,28,221,28,243,29,8,29,30,29,123,29,140,29,157,29,174,29,191,29,209,29,221,30,43,30,55,30,72,30,89,30,106,30,124,30,141,30,158,30,175,30,193,31,25,31,42,31,59,31,76,31,93,31,110,31,128,31,174,32,25,32,42,32,59,32,76,32,94,32,111,32,177,33,24,33,40,33,56,33,72,33,88,33,105,33,122,34,5,34,17,34,33,34,49,34,65,34,82,34,99,34,116,34,133,34,151,34,255,35,15,35,31,35,47,35,63,35,79,35,96,35,166,36,12,36,28,36,44,36,60,36,77,36,93,36,180,36,197,36,214,36,230,36,247,37,7,37,19,37,31,37,48,37,64,37,81,37,97,37,114,37,131,37,148,37,164,37,181,37,198,37,206,38,58,38,75,38,91,38,108,38,124,38,141,38,158,38,170,38,182,38,199,38,215,38,232,38,248,39,9,39,25,39,42,39,59,39,71,39,87,39,104,39,121,39,201,40,34,40,51,40,68,40,85,40,102,40,119,40,136,40,147,40,158,40,175,40,198,40,210,40,222,40,239,41,0,41,12,41,23,41,76,41,93,41,110,41,121,41,133,41,150,41,166,41,178,41,190,41,248,42,45,42,62,42,78,42,90,42,101,42,118,42,134,42,151,42,222,43,39,43,56,43,72,43,89,43,105,43,123,43,140,43,239,44,105,44,122,44,138,44,149,44,161,44,178,44,195,44,212,44,228,44,245,45,5,45,17,45,29,45,46,45,62,45,73,45,84,45,101,45,117,45,178,46,4,46,21,46,37,46,54,46,70,46,87,46,103,46,121,46,138,46,156,46,173,46,185,46,197,46,214,46,231,46,248,47,8,47,26,47,43,47,59,47,76,47,93,47,110,47,126,47,165,47,248,48,119,49,22,49,39,49,56,49,73,49,89,49,100,49,111,49,152,49,193,49,215,49,255,50,31,50,84,50,123,50,180,50,230,51,5,51,78,51,95,51,103,51,120,51,138,51,156,51,173,51,191,51,208,51,227,51,235,51,243,52,18,52,26,52,34,52,42,52,50,52,139,52,147,52,155,52,193,52,201,52,209,53,6,53,14,53,50,53,58,53,113,53,121,53,129,53,232,53,240,54,60,54,144,54,162,54,180,54,196,54,212,54,228,54,245,55,7,55,107,55,208,56,6,56,103,56,197,57,18,57,76,57,166,57,210,57,218,58,44,58,52,58,95,58,202,58,210,59,16,59,92,59,168,59,237,60,37,60,93,60,186,61,16,61,95,61,185,61,203,61,220,61,236,61,252,62,13,62,31,62,111,62,128,62,202,62,210,62,218,62,236,62,244,63,83,63,166,63,229,63,246,64,7,64,55,64,63,64,134,64,142,64,150,64,223,64,231,65,44,65,137,65,193,65,210,66,1,66,60,66,68,66,76,66,84,66,92,66,100,66,108,66,116,66,179,66,187,66,195,66,244,67,43,67,91,67,149,67,219,68,35,68,97,68,175,69,15,69,86,69,94,69,186,70,21,70,52,70,124,70,132,70,202,71,35,71,91,71,107,71,155,71,209,72,20,72,73,72,81,72,117,72,125,72,133,72,170,72,178,73,19,73,27,73,76,73,131,73,180,73,239,74,52,74,125,74,184,75,8,75,101,75,169,75,186,76,37,76,53,76,131,76,139,76,147,76,165,76,173,77,6,77,88,77,96,77,112,77,128,77,177,77,214,77,253,78,14,78,30,78,47,78,64,78,82,78,100,78,117,78,134,78,155,78,176,78,184,78,218,78,247,79,21,79,29,79,58,79,105,79,154,79,180,79,242,80,90,80,122,80,138,81,36,81,44,81,52,81,87,81,123,81,135,81,160,81,211,82,24,82,134,82,248,83,110,83,212,84,44,84,160,84,244,84,252,85,75,85,98,85,121,85,144,85,167,86,10,86,62,86,99,86,151,86,174,86,210,87,50,87,98,87,227,88,44,88,62,88,80,88,125,88,137,88,149,88,188,88,227,89,2,89,33,89,64,89,117,89,183,89,252,90,77,90,110,90,211,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,91,39,92,113,92,204,92,221,92,229,93,108,93,167,94,11,94,28,94,45,94,57,94,69,94,87,94,140,94,195,94,211,94,227,95,64,95,151,95,224,96,49,96,58,96,67,96,76,96,122,96,153,96,170,96,187,96,203,96,219,97,78,97,153,97,237,98,59,98,155,98,254,99,63,99,128,99,214,100,44,100,143,100,244,101,105,101,224,102,140,103,48,103,56,103,64,103,157,103,246,104,47,104,103,104,121,104,139,105,1,105,13,105,128,105,243,106,157,107,59,107,209,108,58,108,125,108,191,109,3,109,51,109,96,109,134,109,172,110,144,111,27,111,129,111,223,112,49,112,130,112,215,113,67,113,123,113,180,114,6,114,85,114,168,114,251,115,7,115,19,115,80,115,140,115,205,116,16,116,88,116,172,116,230,117,30,117,93,117,162,117,221,118,29,118,115,118,198,119,66,119,185,119,197,119,209,120,2,120,52,120,60,120,111,120,173,120,241,121,48,121,113,121,174,121,236,122,48,122,115,122,191,123,11,123,67,123,122,123,232,124,75,124,193,125,45,125,53,125,70,125,87,125,172,125,252,126,68,126,135,126,204,127,21,127,85,127,150,127,218,128,30,128,111,128,189,128,197,128,214,128,230,128,248,129,9,129,17,129,25,129,42,129,58,129,139,129,218,129,236,129,253,130,15,130,33,130,51,130,68,130,144,130,218,130,235,130,251,131,13,131,30,131,48,131,65,131,73,131,81,131,99,131,116,131,134,131,151,131,168,131,184,131,202,131,219,131,237,131,254,132,16,132,33,132,76,132,119,132,137,132,155,132,167,132,178,132,190,132,202,133,16,133,86,133,148,133,156,133,246,134,100,134,201,135,39,135,129,135,212,136,43,136,121,136,196,137,19,137,102,137,176,137,239,138,45,138,138,138,146,138,158,138,170,138,182,138,194,138,211,138,228,138,246,139,8,139,26,139,44,139,62,139,80,139,98,139,116,139,137,139,157,139,175,139,193,139,211,139,229,139,247,140,9,140,27,140,45,140,66,140,86,140,98,140,110,140,127,140,144,140,161,140,177,140,195,140,213,140,231,140,249,141,11,141,29,141,47,141,65,141,86,141,106,141,123,141,140,141,152,141,164,141,176,141,188,141,205,141,222,141,240,142,2,142,20,142,38,142,56,142,74,142,92,142,110,142,131,142,151,142,168,142,184,142,201,142,217,142,234,142,251,143,12,143,28,143,40,143,52,143,64,143,76,143,93,143,110,143,127,143,143,143,160,143,176,143,193,143,210,143,227,143,243,143,255,144,11,144,23,144,35,144,52,144,69,144,86,144,102,144,114,144,166,144,225,145,29,145,106,145,194,145,250,146,50,146,123,146,205,146,245,147,24,147,59,147,68,147,131,147,173,147,238,148,78,148,147,148,222,148,230,149,9,149,17,149,110,149,122,149,246,150,2,150,14,150,113,150,129,150,145,150,162,150,178,150,199,150,216,150,233,150,250,151,12,151,29,151,46,151,63,151,74,151,91,151,103,151,121,151,129,151,147,151,155,151,173,151,181,151,189,151,206,151,218,0,0,0,2,0,193,0,0,4,10,5,182,0,3,0,7,0,21,183,4,3,5,2,4,3,7,0,0,47,50,47,51,1,47,51,47,51,49,48,19,33,17,33,55,33,17,33,193,3,73,252,183,104,2,121,253,135,5,182,250,74,104,4,230,0,2,0,152,255,227,1,137,5,182,0,3,0,14,0,43,64,20,3,9,9,2,4,4,15,16,1,1,12,2,12,6,79,89,12,22,2,3,0,63,63,43,17,18,0,57,24,47,17,18,1,57,17,51,51,17,51,49,48,1,35,3,51,3,52,51,50,22,21,20,6,35,34,38,1,70,105,51,207,225,120,58,63,64,57,52,68,1,147,4,35,250,180,136,70,66,64,71,63,0,0,2,0,133,3,166,2,176,5,182,0,3,0,7,0,31,64,13,0,3,7,4,3,4,8,9,6,2,7,3,3,0,63,51,205,50,17,18,1,57,57,17,51,17,51,49,48,1,3,35,3,33,3,35,3,1,63,40,105,41,2,43,41,104,41,5,182,253,240,2,16,253,240,2,16,0,0,2,0,51,0,0,4,246,5,182,0,27,0,31,0,153,64,85,8,31,28,21,4,20,9,17,12,12,9,18,15,14,11,4,10,19,19,20,22,29,30,7,4,6,23,4,1,0,25,4,24,5,5,6,20,6,10,33,3,26,23,3,24,10,24,32,33,8,4,12,13,12,78,89,28,1,13,31,0,16,17,16,78,89,25,21,17,79,13,1,79,17,1,13,17,13,17,5,23,19,3,10,5,0,47,51,63,51,18,57,57,47,47,93,93,17,51,51,43,17,0,51,51,17,51,51,43,17,0,51,51,17,18,1,57,57,17,23,51,17,18,57,57,17,51,17,18,23,57,17,18,23,57,17,51,17,18,23,57,50,50,17,51,17,18,23,57,49,48,1,3,33,21,33,3,35,19,33,3,35,19,33,53,33,19,33,53,33,19,51,3,33,19,51,3,33,21,1,33,19,33,3,213,66,1,27,254,205,84,137,84,254,209,82,136,80,254,250,1,31,68,254,235,1,43,82,139,82,1,49,84,134,84,1,8,252,229,1,47,66,254,209,3,131,254,172,129,254,82,1,174,254,82,1,174,129,1,84,127,1,180,254,76,1,180,254,76,127,254,172,1,84,0,3,0,131,255,137,4,12,6,18,0,32,0,38,0,45,0,102,64,53,39,17,37,29,23,4,4,42,20,13,5,33,0,0,25,5,17,9,5,46,47,37,13,6,13,77,89,3,6,36,14,42,14,76,89,29,42,43,28,20,28,77,89,23,42,20,6,20,6,20,5,22,5,0,47,47,18,57,57,47,47,18,57,50,43,17,0,51,17,51,43,17,0,51,17,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,51,51,17,51,51,51,17,51,49,48,1,20,6,7,21,35,53,34,38,39,53,22,22,51,17,38,38,53,52,54,55,53,51,21,22,23,7,38,39,17,30,2,7,52,38,39,17,54,1,20,22,23,17,6,6,4,12,204,183,129,112,210,67,83,217,89,205,165,203,167,129,184,171,52,149,154,157,156,74,170,89,128,217,253,221,90,111,99,102,1,193,136,177,23,232,223,35,31,156,37,47,1,184,65,172,136,131,168,18,182,180,5,69,131,59,11,254,78,50,95,123,101,72,89,44,254,123,30,3,7,76,92,41,1,131,16,93,0,0,5,0,104,255,236,6,45,5,203,0,9,0,21,0,33,0,45,0,49,0,69,64,36,0,16,5,10,22,40,28,34,34,46,40,10,48,16,6,50,51,3,13,31,43,13,43,13,43,48,49,6,48,24,25,37,25,7,19,7,0,63,51,63,51,63,63,18,57,57,47,47,17,51,17,51,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,19,20,22,51,50,17,16,35,34,6,5,20,6,35,34,38,53,52,54,51,50,22,1,20,22,51,50,54,53,52,38,35,34,6,5,20,6,35,34,38,53,52,54,51,50,22,1,1,35,1,242,74,83,164,164,83,74,1,202,153,148,140,155,149,146,145,156,1,166,74,84,84,80,80,84,84,74,1,203,153,148,142,153,149,146,142,159,254,254,252,213,147,3,43,4,2,170,170,1,84,1,82,168,170,228,233,238,223,227,230,238,252,219,171,169,167,173,171,165,165,171,227,233,238,222,227,230,235,3,32,250,74,5,182,0,0,3,0,113,255,236,5,211,5,205,0,11,0,21,0,53,0,81,64,48,19,22,0,29,6,35,42,43,46,43,45,35,14,38,25,29,22,9,54,55,51,12,73,89,51,19,15,39,45,14,48,5,47,3,25,38,3,42,42,32,47,18,32,9,74,89,32,4,0,63,43,0,24,63,18,57,47,23,57,18,23,57,63,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,20,22,23,54,54,53,52,38,35,34,6,19,50,55,1,14,2,21,20,22,37,52,54,55,46,2,53,52,54,51,50,22,21,20,6,7,1,54,54,55,51,2,7,1,35,39,6,6,35,34,38,1,158,72,87,129,101,103,86,89,111,155,241,159,254,75,111,92,44,155,254,185,139,180,85,61,36,196,175,162,186,136,157,1,151,56,67,23,168,68,137,1,43,229,185,118,244,150,215,237,4,147,69,125,88,75,127,83,77,97,96,251,157,154,1,168,68,89,102,65,117,137,250,130,200,102,95,98,106,57,150,168,167,149,107,181,93,254,121,62,167,99,254,226,148,254,221,178,106,92,212,0,0,1,0,133,3,166,1,63,5,182,0,3,0,20,183,0,3,3,4,5,2,3,3,0,63,205,17,18,1,57,17,51,49,48,1,3,35,3,1,63,40,105,41,5,182,253,240,2,16,0,0,1,0,82,254,188,2,33,5,182,0,13,0,28,64,12,7,0,10,4,0,4,14,15,11,39,3,3,0,63,63,17,18,1,57,57,17,51,17,51,49,48,19,16,18,55,51,6,2,21,20,18,23,35,38,2,82,155,146,162,144,145,148,139,160,147,154,2,49,1,9,1,206,174,193,254,50,244,240,254,54,189,170,1,198,0,0,1,0,61,254,188,2,12,5,182,0,13,0,28,64,12,4,10,7,0,10,0,14,15,10,3,4,39,0,63,63,17,18,1,57,57,17,51,17,51,49,48,1,16,2,7,35,54,18,53,52,2,39,51,22,18,2,12,155,146,160,139,148,145,144,162,147,154,2,49,254,249,254,58,168,188,1,203,240,244,1,206,193,175,254,49,0,1,0,86,2,127,4,14,6,20,0,14,0,48,64,27,3,5,4,1,7,13,10,9,11,9,15,16,4,10,1,13,2,12,12,13,10,7,4,6,8,14,0,0,63,196,50,23,57,17,51,17,51,17,51,17,18,1,23,57,49,48,1,3,37,23,5,19,7,3,3,39,19,37,55,5,3,2,145,43,1,142,26,254,131,248,172,176,160,176,242,254,135,29,1,135,43,6,20,254,117,111,182,31,254,186,94,1,106,254,150,94,1,70,31,182,111,1,139,0,0,1,0,104,0,227,4,41,4,195,0,11,0,40,64,19,0,4,4,9,5,5,12,13,3,7,8,7,80,89,0,15,8,1,8,0,47,93,51,43,17,0,51,17,18,1,57,17,51,51,17,51,49,48,1,33,21,33,17,35,17,33,53,33,17,51,2,141,1,156,254,100,139,254,102,1,154,139,3,23,138,254,86,1,170,138,1,172,0,1,0,63,254,248,1,109,0,238,0,8,0,17,181,5,0,9,10,5,0,0,47,205,17,18,1,57,57,49,48,37,23,6,2,7,35,54,18,55,1,94,15,26,98,53,125,27,65,13,238,23,100,254,247,114,104,1,50,92,0,1,0,84,1,217,2,63,2,113,0,3,0,17,181,2,0,5,4,0,1,0,47,51,17,18,1,57,57,49,48,19,53,33,21,84,1,235,1,217,152,152,0,1,0,152,255,227,1,137,0,242,0,11,0,24,64,11,6,0,0,12,13,9,3,79,89,9,22,0,63,43,17,18,1,57,17,51,49,48,55,52,54,51,50,22,21,20,6,35,34,38,152,61,57,58,65,66,57,51,67,106,67,69,69,67,65,70,63,0,0,1,0,20,0,0,2,219,5,182,0,3,0,19,183,2,0,4,5,3,3,2,18,0,63,63,17,18,1,57,57,49,48,1,1,35,1,2,219,253,223,166,2,33,5,182,250,74,5,182,0,2,0,102,255,236,4,45,5,205,0,11,0,23,0,40,64,20,18,0,12,6,0,6,25,24,9,21,75,89,9,7,3,15,75,89,3,25,0,63,43,0,24,63,43,17,18,1,57,57,17,51,17,51,49,48,1,16,2,35,34,2,17,16,18,51,50,18,1,16,18,51,50,18,17,16,2,35,34,2,4,45,239,246,236,246,238,244,238,247,252,225,150,164,166,149,149,166,164,150,2,221,254,133,254,138,1,127,1,114,1,126,1,114,254,126,254,146,254,193,254,221,1,39,1,59,1,59,1,37,254,223,0,1,0,188,0,0,2,203,5,182,0,10,0,36,64,16,9,0,1,8,1,11,12,4,9,7,7,1,9,6,1,24,0,63,63,18,57,47,18,57,17,18,1,57,57,17,51,51,49,48,33,35,17,52,55,6,6,7,39,1,51,2,203,162,8,21,52,212,88,1,131,140,4,18,130,116,21,46,172,114,1,43,0,1,0,100,0,0,4,37,5,203,0,25,0,43,64,23,24,1,7,19,0,19,14,1,4,26,27,16,10,75,89,16,7,1,24,76,89,1,24,0,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,33,33,53,1,62,2,53,52,38,35,34,6,7,39,54,51,50,22,21,20,2,7,1,21,33,4,37,252,63,1,129,176,112,56,142,126,91,163,100,88,202,238,206,234,156,214,254,192,2,240,143,1,131,178,152,144,83,117,137,60,79,113,168,211,178,139,254,240,208,254,199,8,0,0,1,0,94,255,236,4,27,5,203,0,39,0,67,64,36,27,0,19,7,7,0,3,22,34,13,6,40,41,3,23,22,23,22,75,89,23,23,10,37,37,30,75,89,37,7,10,17,75,89,10,25,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,49,48,1,20,6,7,21,22,22,21,20,4,33,34,38,39,53,22,22,51,32,17,16,33,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,3,238,157,144,176,170,254,222,254,245,116,193,91,95,215,96,1,123,254,94,144,146,171,200,147,126,96,170,109,84,90,235,130,213,236,4,94,140,178,30,8,22,180,146,209,225,35,44,158,47,49,1,41,1,10,143,151,134,107,122,52,70,112,71,81,195,0,0,2,0,43,0,0,4,106,5,190,0,10,0,18,0,60,64,30,18,5,9,2,2,11,7,3,0,3,5,3,19,20,1,5,18,5,76,89,9,15,7,18,18,3,7,6,3,24,0,63,63,18,57,47,18,57,51,43,17,0,51,17,18,1,23,57,17,51,51,51,17,51,17,51,49,48,1,35,17,35,17,33,53,1,51,17,51,33,17,52,55,35,6,7,1,4,106,217,159,253,57,2,182,176,217,254,136,10,8,48,42,254,55,1,80,254,176,1,80,145,3,221,252,41,1,230,143,180,96,63,253,118,0,1,0,133,255,236,4,29,5,182,0,26,0,58,64,31,15,3,25,20,8,20,23,3,4,28,27,0,17,75,89,0,0,6,21,21,24,76,89,21,6,6,12,75,89,6,25,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,50,4,21,20,0,35,34,39,53,22,22,51,50,54,53,16,33,34,7,39,19,33,21,33,3,54,2,45,231,1,9,254,223,254,247,130,70,208,101,176,195,254,137,95,159,86,55,2,215,253,183,37,115,3,125,229,199,227,254,254,79,160,45,51,166,157,1,50,29,55,2,172,153,254,73,23,0,0,2,0,117,255,236,4,47,5,203,0,22,0,36,0,68,64,35,26,17,11,33,33,0,0,6,17,3,38,37,12,11,14,29,77,89,11,14,14,20,3,20,23,75,89,20,25,3,8,77,89,3,7,0,63,43,0,24,63,43,17,18,0,57,24,47,57,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,19,16,0,33,50,23,21,38,35,34,2,3,51,54,51,50,22,21,20,2,35,34,0,5,50,54,53,52,38,35,34,6,6,21,20,22,22,117,1,79,1,72,113,65,77,99,235,248,12,12,110,238,197,227,249,212,227,254,246,1,235,142,157,146,145,90,150,89,80,147,2,113,1,175,1,171,19,143,25,254,219,254,198,172,238,204,228,254,251,1,85,200,179,169,145,166,74,130,70,103,178,104,0,1,0,94,0,0,4,43,5,182,0,6,0,31,64,16,1,5,5,0,2,3,7,8,3,2,76,89,3,6,0,24,0,63,63,43,17,18,1,23,57,17,51,49,48,33,1,33,53,33,21,1,1,29,2,94,252,227,3,205,253,170,5,29,153,133,250,207,0,3,0,104,255,236,4,41,5,203,0,22,0,34,0,46,0,77,64,41,23,15,38,20,44,3,29,9,9,3,6,17,20,15,6,47,48,6,17,41,32,41,32,75,89,41,41,12,0,12,26,77,89,12,25,0,35,77,89,0,7,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,50,22,21,20,6,7,22,22,21,20,6,35,34,38,53,52,37,38,38,53,52,54,3,20,22,51,50,54,53,52,38,39,6,6,1,34,6,21,20,22,23,54,54,53,52,38,2,72,200,234,134,147,178,150,254,221,234,252,1,50,138,120,235,119,167,151,149,166,156,194,149,134,1,58,125,142,118,159,143,119,145,5,203,186,164,108,178,73,85,187,123,182,217,205,188,251,140,78,181,112,159,189,251,166,120,134,140,122,97,151,71,64,155,3,103,120,100,92,132,66,60,138,92,101,119,0,0,2,0,106,255,236,4,37,5,203,0,23,0,37,0,65,64,34,27,17,34,10,10,0,0,4,17,3,38,39,14,30,77,89,11,20,14,14,2,20,20,24,75,89,20,7,2,7,77,89,2,25,0,63,43,0,24,63,43,17,18,0,57,24,47,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,16,33,34,39,53,22,51,50,18,19,35,6,6,35,34,38,53,52,18,51,50,22,18,1,34,6,21,20,22,51,50,54,54,53,52,38,38,4,37,253,104,116,68,80,102,240,245,11,12,55,182,114,194,228,255,208,149,223,120,254,20,143,156,144,147,91,153,88,82,147,3,70,252,166,20,143,26,1,41,1,51,83,87,232,208,228,1,8,153,254,219,1,48,184,164,144,165,74,128,70,105,178,102,0,0,2,0,152,255,227,1,137,4,100,0,11,0,21,0,40,64,20,16,6,6,12,0,0,22,23,14,19,79,89,14,16,9,3,79,89,9,22,0,63,43,0,24,63,43,17,18,1,57,17,51,51,17,51,49,48,55,52,54,51,50,22,21,20,6,35,34,38,17,52,51,50,21,20,6,35,34,38,152,61,57,58,65,66,57,51,67,118,123,66,57,51,67,106,67,69,69,67,65,70,63,3,187,135,135,65,70,63,0,2,0,63,254,248,1,133,4,100,0,8,0,18,0,34,64,16,1,13,13,5,9,9,20,19,11,16,79,89,11,16,5,0,0,47,205,63,43,17,18,1,57,17,51,51,17,51,49,48,37,23,6,2,7,35,54,18,55,3,52,51,50,21,20,6,35,34,38,1,94,15,26,98,53,125,27,65,13,21,119,123,66,57,58,61,238,23,100,254,247,114,104,1,50,92,2,239,135,135,65,70,70,0,0,1,0,104,0,242,4,41,4,217,0,6,0,21,64,9,4,0,5,1,4,7,8,3,0,0,47,47,17,18,1,23,57,49,48,37,1,53,1,21,1,1,4,41,252,63,3,193,252,242,3,14,242,1,166,98,1,223,149,254,141,254,184,0,0,2,0,119,1,193,4,25,3,227,0,3,0,7,0,42,64,21,7,2,4,0,2,0,9,8,4,5,80,89,4,1,0,80,89,15,1,1,1,0,47,93,43,0,24,47,43,17,18,1,57,57,17,51,17,51,49,48,19,53,33,21,1,53,33,21,119,3,162,252,94,3,162,3,90,137,137,254,103,137,137,0,0,1,0,104,0,242,4,41,4,217,0,6,0,21,64,9,5,1,2,0,4,7,8,6,3,0,47,47,17,18,1,23,57,49,48,19,1,1,53,1,21,1,104,3,15,252,241,3,193,252,63,1,137,1,70,1,117,149,254,33,98,254,90,0,0,2,0,27,255,227,3,57,5,203,0,27,0,38,0,57,64,29,33,28,27,0,7,19,19,0,28,14,4,39,40,0,0,36,16,36,30,79,89,36,22,16,10,73,89,16,4,0,63,43,0,24,63,43,17,18,0,57,24,47,17,18,1,23,57,17,51,17,51,17,51,49,48,1,53,52,54,55,54,54,53,52,38,35,34,6,7,39,54,51,50,22,21,20,6,6,7,6,6,21,21,3,52,51,50,22,21,20,6,35,34,38,1,33,72,98,136,71,131,123,79,150,97,59,189,206,191,212,39,76,126,101,65,178,120,58,63,64,57,52,68,1,147,54,117,151,84,115,116,82,102,111,37,49,135,99,188,171,73,111,99,110,86,114,95,33,254,215,136,70,66,64,71,63,0,2,0,121,255,70,6,184,5,180,0,53,0,63,0,69,64,34,35,46,54,14,59,7,20,27,0,0,41,20,14,46,5,64,65,24,56,56,4,61,8,17,11,17,11,17,43,31,50,3,38,43,0,47,51,63,51,18,57,57,47,47,18,57,50,51,51,17,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,20,6,6,35,34,38,39,35,6,6,35,34,38,53,52,54,51,50,22,23,3,21,20,51,50,54,53,52,2,36,35,34,4,2,21,16,0,33,50,55,21,6,35,32,0,17,16,18,36,33,50,4,18,1,20,51,50,19,19,38,35,34,6,6,184,88,160,104,86,118,11,8,40,149,102,150,169,236,192,68,172,69,25,133,91,114,148,254,239,177,223,254,182,174,1,66,1,47,210,226,192,244,254,149,254,111,214,1,140,1,0,215,1,79,183,251,246,195,207,18,14,72,85,130,147,2,217,142,236,130,104,81,87,98,205,176,204,255,25,22,254,42,22,178,215,172,181,1,16,147,185,254,169,225,254,207,254,184,86,133,84,1,143,1,102,1,4,1,150,223,181,254,179,254,164,254,1,57,1,5,20,180,0,2,0,0,0,0,5,16,5,188,0,7,0,14,0,57,64,30,2,14,11,8,1,5,0,3,0,7,3,4,7,4,16,15,14,2,73,89,11,5,14,14,4,5,3,0,4,18,0,63,51,63,18,57,47,18,57,43,17,18,1,57,57,17,51,17,51,17,18,23,57,49,48,33,3,33,3,35,1,51,1,1,3,38,39,6,7,3,4,96,182,253,182,180,172,2,66,143,2,63,254,101,170,33,35,22,41,172,1,209,254,47,5,188,250,68,2,106,1,197,86,125,96,115,254,59,0,3,0,201,0,0,4,190,5,182,0,14,0,23,0,32,0,73,64,38,19,4,29,10,15,25,25,14,10,4,7,14,4,33,34,8,15,24,15,24,74,89,15,15,14,0,14,25,74,89,14,18,0,23,74,89,0,3,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,19,33,32,4,21,20,6,7,21,4,17,20,4,35,33,19,33,50,54,53,52,38,35,35,17,17,33,50,54,53,52,38,35,201,1,157,1,35,1,4,145,139,1,77,254,247,238,254,2,170,1,24,180,158,176,192,250,1,49,177,179,183,187,5,182,174,188,130,169,25,10,57,254,219,196,220,3,68,113,134,123,109,253,145,253,221,137,146,136,128,0,0,1,0,125,255,236,4,207,5,203,0,22,0,38,64,20,3,14,20,9,14,3,23,24,18,0,73,89,18,4,11,6,73,89,11,19,0,63,43,0,24,63,43,17,18,1,23,57,17,51,49,48,1,34,0,17,16,0,51,50,55,21,6,35,32,0,17,52,18,36,51,50,23,7,38,3,59,241,254,233,1,13,249,153,196,152,223,254,189,254,161,169,1,63,216,230,172,72,166,5,51,254,191,254,233,254,225,254,199,55,149,57,1,136,1,105,226,1,84,184,84,146,78,0,0,2,0,201,0,0,5,88,5,182,0,8,0,17,0,40,64,20,14,4,9,0,4,0,18,19,5,13,74,89,5,3,4,14,74,89,4,18,0,63,43,0,24,63,43,17,18,1,57,57,17,51,17,51,49,48,1,16,0,33,33,17,33,32,0,3,16,0,33,35,17,51,32,0,5,88,254,119,254,143,254,107,1,192,1,85,1,122,180,254,225,254,229,247,207,1,48,1,50,2,233,254,150,254,129,5,182,254,134,254,167,1,30,1,34,251,112,1,43,0,0,1,0,201,0,0,3,248,5,182,0,11,0,58,64,31,6,10,10,1,4,0,8,1,4,12,13,6,9,73,89,6,6,1,2,2,5,73,89,2,3,1,10,73,89,1,18,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,33,33,17,33,21,33,17,33,21,33,17,33,3,248,252,209,3,47,253,123,2,94,253,162,2,133,5,182,151,254,41,150,253,230,0,1,0,201,0,0,3,248,5,182,0,9,0,50,64,26,6,0,0,1,3,8,1,3,10,11,6,9,73,89,6,6,1,2,2,5,73,89,2,3,1,18,0,63,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,33,35,17,33,21,33,17,33,21,33,1,115,170,3,47,253,123,2,94,253,162,5,182,151,253,233,151,0,0,1,0,125,255,236,5,61,5,203,0,27,0,58,64,31,20,8,25,2,2,14,27,8,4,28,29,0,27,73,89,0,0,5,12,12,17,73,89,12,4,5,23,73,89,5,19,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,33,17,6,6,35,32,0,17,52,18,36,51,50,23,7,38,35,32,0,17,16,0,33,50,55,17,33,3,76,1,241,116,240,158,254,180,254,142,183,1,88,231,234,202,66,198,183,254,245,254,212,1,33,1,24,152,145,254,185,2,254,253,57,37,38,1,139,1,100,228,1,87,181,86,150,84,254,194,254,230,254,216,254,206,35,1,194,0,1,0,201,0,0,5,31,5,182,0,11,0,51,64,25,9,1,1,0,8,4,4,5,0,5,13,12,8,3,73,89,8,8,5,10,6,3,1,5,18,0,63,51,63,51,18,57,47,43,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,33,35,17,33,17,35,17,51,17,33,17,51,5,31,170,252,254,170,170,3,2,170,2,176,253,80,5,182,253,146,2,110,0,0,1,0,84,0,0,2,86,5,182,0,11,0,55,64,28,5,1,10,3,8,0,0,3,1,3,12,13,9,4,6,4,74,89,6,3,10,3,1,3,74,89,1,18,0,63,43,17,0,51,24,63,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,33,33,53,55,17,39,53,33,21,7,17,23,2,86,253,254,172,172,2,2,172,172,98,35,4,170,37,98,98,37,251,86,35,0,1,255,96,254,127,1,104,5,182,0,13,0,29,64,13,11,8,8,14,15,9,3,0,5,73,89,0,34,0,63,43,0,24,63,17,18,1,57,17,51,49,48,3,34,39,53,22,51,50,54,53,17,51,17,20,6,12,94,54,71,77,99,103,170,192,254,127,27,145,20,120,113,5,182,250,88,190,209,0,0,1,0,201,0,0,4,233,5,182,0,11,0,42,64,21,8,4,4,5,5,2,11,10,0,5,13,12,2,8,5,9,6,3,1,5,18,0,63,51,63,51,18,57,57,17,18,1,23,57,17,51,17,51,49,48,33,35,1,7,17,35,17,51,17,1,51,1,4,233,200,253,235,153,170,170,2,151,201,253,180,2,197,136,253,195,5,182,253,43,2,213,253,133,0,1,0,201,0,0,3,248,5,182,0,5,0,31,64,14,3,0,0,4,6,7,1,3,0,3,73,89,0,18,0,63,43,0,24,63,17,18,1,57,57,17,51,49,48,51,17,51,17,33,21,201,170,2,133,5,182,250,228,154,0,1,0,201,0,0,6,113,5,182,0,19,0,50,64,24,8,5,5,6,11,14,14,13,6,13,20,21,1,10,17,3,6,11,7,3,14,0,6,18,0,63,51,51,63,51,18,23,57,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,33,1,35,22,21,17,35,17,33,1,51,1,51,17,35,17,52,55,35,1,3,80,254,16,8,14,157,1,0,1,207,8,1,211,254,170,14,8,254,12,5,16,154,212,252,94,5,182,251,74,4,182,250,74,3,174,162,190,250,242,0,1,0,201,0,0,5,63,5,182,0,16,0,46,64,21,9,6,6,7,1,15,15,0,7,0,17,18,11,3,7,15,8,3,1,7,18,0,63,51,63,51,18,57,57,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,33,35,1,35,22,21,17,35,17,51,1,51,38,2,55,17,51,5,63,194,252,225,8,16,157,192,3,29,8,2,14,2,159,4,203,216,180,252,193,5,182,251,58,27,1,37,63,3,71,0,0,2,0,125,255,236,5,190,5,205,0,11,0,23,0,40,64,20,18,0,12,6,0,6,25,24,9,21,73,89,9,4,3,15,73,89,3,19,0,63,43,0,24,63,43,17,18,1,57,57,17,51,17,51,49,48,1,16,0,33,32,0,17,16,0,33,32,0,1,16,18,51,50,18,17,16,2,35,34,2,5,190,254,157,254,196,254,189,254,161,1,96,1,68,1,59,1,98,251,115,253,241,243,248,247,242,243,253,2,221,254,161,254,110,1,139,1,104,1,101,1,137,254,112,254,160,254,215,254,205,1,50,1,42,1,39,1,49,254,205,0,2,0,201,0,0,4,104,5,182,0,9,0,18,0,52,64,26,10,5,5,6,14,0,6,0,19,20,10,4,74,89,10,10,6,7,7,18,74,89,7,3,6,18,0,63,63,43,17,18,0,57,24,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,1,20,4,33,35,17,35,17,33,32,1,51,50,54,53,52,38,35,35,4,104,254,209,254,230,172,170,1,123,2,36,253,11,153,226,202,190,201,190,4,12,222,239,253,193,5,182,253,27,146,161,145,142,0,0,2,0,125,254,164,5,190,5,205,0,15,0,27,0,52,64,27,16,10,22,0,0,4,3,10,4,28,29,3,13,7,13,25,73,89,13,4,7,19,73,89,5,7,19,0,63,198,43,0,24,63,43,17,18,0,57,17,18,1,23,57,17,51,17,51,49,48,1,16,2,7,1,35,1,7,32,0,17,16,0,33,32,0,1,16,18,51,50,18,17,16,2,35,34,2,5,190,226,206,1,92,247,254,227,55,254,189,254,161,1,96,1,68,1,59,1,98,251,115,253,241,243,248,247,242,243,253,2,221,254,231,254,140,66,254,150,1,74,2,1,139,1,104,1,101,1,137,254,112,254,160,254,215,254,205,1,50,1,42,1,39,1,49,254,205,0,2,0,201,0,0,4,207,5,182,0,12,0,21,0,72,64,37,13,1,1,2,12,9,17,7,11,10,10,7,9,2,4,22,23,9,13,0,13,0,74,89,13,13,2,3,3,21,73,89,3,3,11,2,18,0,63,51,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,17,35,17,33,32,4,21,16,5,1,35,1,37,51,50,54,53,52,38,35,35,1,115,170,1,145,1,13,1,1,254,218,1,141,201,254,158,254,207,233,180,168,171,189,221,2,96,253,160,5,182,206,207,254,222,102,253,111,2,96,146,143,143,145,128,0,1,0,106,255,236,4,2,5,203,0,36,0,52,64,27,30,19,12,0,0,24,19,5,4,37,38,12,30,3,22,22,27,73,89,22,4,3,9,73,89,3,19,0,63,43,0,24,63,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,49,48,1,20,4,35,32,39,53,22,22,51,50,54,53,52,38,38,39,38,38,53,52,54,51,50,23,7,38,35,34,6,21,20,22,22,23,22,22,4,2,254,232,240,254,252,140,90,212,104,170,172,61,143,146,204,175,254,209,218,183,53,181,171,135,152,56,133,137,230,173,1,133,193,216,67,164,38,44,129,115,76,97,82,52,73,200,161,169,200,80,148,76,116,103,76,97,81,49,82,188,0,0,1,0,18,0,0,4,90,5,182,0,7,0,36,64,18,0,1,5,1,3,3,8,9,7,3,4,3,73,89,4,3,1,18,0,63,63,43,17,0,51,17,18,1,23,57,17,51,49,48,33,35,17,33,53,33,21,33,2,139,170,254,49,4,72,254,49,5,31,151,151,0,0,1,0,186,255,236,5,25,5,182,0,17,0,37,64,17,16,1,10,7,1,7,19,18,17,8,3,4,13,73,89,4,19,0,63,43,0,24,63,51,17,18,1,57,57,17,51,17,51,49,48,1,17,20,0,33,32,0,53,17,51,17,20,22,51,50,54,53,17,5,25,254,210,254,248,254,248,254,223,170,200,194,185,200,5,182,252,78,250,254,226,1,32,252,3,174,252,70,183,196,197,184,3,184,0,1,0,0,0,0,4,195,5,182,0,10,0,26,64,11,1,4,12,11,8,3,0,4,3,3,18,0,63,63,51,18,57,17,18,1,57,57,49,48,1,51,1,35,1,51,1,22,23,54,55,4,12,183,253,241,168,253,244,180,1,80,58,34,36,58,5,182,250,74,5,182,252,78,163,154,162,161,0,1,0,27,0,0,7,76,5,182,0,25,0,36,64,16,25,10,27,26,21,14,14,5,9,24,17,10,3,1,9,18,0,63,51,63,51,51,18,57,57,17,51,17,18,1,57,57,49,48,33,35,1,38,38,39,6,7,1,35,1,51,19,22,23,54,55,1,51,1,22,23,54,55,19,51,5,197,168,254,217,21,52,1,22,48,254,226,168,254,123,180,231,48,22,27,53,1,6,180,1,19,48,33,19,53,230,180,3,211,65,198,20,132,157,252,51,5,182,252,121,190,154,183,175,3,121,252,127,155,195,142,204,3,133,0,0,1,0,8,0,0,4,150,5,182,0,11,0,35,64,18,4,6,5,11,10,0,6,13,12,2,8,4,9,6,3,1,4,18,0,63,51,63,51,18,57,57,17,18,1,23,57,49,48,33,35,1,1,35,1,1,51,1,1,51,1,4,150,193,254,119,254,112,180,1,230,254,59,188,1,107,1,110,181,254,59,2,131,253,125,2,252,2,186,253,189,2,67,253,76,0,0,1,0,0,0,0,4,123,5,182,0,8,0,32,64,15,4,5,2,5,7,3,9,10,0,5,1,7,3,5,18,0,63,63,51,18,57,17,18,1,23,57,17,51,49,48,1,1,51,1,17,35,17,1,51,2,61,1,134,184,254,24,172,254,25,186,2,219,2,219,252,129,253,201,2,47,3,135,0,1,0,82,0,0,4,63,5,182,0,9,0,43,64,23,8,1,3,7,0,7,4,1,4,10,11,5,4,73,89,5,3,1,8,73,89,1,18,0,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,33,33,53,1,33,53,33,21,1,33,4,63,252,19,3,8,253,16,3,191,252,248,3,30,133,4,152,153,133,251,105,0,1,0,166,254,188,2,111,5,182,0,7,0,32,64,14,6,1,4,0,1,0,8,9,5,2,3,6,1,39,0,63,51,63,51,17,18,1,57,57,17,51,17,51,49,48,1,33,17,33,21,33,17,33,2,111,254,55,1,201,254,223,1,33,254,188,6,250,141,250,33,0,0,1,0,23,0,0,2,221,5,182,0,3,0,19,183,3,1,4,5,3,3,2,18,0,63,63,17,18,1,57,57,49,48,19,1,35,1,186,2,35,166,253,224,5,182,250,74,5,182,0,0,1,0,51,254,188,1,252,5,182,0,7,0,32,64,14,3,0,1,6,0,6,8,9,0,7,39,3,4,3,0,63,51,63,51,17,18,1,57,57,17,51,17,51,49,48,23,33,17,33,53,33,17,33,51,1,33,254,223,1,201,254,55,182,5,223,141,249,6,0,0,1,0,49,2,39,4,35,5,193,0,6,0,24,64,9,0,3,7,8,5,2,0,4,2,0,47,47,51,18,57,17,18,1,57,57,49,48,19,1,51,1,35,1,1,49,1,178,99,1,221,152,254,140,254,178,2,39,3,154,252,102,2,233,253,23,0,1,255,252,254,197,3,154,255,72,0,3,0,17,181,0,5,1,4,1,2,0,47,51,17,1,51,17,51,49,48,1,33,53,33,3,154,252,98,3,158,254,197,131,0,1,1,137,4,217,3,18,6,33,0,9,0,19,182,0,4,11,10,6,128,1,0,47,26,205,17,18,1,57,57,49,48,1,35,38,38,39,53,51,22,22,23,3,18,110,65,178,40,203,32,114,44,4,217,52,192,63,21,69,181,53,0,2,0,94,255,236,3,205,4,90,0,25,0,36,0,71,64,37,34,8,11,30,30,25,25,18,8,3,37,38,1,2,11,30,71,89,2,11,11,0,21,21,15,70,89,21,16,5,26,70,89,5,22,0,21,0,63,63,43,0,24,63,43,17,18,0,57,24,47,57,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,33,39,35,6,6,35,34,38,53,16,37,55,53,52,38,35,34,7,39,54,54,51,50,22,21,17,37,50,54,53,53,7,6,6,21,20,22,3,82,33,8,82,163,122,163,185,2,19,186,111,122,137,173,51,81,193,97,196,189,254,14,155,177,166,198,175,109,156,103,73,168,155,1,76,16,6,68,129,123,84,127,44,50,174,192,253,20,117,170,153,99,7,7,109,115,90,94,0,2,0,176,255,236,4,117,6,20,0,19,0,31,0,68,64,34,10,23,23,15,15,12,29,3,12,3,32,33,13,0,12,21,18,17,10,17,6,0,6,26,70,89,6,22,0,20,70,89,0,16,0,63,43,0,24,63,43,17,18,0,57,57,17,51,24,63,63,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,1,50,18,17,16,2,35,34,38,39,35,7,35,17,51,17,20,7,51,54,23,34,6,21,20,22,51,50,54,53,52,38,2,174,216,239,241,214,107,177,60,12,35,119,166,8,8,116,204,170,150,154,170,153,150,150,4,90,254,217,254,242,254,242,254,213,79,82,141,6,20,254,134,127,101,164,139,195,231,231,199,223,209,214,210,0,0,1,0,115,255,236,3,139,4,92,0,22,0,38,64,20,15,3,3,21,9,3,24,23,6,13,70,89,6,16,0,18,70,89,0,22,0,63,43,0,24,63,43,17,18,1,23,57,17,51,49,48,5,34,0,17,16,0,51,50,22,23,7,38,38,35,32,17,20,22,51,50,55,21,6,2,102,238,254,251,1,9,245,79,158,45,51,55,130,50,254,178,163,160,137,144,110,20,1,37,1,12,1,19,1,44,34,23,141,22,29,254,86,202,216,59,147,57,0,2,0,115,255,236,4,55,6,20,0,18,0,31,0,66,64,33,29,6,23,0,14,14,17,6,17,32,33,18,21,15,0,0,1,1,12,3,9,9,26,70,89,9,16,3,19,70,89,3,22,0,63,43,0,24,63,43,17,18,0,57,57,17,51,24,63,63,17,18,1,57,57,17,51,17,51,51,17,51,49,48,37,35,6,35,34,2,17,16,18,51,50,23,51,39,39,17,51,17,35,37,50,54,53,53,52,38,35,34,6,21,20,22,3,154,9,115,229,215,239,240,214,223,119,13,7,4,166,135,254,158,170,153,155,170,146,155,154,147,167,1,38,1,15,1,15,1,44,162,79,77,1,190,249,236,119,185,206,35,233,199,227,207,210,214,0,2,0,115,255,236,4,18,4,92,0,19,0,26,0,59,64,31,24,10,23,11,3,3,17,10,3,28,27,23,11,70,89,23,23,0,6,6,20,70,89,6,16,0,14,70,89,0,22,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,51,17,51,49,48,5,34,0,17,16,0,51,50,18,21,21,33,22,22,51,50,55,21,6,6,3,34,6,7,33,52,38,2,127,243,254,231,1,5,220,206,240,253,13,5,185,168,177,173,88,157,156,132,157,14,2,61,140,20,1,40,1,7,1,9,1,56,254,241,222,105,193,200,74,148,38,33,3,229,172,152,157,167,0,0,1,0,29,0,0,3,14,6,31,0,20,0,57,64,29,20,12,12,19,2,2,7,3,5,3,21,22,10,15,70,89,10,0,1,5,7,5,70,89,19,7,15,3,21,0,63,63,51,43,17,0,51,24,63,43,17,18,1,57,57,17,51,51,17,51,51,18,57,49,48,1,33,17,35,17,35,53,55,53,16,33,50,23,7,38,35,34,6,21,21,33,2,158,254,233,166,196,196,1,97,87,117,43,96,68,94,90,1,23,3,199,252,57,3,199,75,60,61,1,148,35,133,31,125,138,71,0,0,3,0,39,254,20,4,49,4,92,0,42,0,55,0,65,0,110,64,62,43,25,56,37,12,31,61,5,49,19,1,19,5,2,42,34,28,31,37,25,10,66,67,28,15,53,15,53,70,89,8,59,71,89,10,34,8,42,15,8,15,8,22,42,42,2,71,89,42,15,40,63,71,89,40,16,22,46,71,89,22,27,0,63,43,0,24,63,43,0,24,63,43,17,18,0,57,57,24,47,47,17,18,57,57,43,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,21,7,22,22,21,20,6,35,34,39,6,21,20,22,51,51,50,22,21,20,4,33,34,38,53,52,54,55,38,38,53,52,54,55,38,38,53,52,54,51,50,23,1,20,22,51,50,54,53,52,38,35,35,34,6,19,20,22,51,50,53,52,35,34,6,4,49,203,28,44,220,192,49,43,106,74,90,194,178,191,254,220,254,232,215,233,128,116,42,57,64,69,85,107,216,198,86,69,254,17,150,140,209,201,110,152,199,113,126,90,130,116,243,246,117,126,4,72,105,24,35,113,71,161,192,8,56,85,45,43,150,143,182,191,160,146,100,146,26,19,80,53,60,90,42,35,168,108,180,195,20,251,0,89,92,125,107,89,69,108,3,60,115,118,236,247,126,0,1,0,176,0,0,4,68,6,20,0,22,0,51,64,25,14,12,8,8,9,0,22,9,22,23,24,14,9,18,18,4,70,89,18,16,10,0,0,9,21,0,63,51,63,63,43,17,18,0,57,17,18,1,57,57,17,51,17,51,17,51,51,49,48,33,17,52,38,35,34,6,21,17,35,17,51,17,20,7,51,54,54,51,50,22,21,17,3,158,122,130,173,159,166,166,8,10,49,181,116,201,201,2,197,134,132,188,214,253,195,6,20,254,41,85,56,79,91,191,208,253,53,0,0,2,0,162,0,0,1,102,5,223,0,3,0,15,0,35,64,17,10,0,0,4,1,1,16,17,13,7,72,89,13,2,15,1,21,0,63,63,206,43,17,18,1,57,17,51,51,17,51,49,48,33,35,17,51,3,52,54,51,50,22,21,20,6,35,34,38,1,86,166,166,180,56,42,40,58,58,40,42,56,4,72,1,41,57,53,54,56,56,55,55,0,0,2,255,145,254,20,1,102,5,223,0,12,0,24,0,44,64,22,19,11,11,13,8,8,25,26,22,16,72,89,22,64,9,15,0,5,70,89,0,27,0,63,43,0,24,63,26,206,43,17,18,1,57,17,51,51,17,51,49,48,19,34,39,53,22,51,50,54,53,17,51,17,16,3,52,54,51,50,22,21,20,6,35,34,38,43,95,59,69,67,78,73,166,180,56,42,40,58,58,40,42,56,254,20,25,135,20,85,87,4,252,251,16,254,188,7,93,57,53,54,56,56,55,55,0,1,0,176,0,0,4,29,6,20,0,16,0,54,64,27,16,14,10,10,11,11,8,6,4,5,8,4,17,18,12,0,0,16,16,8,8,3,7,11,21,3,15,0,63,63,51,18,57,47,57,17,51,63,17,18,1,23,57,17,57,17,51,17,51,51,49,48,1,54,55,1,51,1,1,35,1,7,17,35,17,51,17,20,7,1,84,43,88,1,98,197,254,68,1,219,201,254,125,125,164,164,8,2,49,61,99,1,119,254,45,253,139,2,6,108,254,102,6,20,252,199,55,115,0,1,0,176,0,0,1,86,6,20,0,3,0,22,64,9,0,1,1,4,5,2,0,1,21,0,63,63,17,18,1,57,17,51,49,48,33,35,17,51,1,86,166,166,6,20,0,1,0,176,0,0,6,203,4,92,0,35,0,70,64,35,21,17,17,18,8,9,0,35,9,18,35,3,36,37,28,22,21,21,18,25,4,13,25,13,70,89,31,25,16,19,15,9,0,18,21,0,63,51,51,63,63,51,43,17,0,51,17,18,57,24,47,51,51,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,33,17,52,38,35,34,6,21,17,35,17,52,38,35,34,6,21,17,35,17,51,23,51,54,54,51,32,23,51,54,54,51,50,22,21,17,6,37,112,118,155,148,166,112,119,156,145,166,135,27,8,47,171,106,1,1,79,8,49,186,119,186,185,2,201,131,131,178,185,253,156,2,201,131,131,187,213,253,193,4,72,150,80,90,186,86,100,191,210,253,53,0,0,1,0,176,0,0,4,68,4,92,0,20,0,49,64,24,0,20,12,8,8,9,20,9,22,21,12,9,16,16,4,70,89,16,16,10,15,0,9,21,0,63,51,63,63,43,17,18,0,57,17,18,1,57,57,17,51,17,51,17,51,49,48,33,17,52,38,35,34,6,21,17,35,17,51,23,51,54,54,51,50,22,21,17,3,158,122,130,172,160,166,135,27,8,51,184,113,198,200,2,197,134,132,186,214,253,193,4,72,150,81,89,191,210,253,53,0,2,0,115,255,236,4,98,4,92,0,12,0,24,0,40,64,20,19,0,13,7,0,7,26,25,10,22,70,89,10,16,3,16,70,89,3,22,0,63,43,0,24,63,43,17,18,1,57,57,17,51,17,51,49,48,1,16,0,35,34,38,2,53,16,0,51,50,0,1,20,22,51,50,54,53,52,38,35,34,6,4,98,254,242,238,147,228,124,1,12,238,230,1,15,252,189,168,163,163,169,169,165,163,166,2,37,254,244,254,211,138,1,2,173,1,12,1,43,254,206,254,251,210,220,219,211,209,217,214,0,2,0,176,254,20,4,117,4,92,0,20,0,33,0,63,64,32,25,11,4,7,7,8,31,18,8,18,34,35,4,11,0,15,15,21,70,89,15,16,9,15,8,27,0,28,70,89,0,22,0,63,43,0,24,63,63,63,43,17,18,0,57,57,17,18,1,57,57,17,51,17,51,17,51,51,51,49,48,5,34,38,39,35,22,21,17,35,17,51,23,51,54,54,51,50,18,17,16,2,3,34,6,7,21,20,22,51,50,54,53,52,38,2,174,107,177,60,12,12,166,135,23,8,64,170,110,218,237,241,238,168,150,2,154,170,142,161,161,20,79,82,96,86,254,61,6,52,150,90,80,254,214,254,243,254,242,254,213,3,227,186,203,37,231,199,230,202,205,219,0,2,0,115,254,20,4,55,4,92,0,12,0,31,0,68,64,34,10,16,29,22,3,26,26,25,16,25,32,33,26,27,23,15,29,30,30,22,13,19,19,7,70,89,19,16,13,0,70,89,13,22,0,63,43,0,24,63,43,17,18,0,57,57,17,51,24,63,63,17,18,1,57,57,17,51,17,51,51,51,17,51,49,48,37,50,54,55,53,52,38,35,34,6,21,20,22,23,34,2,17,16,18,51,50,23,51,55,51,17,35,17,52,55,35,6,2,78,166,152,5,156,169,146,155,153,125,212,238,240,214,225,121,9,24,131,166,11,13,115,119,178,211,37,230,202,227,207,207,217,139,1,42,1,11,1,13,1,46,170,150,249,204,1,213,100,70,167,0,1,0,176,0,0,3,39,4,92,0,16,0,42,64,20,13,9,9,10,10,2,17,18,11,15,13,0,10,21,0,5,70,89,0,16,0,63,43,0,24,63,18,57,63,17,18,1,57,57,17,51,17,51,49,48,1,50,23,7,38,35,34,6,21,17,35,17,51,23,51,54,54,2,164,73,58,23,68,52,133,189,166,137,19,8,61,172,4,92,12,154,15,216,161,253,180,4,72,203,107,116,0,1,0,106,255,236,3,115,4,92,0,36,0,54,64,28,30,19,12,0,0,24,5,19,4,37,38,12,30,3,22,22,27,70,89,22,16,6,3,9,70,89,3,22,0,63,43,0,24,47,63,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,49,48,1,20,6,35,34,39,53,22,22,51,50,54,53,52,38,39,46,2,53,52,54,51,50,23,7,38,35,34,6,21,20,22,22,23,22,22,3,115,228,206,218,122,79,181,84,130,140,111,161,153,129,63,218,190,177,169,59,165,134,118,120,45,100,142,195,137,1,43,153,166,69,154,40,46,83,85,64,91,62,57,85,108,75,134,155,72,135,68,74,65,44,62,56,53,71,144,0,1,0,31,255,236,2,168,5,70,0,22,0,52,64,27,16,20,20,9,11,9,18,3,4,24,23,10,19,16,19,71,89,14,64,16,15,7,0,70,89,7,22,0,63,43,0,24,63,26,205,43,17,0,51,17,18,1,23,57,17,51,17,51,49,48,37,50,54,55,21,6,6,35,32,17,17,35,53,55,55,51,21,33,21,33,17,20,22,2,18,44,82,24,27,105,42,254,194,157,157,70,96,1,62,254,194,94,117,13,7,127,13,17,1,79,2,140,80,69,234,254,129,253,123,99,106,0,0,1,0,164,255,236,4,57,4,72,0,20,0,52,64,25,1,19,7,12,12,10,19,10,21,22,12,13,13,16,8,20,15,16,4,70,89,16,22,11,21,0,63,63,43,0,24,63,51,18,57,17,51,17,18,1,57,57,17,51,17,51,17,51,49,48,1,17,20,22,51,50,54,53,17,51,17,35,39,35,6,6,35,34,38,53,17,1,76,122,130,172,159,166,137,24,9,51,181,116,200,199,4,72,253,57,134,132,188,213,2,64,251,184,147,81,86,190,209,2,205,0,0,1,0,0,0,0,4,2,4,72,0,11,0,24,64,10,1,10,12,13,5,9,1,15,0,21,0,63,63,51,57,17,18,1,57,57,49,48,33,1,51,19,22,23,51,54,18,19,51,1,1,160,254,96,178,236,80,14,8,11,117,204,178,254,96,4,72,253,118,228,68,53,1,77,2,48,251,184,0,1,0,23,0,0,6,35,4,72,0,28,0,44,64,20,9,27,29,30,23,22,14,13,3,4,13,4,8,26,18,9,15,0,8,21,0,63,51,63,51,51,18,57,57,17,51,17,51,51,51,17,18,1,57,57,49,48,33,3,38,39,35,6,7,3,35,1,51,18,18,23,51,54,54,55,19,51,19,22,23,51,54,54,19,51,1,4,47,201,19,52,8,40,30,207,192,254,213,174,106,111,8,8,11,49,18,201,180,196,56,20,8,4,35,191,172,254,209,2,131,59,209,175,95,253,127,4,72,254,99,254,80,75,57,181,53,2,117,253,139,172,117,36,150,2,220,251,184,0,0,1,0,39,0,0,4,8,4,72,0,11,0,34,64,17,7,5,6,0,1,5,12,13,9,3,1,8,11,21,4,1,15,0,63,51,63,51,18,57,57,17,18,1,23,57,49,48,1,1,51,1,1,51,1,1,35,1,1,35,1,184,254,131,189,1,33,1,32,187,254,131,1,145,188,254,205,254,202,188,2,49,2,23,254,92,1,164,253,233,253,207,1,188,254,68,0,1,0,2,254,20,4,6,4,72,0,21,0,36,64,18,9,15,0,3,22,23,4,13,0,13,18,70,89,13,27,8,0,15,0,63,50,63,43,17,18,0,57,17,18,1,23,57,49,48,19,51,19,22,23,51,54,54,19,51,1,6,6,35,34,39,53,22,51,50,55,55,2,178,240,79,19,8,13,83,230,178,254,41,70,187,136,76,74,55,68,171,73,61,4,72,253,143,214,95,51,247,2,124,251,32,185,155,17,133,12,192,156,0,0,1,0,82,0,0,3,109,4,72,0,9,0,43,64,23,8,1,3,7,0,7,4,1,4,10,11,5,4,71,89,5,15,1,8,71,89,1,21,0,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,33,33,53,1,33,53,33,21,1,33,3,109,252,229,2,86,253,207,2,231,253,178,2,93,113,3,86,129,129,252,186,0,1,0,61,254,188,2,193,5,182,0,28,0,44,64,21,25,26,26,11,23,0,0,15,7,20,3,3,7,11,3,29,30,19,3,4,39,0,63,63,17,18,1,23,57,17,51,17,51,51,17,51,17,51,17,51,49,48,37,20,22,23,21,38,38,53,17,52,38,35,53,54,54,53,17,52,54,51,21,6,21,17,20,7,21,22,21,1,219,117,113,190,208,126,120,130,116,216,182,230,223,223,12,102,92,2,140,2,170,154,1,47,104,89,141,2,92,96,1,50,155,172,139,6,193,254,217,215,39,12,39,215,0,1,1,238,254,16,2,123,6,20,0,3,0,22,64,9,2,3,3,4,5,3,27,0,0,0,63,63,17,18,1,57,17,51,49,48,1,51,17,35,1,238,141,141,6,20,247,252,0,1,0,72,254,188,2,203,5,182,0,29,0,44,64,21,21,5,10,18,18,2,25,0,29,29,14,14,25,5,3,30,31,21,39,6,3,0,63,63,17,18,1,23,57,17,51,17,51,17,51,51,17,51,17,51,49,48,1,38,53,17,52,39,53,50,22,21,17,20,22,23,21,34,6,21,17,20,6,7,53,54,54,53,17,52,54,55,2,10,223,227,184,211,118,130,122,126,205,190,111,116,110,113,2,63,39,215,1,39,193,6,139,174,153,254,206,97,91,2,141,89,104,254,209,153,171,2,140,2,92,102,1,41,114,120,20,0,0,1,0,104,2,80,4,41,3,84,0,23,0,36,64,17,3,15,24,25,18,12,80,89,3,18,15,6,6,0,80,89,6,0,47,43,0,16,24,196,47,196,43,17,18,1,57,57,49,48,1,34,6,7,53,54,51,50,22,23,22,22,51,50,54,55,21,6,35,34,38,39,38,38,1,82,53,127,54,100,144,68,113,89,66,98,47,54,128,54,102,142,72,126,72,75,90,2,201,67,54,151,109,28,38,28,27,64,57,150,110,33,32,32,24,0,0,2,0,152,254,139,1,137,4,94,0,3,0,14,0,43,64,20,2,4,4,3,9,9,15,16,0,0,3,12,12,6,79,89,12,16,3,34,0,63,63,43,17,18,0,57,24,47,17,18,1,57,17,51,51,17,51,49,48,19,51,19,35,19,20,35,34,38,53,52,54,51,50,22,219,105,51,207,225,121,60,60,63,57,51,70,2,172,251,223,5,76,135,71,64,63,72,64,0,1,0,190,255,236,3,219,5,203,0,27,0,62,64,30,22,8,13,3,3,10,4,0,16,16,4,8,3,28,29,25,5,2,19,10,13,2,13,2,13,4,11,7,4,25,0,63,63,18,57,57,47,47,17,51,51,17,51,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,37,6,7,21,35,53,38,2,53,16,37,53,51,21,22,22,23,7,38,35,34,6,21,20,22,51,50,55,3,203,105,147,133,203,193,1,140,135,75,142,49,49,133,109,172,162,159,167,141,142,240,54,6,200,206,32,1,17,250,1,252,62,172,164,3,33,23,140,51,211,217,212,203,59,0,1,0,63,0,0,4,68,5,201,0,29,0,72,64,38,24,19,9,13,13,26,22,17,2,11,22,19,5,30,31,12,24,25,24,78,89,9,25,25,19,0,19,16,76,89,19,24,0,5,75,89,0,7,0,63,43,0,24,63,43,17,18,0,57,24,47,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,17,51,49,48,1,50,23,7,38,35,34,6,21,17,33,21,33,21,20,6,7,33,21,33,53,54,53,53,35,53,51,17,52,54,2,170,190,170,61,154,143,123,125,1,166,254,90,65,74,3,27,251,251,205,198,198,224,5,201,84,133,77,124,140,254,217,127,221,100,136,44,154,141,47,244,223,127,1,60,178,205,0,0,2,0,123,1,6,4,23,4,160,0,27,0,39,0,32,64,13,28,0,34,14,0,14,40,41,31,21,21,37,7,0,47,51,51,47,51,17,18,1,57,57,17,51,17,51,49,48,19,52,55,39,55,23,54,51,50,23,55,23,7,22,21,20,7,23,7,39,6,35,34,39,7,39,55,38,55,20,22,51,50,54,53,52,38,35,34,6,184,74,135,94,135,104,130,127,102,137,95,134,74,74,131,92,137,102,127,134,100,135,92,133,74,129,157,116,116,158,160,114,116,157,2,211,122,107,140,92,133,73,73,133,92,138,113,118,131,103,135,92,133,71,73,133,92,136,107,124,112,160,159,113,114,162,164,0,0,1,0,31,0,0,4,113,5,182,0,22,0,86,64,46,18,14,7,11,11,16,12,5,9,2,9,3,12,20,14,21,7,23,24,10,14,14,7,15,6,18,18,3,0,19,21,15,19,31,19,2,15,19,15,19,12,1,21,6,12,24,0,63,63,51,18,57,57,47,47,93,17,18,57,50,50,17,51,17,51,51,17,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,1,51,1,33,21,33,21,33,21,33,17,35,17,33,53,33,53,33,53,33,1,51,2,72,1,123,174,254,96,1,6,254,195,1,61,254,195,164,254,196,1,60,254,196,1,0,254,101,178,2,223,2,215,252,254,127,170,127,254,244,1,12,127,170,127,3,2,0,2,1,238,254,16,2,123,6,20,0,3,0,7,0,36,64,16,2,6,6,3,7,7,8,9,4,3,4,3,7,27,0,0,0,63,63,57,57,47,47,17,18,1,57,17,51,51,17,51,49,48,1,51,17,35,17,51,17,35,1,238,141,141,141,141,6,20,252,248,254,13,252,247,0,2,0,123,255,248,3,150,6,29,0,49,0,61,0,67,64,38,50,0,19,6,42,30,56,25,25,30,12,6,0,35,6,62,63,21,3,59,54,28,45,6,33,9,33,39,71,89,33,21,9,16,71,89,9,0,0,63,43,0,24,63,43,17,18,0,23,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,19,52,54,55,38,38,53,52,54,51,50,22,23,7,38,38,35,34,6,21,20,22,23,22,22,21,20,6,7,22,21,20,6,35,34,39,53,22,22,51,50,54,53,52,38,38,39,46,2,55,20,22,23,23,54,53,52,38,39,6,6,139,86,78,74,84,207,197,94,159,97,53,98,135,76,116,116,123,154,186,150,82,74,153,234,212,218,128,78,194,82,134,141,48,108,115,142,134,66,146,132,167,49,137,147,185,68,85,3,41,86,137,37,40,111,85,121,139,29,39,131,39,27,59,64,60,84,55,68,151,107,90,141,41,81,146,140,153,65,148,37,45,76,71,46,58,58,43,52,90,114,98,77,105,61,19,80,111,83,112,57,19,100,0,2,1,53,5,14,3,104,5,211,0,11,0,23,0,30,64,12,6,0,12,18,0,18,24,25,15,3,21,9,0,47,51,205,50,17,18,1,57,57,17,51,17,51,49,48,1,52,54,51,50,22,21,20,6,35,34,38,37,52,54,51,50,22,21,20,6,35,34,38,1,53,53,37,38,55,55,38,37,53,1,125,53,37,37,55,55,37,37,53,5,113,52,46,46,52,50,49,49,50,52,46,46,52,50,49,49,0,0,3,0,100,255,236,6,68,5,203,0,22,0,38,0,54,0,70,64,39,39,23,3,15,47,31,31,20,9,15,23,5,55,56,6,12,0,18,15,12,31,12,2,0,18,16,18,2,12,18,12,18,27,43,35,19,51,27,4,0,63,51,63,51,18,57,57,47,47,93,93,17,51,17,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,6,21,20,22,51,50,55,21,6,6,35,34,38,53,52,54,51,50,23,7,38,1,52,18,36,51,50,4,18,21,20,2,4,35,34,36,2,55,20,18,4,51,50,36,18,53,52,2,36,35,34,4,2,3,125,125,135,127,131,86,125,48,101,70,194,208,221,191,128,118,58,108,252,151,200,1,94,202,200,1,94,202,194,254,162,208,207,254,162,195,105,174,1,45,172,174,1,42,175,174,254,215,176,174,254,214,175,4,35,174,154,168,162,45,124,20,28,241,216,209,246,60,118,51,254,184,200,1,94,202,200,254,162,202,197,254,166,208,207,1,90,198,173,254,211,173,174,1,41,176,174,1,42,175,174,254,215,0,0,2,0,70,3,20,2,113,5,199,0,22,0,31,0,55,64,28,23,6,27,10,1,1,22,22,16,6,3,32,33,28,10,10,18,25,22,0,3,16,3,2,3,13,18,31,0,63,51,212,93,196,51,18,57,47,51,17,18,1,23,57,17,51,17,51,51,17,51,49,48,1,39,6,35,34,38,53,52,54,55,55,53,52,35,34,7,39,54,51,50,22,21,17,37,20,51,50,53,53,7,6,6,2,20,24,92,140,95,111,154,165,117,148,100,104,43,114,133,130,137,254,80,112,201,98,112,103,3,33,84,97,99,102,102,105,6,4,39,133,51,96,56,105,121,254,60,188,100,180,49,4,4,57,0,2,0,82,0,117,3,170,3,190,0,6,0,13,0,41,64,19,3,6,10,13,2,4,11,9,9,4,13,6,4,14,15,12,5,8,1,0,47,51,47,51,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,19,1,23,1,1,7,1,37,1,23,1,1,7,1,82,1,86,119,254,223,1,33,119,254,170,1,139,1,88,117,254,225,1,31,117,254,168,2,39,1,151,69,254,162,254,161,71,1,151,27,1,151,69,254,162,254,161,71,1,151,0,0,1,0,104,1,8,4,41,3,23,0,5,0,27,64,12,2,1,4,1,6,7,5,4,80,89,5,2,0,47,47,43,17,18,1,57,57,17,51,49,48,1,17,35,17,33,53,4,41,137,252,200,3,23,253,241,1,133,138,0,255,255,0,84,1,217,2,63,2,113,2,6,0,16,0,0,0,4,0,100,255,236,6,68,5,203,0,8,0,22,0,38,0,54,0,93,64,51,39,23,0,17,17,18,4,9,47,31,31,13,9,12,18,23,6,55,56,12,16,16,0,0,14,19,14,18,8,19,15,18,31,18,2,0,19,16,19,2,18,19,18,19,27,43,35,19,51,27,4,0,63,51,63,51,18,57,57,47,47,93,93,17,51,17,51,17,18,57,47,51,17,51,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,51,50,54,53,52,38,35,35,5,20,6,7,19,35,3,35,17,35,17,33,50,22,1,52,18,36,51,50,4,18,21,20,2,4,35,34,36,2,55,20,18,4,51,50,36,18,53,52,2,36,35,34,4,2,2,211,108,80,97,86,93,106,1,178,85,77,238,168,207,135,148,1,5,166,155,251,223,200,1,94,202,200,1,94,202,194,254,162,208,207,254,162,195,105,174,1,45,172,174,1,42,175,174,254,215,176,174,254,214,175,2,250,83,64,75,65,136,80,123,30,254,117,1,98,254,158,3,123,130,254,197,200,1,94,202,200,254,162,202,197,254,166,208,207,1,90,198,173,254,211,173,174,1,41,176,174,1,42,175,174,254,215,0,1,255,250,6,20,4,6,6,147,0,3,0,17,181,0,5,1,4,1,2,0,47,51,17,1,51,17,51,49,48,1,33,53,33,4,6,251,244,4,12,6,20,127,0,2,0,127,3,92,2,238,5,203,0,12,0,24,0,33,64,14,13,0,19,6,0,6,25,26,16,10,192,22,3,4,0,63,51,26,204,50,17,18,1,57,57,17,51,17,51,49,48,19,52,54,51,50,22,21,20,6,6,35,34,38,55,20,22,51,50,54,53,52,38,35,34,6,127,181,130,130,182,82,146,84,130,181,115,117,81,80,115,113,82,83,115,4,147,130,182,181,131,84,143,84,180,131,82,114,113,83,84,113,114,0,255,255,0,104,0,1,4,41,4,195,2,38,0,14,0,0,0,7,2,43,0,0,253,116,0,1,0,49,2,74,2,141,5,201,0,24,0,35,64,17,7,19,23,1,1,14,19,0,4,26,25,10,16,31,23,1,32,0,63,51,63,51,17,18,1,23,57,17,51,17,51,49,48,1,33,53,55,62,2,53,52,38,35,34,6,7,39,54,51,50,22,21,20,6,7,7,33,2,141,253,164,236,89,82,33,80,63,52,98,69,66,131,152,132,147,89,147,174,1,184,2,74,104,230,86,97,76,54,68,69,38,50,88,111,130,112,80,151,138,165,0,1,0,33,2,57,2,141,5,201,0,35,0,57,64,34,15,5,5,0,3,18,30,10,6,36,37,18,93,19,109,19,2,76,19,1,11,19,27,19,2,19,19,8,26,33,31,13,8,33,0,63,51,63,51,18,57,47,93,93,93,51,17,18,1,23,57,17,51,49,48,1,20,6,7,22,21,20,6,35,34,39,53,22,51,50,53,52,35,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,2,115,82,68,176,184,168,152,116,147,123,211,231,117,119,103,99,80,67,66,112,56,69,63,140,94,136,157,4,231,80,103,23,47,162,128,143,56,123,68,162,145,107,79,68,61,68,43,35,90,45,54,119,0,1,1,137,4,217,3,18,6,33,0,9,0,19,182,9,4,10,11,4,128,9,0,47,26,205,17,18,1,57,57,49,48,1,54,54,55,51,21,6,6,7,35,1,137,48,111,32,202,44,174,64,111,4,242,62,176,65,21,65,190,52,0,1,0,176,254,20,4,68,4,72,0,22,0,53,64,26,5,10,10,8,16,0,19,19,20,8,20,24,23,6,21,15,20,27,13,2,70,89,13,22,9,21,0,63,63,43,0,24,63,63,51,17,18,1,57,57,17,51,17,51,51,17,51,17,51,49,48,1,16,51,50,54,53,17,51,17,35,39,35,6,35,34,39,35,22,21,17,35,17,51,1,86,254,171,159,166,136,26,10,111,229,150,88,10,10,166,166,1,125,254,250,189,212,2,64,251,184,147,167,92,84,160,254,192,6,52,0,1,0,113,254,252,4,96,6,20,0,15,0,39,64,18,4,5,1,0,0,5,11,3,16,17,8,8,5,3,15,5,1,5,0,47,51,63,51,18,57,47,17,18,1,23,57,17,51,17,51,49,48,1,35,17,35,17,35,17,6,35,34,38,53,16,54,51,33,4,96,114,213,115,62,84,216,203,218,232,2,45,254,252,6,176,249,80,3,51,18,250,251,1,4,254,0,1,0,152,2,76,1,137,3,90,0,11,0,23,64,10,6,0,0,13,12,3,9,79,89,3,0,47,43,17,18,1,57,17,51,49,48,19,52,54,51,50,22,21,20,6,35,34,38,152,62,56,58,65,66,57,51,67,2,211,66,69,69,66,65,70,63,0,0,1,0,37,254,20,1,180,0,0,0,18,0,36,64,16,17,14,11,0,0,14,5,3,19,20,14,17,17,8,3,16,0,47,204,50,57,47,51,17,18,1,23,57,17,51,17,51,49,48,1,20,6,35,34,39,53,22,51,50,54,53,52,38,39,55,51,7,22,1,180,153,150,51,45,45,59,79,81,79,109,88,110,55,180,254,223,97,106,9,106,8,40,54,43,53,17,178,115,39,0,1,0,76,2,74,1,225,5,182,0,10,0,32,64,14,2,0,3,3,10,12,11,9,9,3,32,6,0,30,0,63,50,63,57,47,17,18,1,57,57,17,51,51,49,48,1,51,17,35,17,52,55,6,6,7,39,1,82,143,133,6,22,54,135,67,5,182,252,148,2,67,91,90,22,45,95,96,0,2,0,66,3,20,2,190,5,199,0,11,0,23,0,37,64,18,12,6,18,0,6,0,24,25,15,0,3,16,3,2,3,21,9,31,0,63,51,196,93,50,17,18,1,57,57,17,51,17,51,49,48,1,20,6,35,34,38,53,52,54,51,50,22,5,20,22,51,50,54,53,52,38,35,34,6,2,190,171,150,146,169,168,151,152,165,253,254,91,104,105,92,92,105,103,92,4,111,164,183,186,161,163,181,182,162,122,122,122,122,123,118,118,0,2,0,80,0,117,3,168,3,190,0,6,0,13,0,35,64,17,11,9,4,2,0,3,7,2,10,9,6,14,15,12,5,8,1,0,47,51,47,51,17,18,1,23,57,17,51,17,51,49,48,1,1,39,1,1,55,1,5,1,39,1,1,55,1,3,168,254,168,117,1,31,254,225,117,1,88,254,117,254,168,117,1,31,254,225,117,1,88,2,12,254,105,71,1,95,1,94,69,254,105,27,254,105,71,1,95,1,94,69,254,105,255,255,0,75,0,0,5,209,5,182,0,39,2,23,2,131,0,0,0,38,0,123,255,0,1,7,2,60,3,29,253,183,0,9,179,3,2,18,24,0,63,53,53,0,255,255,0,46,0,0,5,219,5,182,0,39,2,23,2,63,0,0,0,38,0,123,226,0,1,7,0,116,3,78,253,183,0,7,178,2,16,24,0,63,53,0,255,255,0,26,0,0,6,33,5,201,0,38,0,117,249,0,0,39,2,23,2,223,0,0,1,7,2,60,3,109,253,183,0,9,179,3,2,43,24,0,63,53,53,0,0,2,0,51,254,119,3,84,4,94,0,29,0,40,0,65,64,34,8,20,30,35,1,28,15,28,35,20,4,41,42,0,29,1,12,3,29,29,17,38,38,32,79,89,38,16,17,11,73,89,17,35,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,17,18,1,23,57,17,51,17,51,17,51,49,48,1,21,20,6,7,14,2,21,20,22,51,50,54,55,23,6,35,34,38,53,52,62,2,55,54,54,53,53,19,20,35,34,38,53,52,54,51,50,22,2,78,75,97,121,61,25,132,122,80,150,98,59,197,198,190,216,35,64,89,54,101,65,180,121,59,62,66,55,51,70,2,172,51,122,148,84,106,75,77,56,100,113,38,48,135,96,186,170,70,105,89,82,47,88,116,93,31,1,43,135,69,66,64,71,64,255,255,0,0,0,0,5,16,7,115,2,38,0,36,0,0,1,7,0,67,255,194,1,82,0,8,179,2,16,5,38,0,43,53,255,255,0,0,0,0,5,16,7,115,2,38,0,36,0,0,1,7,0,118,0,133,1,82,0,8,179,2,24,5,38,0,43,53,255,255,0,0,0,0,5,16,7,115,2,38,0,36,0,0,1,7,1,75,0,35,1,82,0,8,179,2,29,5,38,0,43,53,255,255,0,0,0,0,5,16,7,47,2,38,0,36,0,0,1,7,1,82,0,4,1,82,0,8,179,2,24,5,38,0,43,53,255,255,0,0,0,0,5,16,7,37,2,38,0,36,0,0,1,7,0,106,0,55,1,82,0,10,180,3,2,36,5,38,0,43,53,53,255,255,0,0,0,0,5,16,7,6,2,38,0,36,0,0,0,7,1,80,0,57,0,129,0,2,255,254,0,0,6,129,5,182,0,15,0,19,0,78,64,44,10,14,14,17,1,0,8,12,1,16,5,5,21,5,20,9,19,6,19,73,89,16,3,73,89,10,13,73,89,16,10,16,10,1,6,3,5,18,1,14,73,89,1,18,0,63,43,0,24,63,63,18,57,57,47,47,43,43,43,17,0,51,17,1,51,17,18,23,57,17,51,51,17,51,49,48,33,33,17,33,3,35,1,33,21,33,17,33,21,33,17,33,1,33,17,35,6,129,253,18,253,254,227,176,2,186,3,201,253,188,2,29,253,227,2,68,251,84,1,190,118,1,209,254,47,5,182,151,254,41,150,253,230,1,210,2,181,0,255,255,0,125,254,20,4,207,5,203,2,38,0,38,0,0,0,7,0,122,2,2,0,0,255,255,0,201,0,0,3,248,7,115,2,38,0,40,0,0,1,7,0,67,255,183,1,82,0,8,179,1,13,5,38,0,43,53,255,255,0,201,0,0,3,248,7,115,2,38,0,40,0,0,1,7,0,118,0,63,1,82,0,8,179,1,21,5,38,0,43,53,255,255,0,201,0,0,3,248,7,115,2,38,0,40,0,0,1,7,1,75,255,251,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,201,0,0,3,248,7,37,2,38,0,40,0,0,1,7,0,106,0,18,1,82,0,10,180,2,1,33,5,38,0,43,53,53,255,255,0,60,0,0,2,86,7,115,2,38,0,44,0,0,1,7,0,67,254,179,1,82,0,8,179,1,13,5,38,0,43,53,255,255,0,84,0,0,2,115,7,115,2,38,0,44,0,0,1,7,0,118,255,97,1,82,0,8,179,1,21,5,38,0,43,53,255,255,255,255,0,0,2,161,7,115,2,38,0,44,0,0,1,7,1,75,254,243,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,60,0,0,2,111,7,37,2,38,0,44,0,0,1,7,0,106,255,7,1,82,0,10,180,2,1,33,5,38,0,43,53,53,0,2,0,47,0,0,5,72,5,182,0,12,0,23,0,87,64,50,17,21,21,8,4,13,0,0,19,4,6,4,24,25,20,6,7,6,73,89,17,15,7,63,7,175,7,207,7,223,7,5,11,3,7,7,4,9,9,16,74,89,9,3,4,21,74,89,4,18,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,49,48,1,16,0,33,33,17,35,53,51,17,33,32,0,3,16,33,35,17,33,21,33,17,51,32,5,72,254,119,254,143,254,123,154,154,1,178,1,81,1,124,181,253,199,231,1,123,254,133,190,2,98,2,233,254,150,254,129,2,137,150,2,151,254,137,254,164,2,64,253,252,150,254,10,255,255,0,201,0,0,5,63,7,47,2,38,0,49,0,0,1,7,1,82,0,147,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,125,255,236,5,190,7,115,2,38,0,50,0,0,1,7,0,67,0,121,1,82,0,8,179,2,25,5,38,0,43,53,255,255,0,125,255,236,5,190,7,115,2,38,0,50,0,0,1,7,0,118,1,10,1,82,0,8,179,2,33,5,38,0,43,53,255,255,0,125,255,236,5,190,7,115,2,38,0,50,0,0,1,7,1,75,0,180,1,82,0,8,179,2,38,5,38,0,43,53,255,255,0,125,255,236,5,190,7,47,2,38,0,50,0,0,1,7,1,82,0,154,1,82,0,8,179,2,33,5,38,0,43,53,255,255,0,125,255,236,5,190,7,37,2,38,0,50,0,0,1,7,0,106,0,213,1,82,0,10,180,3,2,45,5,38,0,43,53,53,0,1,0,133,1,16,4,12,4,152,0,11,0,25,64,9,7,9,3,1,9,1,12,13,8,0,25,47,17,18,1,57,57,17,51,17,51,49,48,1,23,1,1,7,1,1,39,1,1,55,1,3,172,96,254,160,1,94,96,254,158,254,164,101,1,94,254,160,100,1,97,4,152,99,254,158,254,160,99,1,95,254,161,99,1,96,1,96,101,254,157,0,0,3,0,125,255,195,5,190,5,246,0,19,0,27,0,35,0,78,64,44,22,31,23,30,4,28,20,28,10,20,0,0,18,15,5,8,10,6,36,37,22,30,33,25,13,33,73,89,15,18,8,5,4,3,16,13,4,3,25,73,89,6,3,19,0,63,198,43,0,24,63,198,18,23,57,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,18,23,57,49,48,1,16,0,33,34,39,7,39,55,38,17,16,0,33,50,23,55,23,7,22,3,16,39,1,22,51,50,18,1,16,23,1,38,35,34,2,5,190,254,157,254,196,235,148,101,120,108,178,1,96,1,68,209,157,97,120,106,192,180,110,253,96,115,176,243,248,252,39,101,2,157,106,168,243,253,2,221,254,161,254,110,100,141,79,154,198,1,109,1,101,1,137,94,135,80,148,202,254,149,1,16,154,252,76,82,1,50,1,42,254,250,154,3,175,73,254,205,0,255,255,0,186,255,236,5,25,7,115,2,38,0,56,0,0,1,7,0,67,0,70,1,82,0,8,179,1,19,5,38,0,43,53,255,255,0,186,255,236,5,25,7,115,2,38,0,56,0,0,1,7,0,118,0,207,1,82,0,8,179,1,27,5,38,0,43,53,255,255,0,186,255,236,5,25,7,115,2,38,0,56,0,0,1,7,1,75,0,125,1,82,0,8,179,1,32,5,38,0,43,53,255,255,0,186,255,236,5,25,7,37,2,38,0,56,0,0,1,7,0,106,0,152,1,82,0,10,180,2,1,39,5,38,0,43,53,53,255,255,0,0,0,0,4,123,7,115,2,38,0,60,0,0,1,7,0,118,0,49,1,82,0,8,179,1,18,5,38,0,43,53,0,2,0,201,0,0,4,121,5,182,0,12,0,21,0,54,64,28,13,9,5,5,6,17,0,6,0,22,23,13,4,74,89,9,21,74,89,13,9,13,9,6,7,3,6,18,0,63,63,18,57,57,47,47,43,43,17,18,1,57,57,17,51,17,51,17,51,51,49,48,1,20,4,33,35,17,35,17,51,17,51,32,4,1,51,50,54,53,52,38,35,35,4,121,254,209,254,225,184,170,170,215,1,25,1,22,252,250,168,226,202,190,202,204,3,16,227,238,254,193,5,182,255,0,207,253,234,143,164,149,138,0,0,1,0,176,255,236,4,156,6,31,0,48,0,65,64,34,41,42,5,29,35,0,23,12,12,0,29,17,42,5,49,50,18,18,42,46,46,38,70,89,46,0,42,21,15,21,70,89,15,22,0,63,43,0,24,63,63,43,17,18,0,57,24,47,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,20,7,6,6,21,20,22,22,23,22,22,21,20,6,35,34,39,53,22,22,51,50,53,52,38,39,38,38,53,52,54,55,54,54,53,52,38,35,32,21,17,35,17,52,54,51,50,22,4,25,143,88,56,27,71,78,140,102,194,179,188,107,63,156,72,215,83,110,127,96,69,71,75,64,136,127,254,236,166,220,222,206,225,4,242,135,115,70,67,33,32,42,57,51,95,157,101,160,171,69,154,39,47,182,75,107,70,82,123,84,63,106,53,57,90,53,80,85,223,251,76,4,178,178,187,157,255,255,0,94,255,236,3,205,6,33,2,38,0,68,0,0,1,6,0,67,142,0,0,8,179,2,38,17,38,0,43,53,255,255,0,94,255,236,3,205,6,33,2,38,0,68,0,0,1,6,0,118,43,0,0,8,179,2,46,17,38,0,43,53,255,255,0,94,255,236,3,205,6,33,2,38,0,68,0,0,1,6,1,75,216,0,0,8,179,2,51,17,38,0,43,53,255,255,0,94,255,236,3,205,5,221,2,38,0,68,0,0,1,6,1,82,189,0,0,8,179,2,46,17,38,0,43,53,255,255,0,94,255,236,3,205,5,211,2,38,0,68,0,0,1,6,0,106,226,0,0,10,180,3,2,58,17,38,0,43,53,53,255,255,0,94,255,236,3,205,6,133,2,38,0,68,0,0,1,6,1,80,247,0,0,10,180,3,2,40,17,38,0,43,53,53,0,3,0,94,255,236,6,115,4,92,0,41,0,52,0,59,0,97,64,51,42,0,36,17,48,56,25,25,4,48,57,24,24,31,48,11,0,5,60,61,27,45,39,45,70,89,25,49,4,49,71,89,56,36,39,17,4,4,14,34,39,22,53,8,14,8,70,89,20,14,16,0,63,51,43,17,0,51,24,63,51,18,57,47,57,18,57,51,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,18,57,57,17,51,49,48,19,52,54,55,55,53,52,38,35,34,7,39,54,54,51,50,22,23,54,54,51,50,18,21,21,33,18,33,50,54,55,21,6,6,35,32,39,6,6,35,34,38,55,20,22,51,50,54,53,53,7,6,6,1,34,6,7,33,52,38,94,248,254,184,116,119,144,163,52,74,199,98,130,165,41,53,171,110,192,232,253,67,8,1,58,91,157,84,86,149,101,254,223,125,81,197,134,163,185,174,107,88,145,168,158,186,164,3,189,121,139,11,2,7,128,1,47,161,179,8,6,68,129,123,84,127,41,53,87,95,88,96,254,245,222,107,254,117,35,39,148,38,33,233,127,106,170,151,95,89,169,154,99,7,8,109,2,50,166,158,156,168,0,255,255,0,115,254,20,3,139,4,92,2,38,0,70,0,0,0,7,0,122,1,70,0,0,255,255,0,115,255,236,4,18,6,33,2,38,0,72,0,0,1,6,0,67,181,0,0,8,179,2,28,17,38,0,43,53,255,255,0,115,255,236,4,18,6,33,2,38,0,72,0,0,1,6,0,118,78,0,0,8,179,2,36,17,38,0,43,53,255,255,0,115,255,236,4,18,6,33,2,38,0,72,0,0,1,6,1,75,247,0,0,8,179,2,41,17,38,0,43,53,255,255,0,115,255,236,4,18,5,211,2,38,0,72,0,0,1,6,0,106,10,0,0,10,180,3,2,48,17,38,0,43,53,53,255,255,255,218,0,0,1,99,6,33,2,38,0,243,0,0,1,7,0,67,254,81,0,0,0,8,179,1,5,17,38,0,43,53,255,255,0,169,0,0,2,50,6,33,2,38,0,243,0,0,1,7,0,118,255,32,0,0,0,8,179,1,13,17,38,0,43,53,255,255,255,179,0,0,2,85,6,33,2,38,0,243,0,0,1,7,1,75,254,167,0,0,0,8,179,1,18,17,38,0,43,53,255,255,255,236,0,0,2,31,5,211,2,38,0,243,0,0,1,7,0,106,254,183,0,0,0,10,180,2,1,25,17,38,0,43,53,53,0,2,0,113,255,236,4,98,6,33,0,27,0,38,0,74,64,43,33,6,12,28,28,0,0,24,25,22,14,17,19,16,6,9,39,40,9,31,70,89,11,3,22,17,25,14,15,5,20,9,9,3,23,20,1,3,36,70,89,3,22,0,63,43,0,24,63,51,18,57,47,18,23,57,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,16,0,35,34,0,53,52,0,51,50,23,55,38,39,5,39,55,38,39,55,22,23,55,23,7,22,18,3,52,38,35,32,17,20,22,51,50,54,4,98,254,251,247,222,254,233,1,7,220,226,100,8,57,205,254,241,73,233,92,94,69,156,102,238,76,207,152,165,168,180,156,254,175,175,162,175,161,2,51,254,231,254,210,1,13,226,230,1,6,121,4,214,191,155,108,133,62,49,117,73,75,138,107,119,143,254,114,254,232,147,170,254,152,167,183,201,0,255,255,0,176,0,0,4,68,5,221,2,38,0,81,0,0,1,6,1,82,14,0,0,8,179,1,30,17,38,0,43,53,255,255,0,115,255,236,4,98,6,33,2,38,0,82,0,0,1,6,0,67,212,0,0,8,179,2,26,17,38,0,43,53,255,255,0,115,255,236,4,98,6,33,2,38,0,82,0,0,1,6,0,118,86,0,0,8,179,2,34,17,38,0,43,53,255,255,0,115,255,236,4,98,6,33,2,38,0,82,0,0,1,6,1,75,14,0,0,8,179,2,39,17,38,0,43,53,255,255,0,115,255,236,4,98,5,221,2,38,0,82,0,0,1,6,1,82,241,0,0,8,179,2,34,17,38,0,43,53,255,255,0,115,255,236,4,98,5,211,2,38,0,82,0,0,1,6,0,106,27,0,0,10,180,3,2,46,17,38,0,43,53,53,0,3,0,104,0,252,4,41,4,168,0,3,0,15,0,27,0,51,64,24,22,10,10,16,4,2,4,1,3,28,29,25,19,19,1,7,13,13,1,1,0,80,89,1,0,47,43,17,0,51,24,47,51,17,51,47,51,17,18,1,23,57,17,51,51,17,51,49,48,19,53,33,21,1,52,54,51,50,22,21,20,6,35,34,38,17,52,54,51,50,22,21,20,6,35,34,38,104,3,193,253,174,59,54,52,58,59,51,52,61,59,54,52,58,59,51,52,61,2,141,138,138,254,232,60,61,63,58,57,64,63,2,244,60,61,63,58,57,64,63,0,3,0,115,255,188,4,98,4,135,0,19,0,27,0,35,0,75,64,41,23,31,28,20,20,10,28,0,0,18,15,5,8,10,6,36,37,22,30,33,25,13,25,70,89,15,18,8,5,4,3,16,13,16,3,33,70,89,6,3,22,0,63,198,43,0,24,63,198,18,23,57,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,18,57,57,49,48,1,16,0,35,34,39,7,39,55,38,17,16,0,51,50,23,55,23,7,22,5,20,23,1,38,35,34,6,5,52,39,1,22,51,50,54,4,98,254,242,238,154,112,84,114,94,129,1,12,238,154,116,84,117,97,127,252,189,53,1,209,75,114,163,166,2,151,51,254,47,71,113,163,169,2,37,254,244,254,211,69,117,78,131,152,1,0,1,12,1,43,76,119,76,133,152,249,171,102,2,134,53,214,212,164,100,253,125,51,219,0,255,255,0,164,255,236,4,57,6,33,2,38,0,88,0,0,1,6,0,67,196,0,0,8,179,1,22,17,38,0,43,53,255,255,0,164,255,236,4,57,6,33,2,38,0,88,0,0,1,6,0,118,113,0,0,8,179,1,30,17,38,0,43,53,255,255,0,164,255,236,4,57,6,33,2,38,0,88,0,0,1,6,1,75,18,0,0,8,179,1,35,17,38,0,43,53,255,255,0,164,255,236,4,57,5,211,2,38,0,88,0,0,1,6,0,106,33,0,0,10,180,2,1,42,17,38,0,43,53,53,255,255,0,2,254,20,4,6,6,33,2,38,0,92,0,0,1,6,0,118,18,0,0,8,179,1,31,17,38,0,43,53,0,2,0,176,254,20,4,117,6,20,0,22,0,34,0,62,64,31,32,6,27,20,16,16,17,6,17,36,35,18,0,17,27,12,22,9,3,9,30,70,89,9,22,3,23,70,89,3,16,0,63,43,0,24,63,43,17,18,0,57,57,24,63,63,17,18,1,57,57,17,51,17,51,51,17,51,49,48,1,54,54,51,50,18,17,16,2,35,34,39,35,23,22,21,17,35,17,51,17,20,7,37,34,6,7,21,20,22,51,32,17,52,38,1,88,66,170,106,215,240,241,214,222,122,12,4,8,166,166,6,1,72,168,152,2,154,170,1,47,148,3,180,89,79,254,212,254,245,254,244,254,211,161,34,77,63,254,53,8,0,254,46,52,90,27,184,201,41,231,199,1,176,215,209,255,255,0,2,254,20,4,6,5,211,2,38,0,92,0,0,1,6,0,106,181,0,0,10,180,2,1,43,17,38,0,43,53,53,255,255,0,0,0,0,5,16,6,180,2,38,0,36,0,0,1,7,1,77,0,63,1,82,0,8,179,2,18,5,38,0,43,53,255,255,0,94,255,236,3,205,5,98,2,38,0,68,0,0,1,6,1,77,245,0,0,8,179,2,40,17,38,0,43,53,255,255,0,0,0,0,5,16,7,55,2,38,0,36,0,0,1,7,1,78,0,43,1,82,0,8,179,2,15,5,38,0,43,53,255,255,0,94,255,236,3,205,5,229,2,38,0,68,0,0,1,6,1,78,228,0,0,8,179,2,37,17,38,0,43,53,255,255,0,0,254,66,5,17,5,188,2,38,0,36,0,0,0,7,1,81,3,160,0,0,255,255,0,94,254,66,4,0,4,90,2,38,0,68,0,0,0,7,1,81,2,143,0,0,255,255,0,125,255,236,4,207,7,115,2,38,0,38,0,0,1,7,0,118,1,8,1,82,0,8,179,1,32,5,38,0,43,53,255,255,0,115,255,236,3,139,6,33,2,38,0,70,0,0,1,6,0,118,68,0,0,8,179,1,32,17,38,0,43,53,255,255,0,125,255,236,4,207,7,115,2,38,0,38,0,0,1,7,1,75,0,172,1,82,0,8,179,1,37,5,38,0,43,53,255,255,0,115,255,236,3,139,6,33,2,38,0,70,0,0,1,6,1,75,212,0,0,8,179,1,37,17,38,0,43,53,255,255,0,125,255,236,4,207,7,49,2,38,0,38,0,0,1,7,1,79,2,27,1,82,0,8,179,1,32,5,38,0,43,53,255,255,0,115,255,236,3,139,5,223,2,38,0,70,0,0,1,7,1,79,1,80,0,0,0,8,179,1,32,17,38,0,43,53,255,255,0,125,255,236,4,207,7,115,2,38,0,38,0,0,1,7,1,76,0,193,1,82,0,8,179,1,34,5,38,0,43,53,255,255,0,115,255,236,3,161,6,33,2,38,0,70,0,0,1,6,1,76,243,0,0,8,179,1,34,17,38,0,43,53,255,255,0,201,0,0,5,88,7,115,2,38,0,39,0,0,1,7,1,76,0,88,1,82,0,8,179,2,29,5,38,0,43,53,255,255,0,115,255,236,5,129,6,20,2,38,0,71,0,0,1,7,2,56,3,12,0,0,0,7,178,2,35,0,0,63,53,0,255,255,0,47,0,0,5,72,5,182,2,6,0,146,0,0,0,2,0,115,255,236,4,211,6,20,0,26,0,39,0,100,64,55,37,6,18,14,0,30,30,21,25,22,25,16,6,4,40,41,26,21,24,16,17,16,71,89,21,15,17,31,17,47,17,3,9,3,17,17,9,19,0,1,12,3,9,9,34,70,89,9,16,3,27,70,89,3,22,0,63,43,0,24,63,43,17,18,0,57,57,24,63,18,57,47,95,94,93,51,43,17,0,51,24,63,17,18,1,23,57,17,51,51,17,51,51,51,17,51,49,48,37,35,6,35,34,2,17,16,18,51,50,23,51,38,53,53,33,53,33,53,51,21,51,21,35,17,35,37,50,54,53,53,52,38,35,34,6,21,20,22,3,154,9,115,229,215,239,240,214,223,119,13,11,254,64,1,192,166,156,156,135,254,158,170,153,155,170,146,155,154,147,167,1,38,1,15,1,15,1,44,162,83,73,133,129,184,184,129,251,37,119,185,206,35,233,199,227,207,210,214,255,255,0,201,0,0,3,248,6,180,2,38,0,40,0,0,1,7,1,77,0,18,1,82,0,8,179,1,15,5,38,0,43,53,255,255,0,115,255,236,4,18,5,98,2,38,0,72,0,0,1,6,1,77,10,0,0,8,179,2,30,17,38,0,43,53,255,255,0,201,0,0,3,248,7,55,2,38,0,40,0,0,1,7,1,78,0,16,1,82,0,8,179,1,12,5,38,0,43,53,255,255,0,115,255,236,4,18,5,229,2,38,0,72,0,0,1,6,1,78,251,0,0,8,179,2,27,17,38,0,43,53,255,255,0,201,0,0,3,248,7,20,2,38,0,40,0,0,1,7,1,79,1,111,1,53,0,8,179,1,21,5,38,0,43,53,255,255,0,115,255,236,4,18,5,223,2,38,0,72,0,0,1,7,1,79,1,84,0,0,0,8,179,2,36,17,38,0,43,53,255,255,0,201,254,66,3,248,5,182,2,38,0,40,0,0,0,7,1,81,2,115,0,0,255,255,0,115,254,97,4,18,4,92,2,38,0,72,0,0,0,7,1,81,2,102,0,31,255,255,0,201,0,0,3,248,7,115,2,38,0,40,0,0,1,7,1,76,0,16,1,82,0,8,179,1,23,5,38,0,43,53,255,255,0,115,255,236,4,18,6,33,2,38,0,72,0,0,1,6,1,76,251,0,0,8,179,2,38,17,38,0,43,53,255,255,0,125,255,236,5,61,7,115,2,38,0,42,0,0,1,7,1,75,0,233,1,82,0,8,179,1,42,5,38,0,43,53,255,255,0,39,254,20,4,49,6,33,2,38,0,74,0,0,1,6,1,75,202,0,0,8,179,3,80,17,38,0,43,53,255,255,0,125,255,236,5,61,7,55,2,38,0,42,0,0,1,7,1,78,1,0,1,82,0,8,179,1,28,5,38,0,43,53,255,255,0,39,254,20,4,49,5,229,2,38,0,74,0,0,1,6,1,78,206,0,0,8,179,3,66,17,38,0,43,53,255,255,0,125,255,236,5,61,7,49,2,38,0,42,0,0,1,7,1,79,2,100,1,82,0,8,179,1,37,5,38,0,43,53,255,255,0,39,254,20,4,49,5,223,2,38,0,74,0,0,1,7,1,79,1,31,0,0,0,8,179,3,75,17,38,0,43,53,255,255,0,125,254,59,5,61,5,203,2,38,0,42,0,0,0,7,2,57,1,39,0,0,255,255,0,39,254,20,4,49,6,33,2,38,0,74,0,0,1,6,2,58,68,0,0,8,179,3,70,17,38,0,43,53,255,255,0,201,0,0,5,31,7,115,2,38,0,43,0,0,1,7,1,75,0,150,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,176,0,0,4,68,7,170,2,38,0,75,0,0,1,7,1,75,0,31,1,137,0,8,179,1,37,2,38,0,43,53,0,2,0,0,0,0,5,231,5,182,0,19,0,23,0,84,64,44,23,3,15,15,0,16,20,4,12,12,7,11,8,11,16,18,4,24,25,23,14,73,89,22,10,18,19,18,74,89,7,3,19,23,19,23,19,1,12,16,18,5,1,3,0,63,51,63,51,18,57,57,47,47,17,51,51,43,17,0,51,51,43,17,18,1,23,57,17,51,51,17,51,51,17,51,51,17,51,51,49,48,19,53,51,21,33,53,51,21,51,21,35,17,35,17,33,17,35,17,35,53,1,53,33,21,201,170,3,2,170,200,200,170,252,254,170,201,4,117,252,254,4,190,248,248,248,248,141,251,207,2,176,253,80,4,49,141,254,138,233,233,0,1,0,20,0,0,4,68,6,20,0,30,0,89,64,50,22,20,16,8,8,13,9,0,30,30,18,9,11,4,31,32,23,22,26,4,70,89,19,11,12,11,71,89,16,12,15,12,31,12,47,12,3,22,26,12,12,26,22,3,9,14,0,0,9,21,0,63,51,63,18,23,57,47,47,47,93,17,51,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,51,51,49,48,33,17,52,38,35,34,6,21,17,35,17,35,53,51,53,51,21,33,21,33,21,20,7,51,54,54,51,50,22,21,17,3,158,122,130,174,158,166,156,156,166,1,193,254,63,8,10,49,181,116,201,201,2,158,134,132,186,213,253,231,4,219,127,186,186,127,196,84,56,79,91,191,210,253,92,255,255,255,226,0,0,2,202,7,47,2,38,0,44,0,0,1,7,1,82,254,218,1,82,0,8,179,1,21,5,38,0,43,53,255,255,255,144,0,0,2,120,5,221,2,38,0,243,0,0,1,7,1,82,254,136,0,0,0,8,179,1,13,17,38,0,43,53,255,255,0,42,0,0,2,130,6,180,2,38,0,44,0,0,1,7,1,77,254,253,1,82,0,8,179,1,15,5,38,0,43,53,255,255,255,218,0,0,2,50,5,98,2,38,0,243,0,0,1,7,1,77,254,173,0,0,0,8,179,1,7,17,38,0,43,53,255,255,0,30,0,0,2,138,7,55,2,38,0,44,0,0,1,7,1,78,254,249,1,82,0,8,179,1,12,5,38,0,43,53,255,255,255,204,0,0,2,56,5,229,2,38,0,243,0,0,1,7,1,78,254,167,0,0,0,8,179,1,4,17,38,0,43,53,255,255,0,84,254,66,2,86,5,182,2,38,0,44,0,0,0,6,1,81,104,0,255,255,0,53,254,66,1,129,5,223,2,38,0,76,0,0,0,6,1,81,16,0,255,255,0,84,0,0,2,86,7,49,2,38,0,44,0,0,1,7,1,79,0,80,1,82,0,8,179,1,21,5,38,0,43,53,0,1,0,176,0,0,1,86,4,72,0,3,0,22,64,9,0,1,1,5,4,2,15,1,21,0,63,63,17,18,1,57,17,51,49,48,33,35,17,51,1,86,166,166,4,72,255,255,0,84,254,127,4,16,5,182,0,38,0,44,0,0,0,7,0,45,2,168,0,0,255,255,0,162,254,20,3,108,5,223,0,38,0,76,0,0,0,7,0,77,2,6,0,0,255,255,255,96,254,127,2,101,7,115,2,38,0,45,0,0,1,7,1,75,254,183,1,82,0,8,179,1,28,5,38,0,43,53,255,255,255,145,254,20,2,79,6,33,2,38,2,55,0,0,1,7,1,75,254,161,0,0,0,8,179,1,27,17,38,0,43,53,255,255,0,201,254,59,4,233,5,182,2,38,0,46,0,0,0,7,2,57,0,137,0,0,255,255,0,176,254,59,4,29,6,20,2,38,0,78,0,0,0,6,2,57,43,0,0,1,0,176,0,0,4,27,4,70,0,13,0,47,64,25,13,11,7,7,8,3,1,2,5,8,5,14,15,2,13,5,6,4,8,0,9,15,4,8,21,0,63,51,63,51,18,23,57,17,18,1,23,57,17,51,17,51,51,49,48,1,51,1,1,35,1,7,17,35,17,51,17,20,7,3,47,207,254,98,1,187,201,254,151,135,178,178,12,4,70,254,30,253,156,1,248,113,254,121,4,70,254,229,166,113,255,255,0,201,0,0,3,248,7,115,2,38,0,47,0,0,1,7,0,118,255,99,1,82,0,8,179,1,15,5,38,0,43,53,255,255,0,163,0,0,2,44,7,172,2,38,0,79,0,0,1,7,0,118,255,26,1,139,0,8,179,1,13,2,38,0,43,53,255,255,0,201,254,59,3,248,5,182,2,38,0,47,0,0,0,6,2,57,49,0,255,255,0,89,254,59,1,87,6,20,2,38,0,79,0,0,0,7,2,57,254,232,0,0,255,255,0,201,0,0,3,248,5,183,2,38,0,47,0,0,1,7,2,56,1,29,255,163,0,7,178,1,9,3,0,63,53,0,255,255,0,176,0,0,2,160,6,20,2,38,0,79,0,0,1,6,2,56,43,0,0,7,178,1,7,0,0,63,53,0,255,255,0,201,0,0,3,248,5,182,2,38,0,47,0,0,0,7,1,79,2,4,253,103,255,255,0,176,0,0,2,168,6,20,0,38,0,79,0,0,0,7,1,79,1,66,253,56,0,1,0,29,0,0,3,248,5,182,0,13,0,61,64,33,7,11,11,4,0,12,9,0,3,4,15,14,9,7,4,10,3,1,6,8,2,8,2,8,0,5,3,0,11,73,89,0,18,0,63,43,0,24,63,18,57,57,47,47,18,23,57,17,18,1,23,57,17,51,51,17,51,49,48,51,17,7,39,55,17,51,17,37,23,5,17,33,21,201,105,67,172,170,1,41,67,254,148,2,133,1,252,59,114,101,3,30,253,70,174,121,211,254,60,154,0,1,255,252,0,0,2,39,6,20,0,11,0,55,64,28,0,4,4,9,5,5,12,2,13,8,12,0,2,9,3,8,6,6,1,7,1,7,1,5,10,0,5,21,0,63,63,18,57,57,47,47,18,23,57,17,1,51,17,51,18,57,17,51,51,17,51,49,48,1,55,23,7,17,35,17,7,39,55,17,51,1,86,137,72,209,166,110,70,180,166,3,96,94,112,141,253,63,2,84,72,113,119,3,32,0,255,255,0,201,0,0,5,63,7,115,2,38,0,49,0,0,1,7,0,118,1,2,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,176,0,0,4,68,6,33,2,38,0,81,0,0,1,6,0,118,121,0,0,8,179,1,30,17,38,0,43,53,255,255,0,201,254,59,5,63,5,182,2,38,0,49,0,0,0,7,2,57,0,205,0,0,255,255,0,176,254,59,4,68,4,92,2,38,0,81,0,0,0,6,2,57,86,0,255,255,0,201,0,0,5,63,7,115,2,38,0,49,0,0,1,7,1,76,0,166,1,82,0,8,179,1,28,5,38,0,43,53,255,255,0,176,0,0,4,68,6,33,2,38,0,81,0,0,1,6,1,76,31,0,0,8,179,1,32,17,38,0,43,53,255,255,0,1,0,0,4,203,5,182,0,39,0,81,0,135,0,0,1,6,2,7,232,0,0,7,178,1,28,3,0,63,53,0,0,1,0,201,254,127,5,63,5,182,0,25,0,56,64,28,16,13,13,14,8,20,20,23,23,2,14,3,26,27,18,10,14,21,15,3,14,18,0,5,73,89,0,34,0,63,43,0,24,63,63,51,18,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,34,39,53,22,51,50,54,53,1,35,18,21,17,35,17,51,1,51,38,53,17,51,17,20,6,3,201,98,54,71,83,105,106,252,192,8,16,157,192,3,29,8,14,159,193,254,127,27,145,20,122,111,4,203,254,248,158,252,219,5,182,251,78,149,224,3,61,250,88,195,204,0,1,0,176,254,20,4,68,4,92,0,29,0,56,64,30,19,15,15,16,7,27,27,2,16,3,30,31,23,11,70,89,23,16,19,16,17,15,16,21,0,5,70,89,0,27,0,63,43,0,24,63,63,18,57,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,39,53,22,51,50,53,17,52,38,35,34,6,21,17,35,17,51,23,51,54,54,51,50,22,21,17,20,6,3,37,86,55,60,62,140,122,130,172,160,166,135,27,10,52,180,110,203,199,140,254,20,25,135,20,172,3,121,134,132,186,214,253,193,4,72,150,82,88,191,210,252,141,154,170,255,255,0,125,255,236,5,190,6,180,2,38,0,50,0,0,1,7,1,77,0,199,1,82,0,8,179,2,27,5,38,0,43,53,255,255,0,115,255,236,4,98,5,98,2,38,0,82,0,0,1,6,1,77,18,0,0,8,179,2,28,17,38,0,43,53,255,255,0,125,255,236,5,190,7,55,2,38,0,50,0,0,1,7,1,78,0,193,1,82,0,8,179,2,24,5,38,0,43,53,255,255,0,115,255,236,4,98,5,229,2,38,0,82,0,0,1,6,1,78,14,0,0,8,179,2,25,17,38,0,43,53,255,255,0,125,255,236,5,190,7,115,2,38,0,50,0,0,1,7,1,83,1,20,1,82,0,10,180,3,2,43,5,38,0,43,53,53,255,255,0,115,255,236,4,98,6,33,2,38,0,82,0,0,1,6,1,83,90,0,0,10,180,3,2,44,17,38,0,43,53,53,0,2,0,125,255,236,6,231,5,205,0,20,0,31,0,83,64,46,24,6,15,19,19,29,0,13,17,29,6,5,32,33,15,18,73,89,15,15,0,11,11,14,73,89,11,3,9,21,73,89,9,4,3,27,73,89,3,18,0,19,73,89,0,18,0,63,43,0,24,63,43,0,24,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,33,33,6,35,32,0,17,16,0,33,50,23,33,21,33,17,33,21,33,17,33,1,34,0,17,16,0,51,50,55,17,38,6,231,253,0,102,92,254,185,254,159,1,92,1,64,102,90,3,14,253,179,2,39,253,217,2,77,252,68,249,254,255,1,1,247,112,87,87,20,1,137,1,106,1,104,1,134,23,151,254,41,150,253,230,4,157,254,207,254,217,254,215,254,205,33,4,117,30,0,3,0,113,255,236,7,31,4,90,0,30,0,42,0,49,0,85,64,45,31,8,14,2,22,22,37,47,21,21,28,37,8,4,50,51,43,40,11,40,70,89,46,22,70,89,2,5,14,11,46,46,5,17,11,16,24,34,5,34,70,89,0,5,22,0,63,51,43,17,0,51,24,63,51,18,57,47,18,57,18,57,43,43,17,0,51,17,18,1,23,57,17,51,17,51,18,57,57,17,51,49,48,5,32,39,6,6,35,34,0,17,16,0,51,50,22,23,54,54,51,50,18,21,21,33,18,33,50,54,55,21,6,6,1,20,22,51,50,54,53,52,38,35,34,6,37,34,6,7,33,52,38,5,150,254,219,125,62,209,137,223,254,244,1,6,235,131,205,62,58,192,126,201,238,253,39,8,1,74,94,161,87,88,152,251,33,152,167,163,153,155,165,166,149,4,71,127,145,12,2,32,132,20,235,116,119,1,49,1,8,1,9,1,44,119,114,112,121,254,247,226,105,254,119,35,39,148,39,32,2,57,211,219,213,209,221,213,216,216,164,158,158,164,255,255,0,201,0,0,4,207,7,115,2,38,0,53,0,0,1,7,0,118,0,121,1,82,0,8,179,2,31,5,38,0,43,53,255,255,0,176,0,0,3,39,6,33,2,38,0,85,0,0,1,6,0,118,220,0,0,8,179,1,26,17,38,0,43,53,255,255,0,201,254,59,4,207,5,182,2,38,0,53,0,0,0,6,2,57,125,0,255,255,0,96,254,59,3,39,4,92,2,38,0,85,0,0,0,7,2,57,254,239,0,0,255,255,0,201,0,0,4,207,7,115,2,38,0,53,0,0,1,7,1,76,0,27,1,82,0,8,179,2,33,5,38,0,43,53,255,255,0,130,0,0,3,39,6,33,2,38,0,85,0,0,1,7,1,76,255,118,0,0,0,8,179,1,28,17,38,0,43,53,255,255,0,106,255,236,4,2,7,115,2,38,0,54,0,0,1,7,0,118,0,80,1,82,0,8,179,1,46,5,38,0,43,53,255,255,0,106,255,236,3,115,6,33,2,38,0,86,0,0,1,6,0,118,234,0,0,8,179,1,46,17,38,0,43,53,255,255,0,106,255,236,4,2,7,115,2,38,0,54,0,0,1,7,1,75,255,234,1,82,0,8,179,1,51,5,38,0,43,53,255,255,0,106,255,236,3,115,6,33,2,38,0,86,0,0,1,6,1,75,151,0,0,8,179,1,51,17,38,0,43,53,255,255,0,106,254,20,4,2,5,203,2,38,0,54,0,0,0,7,0,122,1,39,0,0,255,255,0,106,254,20,3,115,4,92,2,38,0,86,0,0,0,7,0,122,0,213,0,0,255,255,0,106,255,236,4,2,7,115,2,38,0,54,0,0,1,7,1,76,255,228,1,82,0,8,179,1,48,5,38,0,43,53,255,255,0,106,255,236,3,115,6,33,2,38,0,86,0,0,1,6,1,76,153,0,0,8,179,1,48,17,38,0,43,53,255,255,0,18,254,59,4,90,5,182,2,38,0,55,0,0,0,6,2,57,25,0,255,255,0,31,254,59,2,168,5,70,2,38,0,87,0,0,0,6,2,57,130,0,255,255,0,18,0,0,4,90,7,115,2,38,0,55,0,0,1,7,1,76,255,220,1,82,0,8,179,1,19,5,38,0,43,53,255,255,0,31,255,236,2,215,6,20,2,38,0,87,0,0,1,6,2,56,98,0,0,7,178,1,26,0,0,63,53,0,0,1,0,18,0,0,4,90,5,182,0,15,0,63,64,33,7,11,11,0,12,4,9,12,14,2,5,16,17,10,14,15,14,74,89,7,15,15,3,12,18,6,2,3,2,73,89,3,3,0,63,43,17,0,51,24,63,18,57,47,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,1,17,33,53,33,21,33,17,33,21,33,17,35,17,33,53,1,225,254,49,4,72,254,49,1,54,254,202,170,254,199,3,47,1,240,151,151,254,16,141,253,94,2,162,141,0,1,0,31,255,236,2,168,5,70,0,28,0,76,64,41,23,19,27,27,12,8,2,21,25,8,10,14,6,29,30,14,22,19,22,71,89,26,10,11,10,71,89,23,11,11,6,17,64,19,15,6,0,70,89,6,22,0,63,43,0,24,63,26,205,18,57,47,51,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,51,49,48,37,50,55,21,6,6,35,32,17,53,35,53,51,17,35,53,55,55,51,21,33,21,33,17,33,21,33,21,20,2,23,85,60,32,106,42,254,200,141,141,157,157,70,96,1,62,254,194,1,45,254,211,117,20,127,14,16,1,92,254,129,1,0,80,69,234,254,129,255,0,129,244,221,0,255,255,0,186,255,236,5,25,7,47,2,38,0,56,0,0,1,7,1,82,0,111,1,82,0,8,179,1,27,5,38,0,43,53,255,255,0,164,255,236,4,57,5,221,2,38,0,88,0,0,1,6,1,82,247,0,0,8,179,1,30,17,38,0,43,53,255,255,0,186,255,236,5,25,6,180,2,38,0,56,0,0,1,7,1,77,0,145,1,82,0,8,179,1,21,5,38,0,43,53,255,255,0,164,255,236,4,57,5,98,2,38,0,88,0,0,1,6,1,77,25,0,0,8,179,1,24,17,38,0,43,53,255,255,0,186,255,236,5,25,7,55,2,38,0,56,0,0,1,7,1,78,0,139,1,82,0,8,179,1,18,5,38,0,43,53,255,255,0,164,255,236,4,57,5,229,2,38,0,88,0,0,1,6,1,78,18,0,0,8,179,1,21,17,38,0,43,53,255,255,0,186,255,236,5,25,7,215,2,38,0,56,0,0,1,7,1,80,0,156,1,82,0,10,180,2,1,21,5,38,0,43,53,53,255,255,0,164,255,236,4,57,6,133,2,38,0,88,0,0,1,6,1,80,35,0,0,10,180,2,1,24,17,38,0,43,53,53,255,255,0,186,255,236,5,25,7,115,2,38,0,56,0,0,1,7,1,83,0,225,1,82,0,10,180,2,1,37,5,38,0,43,53,53,255,255,0,164,255,236,4,57,6,33,2,38,0,88,0,0,1,6,1,83,104,0,0,10,180,2,1,40,17,38,0,43,53,53,255,255,0,186,254,66,5,25,5,182,2,38,0,56,0,0,0,7,1,81,2,33,0,0,255,255,0,164,254,66,4,101,4,72,2,38,0,88,0,0,0,7,1,81,2,244,0,0,255,255,0,27,0,0,7,76,7,115,2,38,0,58,0,0,1,7,1,75,1,84,1,82,0,8,179,1,40,5,38,0,43,53,255,255,0,23,0,0,6,35,6,33,2,38,0,90,0,0,1,7,1,75,0,193,0,0,0,8,179,1,43,17,38,0,43,53,255,255,0,0,0,0,4,123,7,115,2,38,0,60,0,0,1,7,1,75,255,224,1,82,0,8,179,1,23,5,38,0,43,53,255,255,0,2,254,20,4,6,6,33,2,38,0,92,0,0,1,6,1,75,173,0,0,8,179,1,36,17,38,0,43,53,255,255,0,0,0,0,4,123,7,37,2,38,0,60,0,0,1,7,0,106,255,241,1,82,0,10,180,2,1,30,5,38,0,43,53,53,255,255,0,82,0,0,4,63,7,115,2,38,0,61,0,0,1,7,0,118,0,66,1,82,0,8,179,1,19,5,38,0,43,53,255,255,0,82,0,0,3,109,6,33,2,38,0,93,0,0,1,6,0,118,232,0,0,8,179,1,19,17,38,0,43,53,255,255,0,82,0,0,4,63,7,49,2,38,0,61,0,0,1,7,1,79,1,68,1,82,0,8,179,1,19,5,38,0,43,53,255,255,0,82,0,0,3,109,5,223,2,38,0,93,0,0,1,7,1,79,0,223,0,0,0,8,179,1,19,17,38,0,43,53,255,255,0,82,0,0,4,63,7,115,2,38,0,61,0,0,1,7,1,76,255,237,1,82,0,8,179,1,21,5,38,0,43,53,255,255,0,82,0,0,3,109,6,33,2,38,0,93,0,0,1,6,1,76,134,0,0,8,179,1,21,17,38,0,43,53,0,1,0,176,0,0,2,219,6,31,0,12,0,29,64,14,0,1,1,13,6,14,4,9,70,89,4,0,1,21,0,63,63,43,17,1,51,18,57,17,51,49,48,33,35,17,16,33,50,23,7,38,35,34,6,21,1,86,166,1,103,96,100,43,87,73,97,89,4,156,1,131,37,133,30,123,122,0,0,1,0,195,254,20,4,23,5,203,0,32,0,68,64,36,26,30,30,12,8,18,28,8,10,2,5,33,34,29,10,12,10,70,89,26,12,12,16,0,16,22,70,89,16,4,0,5,70,89,0,27,0,63,43,0,24,63,43,17,18,0,57,24,47,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,1,34,39,53,22,51,50,54,53,17,35,53,55,53,52,54,51,50,23,7,7,38,35,34,6,21,21,33,21,33,17,20,6,1,72,69,64,70,61,95,77,222,222,162,182,85,120,22,21,102,60,98,80,1,26,254,234,158,254,20,19,139,18,102,113,3,205,75,60,139,195,178,43,64,65,32,105,124,149,129,252,55,184,175,0,4,0,0,0,0,5,20,7,170,0,16,0,24,0,34,0,46,0,97,64,52,17,5,4,24,6,20,7,4,3,7,8,35,0,41,11,8,11,9,34,20,2,0,29,3,9,48,47,38,14,44,2,9,24,6,73,89,9,20,14,24,34,14,24,24,14,34,3,8,28,4,8,18,0,63,51,47,18,23,57,47,47,47,17,18,57,57,43,17,0,51,51,17,51,17,18,1,23,57,17,51,17,51,17,51,17,51,17,18,57,57,17,57,57,49,48,1,20,7,1,35,3,33,3,35,1,38,53,52,54,51,50,22,19,3,38,39,6,6,7,3,19,54,54,55,51,21,6,6,7,35,19,52,38,35,34,6,21,20,22,51,50,54,3,104,104,2,20,174,176,253,158,166,174,2,20,106,122,99,100,125,27,178,25,47,14,48,9,177,152,49,102,23,203,32,168,66,111,211,66,51,51,66,60,57,53,64,5,150,133,56,251,39,1,145,254,111,4,215,52,136,101,114,117,252,54,1,176,58,145,48,135,24,254,84,4,133,59,149,42,16,46,161,45,254,245,57,60,60,57,55,61,61,0,5,0,94,255,236,3,205,7,170,0,9,0,36,0,47,0,59,0,71,0,103,64,55,45,18,66,54,60,48,41,21,21,11,36,36,6,48,0,54,29,18,7,72,73,9,9,4,63,57,69,51,17,11,12,21,41,71,89,12,21,21,15,32,32,25,70,89,32,16,15,37,70,89,15,22,10,21,4,0,47,63,63,43,0,24,63,43,17,18,0,57,24,47,57,43,17,0,51,24,63,51,196,50,17,57,47,17,18,1,23,57,17,51,51,17,51,17,51,17,51,17,51,49,48,1,53,54,54,55,33,21,6,6,7,1,39,35,6,6,35,34,38,53,16,37,55,53,52,38,35,34,6,7,39,54,54,51,50,22,21,17,37,50,54,53,53,7,6,6,21,20,22,1,20,6,35,34,38,53,52,54,51,50,22,7,52,38,35,34,6,21,20,22,51,50,54,1,215,46,106,22,1,4,21,164,128,1,2,33,8,82,163,122,163,185,2,25,180,119,133,96,167,71,55,84,208,101,209,201,254,14,155,177,166,198,175,109,1,170,123,102,101,121,121,101,101,124,109,65,51,51,66,60,57,52,64,6,217,16,42,120,31,12,24,105,68,249,39,156,103,73,168,155,1,76,16,6,68,130,122,52,32,127,43,51,174,192,253,20,117,170,153,99,7,7,109,115,90,94,5,61,98,119,116,99,98,115,119,94,56,61,61,56,56,61,61,0,255,255,255,254,0,0,6,129,7,115,2,38,0,136,0,0,1,7,0,118,2,76,1,82,0,8,179,2,29,5,38,0,43,53,255,255,0,94,255,236,6,115,6,33,2,38,0,168,0,0,1,7,0,118,1,133,0,0,0,8,179,3,69,17,38,0,43,53,255,255,0,125,255,195,5,190,7,115,2,38,0,154,0,0,1,7,0,118,1,25,1,82,0,8,179,3,45,5,38,0,43,53,255,255,0,115,255,188,4,98,6,33,2,38,0,186,0,0,1,6,0,118,86,0,0,8,179,3,45,17,38,0,43,53,255,255,0,106,254,59,4,2,5,203,2,38,0,54,0,0,0,6,2,57,6,0,255,255,0,106,254,59,3,115,4,92,2,38,0,86,0,0,0,6,2,57,185,0,0,1,1,12,4,217,3,174,6,33,0,14,0,24,64,9,7,0,16,15,11,4,128,14,9,0,47,51,26,205,50,17,18,1,57,57,49,48,1,54,54,55,51,22,22,23,21,35,38,39,6,7,35,1,12,127,102,23,166,22,109,125,119,88,133,136,83,115,4,240,136,128,41,42,133,130,23,55,131,134,52,0,0,1,1,12,4,217,3,174,6,33,0,14,0,24,64,9,6,0,16,15,5,1,128,3,11,0,47,51,26,205,50,17,18,1,57,57,49,48,1,51,22,23,54,55,51,21,7,6,7,35,38,38,39,1,12,115,114,105,130,91,119,66,144,46,166,23,102,127,6,33,74,115,130,59,25,68,148,87,41,126,136,0,0,1,1,45,4,217,3,133,5,98,0,3,0,17,181,0,1,4,5,0,3,0,47,51,17,18,1,57,57,49,48,1,33,21,33,1,45,2,88,253,168,5,98,137,0,1,1,37,4,217,3,145,5,229,0,14,0,24,64,9,12,3,16,15,11,4,128,8,0,0,47,50,26,204,50,17,18,1,57,57,49,48,1,34,38,39,51,30,2,51,50,54,55,51,6,6,2,86,140,156,9,104,6,41,73,85,101,96,10,104,10,167,4,217,137,131,49,56,26,64,67,126,142,0,0,1,0,162,5,2,1,102,5,223,0,11,0,19,182,6,0,0,12,13,3,9,0,47,205,17,18,1,57,17,51,49,48,19,52,54,51,50,22,21,20,6,35,34,38,162,56,42,40,58,58,40,42,56,5,113,57,53,54,56,56,55,55,0,0,2,1,111,4,217,3,45,6,133,0,11,0,23,0,30,64,12,18,6,12,0,6,0,24,25,15,9,21,3,0,47,51,204,50,17,18,1,57,57,17,51,17,51,49,48,1,20,6,35,34,38,53,52,54,51,50,22,7,52,38,35,34,6,21,20,22,51,50,54,3,45,123,102,101,120,121,100,101,124,108,66,51,51,66,60,57,52,65,5,178,98,119,117,98,98,115,119,94,56,61,61,56,56,61,61,0,1,0,37,254,66,1,113,0,0,0,15,0,24,64,10,0,9,4,13,9,3,16,17,2,7,0,47,51,17,18,1,23,57,17,51,49,48,23,20,51,50,55,21,6,35,34,53,52,54,55,51,6,6,178,94,42,55,65,60,207,86,72,120,68,69,238,94,13,109,18,188,70,135,53,66,109,0,0,1,1,8,4,217,3,240,5,221,0,23,0,36,64,15,9,21,24,25,17,0,5,12,0,12,0,12,21,128,9,0,47,26,204,57,57,47,47,17,51,17,51,17,18,1,57,57,49,48,1,34,46,2,35,34,6,7,35,54,54,51,50,30,2,51,50,54,55,51,6,6,3,20,43,82,79,73,34,50,51,14,98,13,115,91,46,86,78,72,32,49,48,15,99,13,113,4,219,37,45,37,60,61,121,137,37,45,37,59,62,121,137,0,0,2,0,231,4,217,3,182,6,33,0,9,0,19,0,27,64,12,14,5,19,9,4,20,21,13,4,128,19,9,0,47,51,26,205,50,17,18,1,23,57,49,48,19,54,54,55,51,21,6,6,7,35,37,54,54,55,51,21,6,6,7,35,231,36,110,31,186,37,171,58,97,1,101,49,101,26,186,37,171,58,96,4,242,48,186,69,21,63,196,48,25,68,177,58,21,63,196,48,0,0,1,1,252,4,217,3,16,6,115,0,9,0,19,182,4,0,11,10,4,128,9,0,47,26,205,17,18,1,57,57,49,48,1,54,54,55,51,21,6,6,7,35,1,252,27,53,12,184,18,109,49,100,4,246,72,227,82,23,74,237,76,0,3,1,27,5,14,3,131,6,180,0,8,0,20,0,32,0,43,64,20,15,9,21,27,27,3,8,9,4,33,34,24,12,8,12,8,12,3,30,18,0,47,51,204,57,57,47,47,17,51,17,18,1,23,57,17,51,17,51,49,48,1,54,55,51,21,6,6,7,35,39,52,54,51,50,22,21,20,6,35,34,38,37,52,54,51,50,22,21,20,6,35,34,38,2,0,65,31,189,33,121,51,80,229,52,38,41,49,55,35,38,52,1,180,52,38,41,49,55,35,38,52,5,133,169,134,20,67,179,61,4,52,46,52,46,50,49,49,50,52,46,52,46,50,49,49,255,255,0,0,0,0,5,16,6,10,2,38,0,36,0,0,1,7,1,84,254,32,255,151,0,7,178,2,18,0,0,63,53,0,255,255,0,152,2,76,1,137,3,90,2,6,0,121,0,0,255,255,255,212,0,0,4,117,6,10,0,38,0,40,125,0,1,7,1,84,253,216,255,151,0,7,178,1,16,0,0,63,53,0,255,255,255,212,0,0,5,181,6,10,0,39,0,43,0,150,0,0,1,7,1,84,253,216,255,151,0,7,178,1,16,0,0,63,53,0,255,255,255,228,0,0,3,68,6,10,0,39,0,44,0,238,0,0,1,7,1,84,253,232,255,151,0,7,178,1,16,0,0,63,53,0,255,255,255,228,255,236,6,2,6,10,0,38,0,50,68,0,1,7,1,84,253,232,255,151,0,7,178,2,28,0,0,63,53,0,255,255,255,212,0,0,5,133,6,10,0,39,0,60,1,10,0,0,1,7,1,84,253,216,255,151,0,7,178,1,13,0,0,63,53,0,255,255,255,228,0,0,6,51,6,10,0,38,1,118,63,0,1,7,1,84,253,232,255,151,0,7,178,1,35,0,0,63,53,0,255,255,255,233,255,236,2,147,6,180,2,38,1,134,0,0,1,7,1,85,254,206,0,0,0,12,181,3,2,1,46,17,38,0,43,53,53,53,255,255,0,0,0,0,5,16,5,188,2,6,0,36,0,0,255,255,0,201,0,0,4,190,5,182,2,6,0,37,0,0,0,1,0,201,0,0,3,248,5,182,0,5,0,29,64,14,3,4,4,0,6,7,5,2,73,89,5,3,4,18,0,63,63,43,17,18,1,57,57,17,51,49,48,1,21,33,17,35,17,3,248,253,123,170,5,182,153,250,227,5,182,0,255,255,0,39,0,0,4,109,5,182,2,6,2,40,0,0,255,255,0,201,0,0,3,248,5,182,2,6,0,40,0,0,255,255,0,82,0,0,4,63,5,182,2,6,0,61,0,0,255,255,0,201,0,0,5,31,5,182,2,6,0,43,0,0,0,3,0,125,255,236,5,190,5,205,0,3,0,15,0,27,0,63,64,32,2,3,16,22,16,10,22,4,10,4,28,29,0,3,73,89,0,0,7,13,13,25,73,89,13,4,7,19,73,89,7,19,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,57,57,17,51,17,51,17,18,57,57,49,48,1,33,21,33,37,16,0,33,32,0,17,16,0,33,32,0,1,16,18,51,50,18,17,16,2,35,34,2,1,227,2,117,253,139,3,219,254,157,254,196,254,189,254,161,1,96,1,68,1,59,1,98,251,115,250,244,243,248,247,242,245,251,3,51,149,63,254,161,254,110,1,139,1,104,1,101,1,137,254,112,254,160,254,216,254,204,1,48,1,44,1,42,1,46,254,206,0,255,255,0,84,0,0,2,86,5,182,2,6,0,44,0,0,255,255,0,201,0,0,4,233,5,182,2,6,0,46,0,0,0,1,0,0,0,0,4,211,5,182,0,10,0,26,64,11,8,0,12,11,4,8,9,3,1,8,18,0,63,51,63,18,57,17,18,1,57,57,49,48,33,35,1,38,39,6,7,1,35,1,51,4,211,182,254,182,87,22,33,71,254,184,182,2,16,177,3,160,252,90,139,201,252,94,5,182,255,255,0,201,0,0,6,113,5,182,2,6,0,48,0,0,255,255,0,201,0,0,5,63,5,182,2,6,0,49,0,0,0,3,0,72,0,0,4,37,5,182,0,3,0,7,0,11,0,52,64,29,10,7,3,2,6,8,6,13,12,0,3,73,89,0,0,10,4,10,11,73,89,10,18,4,7,73,89,4,3,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,49,48,19,33,21,33,3,33,21,33,1,21,33,53,195,2,231,253,25,82,3,139,252,117,3,180,252,35,3,72,150,3,4,151,251,121,152,152,255,255,0,125,255,236,5,190,5,205,2,6,0,50,0,0,0,1,0,201,0,0,5,12,5,182,0,7,0,35,64,17,1,0,4,5,0,5,9,8,6,3,73,89,6,3,1,5,18,0,63,51,63,43,17,18,1,57,57,17,51,17,51,49,48,33,35,17,33,17,35,17,33,5,12,170,253,17,170,4,67,5,31,250,225,5,182,0,255,255,0,201,0,0,4,104,5,182,2,6,0,51,0,0,0,1,0,74,0,0,4,92,5,182,0,12,0,53,64,28,8,10,10,0,9,2,11,6,3,2,0,5,13,14,7,8,4,8,73,89,4,3,0,10,73,89,0,18,0,63,43,0,24,63,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,51,53,1,1,53,33,21,33,39,1,1,33,21,74,1,225,254,43,3,203,253,92,96,1,204,254,31,3,84,141,2,111,2,43,143,153,2,253,223,253,154,152,0,255,255,0,18,0,0,4,90,5,182,2,6,0,55,0,0,255,255,0,0,0,0,4,123,5,182,2,6,0,60,0,0,0,3,0,106,255,236,5,248,5,203,0,25,0,34,0,43,0,80,64,41,39,20,26,2,13,13,43,25,14,30,7,7,14,20,3,44,45,12,16,26,42,16,42,74,89,34,36,24,36,74,89,2,24,16,24,16,24,14,19,0,4,0,63,63,57,57,47,47,17,51,43,17,0,51,43,17,0,51,17,51,17,18,1,23,57,17,51,17,51,51,51,17,51,51,17,51,49,48,1,51,21,51,50,22,22,21,20,2,4,35,35,21,35,53,35,34,36,2,53,52,54,54,51,51,19,51,50,54,53,52,38,43,3,34,6,21,20,22,51,51,2,219,172,70,171,251,133,149,254,253,176,41,172,45,176,254,254,146,135,252,171,67,172,25,201,223,206,185,58,172,57,182,209,222,202,24,5,203,180,136,248,159,166,254,253,130,225,225,132,1,4,161,158,248,139,252,69,219,195,185,210,212,183,197,217,0,255,255,0,8,0,0,4,150,5,182,2,6,0,59,0,0,0,1,0,109,0,0,5,242,5,182,0,29,0,62,64,31,10,7,17,0,0,14,1,21,24,24,1,7,3,30,31,29,3,13,3,73,89,17,13,13,1,22,15,8,3,1,18,0,63,63,51,51,18,57,47,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,33,35,17,35,34,38,38,53,17,51,17,20,22,51,51,17,51,17,51,50,54,53,17,51,17,20,6,4,35,35,3,131,170,45,176,255,144,174,207,212,27,170,29,211,207,176,144,254,253,175,45,1,190,122,247,164,1,227,254,33,188,201,3,100,252,156,198,187,1,227,254,31,165,247,123,0,0,1,0,80,0,0,5,244,5,205,0,31,0,57,64,32,3,13,29,19,24,19,22,25,7,10,13,8,8,32,33,16,0,73,89,16,4,26,22,6,9,8,9,73,89,25,8,18,0,63,51,43,17,0,51,51,51,24,63,43,17,18,1,23,57,17,51,17,51,49,48,1,34,2,21,20,18,23,21,33,53,33,38,2,53,16,0,33,32,0,17,20,2,7,33,21,33,53,54,18,53,52,2,3,33,238,250,173,180,253,182,1,108,151,160,1,98,1,58,1,59,1,98,158,151,1,107,253,182,183,169,249,5,53,254,255,253,225,254,179,132,133,152,118,1,94,203,1,54,1,96,254,165,254,199,207,254,166,120,152,133,134,1,78,222,252,1,2,255,255,0,60,0,0,2,111,7,37,2,38,0,44,0,0,1,7,0,106,255,7,1,82,0,10,180,2,1,33,5,38,0,43,53,53,255,255,0,0,0,0,4,123,7,37,2,38,0,60,0,0,1,7,0,106,255,239,1,82,0,10,180,2,1,30,5,38,0,43,53,53,255,255,0,115,255,236,4,199,6,115,2,38,1,126,0,0,1,6,1,84,29,0,0,8,179,2,52,17,38,0,43,53,255,255,0,90,255,236,3,135,6,115,2,38,1,130,0,0,1,6,1,84,200,0,0,8,179,1,47,17,38,0,43,53,255,255,0,176,254,20,4,68,6,115,2,38,1,132,0,0,1,6,1,84,59,0,0,8,179,1,30,17,38,0,43,53,255,255,0,168,255,236,2,147,6,115,2,38,1,134,0,0,1,7,1,84,254,196,0,0,0,8,179,1,25,17,38,0,43,53,255,255,0,164,255,236,4,113,6,180,2,38,1,146,0,0,1,6,1,85,59,0,0,12,181,3,2,1,52,17,38,0,43,53,53,53,0,2,0,115,255,236,4,199,4,92,0,11,0,42,0,71,64,36,9,15,39,21,4,4,29,34,29,15,3,43,44,24,15,39,40,40,22,12,18,18,7,70,89,18,16,31,0,12,0,70,89,36,12,22,0,63,51,43,17,0,51,24,63,43,17,18,0,57,57,17,51,24,63,17,18,1,23,57,17,51,17,51,51,17,51,49,48,37,50,54,53,53,52,38,35,32,17,20,22,23,34,2,17,16,18,51,50,22,23,51,54,55,51,6,6,21,17,20,51,50,55,21,6,35,34,38,39,35,6,6,2,80,169,150,152,169,254,209,147,133,214,238,244,225,121,161,54,12,24,41,129,21,28,84,29,33,46,65,81,89,18,13,59,167,119,195,218,15,229,199,254,80,212,212,139,1,41,1,12,1,18,1,41,84,84,92,56,66,246,116,254,73,114,10,119,26,81,86,86,81,0,2,0,176,254,20,4,168,6,31,0,19,0,41,0,76,64,40,24,15,15,16,39,3,30,8,8,3,5,34,16,5,42,43,16,27,35,34,70,89,14,35,14,35,11,0,11,27,70,89,11,22,0,20,70,89,0,0,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,43,0,24,63,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,50,22,21,16,5,21,4,17,20,4,35,34,38,39,17,35,17,52,54,23,34,6,21,17,22,22,51,50,54,53,52,38,35,35,53,51,50,54,53,52,38,2,147,220,249,254,199,1,121,254,248,238,109,160,79,166,253,228,158,157,93,161,86,171,173,190,177,112,92,155,162,156,6,31,208,183,254,218,51,8,42,254,145,209,225,31,38,253,227,6,52,225,246,140,172,165,252,137,49,37,150,157,157,164,142,147,137,123,133,0,1,0,10,254,20,4,14,4,72,0,18,0,33,64,16,15,4,1,5,4,19,20,10,9,9,1,14,5,15,1,27,0,63,63,51,18,57,47,51,17,18,1,23,57,49,48,1,35,52,18,55,1,51,19,22,23,51,62,2,19,51,1,6,2,2,20,180,64,43,254,63,172,240,94,19,8,5,41,43,234,172,254,107,48,53,254,20,96,1,38,114,4,60,253,184,235,103,30,142,129,2,109,251,211,124,254,220,0,2,0,113,255,236,4,96,6,18,0,30,0,42,0,59,64,32,37,28,16,3,31,22,22,9,0,3,28,5,43,44,16,0,34,3,25,6,25,40,70,89,25,22,6,13,70,89,6,0,0,63,43,0,24,63,43,17,18,0,23,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,38,38,53,52,54,51,50,22,23,7,38,38,35,34,6,21,20,22,23,22,22,21,20,0,35,34,36,53,52,18,1,52,38,39,6,6,21,20,22,51,50,54,2,33,140,116,194,164,103,189,126,72,112,159,81,85,97,107,167,210,177,254,240,236,227,254,240,226,2,97,123,141,206,191,178,147,162,174,3,168,78,159,99,130,152,45,63,135,62,44,79,66,71,111,91,115,241,164,235,254,248,248,210,177,1,5,254,115,128,183,74,53,217,160,144,171,186,0,0,1,0,90,255,236,3,135,4,92,0,37,0,77,64,43,4,16,35,23,29,11,1,19,23,16,6,38,39,20,37,2,37,2,70,89,15,37,31,37,2,11,3,37,37,13,26,26,33,70,89,26,16,13,7,70,89,13,22,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,0,57,17,18,1,23,57,17,51,17,51,49,48,1,21,35,32,21,20,22,51,50,54,55,21,6,35,34,38,53,52,54,55,53,38,38,53,52,54,51,50,22,23,7,38,38,35,34,21,20,33,2,203,148,254,201,147,146,84,166,100,137,221,210,241,110,130,98,107,224,192,97,165,100,63,94,130,79,250,1,61,2,129,141,195,90,98,39,47,148,75,169,148,98,131,41,11,28,127,92,133,158,33,45,133,42,28,162,172,0,0,1,0,115,254,111,3,160,6,20,0,32,0,48,64,24,7,25,30,19,19,14,14,3,0,25,4,33,34,17,35,30,3,0,1,0,70,89,1,0,0,63,43,17,0,51,51,24,63,17,18,1,23,57,17,51,17,51,17,51,49,48,19,53,33,21,6,0,2,21,20,22,22,23,22,22,21,20,7,35,54,53,52,38,39,38,38,53,52,62,2,55,6,33,176,2,240,215,254,224,138,59,125,172,149,136,127,166,125,111,143,203,188,59,112,201,242,40,254,241,5,135,141,129,180,254,189,254,223,166,98,118,73,37,31,109,91,149,164,161,107,56,61,26,36,219,194,114,208,195,229,218,8,0,0,1,0,176,254,20,4,68,4,92,0,20,0,47,64,24,0,20,12,8,8,9,20,9,22,21,16,4,70,89,16,16,12,9,10,15,9,21,0,27,0,63,63,63,18,57,63,43,17,18,1,57,57,17,51,17,51,17,51,49,48,1,17,52,38,35,34,6,21,17,35,17,51,23,51,54,54,51,50,22,21,17,3,158,122,130,172,160,166,135,27,8,51,184,113,198,200,254,20,4,177,134,132,186,214,253,193,4,72,150,81,89,191,210,251,73,0,3,0,115,255,236,4,74,6,43,0,11,0,18,0,25,0,73,64,39,22,16,16,6,23,15,15,0,6,0,26,27,22,16,70,89,15,22,191,22,2,11,3,22,22,3,9,9,19,70,89,9,1,3,12,70,89,3,22,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,1,16,2,35,34,2,17,16,18,51,50,18,1,50,18,19,33,18,18,19,34,2,3,33,2,2,4,74,244,250,240,249,245,244,244,250,254,18,164,156,6,253,121,4,150,167,161,150,10,2,133,11,152,3,12,254,106,254,118,1,147,1,141,1,151,1,136,254,107,251,225,1,49,1,51,254,208,254,204,5,41,254,225,254,231,1,25,1,31,0,1,0,168,255,236,2,147,4,72,0,15,0,31,64,14,1,14,7,14,17,16,15,15,11,4,70,89,11,22,0,63,43,0,24,63,17,18,1,57,57,17,51,49,48,1,17,20,22,51,50,54,55,21,6,6,35,34,38,53,17,1,78,73,87,37,101,27,31,105,50,160,145,4,72,252,250,104,101,13,7,127,13,17,168,169,3,11,255,255,0,176,0,0,4,27,4,70,2,6,0,250,0,0,0,1,255,242,255,236,4,70,6,33,0,34,0,51,64,27,8,1,21,3,36,0,0,35,24,19,70,89,24,22,30,31,31,0,11,11,6,70,89,11,1,0,21,0,63,63,43,17,18,0,57,17,51,24,63,43,17,1,51,17,18,23,57,49,48,35,1,39,46,2,35,34,7,53,54,51,50,22,22,23,1,22,22,51,50,55,21,6,35,34,38,39,3,38,39,35,6,7,3,14,1,217,58,30,50,67,49,58,57,68,63,91,121,88,54,1,107,19,42,35,27,33,48,61,74,83,29,156,84,22,9,28,88,254,4,55,162,85,70,36,13,133,17,60,130,152,252,12,49,51,10,121,24,76,83,1,180,240,96,116,209,253,182,0,255,255,0,176,254,20,4,68,4,72,2,6,0,119,0,0,0,1,0,0,0,0,4,2,4,72,0,14,0,28,64,12,9,10,10,0,16,15,5,14,21,9,0,15,0,63,50,63,57,17,18,1,57,57,17,51,49,48,17,51,19,22,22,23,51,54,18,17,51,16,2,7,35,172,219,26,83,16,8,177,159,166,207,225,186,4,72,253,178,67,238,62,175,1,189,1,81,254,149,254,4,225,0,1,0,113,254,111,3,160,6,20,0,49,0,73,64,39,4,25,45,31,29,28,19,12,12,40,0,28,31,37,25,7,50,51,28,48,1,48,1,71,89,48,48,16,38,41,37,38,37,70,89,38,0,16,35,0,63,63,43,17,0,51,17,18,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,35,34,6,21,20,30,2,23,22,22,21,20,6,7,35,54,54,53,52,38,39,38,38,53,52,54,55,53,38,53,52,54,55,6,35,35,53,33,21,35,34,6,6,21,20,22,51,51,3,86,178,176,213,50,95,135,84,142,135,54,67,156,53,66,115,143,200,199,158,128,217,139,166,128,115,68,2,186,51,130,224,127,167,175,170,2,242,178,142,80,98,61,36,18,29,110,90,65,149,99,71,147,52,55,61,25,34,200,176,140,210,39,12,64,217,117,158,50,12,141,131,80,144,95,115,108,255,255,0,115,255,236,4,98,4,92,2,6,0,82,0,0,0,1,0,25,255,236,4,244,4,72,0,21,0,54,64,29,10,11,7,19,16,3,19,11,13,5,22,23,18,9,13,15,13,70,89,15,15,11,21,5,0,70,89,5,22,0,63,43,0,24,63,63,43,17,0,51,51,17,18,1,23,57,17,51,17,51,49,48,37,50,55,21,6,35,34,53,17,33,17,35,17,35,53,55,33,21,35,17,20,22,4,125,38,48,43,84,219,254,35,166,221,143,4,76,213,51,117,18,131,24,253,2,209,252,70,3,186,74,68,142,253,60,74,55,0,2,0,166,254,20,4,98,4,92,0,16,0,28,0,54,64,27,21,9,9,10,26,0,10,0,29,30,6,3,14,14,17,70,89,14,16,10,27,3,23,70,89,3,22,0,63,43,0,24,63,63,43,17,18,0,57,17,18,1,57,57,17,51,17,51,17,51,49,48,1,16,0,35,34,39,35,22,21,17,35,17,16,18,51,50,18,37,34,6,21,17,22,51,50,54,53,52,38,4,98,255,0,233,179,120,8,8,168,251,234,219,252,254,33,158,151,122,183,159,152,144,2,37,254,241,254,214,94,61,212,254,219,4,31,1,10,1,31,254,209,162,207,209,254,174,102,208,222,214,212,0,0,1,0,115,254,111,3,162,4,92,0,32,0,46,64,23,14,7,0,21,21,7,27,3,34,33,4,18,18,24,11,24,30,70,89,24,16,11,35,0,63,63,43,17,18,0,57,17,51,17,18,1,23,57,17,51,17,51,49,48,1,20,22,22,23,22,22,21,20,6,7,35,54,54,53,52,38,38,39,38,38,53,16,0,51,50,22,23,7,38,35,34,6,1,31,59,143,160,148,131,54,67,156,54,67,51,110,97,204,195,1,20,248,79,158,54,53,130,114,176,170,2,10,135,132,80,34,32,107,90,66,152,95,70,148,50,40,47,38,18,37,254,219,1,30,1,54,33,24,141,51,218,0,2,0,115,255,236,4,182,4,72,0,13,0,25,0,48,64,25,20,0,14,7,7,12,0,11,4,27,26,12,23,9,23,70,89,9,15,4,17,70,89,4,22,0,63,43,0,24,63,43,17,0,51,17,18,1,23,57,17,51,17,51,49,48,1,20,6,6,35,34,0,53,16,33,33,21,33,22,1,20,22,51,50,54,53,16,39,35,34,6,4,96,123,229,154,235,254,248,2,80,1,243,254,248,178,252,191,170,161,159,171,174,65,222,200,1,252,157,241,130,1,32,254,2,62,142,167,254,247,194,209,197,182,1,14,186,208,0,0,1,0,18,255,231,3,147,4,72,0,19,0,44,64,23,3,15,0,9,15,17,4,20,21,2,17,19,17,70,89,19,15,12,5,70,89,12,22,0,63,43,0,24,63,43,17,0,51,17,18,1,23,57,17,51,49,48,1,21,33,17,20,51,50,54,55,21,6,6,35,34,38,53,17,33,53,55,3,147,254,80,205,47,98,27,35,111,48,181,170,254,215,148,4,72,142,253,150,223,13,7,125,15,18,170,170,2,127,74,68,0,0,1,0,164,255,236,4,113,4,72,0,21,0,37,64,17,12,19,6,3,19,3,23,22,15,4,15,0,9,70,89,0,22,0,63,43,0,24,63,51,17,18,1,57,57,17,51,17,51,49,48,5,34,38,17,17,51,17,20,22,51,50,54,53,52,38,39,51,22,22,21,16,0,2,115,231,232,166,158,153,167,161,28,34,166,36,28,254,254,20,250,1,10,2,88,253,176,192,195,238,251,130,224,136,144,214,140,254,194,254,212,0,0,2,0,115,254,20,5,76,4,92,0,24,0,34,0,65,64,35,10,4,32,24,24,12,0,25,19,19,0,7,4,4,35,36,16,28,70,89,16,16,6,15,32,12,1,12,70,89,23,1,22,0,27,0,63,63,51,43,17,0,51,24,63,63,43,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,17,36,0,17,16,55,23,6,6,21,16,5,17,52,54,51,50,18,21,20,2,6,7,17,1,52,38,35,34,6,21,17,54,54,2,131,254,252,254,244,207,131,89,81,1,104,166,149,180,218,136,248,165,1,121,124,102,73,78,179,198,254,20,1,218,11,1,35,1,15,1,40,253,90,117,224,124,254,117,35,2,108,187,190,254,219,250,178,254,251,144,8,254,38,4,39,185,219,120,114,253,146,16,236,0,1,255,236,254,20,4,80,4,78,0,32,0,57,64,33,14,7,8,5,21,24,30,7,34,23,33,5,24,8,21,4,6,23,27,17,12,70,89,17,27,6,15,0,28,70,89,0,15,0,63,43,0,24,63,63,43,0,24,63,18,23,57,17,1,51,18,23,57,49,48,19,50,22,22,23,19,1,51,1,19,22,22,51,50,55,21,6,35,34,38,39,3,1,35,1,3,38,38,35,34,7,53,54,178,54,78,62,44,145,1,62,180,254,84,190,48,82,63,45,45,60,59,115,141,59,150,254,150,178,1,208,172,38,70,43,37,27,49,4,78,43,91,112,254,143,2,97,252,252,254,28,122,74,8,129,15,118,159,1,131,253,104,3,68,1,188,99,80,11,129,17,0,1,0,164,254,20,5,135,6,18,0,26,0,61,64,31,22,19,1,14,14,25,15,4,10,10,15,19,3,27,28,26,0,7,20,15,1,25,16,25,70,89,13,16,22,15,27,0,63,63,51,43,17,0,51,24,63,51,63,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,17,54,54,53,52,38,39,51,18,21,16,0,5,17,35,17,36,0,17,17,51,17,20,22,23,17,3,90,188,203,26,37,166,63,254,227,254,240,164,254,248,254,246,166,180,184,6,18,250,105,15,231,204,120,235,168,254,240,244,254,236,254,206,16,254,38,1,218,9,1,34,1,16,2,31,253,219,195,218,13,5,153,0,1,0,115,255,236,5,188,4,72,0,39,0,61,64,30,10,3,38,19,19,16,25,32,32,16,3,3,40,41,38,17,17,0,28,6,15,22,13,0,13,70,89,35,0,22,0,63,50,43,17,0,51,24,63,51,18,57,47,57,17,18,1,23,57,17,51,17,51,18,57,17,51,49,48,5,34,2,53,52,18,55,51,6,6,21,20,22,51,50,54,53,17,51,17,20,22,51,50,54,53,52,2,39,51,22,18,21,20,2,35,34,39,35,6,1,244,182,203,55,68,172,68,57,120,107,94,105,161,106,93,107,120,55,69,172,65,57,203,182,220,68,9,65,20,1,40,254,156,1,1,153,156,255,157,193,216,143,125,1,55,254,201,128,140,216,193,151,1,4,157,146,254,249,157,252,254,214,182,182,255,255,0,9,255,236,2,147,5,211,2,38,1,134,0,0,1,7,0,106,254,212,0,0,0,10,180,2,1,37,17,38,0,43,53,53,255,255,0,164,255,236,4,113,5,211,2,38,1,146,0,0,1,6,0,106,57,0,0,10,180,2,1,43,17,38,0,43,53,53,255,255,0,115,255,236,4,98,6,115,2,38,0,82,0,0,1,6,1,84,33,0,0,8,179,2,34,17,38,0,43,53,255,255,0,164,255,236,4,113,6,115,2,38,1,146,0,0,1,6,1,84,39,0,0,8,179,1,31,17,38,0,43,53,255,255,0,115,255,236,5,188,6,115,2,38,1,150,0,0,1,7,1,84,0,201,0,0,0,8,179,1,49,17,38,0,43,53,255,255,0,201,0,0,3,248,7,37,2,38,0,40,0,0,1,7,0,106,0,39,1,82,0,10,180,2,1,33,5,38,0,43,53,53,0,1,0,18,255,236,5,66,5,182,0,29,0,70,64,38,22,14,14,15,8,27,27,20,2,15,17,5,30,31,22,13,73,89,22,22,15,18,21,17,18,17,73,89,18,3,15,18,0,5,73,89,0,19,0,63,43,0,24,63,63,43,17,0,51,17,18,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,5,34,39,53,22,51,50,54,53,53,52,38,35,33,17,35,17,33,53,33,21,33,17,33,50,22,21,21,20,6,3,207,96,54,55,91,101,104,131,140,254,131,170,254,176,3,183,254,67,1,140,205,221,196,20,22,150,19,124,112,131,128,113,253,27,5,31,151,151,254,94,191,178,143,190,211,255,255,0,201,0,0,3,248,7,115,2,38,1,97,0,0,1,7,0,118,0,90,1,82,0,8,179,1,15,5,38,0,43,53,0,1,0,125,255,236,4,227,5,205,0,24,0,56,64,30,6,3,17,22,12,5,17,4,25,26,3,6,73,89,3,3,14,20,20,0,73,89,20,4,14,9,73,89,14,19,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,51,49,48,1,34,4,7,33,21,33,18,0,51,50,55,21,6,35,32,0,17,16,0,33,50,23,7,38,3,66,226,254,243,30,2,211,253,41,10,1,11,249,162,201,161,226,254,180,254,162,1,121,1,78,237,178,71,169,5,51,250,241,150,254,238,254,227,55,149,57,1,132,1,109,1,95,1,145,88,148,82,255,255,0,106,255,236,4,2,5,203,2,6,0,54,0,0,255,255,0,84,0,0,2,86,5,182,2,6,0,44,0,0,255,255,0,60,0,0,2,111,7,37,2,38,0,44,0,0,1,7,0,106,255,7,1,82,0,10,180,2,1,33,5,38,0,43,53,53,255,255,255,96,254,127,1,104,5,182,2,6,0,45,0,0,0,2,0,0,255,233,7,35,5,182,0,26,0,35,0,71,64,38,24,27,27,4,31,0,0,4,13,3,36,37,24,35,73,89,24,24,11,22,22,6,73,89,22,3,11,16,74,89,11,18,4,27,74,89,4,18,0,63,43,0,24,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,4,33,33,17,33,2,2,6,6,35,34,39,53,22,51,50,62,2,18,19,33,17,51,32,1,51,50,54,53,52,38,35,35,7,35,254,237,254,252,254,185,254,147,57,84,80,139,107,69,64,50,63,48,65,43,55,68,65,2,166,122,2,58,253,76,133,198,183,192,220,102,1,170,206,220,5,31,254,72,253,246,251,121,25,143,26,62,103,250,1,190,1,226,253,144,253,77,139,140,138,124,0,2,0,201,0,0,7,84,5,182,0,17,0,26,0,74,64,38,11,7,7,8,15,18,18,12,4,22,0,0,4,8,3,27,28,26,6,11,6,73,89,15,11,11,4,13,9,3,8,18,4,18,74,89,4,18,0,63,43,0,24,63,63,51,18,57,47,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,17,51,49,48,1,20,4,33,33,17,33,17,35,17,51,17,33,17,51,17,51,32,1,51,50,54,53,52,38,35,35,7,84,254,240,254,251,254,183,253,125,170,170,2,131,172,121,2,57,253,78,133,196,185,193,219,102,1,170,206,220,2,176,253,80,5,182,253,146,2,110,253,144,253,77,139,140,137,125,0,0,1,0,18,0,0,5,66,5,182,0,19,0,58,64,31,0,12,12,13,6,5,5,18,13,15,4,20,21,19,15,16,15,73,89,0,11,73,89,0,0,13,16,3,6,13,18,0,63,51,63,18,57,47,43,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,33,50,22,21,17,35,17,52,38,35,33,17,35,17,33,53,33,21,33,2,12,1,144,205,217,170,125,140,254,125,170,254,176,3,246,254,4,3,125,188,181,253,244,1,246,126,113,253,27,5,31,151,151,255,255,0,201,0,0,4,229,7,115,2,38,1,180,0,0,1,7,0,118,0,162,1,82,0,8,179,1,20,5,38,0,43,53,255,255,0,27,255,236,4,248,7,94,2,38,1,189,0,0,1,7,2,54,0,68,1,82,0,8,179,1,23,5,38,0,43,53,0,1,0,201,254,131,5,12,5,182,0,11,0,48,64,24,8,5,2,3,9,0,0,3,5,3,12,13,10,6,3,5,8,73,89,1,5,18,3,34,0,63,63,51,43,0,24,63,51,17,18,1,23,57,17,51,17,51,17,51,49,48,33,33,17,35,17,33,17,51,17,33,17,51,5,12,254,47,176,254,62,170,2,239,170,254,131,1,125,5,182,250,228,5,28,0,255,255,0,0,0,0,5,16,5,188,2,6,0,36,0,0,0,2,0,201,0,0,4,125,5,182,0,13,0,22,0,61,64,32,18,0,9,14,14,4,4,7,0,3,24,23,9,22,73,89,9,9,4,5,5,8,73,89,5,3,4,14,74,89,4,18,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,4,33,33,17,33,21,33,17,51,50,22,22,1,51,50,54,53,52,38,35,35,4,125,254,253,254,251,254,84,3,94,253,76,227,193,242,116,252,246,239,190,173,176,219,207,1,170,218,208,5,182,151,254,39,89,174,254,84,130,149,142,120,0,255,255,0,201,0,0,4,190,5,182,2,6,0,37,0,0,255,255,0,201,0,0,3,248,5,182,2,6,1,97,0,0,0,2,0,14,254,131,5,74,5,182,0,13,0,19,0,67,64,36,4,5,19,7,16,10,14,12,1,0,0,12,10,7,5,5,20,21,10,16,73,89,10,3,1,5,34,19,12,6,3,6,73,89,3,18,0,63,43,17,0,51,51,24,63,51,63,43,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,35,17,33,17,35,17,51,18,18,19,33,17,51,33,17,33,6,2,7,5,74,162,252,8,162,113,154,219,12,2,145,185,254,157,254,179,18,206,137,254,131,1,125,254,131,2,23,1,3,2,230,1,51,250,228,4,131,242,253,89,234,0,255,255,0,201,0,0,3,248,5,182,2,6,0,40,0,0,0,1,0,2,0,0,6,188,5,182,0,17,0,60,64,31,6,13,13,3,14,10,9,8,1,14,0,17,7,18,19,15,12,9,6,3,0,0,1,14,11,17,18,7,4,1,3,0,63,51,51,63,51,51,18,57,17,51,51,51,51,51,17,18,1,23,57,17,51,51,17,51,49,48,1,1,51,1,17,51,17,1,51,1,1,35,1,17,35,17,1,35,2,86,253,193,190,2,57,164,2,58,190,253,192,2,82,196,253,186,164,253,187,199,2,240,2,198,253,60,2,196,253,60,2,196,253,60,253,14,2,229,253,27,2,229,253,27,0,1,0,74,255,236,4,53,5,203,0,40,0,67,64,36,28,0,19,7,7,0,3,23,35,12,6,41,42,3,24,23,24,23,74,89,24,24,10,38,38,31,74,89,38,4,10,16,74,89,10,19,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,49,48,1,20,6,7,21,22,22,21,20,4,33,34,39,53,22,22,51,50,54,53,52,38,35,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,4,25,183,161,183,189,254,206,254,233,255,163,96,223,103,198,203,225,223,218,209,205,225,162,137,110,178,117,84,101,251,135,225,255,4,96,144,180,24,8,25,180,145,205,229,79,158,46,50,150,141,134,138,143,147,132,107,128,50,74,114,75,77,197,0,1,0,203,0,0,5,82,5,182,0,15,0,52,64,24,14,2,2,15,6,9,9,8,15,8,16,17,5,4,12,13,4,13,9,15,18,6,0,3,0,63,50,63,51,57,57,17,51,17,51,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,19,51,17,20,7,51,1,51,17,35,17,52,55,35,1,35,203,159,14,8,3,52,186,160,17,9,252,203,186,5,182,252,211,225,182,4,196,250,74,3,37,201,221,251,53,0,255,255,0,203,0,0,5,82,7,94,2,38,1,178,0,0,1,7,2,54,0,225,1,82,0,8,179,1,16,5,38,0,43,53,0,1,0,201,0,0,4,229,5,182,0,10,0,45,64,22,7,3,3,4,0,9,10,4,4,11,12,10,7,2,7,4,8,5,3,1,4,18,0,63,51,63,51,18,57,57,17,51,17,18,1,23,57,17,51,17,51,49,48,33,35,1,17,35,17,51,17,1,51,1,4,229,206,253,92,170,170,2,147,195,253,121,2,229,253,27,5,182,253,60,2,196,253,58,0,1,0,0,255,231,4,217,5,182,0,19,0,45,64,24,3,18,1,0,0,18,10,3,20,21,18,3,73,89,18,3,8,13,74,89,8,19,1,18,0,63,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,33,35,17,33,7,2,2,6,39,34,39,53,22,51,50,54,54,18,19,33,4,217,170,254,37,31,61,93,152,126,74,59,54,59,53,79,61,93,56,3,18,5,31,240,254,33,254,69,174,2,25,143,26,87,215,2,89,1,184,255,255,0,201,0,0,6,113,5,182,2,6,0,48,0,0,255,255,0,201,0,0,5,31,5,182,2,6,0,43,0,0,255,255,0,125,255,236,5,190,5,205,2,6,0,50,0,0,255,255,0,201,0,0,5,12,5,182,2,6,1,110,0,0,255,255,0,201,0,0,4,104,5,182,2,6,0,51,0,0,255,255,0,125,255,236,4,207,5,203,2,6,0,38,0,0,255,255,0,18,0,0,4,90,5,182,2,6,0,55,0,0,0,1,0,27,255,236,4,248,5,182,0,22,0,42,64,21,18,8,2,9,4,23,24,14,13,8,13,0,17,9,3,0,5,73,89,0,19,0,63,43,0,24,63,51,18,57,57,17,51,17,18,1,23,57,49,48,5,34,39,53,22,51,50,54,55,1,51,1,22,23,51,54,55,1,51,1,14,2,1,37,111,84,93,96,110,133,66,253,199,188,1,176,25,14,8,28,11,1,103,180,254,45,84,135,169,20,30,166,43,101,139,4,65,252,193,49,47,84,22,3,53,251,234,187,170,79,255,255,0,106,255,236,5,248,5,203,2,6,1,115,0,0,255,255,0,8,0,0,4,150,5,182,2,6,0,59,0,0,0,1,0,201,254,131,5,184,5,182,0,11,0,50,64,25,8,5,9,0,3,2,2,0,5,3,12,13,10,6,3,0,8,5,8,73,89,5,18,3,34,0,63,63,43,17,0,51,24,63,51,17,18,1,23,57,17,51,17,51,17,51,49,48,37,51,17,35,17,33,17,51,17,33,17,51,5,12,172,161,251,178,170,2,239,170,154,253,233,1,125,5,182,250,228,5,28,0,0,1,0,170,0,0,4,199,5,182,0,19,0,45,64,22,11,8,17,1,1,0,8,0,20,21,5,14,73,89,5,5,1,18,9,3,1,18,0,63,63,51,18,57,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,33,35,17,6,6,35,34,38,53,17,51,17,20,22,51,50,54,55,17,51,4,199,170,149,198,106,207,223,170,127,143,97,177,169,170,2,92,53,39,190,179,2,69,253,207,121,116,29,55,2,202,0,1,0,201,0,0,7,121,5,182,0,11,0,49,64,24,4,1,8,5,9,0,0,5,1,3,12,13,10,6,2,3,8,4,1,4,73,89,1,18,0,63,43,17,0,51,24,63,51,51,17,18,1,23,57,17,51,17,51,17,51,49,48,33,33,17,51,17,33,17,51,17,33,17,51,7,121,249,80,170,2,88,170,2,88,172,5,182,250,228,5,28,250,228,5,28,0,1,0,201,254,131,8,4,5,182,0,15,0,59,64,30,3,0,7,4,8,11,14,13,13,11,4,0,4,16,17,14,34,9,5,1,3,11,7,3,0,3,73,89,0,18,0,63,43,17,0,51,51,24,63,51,51,63,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,201,170,2,71,172,2,72,170,172,162,5,182,250,228,5,28,250,228,5,28,250,228,253,233,1,125,0,0,2,0,18,0,0,5,23,5,182,0,12,0,21,0,61,64,32,9,13,13,4,17,0,0,4,6,3,22,23,9,21,73,89,9,9,4,7,7,6,73,89,7,3,4,13,74,89,4,18,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,4,35,33,17,33,53,33,17,51,32,4,1,51,50,54,53,52,38,35,35,5,23,254,253,249,254,71,254,176,1,250,244,1,5,1,18,252,245,252,181,169,175,203,224,1,170,206,220,5,31,151,253,144,205,254,26,139,140,136,126,0,0,3,0,201,0,0,6,10,5,182,0,10,0,19,0,23,0,63,64,32,3,11,11,0,15,7,21,20,20,7,0,3,24,25,21,18,3,19,73,89,3,3,0,22,1,3,0,11,74,89,0,18,0,63,43,0,24,63,51,18,57,47,43,0,24,63,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,51,17,51,17,51,32,4,21,20,4,35,37,51,50,54,53,52,38,35,35,1,35,17,51,201,170,239,1,5,1,18,254,253,249,254,246,247,181,170,179,200,219,4,151,170,170,5,182,253,144,205,207,206,220,145,141,140,137,123,253,82,5,182,0,2,0,201,0,0,4,186,5,182,0,10,0,18,0,50,64,25,7,11,11,4,14,0,4,0,19,20,7,18,73,89,7,7,4,5,3,4,11,74,89,4,18,0,63,43,0,24,63,18,57,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,1,20,4,35,33,17,51,17,33,32,4,1,33,32,17,52,38,35,33,4,186,254,241,251,254,25,170,1,35,1,11,1,25,252,185,1,43,1,108,187,206,254,242,1,170,203,223,5,182,253,144,211,254,32,1,23,135,127,0,1,0,61,255,236,4,137,5,203,0,26,0,58,64,31,24,21,21,9,9,22,15,3,4,27,28,23,22,73,89,23,23,12,5,12,18,73,89,12,19,5,0,73,89,5,4,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,34,7,39,54,51,50,4,18,21,16,0,33,34,39,53,22,22,51,32,0,19,33,53,33,38,0,1,211,172,162,72,172,236,217,1,57,162,254,148,254,170,227,156,83,172,99,1,15,1,20,8,253,49,2,205,22,254,241,5,51,76,144,84,176,254,186,221,254,136,254,108,57,149,21,34,1,33,1,16,152,229,1,2,0,2,0,201,255,236,7,231,5,205,0,18,0,30,0,71,64,38,12,8,8,9,19,13,6,25,0,0,6,9,3,31,32,16,28,73,89,16,4,12,7,73,89,12,12,9,10,3,9,18,3,22,73,89,3,19,0,63,43,0,24,63,63,18,57,47,43,0,24,63,43,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,16,0,33,32,0,3,33,17,35,17,51,17,33,18,0,33,32,0,1,16,18,51,50,18,17,16,2,35,34,2,7,231,254,171,254,208,254,211,254,171,11,254,158,170,170,1,100,23,1,81,1,31,1,51,1,86,251,160,238,231,234,237,235,232,233,240,2,221,254,158,254,113,1,111,1,85,253,80,5,182,253,146,1,55,1,78,254,111,254,161,254,216,254,204,1,50,1,42,1,42,1,46,254,207,0,2,0,51,0,0,4,78,5,182,0,13,0,21,0,61,64,32,21,12,12,11,18,6,2,6,3,11,4,23,22,0,20,74,89,3,9,0,0,2,9,9,15,74,89,9,3,12,2,18,0,63,51,63,43,17,18,0,57,24,47,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,1,35,1,38,38,53,52,36,33,33,17,35,17,17,35,34,6,21,16,33,51,2,123,254,129,201,1,154,161,146,1,15,1,19,1,146,170,227,183,190,1,123,221,2,98,253,158,2,127,51,207,158,196,211,250,74,2,98,2,193,126,142,254,221,255,255,0,94,255,236,3,205,4,90,2,6,0,68,0,0,0,2,0,119,255,236,4,84,6,33,0,23,0,34,0,59,64,30,26,18,32,11,0,0,6,18,3,36,35,12,11,15,28,70,89,11,15,15,21,5,21,24,70,89,21,22,5,1,0,63,63,43,17,18,0,57,24,47,57,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,19,16,18,55,36,55,23,4,7,6,6,7,51,54,54,51,50,18,21,16,0,35,34,0,5,32,17,16,33,34,6,6,7,16,18,119,212,230,1,30,218,31,254,165,149,145,145,7,12,62,196,107,202,226,254,250,234,231,254,250,1,252,1,49,254,235,76,141,117,32,166,2,145,1,104,1,147,50,61,38,146,58,34,33,246,212,84,96,254,250,232,254,255,254,223,1,98,215,1,133,1,115,63,104,55,254,249,254,237,0,3,0,176,0,0,4,76,4,72,0,14,0,22,0,31,0,73,64,38,28,20,20,11,23,0,15,7,7,0,3,11,4,32,33,4,28,19,28,19,70,89,28,28,11,12,12,27,70,89,12,15,11,20,70,89,11,21,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,20,6,7,21,22,22,21,20,6,35,33,17,33,32,3,52,38,35,33,17,33,32,3,52,38,35,33,17,33,50,54,4,41,123,111,140,129,225,216,254,29,1,225,1,152,131,135,156,254,211,1,49,1,31,31,123,125,254,199,1,25,154,126,3,53,107,111,19,9,19,126,111,153,166,4,72,253,2,89,81,254,151,2,154,80,67,254,203,76,0,0,1,0,176,0,0,3,68,4,72,0,5,0,29,64,14,2,3,0,3,7,6,4,1,70,89,4,15,3,21,0,63,63,43,17,18,1,57,57,17,51,49,48,1,33,17,35,17,33,3,68,254,18,166,2,148,3,186,252,70,4,72,0,2,0,41,254,133,4,104,4,72,0,13,0,19,0,67,64,36,4,5,19,7,16,10,14,12,1,0,0,12,10,7,5,5,20,21,10,16,71,89,10,15,1,5,34,19,12,6,3,6,70,89,3,21,0,63,43,17,0,51,51,24,63,51,63,43,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,35,17,33,17,35,17,51,54,18,19,33,17,51,33,17,35,6,2,7,4,104,161,253,2,160,86,134,152,3,2,43,157,254,195,246,13,145,108,254,133,1,123,254,133,2,10,182,1,234,1,25,252,71,3,54,222,254,57,145,0,255,255,0,115,255,236,4,18,4,92,2,6,0,72,0,0,0,1,0,4,0,0,5,223,4,70,0,17,0,60,64,31,2,9,9,17,10,6,4,5,10,14,15,13,7,19,18,17,11,8,5,2,14,14,13,3,0,15,15,10,7,13,21,0,63,51,51,63,51,51,18,57,17,51,51,51,51,51,17,18,1,23,57,17,51,51,17,51,49,48,1,51,17,1,51,1,1,35,1,17,35,17,1,35,1,1,51,1,2,164,153,1,197,182,254,54,1,241,192,254,30,153,254,31,191,1,240,254,55,182,1,195,4,70,253,237,2,19,253,237,253,205,2,43,253,213,2,43,253,213,2,51,2,19,253,237,0,1,0,68,255,236,3,127,4,92,0,34,0,77,64,43,2,13,30,19,19,13,15,33,8,24,6,35,36,16,34,33,34,33,70,89,15,34,31,34,2,11,3,34,34,22,10,22,27,70,89,22,22,10,4,70,89,10,16,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,0,57,17,18,1,23,57,17,51,17,51,49,48,1,32,53,52,35,34,6,7,39,54,51,50,22,21,20,7,21,22,22,21,20,6,35,34,39,53,22,51,50,54,53,52,33,35,53,1,129,1,55,252,77,126,102,59,170,201,189,218,205,126,116,245,216,237,129,183,187,144,147,254,201,152,2,129,172,162,28,42,135,76,155,134,184,57,8,37,137,103,152,169,71,152,86,99,93,191,141,0,1,0,176,0,0,4,98,4,72,0,13,0,52,64,25,8,4,7,7,6,11,3,3,12,6,12,15,14,3,10,12,4,13,15,12,21,7,21,4,15,0,63,63,63,63,17,18,57,57,17,18,1,57,57,17,51,17,51,17,51,17,51,51,49,48,1,17,7,7,1,51,17,35,17,55,55,1,35,17,1,76,7,3,2,81,207,155,3,5,253,176,207,4,72,253,73,182,57,3,166,251,184,2,158,132,130,252,92,4,72,0,255,255,0,176,0,0,4,98,6,12,2,38,1,210,0,0,1,6,2,54,61,0,0,8,179,1,14,17,38,0,43,53,0,1,0,176,0,0,4,12,4,72,0,10,0,45,64,22,10,6,6,7,3,1,2,7,4,12,11,2,10,5,10,7,0,8,15,4,7,21,0,63,51,63,51,18,57,57,17,51,17,18,1,23,57,17,51,17,51,49,48,1,51,1,1,35,1,17,35,17,51,17,3,47,182,254,39,2,0,194,254,12,166,166,4,72,253,239,253,201,2,43,253,213,4,72,253,235,0,1,0,16,255,242,3,225,4,72,0,16,0,45,64,24,1,0,3,15,10,15,0,3,18,17,15,3,70,89,15,15,7,12,71,89,7,22,1,21,0,63,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,33,35,17,33,2,2,6,35,34,39,53,22,51,50,18,19,33,3,225,168,254,183,27,96,153,118,54,32,22,28,115,136,35,2,129,3,186,254,156,254,94,194,12,123,6,1,230,1,239,0,1,0,176,0,0,5,47,4,70,0,20,0,53,64,25,3,6,6,5,18,15,15,16,5,16,22,21,7,14,0,14,11,3,17,15,6,16,21,11,21,0,63,63,51,63,51,18,57,57,17,51,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,37,55,55,1,51,17,35,17,7,7,1,35,1,38,39,17,35,17,51,1,22,2,233,31,43,1,41,211,147,20,58,254,229,139,254,229,53,20,148,203,1,31,43,160,93,118,2,211,251,186,3,137,58,153,253,74,2,184,134,75,252,119,4,70,253,73,110,0,1,0,176,0,0,4,98,4,72,0,11,0,57,64,30,2,6,6,5,1,9,9,10,5,10,13,12,1,8,70,89,47,1,63,1,2,1,1,10,3,11,15,6,10,21,0,63,51,63,51,18,57,47,93,43,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,1,17,33,17,51,17,35,17,33,17,35,17,1,86,2,102,166,166,253,154,166,4,72,254,53,1,203,251,184,1,238,254,18,4,72,255,255,0,115,255,236,4,98,4,92,2,6,0,82,0,0,0,1,0,176,0,0,4,72,4,72,0,7,0,35,64,17,0,1,5,4,1,4,8,9,2,7,70,89,2,15,5,1,21,0,63,51,63,43,17,18,1,57,57,17,51,17,51,49,48,33,35,17,33,17,35,17,33,1,86,166,3,152,168,253,182,4,72,251,184,3,184,0,255,255,0,176,254,20,4,117,4,92,2,6,0,83,0,0,255,255,0,115,255,236,3,139,4,92,2,6,0,70,0,0,0,1,0,41,0,0,3,147,4,72,0,7,0,36,64,18,2,3,0,3,5,3,8,9,1,5,6,5,70,89,6,15,3,21,0,63,63,43,17,0,51,17,18,1,23,57,17,51,49,48,1,33,17,35,17,33,53,33,3,147,254,156,166,254,160,3,106,3,186,252,70,3,186,142,255,255,0,2,254,20,4,6,4,72,2,6,0,92,0,0,0,3,0,113,254,20,5,70,6,20,0,17,0,24,0,30,0,76,64,39,18,9,28,15,4,4,21,12,5,25,0,0,5,9,3,31,32,13,0,27,22,12,22,70,89,15,12,16,28,21,6,21,70,89,3,6,22,5,27,0,63,63,51,43,17,0,51,24,63,51,43,17,0,51,24,63,17,18,1,23,57,17,51,17,51,51,51,17,51,51,17,51,49,48,1,20,0,7,17,35,17,38,0,53,52,0,55,17,51,17,22,0,5,20,22,23,17,6,6,5,16,37,17,54,54,5,70,254,229,254,164,248,254,224,1,31,255,158,251,1,30,251,217,176,192,185,183,3,123,254,147,190,175,2,37,249,254,217,21,254,36,1,220,19,1,46,244,249,1,38,20,1,188,254,68,23,254,212,240,192,218,18,3,84,17,207,200,1,127,39,252,174,19,218,255,255,0,39,0,0,4,8,4,72,2,6,0,91,0,0,0,1,0,176,254,133,4,221,4,72,0,11,0,50,64,25,6,3,7,10,1,0,0,10,3,3,12,13,8,4,15,10,6,3,6,70,89,3,21,1,34,0,63,63,43,17,0,51,24,63,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,35,17,33,17,51,17,33,17,51,17,51,4,221,166,252,121,166,2,70,166,155,254,133,1,123,4,72,252,71,3,185,252,71,0,1,0,156,0,0,4,45,4,72,0,18,0,45,64,22,6,10,10,9,1,17,9,17,20,19,3,14,70,89,3,3,10,7,18,15,10,21,0,63,63,51,18,57,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,1,17,20,51,50,54,55,17,51,17,35,17,6,6,35,34,38,53,17,1,66,219,91,166,105,166,166,105,179,113,164,186,4,72,254,112,192,56,67,1,213,251,184,1,240,72,59,172,147,1,156,0,1,0,176,0,0,6,111,4,72,0,11,0,49,64,24,8,5,0,9,1,4,4,9,5,3,12,13,10,2,6,15,0,8,5,8,70,89,5,21,0,63,43,17,0,51,24,63,51,51,17,18,1,23,57,17,51,17,51,17,51,49,48,37,33,17,51,17,33,17,51,17,33,17,51,3,225,1,230,168,250,65,166,1,229,166,143,3,185,251,184,4,72,252,71,3,185,0,0,1,0,176,254,135,7,10,4,70,0,15,0,59,64,30,12,9,0,13,1,4,7,6,6,4,13,9,4,16,17,14,2,10,15,4,0,12,9,12,70,89,9,21,7,34,0,63,63,43,17,0,51,51,24,63,51,51,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,37,33,17,51,17,51,17,35,17,33,17,51,17,33,17,51,3,225,1,230,166,157,168,250,78,166,1,229,166,143,3,183,252,73,253,248,1,121,4,70,252,73,3,183,0,0,2,0,41,0,0,5,29,4,72,0,12,0,20,0,61,64,32,0,18,18,8,13,4,4,8,10,3,21,22,0,17,70,89,0,0,8,11,11,10,70,89,11,15,8,18,70,89,8,21,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,33,50,22,21,20,6,35,33,17,33,53,33,1,52,38,35,33,17,33,32,2,45,1,57,224,215,223,220,254,37,254,162,2,4,2,76,124,157,254,205,1,57,1,19,2,131,154,155,166,168,3,186,142,252,252,93,83,254,151,0,0,3,0,176,0,0,5,121,4,72,0,10,0,14,0,22,0,63,64,32,0,16,16,8,4,19,12,11,11,19,8,3,23,24,12,21,0,15,70,89,0,0,8,13,9,15,8,16,70,89,8,21,0,63,43,0,24,63,51,18,57,47,43,0,24,63,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,33,50,22,21,20,6,35,33,17,51,1,35,17,51,1,17,33,32,53,52,38,35,1,86,1,43,209,201,213,207,254,57,166,4,35,166,166,251,221,1,25,1,8,122,147,2,131,155,154,165,169,4,72,251,184,4,72,253,172,254,151,185,92,84,0,2,0,176,0,0,4,76,4,72,0,9,0,18,0,50,64,25,15,3,0,11,11,7,3,7,20,19,0,10,70,89,0,0,7,8,15,7,11,70,89,7,21,0,63,43,0,24,63,18,57,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,1,33,32,17,20,6,35,33,17,51,17,17,33,50,54,53,52,38,35,1,86,1,82,1,164,219,211,254,18,166,1,64,132,140,129,148,2,131,254,203,162,172,4,72,253,172,254,151,92,93,91,85,0,1,0,57,255,236,3,125,4,92,0,26,0,68,64,38,12,9,9,24,24,10,18,2,4,27,28,11,10,70,89,15,11,31,11,2,11,3,11,11,0,21,21,15,70,89,21,16,0,6,70,89,0,22,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,1,23,57,17,51,17,51,49,48,5,34,39,53,22,22,51,50,54,55,33,53,33,38,38,35,34,7,39,54,54,51,32,0,17,16,0,1,86,167,118,60,140,91,174,189,10,253,213,2,41,16,169,161,103,151,47,55,164,80,1,0,1,10,254,223,20,57,147,23,36,186,185,141,172,160,54,140,26,35,254,219,254,236,254,243,254,214,0,2,0,176,255,236,6,51,4,92,0,18,0,30,0,81,64,45,12,8,8,9,19,13,6,25,0,0,6,9,3,31,32,16,28,70,89,16,16,12,7,70,89,15,12,31,12,2,11,3,12,12,9,10,15,9,21,3,22,70,89,3,22,0,63,43,0,24,63,63,18,57,47,95,94,93,43,0,24,63,43,17,18,1,23,57,17,51,17,51,51,17,51,17,51,49,48,1,16,0,35,34,2,39,33,17,35,17,51,17,33,54,54,51,50,0,1,20,22,51,50,54,53,52,38,35,34,6,6,51,254,255,224,213,250,14,254,225,166,166,1,33,20,252,207,220,1,1,252,238,146,161,158,149,146,161,161,146,2,37,254,243,254,212,1,11,247,254,18,4,72,254,53,228,251,254,207,254,250,211,219,213,217,210,216,216,0,2,0,37,0,0,3,193,4,72,0,13,0,20,0,61,64,32,17,11,11,10,14,5,1,5,2,10,4,22,21,13,16,70,89,2,8,13,13,1,8,8,19,70,89,8,15,11,1,21,0,63,51,63,43,17,18,0,57,24,47,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,51,35,1,38,38,53,52,54,51,33,17,35,17,33,1,20,33,33,17,33,34,231,194,1,59,127,135,202,181,1,232,166,254,235,254,246,1,20,1,11,254,211,242,1,207,28,161,122,150,172,251,184,1,182,1,78,190,1,114,255,255,0,115,255,236,4,18,5,211,2,38,0,72,0,0,1,6,0,106,8,0,0,10,180,3,2,48,17,38,0,43,53,53,0,1,0,20,254,20,4,68,6,20,0,39,0,102,64,58,29,27,23,15,15,20,16,7,37,37,25,2,16,18,5,40,41,30,29,33,11,70,89,26,18,19,18,71,89,23,19,15,19,31,19,47,19,3,9,3,29,33,19,19,33,29,3,16,21,0,16,21,0,5,70,89,0,27,0,63,43,0,24,63,63,18,23,57,47,47,47,95,94,93,17,51,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,51,51,49,48,1,34,39,53,22,51,50,53,17,52,38,35,34,6,21,17,35,17,35,53,51,53,51,21,33,21,33,21,20,7,51,54,54,51,50,22,21,17,20,6,3,47,79,52,58,55,129,122,130,173,157,168,156,156,166,1,145,254,111,8,10,49,181,116,201,201,137,254,20,25,137,20,170,3,82,134,132,188,211,253,231,4,219,127,186,186,127,196,84,56,79,91,191,210,252,182,156,170,255,255,0,176,0,0,3,68,6,33,2,38,1,205,0,0,1,6,0,118,241,0,0,8,179,1,15,17,38,0,43,53,0,1,0,115,255,236,3,170,4,92,0,25,0,68,64,38,15,18,18,3,9,24,17,3,4,26,27,15,18,70,89,15,15,31,15,2,11,3,15,15,0,6,6,12,70,89,6,16,0,21,70,89,0,22,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,1,23,57,17,51,17,51,49,48,5,34,0,17,16,0,51,50,22,23,7,38,35,34,6,7,33,21,33,22,22,51,50,55,21,6,2,121,248,254,242,1,19,251,82,158,57,49,143,109,164,170,16,2,41,253,213,9,170,167,140,151,116,20,1,35,1,16,1,19,1,42,32,25,141,51,163,169,141,190,181,59,147,57,255,255,0,106,255,236,3,115,4,92,2,6,0,86,0,0,255,255,0,162,0,0,1,102,5,223,2,6,0,76,0,0,255,255,255,236,0,0,2,31,5,211,2,38,0,243,0,0,1,7,0,106,254,183,0,0,0,10,180,2,1,25,17,38,0,43,53,53,255,255,255,145,254,20,1,102,5,223,2,6,0,77,0,0,0,2,0,16,255,242,6,66,4,72,0,21,0,29,0,76,64,41,9,20,0,27,27,7,22,4,4,7,20,14,4,30,31,0,26,70,89,0,0,12,20,20,9,70,89,20,15,12,17,71,89,12,21,7,27,70,89,7,21,0,63,43,0,24,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,51,50,22,21,16,33,33,17,33,2,2,35,34,39,53,22,51,50,18,19,33,1,52,38,35,35,17,51,32,3,176,244,211,203,254,75,254,101,254,254,40,181,171,56,32,22,28,115,136,35,2,80,1,236,125,158,231,237,1,21,2,131,155,154,254,178,3,186,253,250,254,62,12,123,6,1,230,1,239,252,252,91,85,254,151,0,2,0,176,0,0,6,164,4,70,0,17,0,25,0,74,64,38,15,11,11,12,1,19,19,16,8,22,5,5,8,12,3,26,27,18,10,15,10,70,89,1,15,15,8,17,13,15,12,21,8,19,70,89,8,21,0,63,43,0,24,63,63,51,18,57,47,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,17,51,49,48,1,17,33,50,22,21,16,33,33,17,33,17,35,17,51,17,33,17,19,17,51,32,53,52,38,35,4,0,1,0,217,203,254,78,254,96,254,10,172,172,1,250,166,240,1,20,128,153,4,70,254,59,153,154,254,178,1,238,254,18,4,70,254,55,1,201,253,174,254,151,185,92,84,0,255,255,0,20,0,0,4,68,6,20,2,6,0,233,0,0,255,255,0,176,0,0,4,12,6,33,2,38,1,212,0,0,1,6,0,118,51,0,0,8,179,1,20,17,38,0,43,53,255,255,0,2,254,20,4,6,6,12,2,38,0,92,0,0,1,6,2,54,183,0,0,8,179,1,22,17,38,0,43,53,0,1,0,176,254,135,4,70,4,70,0,11,0,50,64,25,4,1,10,11,5,8,8,11,1,3,12,13,11,34,6,2,15,9,1,1,4,70,89,1,21,0,63,43,17,0,51,24,63,51,63,17,18,1,23,57,17,51,17,51,17,51,49,48,33,33,17,51,17,33,17,51,17,33,17,35,2,47,254,129,166,2,74,166,254,143,166,4,70,252,73,3,183,251,186,254,135,0,0,1,0,201,0,0,4,8,6,227,0,7,0,35,64,17,0,3,5,6,3,6,9,8,7,4,73,89,1,7,3,6,18,0,63,63,198,43,17,18,1,57,57,17,51,17,51,49,48,1,17,51,17,33,17,35,17,3,102,162,253,107,170,5,182,1,45,254,58,250,227,5,182,0,0,1,0,176,0,0,3,68,5,137,0,7,0,39,64,18,5,0,2,3,0,3,9,8,6,4,4,1,71,89,4,15,3,21,0,63,63,43,0,24,16,198,17,18,1,57,57,17,51,17,51,49,48,1,33,17,35,17,33,17,51,3,68,254,18,166,1,238,166,3,199,252,57,4,72,1,65,0,255,255,0,27,0,0,7,76,7,115,2,38,0,58,0,0,1,7,0,67,1,23,1,82,0,8,179,1,27,5,38,0,43,53,255,255,0,23,0,0,6,35,6,33,2,38,0,90,0,0,1,6,0,67,115,0,0,8,179,1,30,17,38,0,43,53,255,255,0,27,0,0,7,76,7,115,2,38,0,58,0,0,1,7,0,118,1,176,1,82,0,8,179,1,35,5,38,0,43,53,255,255,0,23,0,0,6,35,6,33,2,38,0,90,0,0,1,7,0,118,1,27,0,0,0,8,179,1,38,17,38,0,43,53,255,255,0,27,0,0,7,76,7,37,2,38,0,58,0,0,1,7,0,106,1,100,1,82,0,10,180,2,1,47,5,38,0,43,53,53,255,255,0,23,0,0,6,35,5,211,2,38,0,90,0,0,1,7,0,106,0,207,0,0,0,10,180,2,1,50,17,38,0,43,53,53,255,255,0,0,0,0,4,123,7,115,2,38,0,60,0,0,1,7,0,67,255,148,1,82,0,8,179,1,10,5,38,0,43,53,255,255,0,2,254,20,4,6,6,33,2,38,0,92,0,0,1,7,0,67,255,97,0,0,0,8,179,1,23,17,38,0,43,53,0,1,0,82,1,217,3,174,2,113,0,3,0,17,181,0,2,4,5,0,1,0,47,51,17,18,1,57,57,49,48,19,53,33,21,82,3,92,1,217,152,152,0,1,0,82,1,217,7,174,2,113,0,3,0,17,181,0,2,4,5,0,1,0,47,51,17,18,1,57,57,49,48,19,53,33,21,82,7,92,1,217,152,152,255,255,0,82,1,217,7,174,2,113,2,6,2,3,0,0,0,2,255,252,254,49,3,78,255,211,0,3,0,7,0,28,64,11,4,0,9,5,1,1,8,5,6,2,1,0,47,51,47,51,17,1,51,17,51,17,51,50,49,48,1,33,53,33,53,33,53,33,3,78,252,174,3,82,252,174,3,82,254,49,139,140,139,0,0,1,0,25,3,193,1,68,5,182,0,7,0,18,182,1,5,8,9,0,4,3,0,63,205,17,18,1,57,57,49,48,19,39,54,18,55,51,6,7,37,12,22,98,56,123,66,37,3,193,22,90,1,12,121,254,247,0,0,1,0,25,3,193,1,68,5,182,0,7,0,18,182,5,1,8,9,5,7,3,0,63,198,17,18,1,57,57,49,48,1,23,6,2,7,35,18,55,1,53,15,26,98,53,122,70,32,5,182,22,100,254,247,114,1,29,216,0,255,255,0,63,254,248,1,109,0,238,2,6,0,15,0,0,0,1,0,25,3,193,1,70,5,182,0,7,0,18,182,2,6,9,8,3,7,3,0,63,205,17,18,1,57,57,49,48,19,22,23,35,38,2,39,55,223,37,66,123,45,109,24,14,5,182,251,250,94,1,28,101,22,0,0,2,0,25,3,193,2,180,5,182,0,7,0,15,0,26,64,12,4,1,13,9,4,16,17,0,8,3,12,3,0,63,51,205,50,17,18,1,23,57,49,48,1,39,54,19,51,6,2,7,33,39,54,18,55,51,6,7,1,150,15,56,122,123,30,59,13,253,215,12,22,98,56,123,66,37,3,193,22,215,1,8,115,254,223,97,22,90,1,12,121,254,247,0,0,2,0,25,3,193,2,180,5,182,0,7,0,16,0,26,64,12,9,13,1,5,4,17,18,13,5,16,7,3,0,63,51,198,50,17,18,1,23,57,49,48,1,23,6,2,7,35,18,55,33,23,6,2,7,35,54,18,55,1,53,15,26,98,53,122,70,32,2,39,14,24,96,56,125,26,66,13,5,182,22,100,254,247,114,1,29,216,22,91,254,246,122,100,1,52,93,0,255,255,0,25,254,249,2,180,0,238,1,7,2,11,0,0,251,56,0,32,183,1,0,7,64,13,13,72,7,184,255,192,179,12,12,72,7,184,255,192,179,9,9,72,7,0,17,43,43,43,53,53,0,1,0,123,0,0,3,137,6,20,0,11,0,67,64,33,9,2,2,8,3,10,1,1,7,4,0,4,3,5,4,12,13,0,5,5,11,6,6,7,8,0,1,4,4,10,7,3,18,0,63,46,51,51,17,51,63,18,57,47,51,51,17,51,17,18,1,23,57,17,51,51,17,51,17,51,51,17,51,49,48,1,37,19,35,19,5,53,5,3,51,3,37,3,137,254,160,49,196,49,254,180,1,76,49,196,49,1,96,3,231,31,251,250,4,6,31,170,30,1,161,254,95,30,0,1,0,123,0,0,3,154,6,20,0,21,0,117,64,58,12,7,21,16,4,4,15,10,5,20,17,0,3,3,14,11,9,6,19,1,1,6,5,7,4,22,23,1,8,8,2,7,3,6,6,0,9,20,11,11,17,14,19,12,12,18,9,14,13,7,13,7,13,5,15,0,5,18,0,63,63,18,57,57,47,47,18,57,57,50,50,17,51,17,51,51,17,51,17,51,51,17,51,17,51,51,17,51,17,18,1,23,57,17,51,17,51,51,51,51,17,51,51,51,17,51,51,51,17,51,51,17,51,49,48,1,37,21,37,19,35,19,5,53,5,3,19,5,53,5,3,51,3,37,21,37,19,2,57,1,97,254,159,49,198,49,254,166,1,90,43,43,254,166,1,90,49,198,49,1,97,254,159,43,1,231,31,168,29,254,133,1,123,29,168,31,1,43,1,27,31,168,30,1,124,254,132,30,168,31,254,229,0,1,0,164,1,244,2,94,3,227,0,11,0,19,182,6,0,0,12,13,9,3,0,47,205,17,18,1,57,17,51,49,48,19,52,54,51,50,22,21,20,6,35,34,38,164,113,108,105,116,115,106,107,114,2,236,121,126,124,123,119,129,131,0,255,255,0,152,255,227,5,174,0,242,0,38,0,17,0,0,0,39,0,17,2,18,0,0,0,7,0,17,4,37,0,0,0,7,0,100,255,236,9,59,5,203,0,9,0,20,0,24,0,36,0,47,0,59,0,70,0,91,64,48,0,16,5,10,48,66,54,60,25,43,31,37,37,43,60,21,66,10,23,16,8,71,72,28,51,51,40,63,25,3,13,34,57,57,45,68,13,68,13,68,23,24,6,23,24,7,18,7,0,63,51,63,63,18,57,57,47,47,17,51,51,17,51,17,51,63,51,51,17,51,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,17,51,49,48,19,20,22,51,50,17,16,35,34,6,5,20,6,35,34,38,53,16,33,50,22,37,1,35,1,1,20,22,51,50,54,53,52,38,35,34,6,5,20,6,35,34,38,53,16,33,50,22,5,20,22,51,50,54,53,52,38,35,34,6,5,20,6,35,34,38,53,16,33,50,22,236,83,93,180,180,93,83,1,237,161,156,149,163,1,56,152,165,2,105,252,213,148,3,43,2,160,83,93,91,89,89,91,93,83,1,237,162,155,148,163,1,55,150,167,251,56,81,93,91,89,89,91,93,81,1,235,162,155,149,163,1,56,150,167,4,2,170,170,1,84,1,82,168,170,230,231,238,223,1,201,240,219,250,74,5,182,252,2,171,169,167,173,171,165,165,171,230,230,239,221,1,201,236,221,171,169,167,173,171,165,165,171,230,230,238,222,1,201,236,0,255,255,0,133,3,166,1,63,5,182,2,6,0,10,0,0,255,255,0,133,3,166,2,176,5,182,0,6,0,5,0,0,0,1,0,82,0,117,2,31,3,190,0,6,0,26,64,10,4,2,3,6,2,6,8,7,5,1,0,47,47,17,18,1,57,57,17,51,17,51,49,48,19,1,23,1,1,7,1,82,1,86,119,254,223,1,33,119,254,170,2,39,1,151,69,254,162,254,161,71,1,151,0,1,0,80,0,117,2,29,3,190,0,6,0,26,64,10,3,0,4,2,0,2,8,7,5,1,0,47,47,17,18,1,57,57,17,51,17,51,49,48,1,1,39,1,1,55,1,2,29,254,168,117,1,31,254,225,117,1,88,2,12,254,105,71,1,95,1,94,69,254,105,0,255,255,0,152,255,227,3,74,5,182,0,38,0,4,0,0,0,7,0,4,1,193,0,0,0,1,254,121,0,0,2,143,5,182,0,3,0,19,183,0,5,2,4,3,3,2,18,0,63,63,17,1,51,17,51,49,48,1,1,35,1,2,143,252,121,143,3,135,5,182,250,74,5,182,0,1,0,109,3,33,2,195,5,199,0,18,0,38,64,17,0,18,12,8,8,9,18,9,20,19,4,15,31,0,9,10,31,0,63,205,50,63,51,17,18,1,57,57,17,51,17,51,17,51,49,48,1,17,52,38,35,34,6,21,17,35,17,51,23,51,54,51,32,21,17,2,76,78,80,114,91,116,96,14,10,75,145,1,2,3,33,1,164,84,71,105,122,254,164,2,153,88,101,250,254,84,0,1,0,98,0,0,4,35,5,182,0,17,0,75,64,40,14,0,4,4,9,5,11,16,2,5,7,5,18,19,3,7,8,7,78,89,0,8,14,17,76,89,8,14,8,14,5,10,10,13,76,89,10,6,5,24,0,63,63,43,17,18,0,57,57,24,47,47,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,51,49,48,1,33,21,33,17,35,17,35,53,51,17,33,21,33,17,33,21,33,1,184,1,52,254,204,166,176,176,3,17,253,149,2,68,253,188,1,139,129,254,246,1,10,129,4,43,151,253,233,151,0,1,0,68,0,0,4,72,5,201,0,37,0,112,64,64,13,9,17,17,34,30,26,11,15,21,2,15,26,28,32,23,7,38,39,16,28,29,28,78,89,13,29,12,32,33,32,78,89,9,33,15,33,31,33,63,33,79,33,4,9,3,29,33,29,33,23,0,23,20,76,89,23,24,0,5,75,89,0,7,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,95,94,93,17,51,43,17,0,51,17,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,51,17,51,51,49,48,1,50,23,7,38,35,34,6,21,21,33,21,33,21,33,21,33,21,20,6,7,33,21,33,53,54,53,53,35,53,51,53,35,53,51,53,52,54,2,176,201,158,60,152,147,122,126,1,164,254,92,1,164,254,92,65,74,3,27,251,252,206,200,200,200,200,224,5,201,80,131,71,135,129,186,129,166,129,33,100,136,44,154,141,48,243,35,129,166,129,207,178,205,0,0,3,0,154,255,236,5,209,5,182,0,22,0,33,0,42,0,96,64,55,34,28,28,29,38,23,16,20,20,13,9,2,18,9,23,11,29,6,43,44,27,34,75,89,16,19,78,89,3,27,11,16,14,14,16,11,27,3,5,29,30,30,42,75,89,30,6,29,24,6,0,77,89,6,25,0,63,43,0,24,63,63,43,17,18,0,23,57,24,47,47,47,47,47,43,43,17,18,1,23,57,17,51,51,17,51,17,51,17,51,17,51,49,48,37,50,54,55,21,6,35,34,38,53,17,35,53,55,55,51,21,51,21,35,17,20,22,1,20,4,33,35,17,35,17,33,32,22,1,51,50,54,53,52,38,35,35,5,78,34,86,11,60,110,109,129,157,157,62,98,221,221,52,254,145,254,235,254,246,64,165,1,6,1,0,254,253,161,52,200,185,172,183,82,117,14,4,125,30,136,138,1,207,80,69,191,211,129,254,71,77,82,3,151,227,234,253,193,5,182,211,253,238,145,162,145,142,0,0,1,0,63,255,236,4,137,5,203,0,38,0,113,64,63,29,23,31,22,22,26,11,2,7,7,26,36,17,4,10,26,23,6,39,40,11,23,24,23,78,89,8,24,5,29,30,29,78,89,2,30,15,30,31,30,47,30,3,9,3,24,30,24,30,19,34,34,0,76,89,34,7,19,14,76,89,19,25,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,95,94,93,17,51,43,17,0,51,17,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,17,51,49,48,1,32,3,33,21,33,7,21,23,33,21,33,22,22,51,50,55,21,6,35,34,0,3,35,53,51,39,53,55,35,53,51,18,0,51,50,23,7,38,3,27,254,193,79,1,254,253,244,2,2,1,207,254,65,37,203,170,156,153,146,171,237,254,223,46,166,152,2,2,152,164,39,1,36,237,201,165,71,166,5,53,254,109,129,57,64,45,129,180,197,66,150,65,1,13,1,1,129,42,44,80,129,1,5,1,36,97,139,86,0,4,0,141,255,248,6,10,5,193,0,3,0,15,0,23,0,43,0,69,64,36,37,27,32,42,16,10,20,4,4,0,10,42,2,27,6,44,45,35,30,6,18,7,24,22,13,39,24,13,24,13,24,2,3,6,2,24,0,63,63,18,57,57,47,47,17,51,17,51,63,51,63,51,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,1,35,1,1,20,6,35,34,38,53,52,54,51,50,22,5,20,51,50,53,52,35,34,37,34,38,53,52,54,51,50,23,7,38,35,34,21,20,51,50,55,21,6,5,31,252,213,148,3,43,1,127,169,148,139,170,167,148,141,170,254,21,178,176,176,178,253,202,166,182,188,171,104,88,33,81,80,224,220,98,90,78,5,182,250,74,5,182,251,152,159,183,185,157,158,184,186,156,238,238,235,219,177,161,168,179,35,103,31,238,235,33,101,37,0,2,0,119,255,236,3,156,5,203,0,28,0,36,0,61,64,31,35,26,26,15,9,29,22,3,22,9,12,4,37,38,35,15,13,25,10,5,12,19,2,12,2,12,6,31,19,0,6,0,47,51,47,51,18,57,57,47,47,17,18,23,57,17,18,1,23,57,17,51,17,51,51,17,51,49,48,37,50,55,51,6,6,35,34,38,53,53,6,7,53,54,55,17,52,54,51,50,22,21,20,2,7,17,20,22,19,52,35,34,6,21,17,36,2,125,174,18,95,8,153,142,150,160,96,96,78,114,150,135,117,135,206,175,82,174,127,67,62,1,0,111,213,166,178,181,169,243,35,22,113,21,38,1,242,138,159,161,138,185,254,208,74,254,229,104,123,4,43,194,86,108,254,75,137,0,0,4,0,201,0,0,7,195,5,182,0,15,0,27,0,39,0,43,0,95,64,49,9,6,6,7,1,13,13,0,28,22,34,16,16,43,40,22,0,7,6,44,45,31,19,37,25,11,40,19,3,25,8,19,25,19,25,40,8,40,41,74,89,40,18,14,8,3,1,7,18,0,63,51,63,51,63,43,17,18,0,57,57,24,47,47,17,18,57,17,18,57,17,51,17,51,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,17,51,49,48,33,35,1,35,18,21,17,35,17,51,1,51,38,53,17,51,1,20,6,35,34,38,53,52,54,51,50,22,5,20,22,51,50,54,53,52,38,35,34,6,3,53,33,21,4,199,187,253,76,8,16,151,194,2,170,8,14,152,2,252,161,147,139,162,161,147,139,162,254,34,81,93,91,79,79,91,92,82,86,2,0,4,203,254,224,108,252,193,5,182,251,58,245,138,3,71,252,183,163,184,187,160,163,181,187,157,114,118,117,115,115,112,112,253,32,135,135,0,2,0,37,2,229,5,133,5,182,0,7,0,24,0,79,64,39,0,1,15,12,12,13,17,20,20,19,19,13,6,1,3,5,25,26,23,22,9,10,10,17,14,14,4,7,3,3,4,16,8,8,20,13,1,4,3,0,63,196,50,50,57,47,51,17,51,17,51,17,51,17,51,51,17,51,51,51,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,35,17,35,53,33,21,35,1,3,35,23,17,35,17,51,19,19,51,17,35,17,55,35,3,1,113,123,209,2,31,211,2,88,201,8,6,119,187,196,203,180,127,6,8,211,2,229,2,103,106,106,253,153,2,47,129,254,82,2,209,253,209,2,47,253,47,1,164,137,253,211,0,255,255,0,80,0,0,5,244,5,205,2,6,1,118,0,0,0,2,0,102,255,221,4,139,4,72,0,23,0,31,0,52,64,26,31,14,14,4,24,12,12,21,4,3,32,33,13,20,47,31,63,31,2,31,31,17,28,8,17,0,0,47,50,47,51,18,57,47,93,57,51,17,18,1,23,57,17,51,17,51,17,51,49,48,5,34,38,2,53,52,54,54,51,50,22,18,21,33,17,22,22,51,50,54,55,23,6,6,19,17,38,38,35,34,7,17,2,121,157,241,133,138,244,149,152,243,135,252,197,49,166,82,131,183,81,72,98,217,147,50,163,88,173,122,35,147,1,5,157,171,255,140,142,254,253,165,254,156,53,70,105,129,41,155,124,2,139,1,21,53,66,117,254,233,255,255,0,71,255,236,5,243,5,182,0,39,2,23,2,92,0,0,0,38,0,123,251,0,1,7,2,64,3,96,253,179,0,11,180,4,3,2,25,25,0,63,53,53,53,0,255,255,0,32,255,236,6,8,5,201,0,39,2,23,2,162,0,0,0,39,2,64,3,117,253,179,1,6,0,117,255,0,0,11,180,1,3,2,14,25,0,63,53,53,53,0,255,255,0,71,255,236,6,4,5,182,0,39,2,23,2,156,0,0,0,38,2,61,12,0,1,7,2,64,3,113,253,179,0,11,180,4,3,2,44,25,0,63,53,53,53,0,255,255,0,106,255,236,6,0,5,182,0,39,2,23,2,70,0,0,0,39,2,64,3,109,253,179,1,6,2,63,49,0,0,11,180,1,3,2,14,25,0,63,53,53,53,0,0,2,0,102,255,236,4,53,5,199,0,26,0,40,0,65,64,34,38,7,31,15,15,0,0,20,7,3,41,42,11,34,71,89,14,4,11,11,24,4,24,17,70,89,24,3,4,27,70,89,4,22,0,63,43,0,24,63,43,17,18,0,57,24,47,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,16,2,4,35,34,38,53,52,18,54,51,50,22,23,55,16,33,34,6,7,53,54,54,51,50,18,1,50,54,18,55,38,38,35,34,6,6,21,20,22,4,53,167,254,236,173,172,187,136,232,151,97,146,43,4,254,230,62,144,48,47,155,74,210,216,253,162,95,166,120,22,25,128,80,101,165,101,101,3,166,254,250,254,53,233,201,192,169,1,51,161,93,75,90,1,149,44,33,159,23,37,254,236,251,198,144,1,3,150,97,108,132,250,128,118,130,0,2,0,39,0,0,4,109,5,182,0,5,0,12,0,40,64,19,9,5,10,4,5,4,14,13,6,5,1,5,9,73,89,5,18,1,3,0,63,63,43,17,18,0,57,17,18,1,57,57,17,51,17,51,49,48,55,1,51,1,21,33,1,6,7,1,33,1,38,39,1,207,166,1,209,251,186,2,33,61,40,254,252,2,209,254,254,68,104,5,78,250,176,102,4,244,225,121,252,254,2,249,202,0,0,1,0,201,254,16,5,33,5,182,0,7,0,35,64,17,0,7,3,4,7,4,9,8,5,2,73,89,5,3,0,4,27,0,63,51,63,43,17,18,1,57,57,17,51,17,51,49,48,1,17,33,17,35,17,33,17,4,119,252,252,170,4,88,254,16,7,13,248,243,7,166,248,90,0,1,0,76,254,16,4,221,5,182,0,11,0,49,64,26,7,9,9,3,0,8,2,10,6,2,0,4,12,13,4,7,73,89,4,3,0,9,73,89,0,27,0,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,51,17,51,49,48,19,53,1,1,53,33,21,33,1,1,33,21,76,2,119,253,153,4,64,252,176,2,67,253,164,3,170,254,16,107,3,156,3,51,108,151,252,252,252,141,152,0,1,0,104,2,141,4,41,3,23,0,3,0,21,64,9,2,0,5,4,1,0,80,89,1,0,47,43,17,18,1,57,57,49,48,19,53,33,21,104,3,193,2,141,138,138,0,1,0,37,255,242,4,188,6,152,0,8,0,28,64,11,8,10,3,9,3,6,4,4,1,8,1,0,47,47,18,57,47,57,51,17,1,51,17,51,49,48,5,35,1,35,53,33,19,1,51,2,111,127,254,233,180,1,33,235,2,2,137,14,3,14,135,253,84,5,189,0,0,3,0,119,1,147,5,45,4,12,0,21,0,33,0,45,0,51,64,24,31,12,43,0,0,37,25,12,4,46,47,34,28,28,17,6,9,19,15,40,22,22,3,9,0,47,51,51,17,51,47,51,18,57,57,51,17,51,17,18,1,23,57,17,51,17,51,49,48,1,20,6,35,34,38,39,6,6,35,34,38,53,52,54,51,50,23,54,51,50,22,1,50,54,55,38,38,35,34,6,21,20,22,1,34,6,7,22,22,51,50,54,53,52,38,5,45,167,128,93,153,65,60,153,88,131,168,168,131,181,122,124,185,133,162,252,125,66,109,54,50,109,72,76,100,97,2,161,66,109,55,51,110,71,76,100,101,2,207,131,185,106,116,104,113,173,142,134,179,219,215,175,254,187,91,100,97,93,105,87,83,106,1,121,92,98,97,94,107,84,85,105,0,1,0,12,254,20,2,248,6,20,0,20,0,28,64,12,8,18,2,18,13,3,21,22,16,11,5,0,0,47,50,47,51,17,18,1,23,57,17,51,49,48,1,50,23,21,38,35,34,21,17,20,6,35,34,39,53,22,51,50,53,17,16,2,125,79,44,49,62,176,165,163,74,59,61,58,182,6,20,16,137,22,243,250,225,176,187,19,135,22,243,5,31,1,106,0,0,2,0,98,1,135,4,45,4,31,0,23,0,47,0,112,64,64,40,15,27,3,15,3,49,48,39,30,30,24,80,89,15,30,31,30,47,30,3,9,3,30,42,64,42,36,80,89,27,42,64,15,6,6,0,80,89,15,6,31,6,47,6,3,9,3,6,18,64,18,12,80,89,3,0,18,16,18,32,18,3,18,0,47,93,196,43,0,26,24,16,205,95,94,93,43,0,16,24,196,26,222,196,43,0,26,24,16,205,95,94,93,43,0,16,24,196,17,18,1,57,57,17,51,17,51,49,48,1,34,6,7,53,54,51,50,22,23,22,22,51,50,54,55,21,6,35,34,38,39,38,38,3,34,6,7,53,54,51,50,22,23,22,22,51,50,54,55,21,6,35,34,38,39,38,38,1,80,54,127,57,108,148,67,112,88,77,91,45,53,128,54,101,153,67,111,88,73,91,49,57,128,53,106,150,69,116,82,69,95,49,55,129,51,100,154,69,118,79,84,85,2,0,64,57,150,110,28,37,33,25,66,57,151,109,29,37,30,25,1,150,68,53,149,109,32,34,29,26,66,55,150,110,32,33,34,24,0,0,1,0,104,0,166,4,41,5,2,0,19,0,70,64,38,5,1,16,11,11,9,10,14,4,0,19,1,8,20,21,13,5,6,5,80,89,10,8,15,6,1,9,3,6,14,2,1,2,80,89,18,17,1,0,47,51,196,43,17,0,51,24,47,95,94,93,198,51,43,17,0,51,17,18,1,23,57,17,51,17,51,49,48,1,33,53,33,19,33,53,33,19,23,7,33,21,33,3,33,21,33,3,39,1,125,254,235,1,84,127,254,45,2,19,135,125,109,1,23,254,170,129,1,215,253,233,131,125,1,193,137,1,16,137,1,31,57,230,137,254,240,137,254,229,55,255,255,0,104,0,1,4,41,4,217,2,38,0,31,0,0,1,7,2,43,0,0,253,116,0,9,179,1,0,7,18,0,63,53,53,0,255,255,0,104,0,1,4,41,4,217,2,38,0,33,0,0,1,7,2,43,0,0,253,116,0,9,179,1,0,7,18,0,63,53,53,0,0,2,0,111,0,0,4,61,5,195,0,5,0,9,0,32,64,13,8,0,6,3,0,3,10,11,9,7,2,5,2,0,47,47,18,57,57,17,18,1,57,57,17,51,17,51,49,48,19,1,51,1,1,35,9,3,111,1,194,72,1,196,254,60,72,1,98,254,195,254,195,1,61,2,223,2,228,253,28,253,33,2,225,2,19,253,237,253,236,0,255,255,0,29,0,0,4,28,6,31,0,38,0,73,0,0,0,7,0,76,2,182,0,0,255,255,0,29,0,0,4,12,6,31,0,38,0,73,0,0,0,7,0,79,2,182,0,0,0,1,0,219,4,217,3,190,6,12,0,13,0,24,64,9,11,3,15,14,10,4,128,7,0,0,47,50,26,204,50,17,18,1,57,57,49,48,1,34,38,39,51,22,22,51,50,54,55,51,6,6,2,72,185,170,10,156,9,91,113,103,99,11,157,12,178,4,217,143,164,104,82,88,98,158,149,0,0,1,255,145,254,20,1,86,4,72,0,12,0,29,64,13,11,8,8,14,13,9,15,0,5,70,89,0,27,0,63,43,0,24,63,17,18,1,57,17,51,49,48,19,34,39,53,22,51,50,54,53,17,51,17,16,43,95,59,69,67,78,73,166,254,20,25,135,20,85,87,4,252,251,16,254,188,0,0,1,1,137,4,205,2,117,6,20,0,9,0,19,182,9,4,10,11,4,128,9,0,47,26,205,17,18,1,57,57,49,48,1,54,54,55,51,21,6,6,7,35,1,137,19,39,10,168,11,88,47,90,4,229,55,167,81,18,51,188,70,0,1,1,113,254,59,2,111,255,131,0,9,0,19,182,9,4,10,11,9,128,4,0,47,26,205,17,18,1,57,57,49,48,1,54,54,55,51,21,6,6,7,35,1,113,28,51,7,168,11,98,55,90,254,84,64,186,53,18,51,193,66,0,1,1,129,4,217,2,127,6,33,0,9,0,19,182,9,4,10,11,9,128,4,0,47,26,205,17,18,1,57,57,49,48,1,6,6,7,35,53,54,54,55,51,2,127,29,53,6,166,14,99,49,92,6,8,61,193,49,19,61,191,57,0,2,0,39,2,57,2,158,5,199,0,11,0,21,0,32,64,14,6,12,0,17,12,17,23,22,9,19,31,3,14,33,0,63,51,63,51,17,18,1,57,57,17,51,17,51,49,48,19,20,22,51,50,54,53,52,38,35,34,6,5,16,33,34,38,53,16,33,50,22,176,82,94,94,86,86,94,94,82,1,238,254,196,158,157,1,59,158,158,4,0,168,166,165,171,170,164,165,169,254,55,236,221,1,197,232,0,2,0,20,2,74,2,180,5,188,0,10,0,20,0,60,64,31,20,5,11,7,3,3,9,2,0,2,5,3,21,22,1,5,5,9,15,20,31,20,2,20,20,3,14,7,31,3,32,0,63,63,51,18,57,47,93,51,51,17,51,17,18,1,23,57,17,51,51,17,51,51,17,51,49,48,1,35,21,35,53,33,53,1,51,17,51,33,53,52,55,14,3,7,7,2,180,125,145,254,110,1,152,139,125,254,242,6,5,24,30,30,11,168,3,20,202,202,101,2,67,253,205,195,134,75,12,39,45,45,17,246,0,1,0,59,2,55,2,137,5,170,0,29,0,43,64,21,16,3,28,23,9,23,26,3,4,31,30,19,0,0,6,27,24,30,13,6,33,0,63,51,63,51,18,57,47,51,17,18,1,23,57,17,51,17,51,49,48,1,50,22,21,20,6,35,34,38,39,53,22,22,51,50,54,53,52,38,35,34,6,7,39,19,33,21,33,7,54,1,72,145,176,170,166,74,139,41,56,140,54,95,110,109,102,57,76,31,59,33,1,239,254,131,20,62,4,104,143,123,140,155,31,23,131,34,38,83,89,78,88,17,8,41,1,160,104,230,12,0,0,2,0,41,2,57,2,162,5,199,0,23,0,35,0,54,64,28,27,18,33,11,0,0,6,18,3,37,36,30,11,21,0,15,16,15,2,15,15,3,24,21,33,8,3,31,0,63,51,63,51,18,57,47,93,18,57,51,17,18,1,23,57,17,51,51,17,51,49,48,19,16,54,51,50,23,21,38,35,34,6,7,51,54,54,51,50,22,21,20,6,35,34,38,5,50,54,53,52,38,35,34,6,21,20,22,41,219,219,74,49,52,83,141,150,10,8,29,113,85,125,148,166,141,153,173,1,68,81,99,88,86,85,112,106,3,195,1,5,255,15,114,18,153,166,43,59,148,126,144,164,210,99,93,99,79,91,90,59,89,124,0,0,1,0,57,2,74,2,143,5,182,0,6,0,28,64,13,1,5,5,0,2,3,7,8,2,3,30,0,32,0,63,63,51,17,18,1,23,57,17,51,49,48,19,1,33,53,33,21,1,162,1,94,254,57,2,86,254,160,2,74,2,248,116,94,252,242,0,3,0,51,2,57,2,147,5,199,0,21,0,34,0,45,0,63,64,34,22,13,38,19,43,3,28,7,7,3,5,16,19,13,6,46,47,5,16,32,32,11,41,27,41,2,41,41,25,10,33,35,0,31,0,63,50,63,51,57,47,93,51,18,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,50,22,21,20,7,22,21,20,6,35,34,38,53,52,54,55,38,38,53,52,54,3,20,22,51,50,54,53,52,38,39,39,6,6,19,34,6,21,20,22,23,54,53,52,38,1,100,124,151,148,176,165,138,146,159,73,85,74,57,157,53,84,86,90,84,93,81,28,72,70,172,68,75,68,81,140,78,5,199,118,104,130,76,74,158,113,137,128,116,69,116,46,46,93,68,102,126,253,102,60,73,73,60,63,79,28,10,34,84,1,239,60,57,47,71,33,54,97,57,60,0,2,0,35,2,57,2,156,5,201,0,22,0,34,0,60,64,31,26,17,32,10,0,0,5,17,3,35,36,29,14,10,11,11,20,15,14,31,14,2,14,14,3,23,20,31,8,3,33,0,63,51,63,51,18,57,47,93,18,57,17,51,17,51,17,18,1,23,57,17,51,51,17,51,49,48,1,16,6,35,34,39,53,22,51,32,19,35,6,6,35,34,38,53,52,54,51,50,22,37,34,6,21,20,22,51,50,54,53,52,38,2,156,218,212,83,49,49,93,1,20,21,10,35,116,65,131,153,169,136,152,176,254,184,81,95,85,87,84,115,103,4,70,254,242,255,15,116,20,1,70,51,52,146,131,136,165,202,91,95,87,81,95,85,62,97,114,0,0,22,0,84,254,129,7,193,5,238,0,5,0,11,0,17,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,83,0,91,0,107,0,116,0,124,0,137,0,248,64,135,65,64,61,60,49,48,15,5,0,12,84,78,88,72,118,107,112,96,122,103,133,134,69,68,41,40,37,36,20,10,9,23,23,134,6,18,59,27,127,103,96,56,24,55,47,107,52,44,72,35,31,32,28,3,17,78,12,25,138,139,10,0,42,66,90,81,134,92,116,92,41,65,70,62,100,117,117,108,69,61,130,125,86,75,107,118,107,38,50,37,49,21,13,0,66,1,65,62,92,61,108,13,49,50,3,107,12,92,108,107,107,108,92,3,1,45,44,29,28,25,24,19,18,15,12,57,56,53,52,33,32,7,6,4,1,0,47,51,51,51,51,51,51,51,51,51,47,51,51,51,51,51,51,51,51,51,18,23,57,47,47,47,17,18,23,57,17,57,18,57,57,17,57,57,17,51,17,51,17,51,17,51,16,196,50,196,50,17,51,17,51,18,57,17,51,17,51,17,51,16,196,196,50,17,51,17,51,17,18,1,23,57,17,51,51,51,51,51,51,51,51,51,17,51,17,51,17,51,17,51,17,51,17,51,17,51,51,51,51,51,51,51,51,51,49,48,19,17,33,21,35,21,37,53,33,17,35,53,1,17,51,21,51,21,33,53,51,53,51,17,33,53,33,21,33,53,33,21,1,53,33,21,1,35,17,51,17,35,17,51,1,53,33,21,1,35,17,51,1,53,33,21,51,53,33,21,1,35,17,51,53,35,17,51,1,35,17,51,5,20,6,35,34,38,53,52,54,51,50,22,5,20,51,50,53,52,35,34,37,51,50,22,21,20,6,7,21,22,22,21,20,6,35,35,19,51,50,54,53,52,38,35,35,21,21,51,50,54,53,52,35,1,34,39,53,22,51,50,53,17,51,17,20,6,84,1,47,192,5,206,1,48,109,249,0,111,192,5,14,195,109,253,73,1,17,251,225,1,14,254,242,1,14,4,183,109,109,109,109,251,194,1,16,252,48,111,111,2,192,1,16,119,1,17,250,168,111,111,111,111,6,254,109,109,251,159,135,127,127,135,135,127,126,136,254,115,135,135,135,135,1,225,172,109,112,46,44,61,46,109,94,207,123,66,46,36,42,47,59,74,49,37,90,1,94,52,28,43,25,86,125,105,4,190,1,48,111,193,193,111,254,208,193,249,2,1,47,194,109,109,194,254,209,109,109,109,109,6,254,111,111,250,168,1,14,2,2,1,15,250,59,109,109,1,166,1,14,4,74,111,111,111,111,252,47,1,16,121,1,15,253,104,1,16,73,145,156,156,145,146,155,154,147,197,197,196,97,67,83,49,66,8,8,14,68,53,81,89,1,98,34,32,34,29,227,154,43,37,74,254,250,10,102,8,86,1,146,254,114,95,99,0,0,3,0,84,254,193,7,170,6,20,0,3,0,30,0,42,0,46,64,25,1,11,23,37,4,30,31,17,3,9,43,44,40,30,20,14,34,30,14,14,30,34,3,2,0,0,47,47,23,57,47,47,47,17,51,17,51,17,18,1,23,57,49,48,9,3,5,53,52,54,55,54,54,53,52,38,35,34,6,7,23,54,51,50,22,21,20,6,7,6,6,21,21,3,20,22,51,50,54,53,52,38,35,34,6,3,254,3,172,252,84,252,86,3,235,44,65,103,73,187,165,79,186,71,82,160,90,63,62,49,72,84,59,27,71,70,66,73,72,67,72,69,6,20,252,86,252,87,3,169,251,47,50,65,49,82,126,88,135,154,56,42,178,80,58,47,53,75,54,68,112,74,59,254,237,63,72,73,62,64,73,72,255,255,255,145,254,20,2,87,6,33,2,38,2,55,0,0,1,7,1,76,254,169,0,0,0,8,179,1,24,17,38,0,43,53,255,255,0,25,3,193,1,68,5,182,2,6,2,7,0,0,0,2,0,10,255,236,4,223,6,43,0,45,0,54,0,102,64,57,27,7,23,11,52,37,46,31,31,43,2,45,2,37,11,7,18,6,55,56,20,14,71,89,0,33,46,33,71,89,43,46,15,46,31,46,2,9,3,20,46,20,46,5,40,40,49,70,89,40,1,5,29,70,89,5,22,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,95,94,93,17,51,43,17,0,51,43,17,18,1,23,57,17,51,51,17,51,17,51,17,51,17,51,49,48,1,22,21,16,0,33,32,17,52,55,54,53,52,38,35,34,6,7,39,54,51,50,22,21,20,7,6,21,20,51,32,17,52,39,38,36,38,53,52,54,51,50,0,19,51,21,37,38,2,35,34,6,21,20,4,4,86,4,254,224,254,253,254,119,16,15,36,32,25,54,15,33,83,95,88,93,15,16,233,1,119,4,223,254,201,160,182,168,208,1,0,42,143,254,199,28,183,123,93,97,1,19,3,78,46,65,254,159,254,110,1,88,57,123,122,23,47,35,15,9,118,39,93,93,35,131,132,58,207,2,112,63,44,2,105,188,131,144,163,254,205,254,215,129,129,211,1,0,95,75,141,154,0,1,0,0,0,0,4,123,5,195,0,21,0,40,64,20,17,18,7,18,20,3,22,23,0,18,20,3,18,18,5,10,74,89,5,4,0,63,43,0,24,63,63,18,57,17,18,1,23,57,17,51,49,48,1,18,18,54,54,51,50,23,21,38,35,34,14,3,7,17,35,17,1,51,2,57,122,141,77,92,58,48,40,26,31,40,59,86,124,101,31,172,254,35,186,2,205,1,35,1,55,108,48,15,135,6,56,161,252,236,85,253,227,2,47,3,135,0,0,2,0,18,255,236,6,119,4,72,0,20,0,41,0,76,64,39,24,3,18,33,33,30,39,13,10,13,30,3,6,5,42,43,19,31,31,0,8,21,11,6,8,6,70,89,8,15,36,27,0,27,70,89,16,0,22,0,63,50,43,17,0,51,24,63,43,17,0,51,51,17,18,57,24,47,57,17,18,1,23,57,17,51,17,51,18,57,17,51,49,48,5,34,38,53,52,19,33,53,55,33,21,35,22,21,20,6,35,34,39,35,6,1,6,2,21,20,22,51,50,54,53,53,51,21,20,22,51,50,54,53,52,39,2,41,186,199,135,254,227,142,5,215,250,117,200,185,221,68,8,68,254,207,63,66,108,117,93,108,162,107,93,117,109,111,20,231,240,240,1,7,74,68,142,252,251,240,231,182,182,3,206,132,254,254,103,174,168,143,125,188,188,122,146,169,173,254,239,0,255,255,0,201,0,0,6,113,7,117,2,38,0,48,0,0,1,7,0,118,1,156,1,84,0,8,179,1,29,5,38,0,43,53,255,255,0,176,0,0,6,203,6,33,2,38,0,80,0,0,1,7,0,118,1,205,0,0,0,8,179,1,45,17,38,0,43,53,255,255,0,0,253,213,5,16,5,188,2,38,0,36,0,0,0,7,2,91,1,53,0,0,255,255,0,94,253,213,3,205,4,90,2,38,0,68,0,0,0,7,2,91,0,199,0,0,255,255,254,223,255,236,5,210,5,205,0,38,0,50,20,0,1,7,2,92,254,71,0,0,0,9,179,3,2,26,3,0,63,53,53,0,0,2,0,117,253,213,2,53,255,131,0,11,0,23,0,30,64,12,18,6,12,0,6,0,24,25,21,3,15,9,0,47,51,204,50,17,18,1,57,57,17,51,17,51,49,48,1,20,6,35,34,38,53,52,54,51,50,22,7,52,38,35,34,6,21,20,22,51,50,54,2,53,125,102,101,120,120,101,101,126,110,66,51,51,66,60,57,53,64,254,174,97,120,117,98,98,117,118,97,57,60,60,57,56,61,61,0,2,0,152,4,104,2,207,5,197,0,8,0,23,0,30,64,14,14,9,3,8,12,19,9,5,24,25,2,11,8,21,0,47,196,220,198,17,18,1,23,57,17,51,49,48,1,54,55,51,21,6,6,7,35,37,52,55,21,6,21,20,30,2,21,20,35,34,38,1,176,70,28,189,41,119,49,78,254,232,237,121,31,37,31,93,55,67,4,135,181,122,20,78,172,57,118,163,61,72,41,53,20,19,16,26,28,74,68,0,255,255,0,29,0,0,6,211,6,31,0,39,0,73,2,176,0,0,0,38,0,73,0,0,0,7,0,76,5,109,0,0,255,255,0,29,0,0,6,195,6,31,0,39,0,73,2,176,0,0,0,38,0,73,0,0,0,7,0,79,5,109,0,0,0,2,0,125,255,236,6,100,6,20,0,21,0,33,0,60,64,31,22,6,15,17,17,28,0,0,20,11,6,4,34,35,20,11,3,9,9,31,73,89,15,9,4,3,25,73,89,3,19,0,63,43,0,24,63,198,43,17,18,0,57,57,17,18,1,23,57,17,51,51,17,51,17,51,49,48,1,16,0,33,32,0,17,16,0,33,32,23,62,2,53,51,23,6,6,7,22,1,16,18,51,50,18,17,16,2,35,34,2,5,188,254,157,254,198,254,189,254,161,1,97,1,67,1,69,179,50,58,27,182,14,29,131,104,96,251,117,250,244,243,246,245,242,243,253,2,221,254,158,254,113,1,137,1,106,1,104,1,134,215,12,67,102,105,22,155,173,39,176,254,254,254,214,254,206,1,49,1,43,1,39,1,49,254,209,0,0,2,0,115,255,236,5,25,4,240,0,22,0,34,0,60,64,31,23,7,16,18,18,29,0,0,21,12,7,4,35,36,21,12,3,10,10,32,70,89,16,10,16,3,26,70,89,3,22,0,63,43,0,24,63,198,43,17,18,0,57,57,17,18,1,23,57,17,51,51,17,51,17,51,49,48,1,16,0,35,34,38,2,53,16,0,51,50,23,62,2,53,51,23,6,6,7,22,5,20,22,51,50,54,53,52,38,35,34,6,4,98,254,242,238,147,228,124,1,12,238,217,137,51,58,26,180,15,31,121,102,71,252,189,158,173,175,157,159,175,173,156,2,37,254,244,254,211,138,1,2,173,1,12,1,43,141,15,65,99,110,23,156,175,38,138,185,211,219,219,211,210,216,216,0,1,0,186,255,236,6,123,6,20,0,27,0,51,64,24,5,7,7,1,11,20,17,11,17,29,28,10,1,14,27,5,18,3,14,23,73,89,14,19,0,63,43,0,24,63,198,51,18,57,57,17,18,1,57,57,17,51,17,51,51,17,51,49,48,1,21,62,2,53,51,23,6,6,7,17,16,0,33,32,0,53,17,51,17,20,22,51,50,54,53,17,5,25,58,70,31,181,14,33,172,149,254,225,254,248,254,244,254,212,170,204,198,184,193,5,182,198,8,62,112,110,22,182,184,25,253,141,254,254,254,234,1,31,253,3,174,252,70,183,196,193,188,3,184,0,0,1,0,164,255,236,5,150,4,242,0,29,0,68,64,34,1,28,13,15,15,19,20,7,7,10,19,28,19,30,31,21,22,10,18,22,3,20,13,8,29,15,25,4,70,89,25,22,20,21,0,63,63,43,0,24,63,51,198,18,23,57,17,51,17,18,1,57,57,17,51,51,17,51,17,51,17,51,17,51,49,48,1,17,20,22,51,50,54,53,17,51,21,54,54,53,51,23,6,6,7,17,35,39,35,6,6,35,34,38,53,17,1,76,122,130,172,159,166,82,74,178,15,32,176,141,137,24,9,52,181,111,203,200,4,70,253,59,134,132,188,213,2,62,121,11,128,154,23,186,191,14,252,172,147,82,85,190,209,2,203,0,255,255,252,83,4,217,253,220,6,33,0,7,0,67,250,202,0,0,255,255,253,13,4,217,254,150,6,33,0,7,0,118,251,132,0,0,255,255,252,25,4,217,255,1,5,221,0,7,1,82,251,17,0,0,0,1,253,8,4,184,254,115,6,143,0,17,0,30,64,12,2,5,5,13,13,8,0,0,19,11,16,4,0,47,204,50,17,1,51,17,51,51,18,57,17,51,49,48,1,20,7,7,35,39,54,54,53,52,38,35,34,7,53,54,51,32,254,115,166,10,105,12,86,78,67,73,62,32,38,69,1,0,5,215,140,34,113,176,14,50,43,43,41,6,100,10,0,1,253,59,254,160,254,2,255,125,0,11,0,17,181,6,0,0,13,9,3,0,47,205,17,1,51,17,51,49,48,5,52,54,51,50,22,21,20,6,35,34,38,253,59,59,42,40,58,58,40,42,59,242,57,54,54,57,55,55,55,0,255,255,0,201,0,0,3,248,7,115,2,38,0,40,0,0,1,7,0,67,255,216,1,82,0,8,179,1,13,5,38,0,43,53,255,255,0,203,0,0,5,82,7,115,2,38,1,178,0,0,1,7,0,67,0,104,1,82,0,8,179,1,17,5,38,0,43,53,255,255,0,115,255,236,4,18,6,33,2,38,0,72,0,0,1,6,0,67,183,0,0,8,179,2,28,17,38,0,43,53,255,255,0,176,0,0,4,98,6,33,2,38,1,210,0,0,1,6,0,67,220,0,0,8,179,1,15,17,38,0,43,53,0,1,0,133,255,236,7,145,5,201,0,49,0,69,64,36,34,22,42,39,47,9,9,4,39,27,22,5,50,51,0,31,25,31,73,89,16,40,40,19,6,25,4,44,37,19,37,73,89,12,19,19,0,63,51,43,17,0,51,24,63,51,18,57,47,57,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,6,7,39,54,51,50,0,17,16,0,35,34,38,39,35,6,6,35,32,0,17,16,18,51,50,23,7,38,38,35,34,2,17,16,18,51,50,55,17,51,17,22,51,50,18,17,16,2,5,164,60,94,45,69,126,150,228,1,1,254,229,255,108,172,83,8,80,169,107,255,0,254,229,255,228,153,124,70,45,93,60,147,165,207,187,139,102,170,102,142,187,206,165,5,47,41,31,146,80,254,136,254,173,254,141,254,97,45,51,50,46,1,155,1,119,1,83,1,120,80,146,31,41,254,215,254,246,254,211,254,178,76,1,201,254,55,76,1,75,1,48,1,11,1,40,0,1,0,0,0,0,6,29,4,72,0,29,0,40,64,22,23,0,13,14,5,5,30,31,27,21,13,0,18,10,4,4,22,14,5,15,4,21,0,63,63,51,51,18,23,57,63,17,18,1,23,57,49,48,1,6,6,3,35,1,51,19,22,23,51,54,54,19,3,51,0,22,23,51,54,18,17,51,16,2,7,35,3,38,3,39,10,20,179,213,254,127,172,246,32,46,8,19,74,142,172,178,1,9,45,10,8,173,153,166,195,219,182,125,33,1,201,26,51,254,132,4,72,253,73,93,189,53,163,1,36,1,213,252,255,144,44,184,1,179,1,82,254,150,254,7,229,1,90,92,0,2,0,23,0,0,4,252,6,20,0,17,0,26,0,76,64,40,8,4,18,18,1,15,22,11,11,6,15,0,4,27,28,7,17,0,17,73,89,4,0,8,26,73,89,0,8,0,8,15,2,0,15,18,74,89,15,18,0,63,43,0,24,63,18,57,57,47,47,43,17,0,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,51,49,48,19,33,17,51,17,33,21,33,17,51,32,17,20,4,33,33,17,33,1,51,50,54,53,52,38,35,35,23,1,63,172,1,162,254,94,201,2,49,254,247,254,251,254,104,254,193,1,235,213,192,181,186,218,182,4,250,1,26,254,230,148,254,224,254,100,208,218,4,102,252,43,137,144,138,122,0,0,2,0,23,0,0,4,156,5,39,0,17,0,25,0,71,64,38,4,0,19,19,15,11,22,7,7,2,11,13,4,26,27,3,13,14,13,70,89,4,18,70,89,4,4,11,16,0,14,15,11,19,70,89,11,21,0,63,43,0,24,63,51,198,18,57,47,43,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,51,49,48,1,33,21,33,17,33,32,17,20,6,35,33,17,35,53,51,53,51,17,17,33,32,53,52,38,35,1,168,1,88,254,168,1,63,1,181,223,220,254,33,235,235,166,1,49,1,31,135,156,4,72,140,254,197,254,205,166,168,3,188,140,223,252,205,254,151,185,92,84,0,1,0,201,255,236,7,33,5,203,0,32,0,74,64,41,23,19,19,20,6,24,29,12,5,24,17,20,6,33,34,27,0,73,89,27,4,6,18,23,18,73,89,3,23,23,20,21,3,20,18,14,9,73,89,14,19,0,63,43,0,24,63,63,18,57,47,51,43,17,0,51,24,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,4,7,33,21,33,18,0,51,50,55,21,6,35,32,0,3,33,17,35,17,51,17,33,18,0,37,50,23,7,38,38,5,143,227,254,252,31,2,191,253,61,8,1,9,247,154,194,152,222,254,193,254,165,8,254,162,170,170,1,100,30,1,113,1,48,213,182,72,100,157,5,51,250,241,150,254,239,254,226,55,149,57,1,112,1,84,253,80,5,182,253,146,1,51,1,78,2,92,146,48,38,0,0,1,0,176,255,236,5,156,4,92,0,33,0,89,64,50,22,25,25,10,3,9,5,5,6,16,32,24,3,6,5,34,35,13,19,70,89,13,16,25,4,9,4,70,89,22,15,9,31,9,2,11,3,9,9,6,7,15,6,21,0,28,70,89,0,22,0,63,43,0,24,63,63,18,57,47,95,94,93,51,43,17,0,51,24,63,43,17,18,1,23,57,17,51,17,51,17,51,51,17,51,49,48,5,34,0,39,33,17,35,17,51,17,33,54,36,51,50,22,23,7,38,35,34,6,7,33,21,33,22,22,51,50,54,55,21,6,4,119,235,254,244,11,254,225,166,166,1,33,24,1,13,223,81,154,54,50,138,101,163,167,16,2,24,253,230,9,169,164,61,119,98,110,20,1,10,248,254,18,4,72,254,51,235,246,32,25,141,51,164,170,141,188,181,22,37,147,57,0,2,0,0,0,0,5,109,5,182,0,11,0,18,0,52,64,27,2,3,7,12,3,13,10,5,20,19,1,5,12,5,73,89,16,8,12,12,7,8,3,11,3,7,18,0,63,51,51,63,18,57,47,18,57,43,17,0,51,17,18,1,23,57,17,51,49,48,1,35,17,35,17,35,1,35,1,51,1,35,1,33,39,38,39,6,7,3,152,148,156,149,254,223,178,2,104,158,2,103,183,253,92,1,76,82,56,30,24,64,2,170,253,86,2,170,253,86,5,182,250,74,3,63,207,144,100,98,164,0,0,2,0,10,0,0,4,121,4,72,0,11,0,18,0,53,64,28,5,6,10,12,6,13,3,1,6,20,19,4,8,12,8,70,89,17,11,12,12,10,11,15,6,2,10,21,0,63,51,51,63,18,57,47,18,57,43,17,0,51,17,18,1,23,57,17,51,49,48,1,1,35,3,35,17,35,17,35,3,35,1,3,33,38,38,39,35,6,2,168,1,209,172,207,113,151,115,205,172,1,209,33,1,15,43,56,34,9,28,4,72,251,184,1,233,254,23,1,233,254,23,4,72,254,45,108,138,106,92,0,0,2,0,201,0,0,7,94,5,182,0,19,0,26,0,70,64,37,14,10,10,11,2,3,18,21,3,20,8,7,11,7,27,28,5,1,9,14,9,73,89,20,24,12,14,14,11,16,12,3,19,7,3,11,18,0,63,51,51,51,63,51,18,57,47,18,57,51,43,17,0,51,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,35,17,35,17,35,1,35,1,33,17,35,17,51,17,33,1,51,1,35,1,33,2,38,39,6,6,5,133,143,154,147,254,227,186,1,34,254,95,170,170,1,225,1,6,158,2,102,188,253,102,1,62,118,28,12,19,35,2,176,253,80,2,176,253,80,2,176,253,80,5,182,253,146,2,110,250,74,3,72,1,53,86,47,67,104,0,2,0,176,0,0,6,20,4,72,0,19,0,25,0,77,64,43,17,13,13,14,5,6,1,25,6,24,11,10,14,7,26,27,8,4,12,17,12,70,89,24,21,19,47,17,63,17,2,17,17,14,19,15,15,15,10,6,2,14,21,0,63,51,51,51,63,63,18,57,47,93,18,57,51,43,17,0,51,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,1,35,3,35,17,35,17,35,3,35,19,33,17,35,17,51,17,33,19,23,35,6,6,7,33,4,70,1,206,170,208,113,152,110,209,172,209,254,223,166,166,1,94,197,104,8,10,32,89,1,12,4,72,251,184,1,238,254,18,1,238,254,18,1,238,254,18,4,72,254,51,1,205,115,34,95,217,0,0,2,0,20,0,0,5,174,5,182,0,31,0,34,0,75,64,40,32,1,15,16,33,30,30,29,16,2,1,7,6,36,35,30,1,33,31,31,33,73,89,14,18,29,18,74,89,34,2,29,29,24,31,3,16,8,24,18,0,63,51,51,63,18,57,47,51,51,43,17,0,51,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,21,1,30,2,23,19,35,3,46,2,35,35,17,35,17,35,34,6,6,7,3,35,19,62,2,55,1,53,5,33,1,5,41,254,90,118,154,100,50,133,174,137,35,68,101,89,27,170,26,91,99,65,32,135,185,136,47,99,149,118,254,101,3,190,253,10,1,123,5,182,133,254,17,6,72,139,164,254,59,1,201,111,96,38,253,66,2,190,39,95,111,254,55,1,197,159,142,73,7,1,239,133,153,254,57,0,0,2,0,12,0,0,5,20,4,72,0,32,0,35,0,78,64,42,33,1,15,16,34,31,24,31,30,16,2,1,7,7,37,36,31,1,34,32,32,34,70,89,17,14,18,30,18,71,89,35,2,30,30,24,32,15,16,8,24,21,0,63,51,51,63,18,57,47,51,51,43,17,0,51,51,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,21,1,30,3,19,35,3,46,2,35,35,17,35,17,35,34,6,6,7,3,35,19,62,3,55,1,53,5,33,1,4,139,254,174,87,111,73,49,155,172,133,34,58,84,76,10,153,11,75,82,56,39,135,170,131,24,48,73,110,87,254,177,3,32,253,180,1,37,4,72,105,254,160,7,48,80,105,254,113,1,80,87,71,28,253,246,2,10,26,64,94,254,174,1,80,61,105,79,50,8,1,96,105,140,254,193,0,0,2,0,201,0,0,7,197,5,182,0,36,0,39,0,97,64,53,33,29,29,30,38,35,15,16,2,39,37,1,7,1,39,16,34,27,35,24,30,9,41,40,35,1,36,38,36,38,73,89,18,14,28,33,28,73,89,39,2,33,33,30,36,3,31,3,24,16,8,30,18,0,63,51,51,51,63,63,18,57,47,51,51,43,17,0,51,51,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,17,51,49,48,1,21,1,30,2,23,19,35,3,46,2,35,35,17,35,17,35,34,6,6,7,3,35,19,54,55,33,17,35,17,51,17,33,1,53,5,33,1,7,61,254,93,120,153,101,45,136,168,138,31,70,105,95,24,172,25,94,100,66,33,135,178,135,55,56,254,82,170,170,2,215,254,104,3,193,253,10,1,123,5,182,133,254,14,6,72,144,156,254,59,1,201,104,99,40,253,68,2,188,40,95,108,254,55,1,190,184,58,253,80,5,182,253,146,1,233,133,153,254,55,0,0,2,0,176,0,0,6,186,4,72,0,36,0,39,0,103,64,58,33,29,29,30,38,35,15,16,2,39,37,1,7,1,39,16,34,27,35,24,30,9,41,40,35,1,36,38,36,38,70,89,18,14,28,33,28,70,89,39,2,47,33,63,33,2,33,33,30,36,15,31,15,24,16,8,30,21,0,63,51,51,51,63,63,18,57,47,93,51,51,43,17,0,51,51,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,17,51,49,48,1,21,1,30,3,19,35,3,46,2,35,35,17,35,17,35,34,6,6,7,3,35,19,54,55,33,17,35,17,51,17,33,1,53,5,33,1,6,49,254,174,88,111,73,48,155,172,133,34,58,86,74,10,154,10,75,84,55,38,135,170,131,47,37,254,205,166,166,2,53,254,176,3,33,253,180,1,37,4,72,105,254,158,7,49,78,105,254,114,1,80,86,70,28,253,248,2,8,27,63,92,254,174,1,80,120,40,254,16,4,72,254,53,1,98,105,140,254,199,0,1,0,63,254,78,4,53,6,209,0,75,0,132,64,77,0,19,33,63,25,70,70,10,63,55,67,60,42,28,45,40,19,11,76,77,73,22,74,89,73,19,57,52,49,15,46,31,46,47,46,3,9,3,46,42,64,67,29,28,29,28,74,89,29,29,16,60,42,42,36,74,89,42,4,10,9,73,89,10,16,16,3,73,89,16,35,12,7,73,89,12,34,0,63,43,0,24,63,43,0,24,16,198,43,0,24,63,43,17,0,51,18,57,24,47,43,17,18,0,57,26,24,16,221,95,94,93,57,196,50,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,23,20,22,51,50,55,54,51,50,23,21,38,35,34,7,6,35,34,38,53,52,54,55,54,54,53,16,33,35,53,51,50,54,53,52,38,35,34,6,7,39,54,55,38,39,39,53,51,22,23,54,54,51,50,23,21,38,35,34,6,7,22,22,21,20,6,7,21,22,22,21,20,4,5,6,6,240,87,89,97,120,120,70,155,71,80,160,68,105,105,105,179,184,217,232,204,181,254,64,218,209,205,225,162,137,106,187,110,86,168,190,57,117,49,123,92,131,92,131,64,50,48,24,43,44,111,48,178,193,191,170,186,203,254,229,254,230,138,134,137,55,50,7,6,39,166,51,5,5,125,133,126,129,9,8,138,141,1,12,143,147,132,107,128,55,69,114,114,28,66,121,52,27,59,136,115,86,14,113,10,82,71,23,189,143,140,184,26,8,24,178,144,208,213,9,5,55,0,0,1,0,25,254,123,3,127,5,78,0,70,0,131,64,78,23,41,54,11,46,16,16,32,11,3,14,8,62,50,64,60,41,11,71,72,68,62,65,0,5,71,89,0,15,65,31,65,47,65,3,9,3,65,62,38,26,70,89,35,29,70,89,14,51,50,51,50,70,89,38,35,51,51,35,38,3,32,62,62,56,70,89,8,62,16,32,34,19,44,71,89,19,22,0,63,43,0,24,63,63,51,43,17,18,0,23,57,24,47,47,47,43,17,18,0,57,43,43,0,24,16,212,95,94,93,196,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,50,23,21,38,35,34,6,7,22,22,21,20,7,21,22,21,20,6,7,14,2,21,20,22,51,50,55,55,50,23,21,38,38,35,7,6,35,34,38,53,52,54,55,36,53,52,38,35,35,53,51,32,53,52,35,34,6,7,39,54,55,38,39,53,51,22,23,54,54,2,248,51,45,24,41,47,103,45,122,140,211,248,242,225,93,109,48,75,89,86,122,175,125,39,21,84,55,179,130,92,144,159,190,180,1,78,156,159,148,119,1,55,252,74,143,88,59,124,126,92,103,123,75,140,88,134,5,78,15,112,10,79,62,28,138,107,184,57,8,71,202,148,168,3,2,23,42,44,49,43,5,5,39,143,19,24,5,5,119,112,116,125,3,4,190,97,90,141,172,162,34,36,135,55,15,117,98,27,52,137,110,85,255,255,0,109,0,0,5,242,5,182,2,6,1,117,0,0,255,255,0,164,254,20,5,135,6,18,2,6,1,149,0,0,0,3,0,125,255,236,5,190,5,205,0,11,0,18,0,25,0,71,64,37,22,16,16,6,23,15,15,0,6,0,26,27,22,16,73,89,15,22,1,11,3,22,22,3,9,9,19,73,89,9,4,3,12,73,89,3,19,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,1,16,0,33,32,0,17,16,0,33,32,0,1,50,18,19,33,18,18,19,34,2,3,33,38,2,5,190,254,157,254,196,254,189,254,161,1,96,1,68,1,59,1,98,253,97,229,247,13,252,43,13,249,232,224,251,19,3,211,17,244,2,221,254,161,254,110,1,139,1,104,1,101,1,137,254,112,252,68,1,17,1,12,254,245,254,238,4,180,254,254,255,0,254,1,4,0,0,3,0,115,255,236,4,98,4,92,0,12,0,19,0,26,0,73,64,39,23,17,17,7,24,16,16,0,7,0,27,28,23,17,70,89,15,23,31,23,2,11,3,23,23,3,10,10,20,70,89,10,16,3,13,70,89,3,22,0,63,43,0,24,63,43,17,18,0,57,24,47,95,94,93,43,17,18,1,57,57,17,51,17,51,17,51,17,51,49,48,1,16,0,35,34,38,2,53,16,0,51,50,0,1,50,54,55,33,22,22,19,34,6,7,33,38,38,4,98,254,242,238,147,228,124,1,12,238,230,1,15,254,8,158,164,10,253,105,9,160,160,156,158,13,2,147,15,161,2,37,254,244,254,211,138,1,2,173,1,12,1,43,254,206,253,77,184,191,186,189,3,88,173,167,168,172,0,0,1,0,0,0,0,5,72,5,195,0,21,0,32,64,16,6,22,19,23,17,0,74,89,17,4,10,5,6,3,5,18,0,63,63,18,57,63,43,17,1,51,18,57,49,48,1,34,6,7,1,35,1,51,1,22,23,54,55,19,62,2,51,50,23,21,38,4,225,59,78,57,254,184,197,253,238,180,1,82,72,35,32,70,162,59,84,110,89,42,79,56,5,55,103,181,251,229,5,182,252,86,199,143,144,223,2,6,191,152,65,19,141,20,0,1,0,0,0,0,4,61,4,82,0,22,0,30,64,15,1,23,15,24,13,18,71,89,13,16,5,1,15,0,21,0,63,63,57,63,43,17,1,51,18,57,49,48,33,1,51,19,18,23,51,54,19,19,62,2,51,50,23,21,38,35,34,6,7,3,1,150,254,106,174,225,100,19,8,23,82,96,37,71,91,84,45,30,29,38,47,58,28,248,4,72,253,155,254,244,100,118,1,11,1,53,122,123,52,10,127,8,84,92,252,223,255,255,0,0,0,0,5,72,7,115,2,38,2,128,0,0,1,7,3,118,4,215,1,82,0,10,180,2,1,33,5,38,0,43,53,53,255,255,0,0,0,0,4,61,6,33,2,38,2,129,0,0,1,7,3,118,4,100,0,0,0,10,180,2,1,34,17,38,0,43,53,53,0,3,0,125,254,20,9,162,5,205,0,11,0,23,0,46,0,68,64,38,12,6,18,0,33,46,39,24,0,6,6,47,48,37,42,74,89,37,27,29,28,28,3,32,24,15,9,21,73,89,9,4,3,15,73,89,3,19,0,63,43,0,24,63,43,0,24,63,51,18,57,17,51,63,43,17,18,1,23,57,17,51,17,51,49,48,1,16,0,33,32,0,17,16,0,33,32,0,1,16,18,51,50,18,17,16,2,35,34,2,37,51,19,22,23,51,54,54,19,51,1,6,6,35,34,39,53,22,51,50,54,55,55,5,84,254,185,254,220,254,215,254,189,1,67,1,44,1,35,1,69,251,221,223,217,218,221,220,216,218,225,4,111,176,246,78,20,8,11,83,228,176,254,43,69,188,136,76,74,55,66,94,117,35,61,2,221,254,160,254,111,1,139,1,104,1,102,1,136,254,112,254,160,254,215,254,205,1,49,1,43,1,41,1,47,254,210,65,253,139,207,102,44,251,2,131,251,32,182,158,17,133,12,103,89,156,255,255,0,115,254,20,8,123,4,92,0,38,0,82,0,0,0,7,0,92,4,117,0,0,0,2,0,125,255,135,6,16,6,45,0,19,0,40,0,81,64,42,20,10,38,13,7,17,34,34,3,28,31,0,0,28,7,23,10,5,41,42,36,34,38,13,38,73,89,17,15,13,3,28,26,23,7,23,73,89,5,3,7,18,0,63,51,51,43,17,0,51,51,24,63,51,51,43,17,0,51,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,51,17,51,49,48,1,16,0,5,6,35,34,39,36,0,17,16,0,37,54,51,50,23,4,0,1,20,18,23,54,54,51,50,23,54,18,53,52,2,39,6,35,34,39,6,2,6,16,254,209,254,248,26,119,124,20,254,244,254,209,1,43,1,16,20,124,121,22,1,12,1,45,251,33,202,189,17,73,54,110,31,189,202,202,189,31,110,113,31,189,202,2,221,254,210,254,115,44,111,111,41,1,138,1,54,1,49,1,133,44,108,108,44,254,115,254,213,244,254,207,41,48,38,86,41,1,49,244,244,1,47,39,88,86,39,254,211,0,0,2,0,115,255,147,4,207,4,180,0,23,0,45,0,80,64,42,24,12,15,9,43,27,37,21,3,35,0,0,3,32,27,9,12,6,46,47,40,37,43,15,43,70,89,21,18,15,16,32,30,27,9,27,70,89,6,3,9,21,0,63,51,51,43,17,0,51,51,24,63,51,51,43,17,0,51,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,17,51,49,48,1,20,2,7,6,6,35,34,38,39,38,2,53,52,18,55,54,54,51,50,22,23,22,18,5,20,22,23,54,54,51,50,23,54,54,53,16,37,6,6,35,34,38,39,6,6,4,207,224,204,9,64,56,57,61,9,203,229,224,208,8,62,57,56,64,9,202,226,252,80,125,137,12,60,53,103,24,134,124,254,252,13,61,51,53,60,12,137,125,2,37,233,254,223,37,54,45,43,56,36,1,38,229,233,1,32,36,56,42,43,57,38,254,220,225,177,210,31,42,34,74,31,210,175,1,96,62,42,32,32,44,31,209,0,0,3,0,125,255,236,7,127,8,59,0,21,0,69,0,84,0,85,64,46,67,55,31,43,43,1,38,70,75,80,72,60,12,55,10,85,86,21,2,2,7,7,16,12,82,64,72,58,34,64,58,64,73,89,40,58,4,28,22,52,22,73,89,46,52,19,0,63,51,43,17,0,51,24,63,51,43,17,0,51,24,16,214,26,220,212,205,50,18,57,47,51,17,18,1,23,57,17,51,17,51,49,48,1,21,35,34,46,2,35,34,6,21,21,35,53,52,54,51,50,30,2,51,1,50,54,55,22,22,51,50,18,17,16,2,35,34,6,7,39,54,51,50,0,17,16,0,33,34,38,39,6,6,35,32,0,17,16,0,51,50,23,7,38,38,35,34,2,17,16,18,1,20,7,53,54,53,52,46,2,53,52,51,50,22,5,162,17,84,142,120,102,43,47,60,125,116,112,58,112,119,133,78,253,40,88,171,61,55,171,93,188,210,165,147,60,95,43,70,121,154,228,1,1,254,224,254,253,104,170,76,75,167,110,254,252,254,227,1,1,228,154,121,70,43,94,60,148,165,210,2,128,237,120,31,36,31,92,56,67,7,199,121,36,43,36,52,51,16,28,103,110,36,44,36,248,186,66,63,57,72,1,78,1,45,1,11,1,40,43,31,146,82,254,136,254,173,254,140,254,98,40,48,45,43,1,157,1,117,1,85,1,118,82,146,31,43,254,217,254,244,254,209,254,180,6,104,162,61,72,41,53,20,18,17,26,28,73,68,0,0,3,0,115,255,236,6,4,7,6,0,42,0,63,0,78,0,92,64,51,19,7,28,40,40,44,34,64,69,13,74,66,54,7,10,79,80,50,58,63,45,45,54,76,66,10,64,31,16,10,16,70,89,2,23,70,89,2,4,37,10,16,26,21,4,21,70,89,0,4,22,0,63,51,43,17,0,51,24,63,51,18,57,43,43,17,0,51,26,24,16,222,220,212,50,17,51,205,50,17,18,1,23,57,17,51,17,51,49,48,5,34,39,6,35,34,2,17,16,18,51,50,22,23,7,38,35,34,6,21,16,33,50,55,22,22,51,32,17,52,38,35,34,7,39,54,54,51,50,18,17,16,2,3,21,35,34,46,2,35,34,21,21,35,53,52,54,51,50,30,2,51,5,20,7,53,54,53,52,46,2,53,52,51,50,22,4,43,148,94,92,143,225,250,207,186,62,119,40,57,89,71,116,109,1,49,123,112,62,111,67,1,45,110,115,71,89,57,40,119,62,187,206,247,81,16,84,143,120,101,43,107,125,115,112,58,113,118,131,78,254,240,238,119,30,36,30,92,56,67,20,65,65,1,35,1,14,1,23,1,40,32,25,139,51,214,214,254,94,80,42,38,1,162,214,214,51,139,25,32,254,215,254,234,254,245,254,218,6,165,120,36,42,36,102,17,31,100,111,37,43,37,221,161,62,72,40,56,20,17,17,25,27,74,68,0,0,2,0,94,255,236,7,127,7,4,0,13,0,64,0,95,64,52,48,36,57,54,62,23,23,1,18,54,41,12,36,7,65,66,14,45,39,45,73,89,30,55,55,33,39,5,9,9,13,64,9,15,72,13,7,3,11,64,20,39,4,59,51,33,51,73,89,26,33,19,0,63,51,43,17,0,51,24,63,51,26,222,50,50,205,43,50,17,51,17,18,57,47,57,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,21,7,35,39,35,7,35,39,35,7,35,39,53,1,34,6,7,39,54,51,50,18,17,16,0,33,34,38,39,35,6,6,35,32,0,17,16,0,51,50,23,7,38,38,35,34,2,17,16,18,51,50,54,55,17,51,17,22,51,50,18,17,16,2,5,139,80,32,50,186,49,33,49,188,47,33,80,3,67,60,93,45,70,124,153,228,255,254,226,254,253,116,172,76,9,78,172,112,254,252,254,227,1,1,229,150,126,70,45,93,60,147,165,210,190,65,130,51,170,102,145,188,212,165,7,4,27,172,103,103,103,103,172,27,254,43,41,31,146,80,254,136,254,173,254,139,254,99,48,48,49,47,1,160,1,114,1,85,1,118,80,146,31,41,254,215,254,246,254,209,254,180,38,38,1,201,254,55,76,1,74,1,49,1,11,1,40,0,0,2,0,0,0,0,6,29,5,164,0,13,0,42,0,63,64,36,36,1,14,26,27,12,18,7,43,44,40,21,14,31,22,3,17,18,5,9,9,13,64,9,15,72,13,7,3,11,35,27,18,15,17,21,0,63,63,51,51,222,50,50,205,43,50,17,51,17,18,23,57,63,17,18,1,23,57,49,48,1,21,7,35,39,35,7,35,39,35,7,35,39,53,1,7,3,35,1,51,19,22,23,51,54,54,19,3,51,0,22,23,51,54,18,17,51,16,2,7,35,3,38,4,182,82,30,50,188,49,31,49,188,50,30,80,1,172,39,170,213,254,127,172,246,39,41,8,12,35,186,172,178,1,9,45,10,8,173,153,166,195,219,182,125,33,5,164,27,172,103,103,103,103,172,27,252,37,95,254,150,4,72,253,73,111,171,35,81,1,136,1,213,252,255,144,44,184,1,179,1,82,254,150,254,7,229,1,90,92,0,0,1,0,125,254,20,4,227,5,203,0,23,0,45,64,24,3,15,9,10,21,10,15,3,24,25,19,0,73,89,19,4,12,6,73,89,12,19,10,27,0,63,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,49,48,1,34,0,17,16,0,33,50,55,17,35,17,35,32,0,17,52,18,36,51,50,23,7,38,3,72,245,254,224,1,10,1,2,111,57,170,20,254,181,254,159,175,1,72,216,237,170,71,171,5,51,254,192,254,232,254,218,254,212,23,253,116,1,216,1,132,1,109,224,1,86,184,84,146,78,0,1,0,115,254,20,3,162,4,92,0,24,0,47,64,24,15,3,23,22,9,22,3,3,25,26,23,27,6,12,70,89,6,16,0,18,70,89,0,22,0,63,43,0,24,63,43,0,24,63,17,18,1,23,57,17,51,17,51,49,48,5,34,0,17,16,0,51,50,22,23,7,38,35,34,6,21,20,22,51,50,54,55,17,35,17,2,117,254,254,252,1,17,251,79,164,48,49,142,104,177,171,171,171,53,80,57,166,20,1,31,1,18,1,20,1,43,34,23,141,51,205,221,220,200,17,26,253,110,1,216,0,0,1,0,106,255,252,4,117,5,6,0,19,0,47,64,33,4,2,8,3,6,0,17,7,10,16,13,18,12,14,14,21,20,19,0,3,17,6,15,5,16,7,13,10,9,12,11,1,18,0,63,205,23,57,17,18,1,23,57,49,48,1,3,39,19,37,55,5,19,37,55,5,19,23,3,5,7,37,3,5,7,2,2,182,121,182,254,225,66,1,33,205,254,223,67,1,33,185,118,184,1,33,68,254,225,204,1,30,65,1,57,254,195,67,1,66,166,115,168,1,100,166,117,168,1,61,67,254,192,166,115,166,254,158,168,115,0,1,0,203,4,145,3,172,5,180,0,19,0,30,64,12,0,6,10,16,6,16,20,21,3,0,13,9,0,47,51,51,50,17,18,1,57,57,17,51,17,51,49,48,1,6,6,35,34,38,53,52,54,51,33,54,54,51,50,22,21,20,6,35,1,135,6,42,48,51,41,42,54,1,193,6,43,47,51,45,44,54,4,240,45,50,50,53,53,41,46,48,49,51,56,40,0,1,0,248,4,229,3,219,5,215,0,19,0,28,64,11,7,18,21,20,0,18,18,12,4,128,9,0,47,26,204,50,51,17,51,17,18,1,57,57,49,48,1,50,55,54,51,50,22,21,21,35,53,52,35,34,14,2,35,35,53,1,4,120,150,149,81,111,116,125,106,43,102,121,142,84,16,5,98,59,58,111,100,31,17,102,36,43,36,121,0,1,1,223,4,215,2,205,6,53,0,14,0,24,64,10,10,0,12,5,0,3,15,16,3,13,0,47,204,17,18,1,23,57,17,51,49,48,1,52,54,51,50,21,20,14,2,21,20,23,21,38,1,223,67,56,92,30,36,30,119,238,5,184,56,69,76,27,25,16,18,20,54,40,74,64,0,1,1,225,4,215,2,207,6,53,0,14,0,24,64,10,5,0,0,10,2,3,15,16,12,2,0,47,204,17,18,1,23,57,17,51,49,48,1,20,7,53,54,53,52,46,2,53,52,51,50,22,2,207,238,119,30,36,30,92,56,67,5,184,161,64,74,40,54,20,18,16,25,27,76,69,0,8,0,41,254,193,7,193,5,145,0,12,0,26,0,40,0,54,0,68,0,82,0,95,0,109,0,128,64,73,95,40,68,90,34,62,12,26,7,20,82,54,109,76,48,103,16,110,111,0,7,58,72,72,65,79,69,68,62,76,86,99,99,92,106,102,95,90,109,30,44,44,37,51,47,34,40,3,54,16,23,7,79,76,106,109,51,54,23,23,54,51,109,106,76,79,7,8,9,13,20,3,9,0,47,51,47,51,18,23,57,47,47,47,47,47,47,47,47,17,51,17,23,51,17,51,51,17,51,17,51,51,51,17,51,51,17,51,17,51,51,51,17,51,51,17,51,17,51,17,18,1,23,57,49,48,1,38,38,35,34,6,7,35,54,51,50,22,23,3,38,38,35,34,6,7,35,54,54,51,50,22,23,1,38,38,35,34,6,7,35,54,54,51,50,22,23,33,38,38,35,34,6,7,35,54,54,51,50,22,23,1,38,38,35,34,6,7,35,54,54,51,50,22,23,33,38,38,35,34,6,7,35,54,54,51,50,22,23,1,38,38,35,34,6,7,35,54,51,50,22,23,33,38,38,35,34,6,7,35,54,54,51,50,22,23,4,111,5,60,69,78,50,5,75,11,197,93,113,7,79,5,60,69,78,50,5,75,5,100,103,92,115,6,1,244,5,60,68,78,50,5,76,5,101,103,92,115,6,251,47,5,60,68,78,50,5,76,5,101,103,92,115,6,4,49,5,60,68,78,50,5,76,5,101,103,92,115,6,251,47,5,60,68,78,50,5,76,5,101,103,92,115,6,4,240,5,60,68,78,51,5,75,11,198,92,115,6,249,190,5,60,68,78,50,5,76,5,101,103,92,115,6,4,207,44,44,41,47,194,101,93,249,242,44,44,41,47,89,105,102,92,1,22,45,43,39,49,90,105,102,93,45,43,39,49,90,105,102,93,3,219,45,43,39,49,90,105,102,93,45,43,39,49,90,105,102,93,254,25,44,44,40,48,194,104,90,45,43,39,49,90,104,102,92,0,0,8,0,41,254,127,7,125,5,211,0,7,0,15,0,23,0,31,0,39,0,46,0,53,0,62,0,52,64,37,21,23,37,32,62,58,5,1,41,44,31,28,50,53,9,13,16,63,64,59,43,7,46,54,25,21,29,17,47,39,15,36,51,14,5,12,5,0,47,47,18,23,57,17,18,1,23,57,49,48,5,23,6,6,7,35,54,55,3,39,54,54,55,51,6,7,1,55,22,22,23,21,38,39,5,7,38,38,39,53,22,23,1,55,54,54,55,23,6,7,1,7,6,7,39,54,55,3,39,38,39,55,22,23,1,23,22,22,23,7,38,38,39,4,55,11,17,70,36,97,53,17,59,11,19,73,31,97,52,18,2,35,14,71,200,65,221,129,251,104,14,66,191,79,221,129,3,166,2,67,190,67,69,177,120,252,234,2,155,169,69,177,120,43,17,82,69,67,123,76,3,106,17,39,90,22,67,31,130,38,35,14,66,191,79,221,129,4,152,14,71,200,65,220,130,254,22,11,19,73,31,97,53,17,59,11,17,70,36,97,53,17,1,170,16,39,88,25,68,110,88,252,149,16,89,63,68,110,88,2,222,2,140,183,70,198,99,252,233,2,69,194,60,70,50,195,52,0,0,2,0,201,254,131,6,8,7,94,0,20,0,34,0,89,64,47,13,10,12,7,14,14,9,19,2,2,20,20,24,32,9,10,5,36,35,20,18,6,5,17,18,5,18,14,0,14,9,73,89,14,18,12,34,31,15,24,1,24,28,21,7,0,3,0,63,50,222,50,205,93,50,63,63,43,17,18,0,57,57,17,51,17,51,24,63,17,18,1,23,57,17,51,17,51,17,51,17,51,51,17,51,49,48,19,51,17,20,7,7,51,1,51,17,51,3,35,19,35,17,52,55,35,1,35,1,34,38,39,51,22,22,51,50,54,55,51,6,6,201,161,10,4,8,3,52,184,184,143,197,156,160,19,9,252,201,186,2,67,186,168,10,155,10,93,110,105,99,9,158,12,181,5,182,252,209,118,206,83,4,198,250,226,253,235,1,125,3,37,175,247,251,53,6,43,143,164,108,78,93,93,159,148,0,2,0,176,254,135,5,18,6,12,0,17,0,31,0,79,64,42,10,7,9,4,11,11,6,15,1,1,16,16,21,29,6,7,5,33,32,3,14,16,17,15,11,6,70,89,11,16,21,9,34,28,15,21,1,21,25,18,4,15,0,63,222,50,205,93,50,63,63,51,43,0,24,63,18,57,57,17,18,1,23,57,17,51,17,51,17,51,17,51,51,17,51,49,48,1,17,20,7,1,51,17,51,3,35,19,35,17,52,55,1,35,17,37,34,38,39,51,22,22,51,50,54,55,51,6,6,1,76,10,2,81,207,176,129,172,125,155,8,253,174,205,1,236,185,170,10,156,7,90,116,103,100,10,157,12,178,4,72,253,106,136,136,3,166,252,71,253,248,1,121,2,160,158,104,252,90,4,72,145,143,164,102,84,90,96,158,149,0,2,0,47,0,0,4,125,5,182,0,17,0,25,0,77,64,41,8,4,18,18,1,15,21,11,11,6,15,17,4,26,27,8,25,73,89,7,17,0,17,73,89,4,0,8,0,8,0,15,2,15,18,74,89,15,18,2,3,0,63,63,43,17,18,0,57,57,24,47,47,17,51,43,17,0,51,43,17,18,1,23,57,17,51,17,51,51,17,51,51,49,48,19,51,53,51,21,33,21,33,17,51,32,17,20,4,33,33,17,35,1,51,32,17,52,38,35,35,47,154,170,1,86,254,170,192,2,74,254,236,254,241,254,111,154,1,68,221,1,123,184,201,215,4,252,186,186,150,254,224,254,100,210,216,4,102,252,43,1,25,132,128,0,0,2,0,20,0,0,4,76,6,20,0,18,0,26,0,75,64,40,4,0,20,20,16,12,23,8,8,2,12,14,4,27,28,4,19,70,89,3,14,15,14,71,89,0,15,4,15,4,15,12,17,0,12,20,70,89,12,21,0,63,43,0,24,63,18,57,57,47,47,17,51,43,17,0,51,43,17,18,1,23,57,17,51,17,51,51,17,51,51,49,48,1,33,21,33,17,33,50,22,21,20,6,35,33,17,35,53,51,53,51,17,17,33,32,53,52,38,35,1,86,1,39,254,217,1,64,223,215,224,221,254,33,156,156,166,1,49,1,31,132,159,5,31,129,253,229,154,155,164,170,4,158,129,245,251,224,254,151,185,92,84,0,0,2,0,201,0,0,4,121,5,182,0,15,0,28,0,72,64,41,16,10,10,11,24,0,0,4,5,3,22,6,21,19,20,11,10,29,30,22,19,28,16,12,28,74,89,9,16,74,89,6,3,12,9,9,11,12,3,11,18,0,63,63,18,57,47,18,57,57,43,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,6,7,23,7,39,6,35,35,17,35,17,33,32,4,1,51,50,55,39,55,23,54,53,52,38,35,35,4,121,115,108,120,100,149,102,136,184,170,1,137,1,18,1,21,252,250,166,87,76,108,108,140,127,194,202,200,4,12,127,201,57,157,84,192,27,253,193,5,182,215,253,242,10,141,82,176,72,178,145,142,0,2,0,176,254,20,4,117,4,92,0,24,0,41,0,85,64,49,29,11,4,7,7,8,39,18,18,21,22,20,37,23,34,36,35,8,10,42,43,37,34,25,32,15,25,70,89,12,11,11,4,20,23,4,0,15,16,9,15,8,27,0,32,70,89,0,22,0,63,43,0,24,63,63,63,18,23,57,17,51,43,17,18,0,57,57,17,18,1,23,57,17,51,17,51,17,51,51,51,49,48,5,34,38,39,35,22,21,17,35,17,51,23,51,54,54,51,50,18,17,16,7,23,7,39,6,3,34,6,7,21,20,22,51,50,55,39,55,23,54,53,52,38,2,174,107,177,60,12,12,166,135,25,8,64,169,109,218,237,183,115,100,131,71,109,168,150,2,154,170,47,41,121,106,129,101,150,20,79,82,148,34,254,61,6,52,150,90,80,254,214,254,243,254,174,145,156,80,174,24,3,227,186,203,37,231,199,12,158,80,170,103,249,215,209,0,0,1,0,47,0,0,4,8,5,182,0,13,0,60,64,31,3,7,7,12,8,0,5,8,10,4,14,15,6,10,11,10,73,89,3,11,11,8,13,13,2,73,89,13,3,8,18,0,63,63,43,17,18,0,57,24,47,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,1,21,33,17,33,21,33,17,35,17,35,53,51,17,4,8,253,107,1,168,254,88,170,154,154,5,182,153,254,2,150,253,119,2,137,150,2,151,0,1,0,18,0,0,3,66,4,72,0,13,0,60,64,31,2,6,6,11,7,0,4,7,9,4,14,15,5,9,10,9,71,89,2,10,10,7,12,12,1,70,89,12,15,7,21,0,63,63,43,17,18,0,57,24,47,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,1,33,17,33,21,33,17,35,17,35,53,51,17,33,3,66,254,20,1,90,254,166,166,158,158,2,146,3,188,254,168,127,254,27,1,229,127,1,228,0,0,1,0,201,254,0,4,219,5,182,0,27,0,65,64,35,9,3,3,4,25,14,14,7,20,4,4,28,29,17,23,73,89,17,28,11,0,73,89,11,11,4,5,5,8,73,89,5,3,4,18,0,63,63,43,17,18,0,57,24,47,43,0,24,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,7,17,35,17,33,21,33,17,54,51,32,0,17,16,0,33,34,38,39,53,22,51,32,17,52,0,2,49,100,90,170,3,73,253,97,90,121,1,64,1,85,254,226,254,253,83,125,70,123,137,1,127,255,0,2,143,12,253,125,5,182,153,253,252,10,254,173,254,198,254,197,254,165,21,28,152,49,1,254,245,1,4,0,0,1,0,176,254,10,3,250,4,72,0,27,0,65,64,35,8,25,20,14,14,15,15,2,18,25,4,29,28,22,11,70,89,22,22,15,16,16,19,70,89,16,15,15,21,0,5,70,89,0,27,0,63,43,0,24,63,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,39,53,22,51,50,54,53,52,38,35,34,7,17,35,17,33,21,33,17,54,51,32,0,17,16,2,2,70,145,101,116,123,133,136,178,181,69,74,166,2,154,254,12,82,59,1,16,1,7,228,254,10,60,149,63,202,215,223,208,17,254,37,4,72,142,254,183,12,254,229,254,217,254,245,254,218,0,0,1,0,2,254,131,6,248,5,182,0,21,0,77,64,41,6,17,17,3,18,13,12,12,8,9,18,0,1,21,7,22,23,18,21,18,19,16,9,6,3,0,0,15,1,15,10,73,89,15,18,13,34,7,4,1,3,0,63,51,51,63,63,43,17,18,0,57,17,51,51,51,51,51,24,63,51,17,18,1,23,57,17,51,17,51,51,17,51,49,48,1,1,51,1,17,51,17,1,51,1,1,51,17,35,17,35,1,17,35,17,1,35,2,86,253,193,190,2,57,164,2,58,190,253,192,1,218,180,162,94,253,186,164,253,187,199,2,240,2,198,253,60,2,196,253,60,2,196,253,60,253,168,253,233,1,125,2,229,253,27,2,229,253,27,0,0,1,0,4,254,135,6,31,4,72,0,21,0,75,64,40,2,13,13,21,14,9,8,8,4,5,14,18,19,17,7,22,23,21,15,12,5,2,18,18,11,3,0,19,15,14,17,21,11,6,70,89,11,21,9,34,0,63,63,43,0,24,63,51,63,51,51,18,57,17,51,51,51,51,51,17,18,1,23,57,17,51,17,51,51,17,51,49,48,1,51,17,1,51,1,1,51,17,35,17,35,1,17,35,17,1,35,1,1,51,1,2,164,153,1,197,182,254,54,1,112,193,162,94,254,30,153,254,31,191,1,240,254,55,182,1,195,4,72,253,237,2,19,253,237,254,90,253,248,1,121,2,45,253,211,2,45,253,211,2,53,2,19,253,237,0,255,255,0,74,254,66,4,53,5,203,2,38,1,177,0,0,0,7,3,127,1,88,0,0,255,255,0,68,254,66,3,127,4,92,2,38,1,209,0,0,0,7,3,127,1,8,0,0,0,1,0,201,254,131,5,43,5,182,0,15,0,59,64,32,12,8,8,9,3,2,2,14,15,6,9,5,16,17,15,12,6,3,5,13,10,3,9,18,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,63,51,18,23,57,17,18,1,23,57,17,51,17,51,17,51,49,48,37,51,17,35,17,35,1,7,17,35,17,51,17,1,51,1,4,127,172,162,102,253,233,153,170,170,2,151,201,253,180,154,253,233,1,125,2,197,136,253,195,5,182,253,43,2,213,253,133,0,1,0,176,254,133,4,61,4,72,0,14,0,58,64,31,14,10,10,11,6,5,5,1,2,11,4,15,16,2,14,9,3,8,0,12,15,11,21,8,3,70,89,8,21,6,34,0,63,63,43,0,24,63,63,51,18,23,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,51,1,1,51,17,35,17,35,1,17,35,17,51,17,3,47,182,254,39,1,127,178,159,84,254,12,166,166,4,72,253,239,254,88,253,246,1,123,2,43,253,213,4,72,253,235,0,0,1,0,201,0,0,4,233,5,182,0,18,0,56,64,30,6,2,2,3,10,17,17,7,18,14,12,18,3,4,19,20,8,10,6,0,16,18,6,3,11,4,3,15,3,18,0,63,51,63,51,18,23,57,17,18,1,23,57,17,51,51,17,51,17,51,17,51,49,48,1,7,17,35,17,51,17,55,17,51,21,1,51,1,1,35,1,17,35,1,240,125,170,170,125,125,1,155,203,253,180,2,98,200,254,76,125,2,168,107,253,195,5,182,253,37,139,1,93,211,1,198,253,133,252,197,2,92,254,207,0,1,0,176,0,0,4,59,4,72,0,19,0,58,64,31,6,2,2,3,14,10,18,18,7,19,15,12,19,3,4,20,21,8,10,6,1,17,19,6,3,11,4,15,16,3,21,0,63,51,63,51,18,23,57,17,18,1,23,57,17,51,51,17,51,51,17,51,17,51,49,48,1,39,17,35,17,51,17,55,17,51,21,1,51,1,21,1,35,1,21,35,1,205,119,166,166,119,131,1,14,182,254,60,1,235,194,254,213,129,1,178,121,253,213,4,72,253,235,121,1,74,205,1,31,254,37,107,253,254,1,59,221,0,0,1,0,47,0,0,4,233,5,182,0,19,0,71,64,38,8,4,16,16,1,17,11,14,12,10,6,14,17,19,6,20,21,7,19,0,19,73,89,4,11,8,14,3,17,0,0,2,13,17,18,9,2,3,0,63,51,63,51,18,57,47,18,23,57,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,51,49,48,19,51,53,51,21,51,21,35,17,1,51,1,1,35,1,7,17,35,17,35,47,154,170,221,221,2,149,203,253,180,2,98,206,253,241,153,170,154,5,4,178,178,151,254,110,2,219,253,133,252,197,2,197,134,253,193,4,109,0,0,1,0,20,0,0,4,27,6,20,0,25,0,77,64,43,10,8,4,22,22,1,23,18,16,6,17,23,25,6,26,27,20,10,15,19,23,21,7,25,0,25,71,89,4,15,0,31,0,47,0,3,0,0,2,15,15,2,0,0,63,63,18,57,47,93,51,43,17,0,51,24,63,51,18,57,57,17,18,1,23,57,17,51,51,17,51,51,51,49,48,19,51,53,51,21,33,21,33,17,7,7,51,55,54,54,1,51,1,1,35,1,7,17,35,17,35,20,156,164,1,125,254,131,3,3,8,18,55,40,1,112,199,254,68,1,217,199,254,125,125,164,156,5,90,186,186,127,253,232,91,55,24,74,48,1,133,254,45,253,139,2,4,106,254,102,4,219,0,1,0,16,0,0,5,131,5,182,0,13,0,53,64,27,2,10,10,11,5,8,6,4,8,11,4,14,15,8,2,0,7,11,18,3,3,0,13,73,89,0,3,0,63,43,0,24,63,63,51,18,57,57,17,18,1,23,57,17,51,17,51,17,51,49,48,19,33,17,1,51,1,1,35,1,7,17,35,17,33,16,1,252,2,150,203,253,180,2,98,201,253,236,154,170,254,174,5,182,253,37,2,219,253,133,252,197,2,197,136,253,195,5,29,0,0,1,0,41,0,0,4,227,4,72,0,12,0,53,64,27,5,1,1,9,9,10,12,10,4,6,4,14,13,8,2,0,7,10,21,3,15,0,12,70,89,0,15,0,63,43,0,24,63,63,51,18,57,57,17,18,1,23,57,17,51,17,51,17,51,49,48,19,33,17,1,51,1,1,35,1,17,35,17,33,41,2,2,1,219,182,254,39,2,0,194,254,10,164,254,162,4,72,253,235,2,21,253,237,253,203,2,43,253,213,3,188,0,1,0,201,254,131,5,193,5,182,0,15,0,68,64,36,12,8,8,9,13,5,5,0,3,2,2,0,9,3,16,17,12,7,73,89,12,12,5,14,10,3,9,18,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,37,51,17,35,17,35,17,33,17,35,17,51,17,33,17,51,5,31,162,162,170,252,254,170,170,3,2,170,154,253,233,1,125,2,176,253,80,5,182,253,146,2,110,0,0,1,0,176,254,135,4,248,4,72,0,15,0,78,64,43,1,13,13,14,2,10,10,5,8,7,7,5,14,3,16,17,1,12,70,89,15,1,31,1,2,11,3,1,1,10,3,15,15,14,21,10,5,70,89,10,21,8,34,0,63,63,43,0,24,63,63,51,18,57,47,95,94,93,43,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,49,48,1,17,33,17,51,17,51,17,35,17,35,17,33,17,35,17,1,86,2,102,166,150,166,150,253,154,166,4,72,254,53,1,203,252,71,253,248,1,121,1,238,254,18,4,72,0,0,1,0,201,0,0,6,111,5,182,0,13,0,63,64,33,10,6,6,7,11,3,3,2,0,2,7,3,14,15,10,5,73,89,10,10,7,12,12,1,73,89,12,3,8,3,3,7,18,0,63,51,63,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,33,17,35,17,33,17,35,17,51,17,33,17,33,6,111,254,176,172,253,0,170,170,3,0,1,252,5,29,250,227,2,176,253,80,5,182,253,146,2,110,0,1,0,176,0,0,5,193,4,72,0,13,0,73,64,39,1,11,11,12,2,8,8,7,4,7,12,3,14,15,13,15,1,10,70,89,15,1,31,1,2,11,3,1,1,3,8,12,21,3,6,70,89,3,15,0,63,43,0,24,63,51,18,57,47,95,94,93,43,0,24,63,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,17,33,17,33,21,33,17,35,17,33,17,35,17,1,86,2,102,2,5,254,161,166,253,154,166,4,72,254,53,1,203,140,252,68,1,238,254,18,4,72,0,1,0,201,254,0,8,29,5,182,0,29,0,71,64,38,4,5,8,0,0,1,23,13,13,18,1,5,4,30,31,16,21,73,89,16,28,10,26,73,89,10,10,5,6,6,3,73,89,6,3,1,5,18,0,63,51,63,43,17,18,0,57,24,47,43,0,24,63,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,33,35,17,33,17,35,17,33,17,54,51,32,0,17,16,0,33,34,39,53,22,51,32,17,52,2,35,34,6,7,4,217,170,253,68,170,4,16,68,125,1,50,1,81,254,229,254,254,156,123,134,127,1,122,230,232,42,127,24,5,29,250,227,5,182,253,97,12,254,168,254,200,254,199,254,166,49,152,49,1,254,242,1,5,7,5,0,0,1,0,176,254,10,6,168,4,72,0,28,0,71,64,38,17,18,21,13,13,14,7,26,26,2,14,18,4,29,30,23,10,70,89,23,23,18,19,19,16,70,89,19,15,14,18,21,0,5,70,89,0,27,0,63,43,0,24,63,51,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,34,39,53,22,51,50,17,52,38,35,34,7,17,35,17,33,17,35,17,33,17,54,51,50,0,17,16,2,5,23,131,97,109,108,240,166,172,67,72,168,253,223,166,3,111,75,66,246,1,6,209,254,10,60,149,63,1,161,223,208,21,254,41,3,184,252,72,4,72,254,39,14,254,215,254,231,254,244,254,219,0,2,0,125,255,172,5,225,5,205,0,40,0,52,0,80,64,44,27,17,47,35,41,0,8,0,3,22,32,35,17,7,53,54,38,44,74,89,12,50,38,38,14,20,20,25,73,89,20,4,10,5,73,89,10,14,14,30,73,89,14,19,0,63,43,0,24,16,196,43,0,24,63,43,17,18,0,57,24,47,57,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,2,7,22,51,50,55,21,6,35,34,39,6,35,32,0,17,16,0,33,50,23,7,38,35,32,17,16,18,51,50,55,38,2,53,52,18,51,50,18,3,52,38,35,34,6,21,20,22,23,54,54,5,184,138,116,66,90,78,61,56,91,178,148,102,144,254,202,254,161,1,73,1,58,127,92,47,84,90,254,51,255,235,54,46,86,92,198,175,181,193,176,103,93,94,103,93,83,102,115,2,166,181,254,203,86,30,22,153,25,100,36,1,137,1,86,1,120,1,138,35,145,28,253,158,254,224,254,206,10,103,1,28,160,244,1,10,254,246,254,254,177,204,201,176,140,254,85,67,255,0,0,2,0,115,255,199,4,211,4,92,0,10,0,53,0,80,64,44,30,19,0,38,6,44,52,44,47,24,36,38,19,7,54,55,41,8,71,89,13,3,41,41,15,22,22,27,70,89,22,16,11,49,70,89,11,15,15,33,70,89,15,22,0,63,43,0,24,16,196,43,0,24,63,43,17,18,0,57,24,47,57,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,22,23,54,54,53,52,35,34,6,1,34,39,6,35,34,38,38,53,16,18,51,50,23,7,38,35,34,6,21,20,22,51,50,54,55,38,53,52,54,51,50,22,21,20,6,7,22,51,50,55,21,6,2,238,68,63,68,83,135,72,75,1,102,147,130,96,123,149,226,122,248,227,91,77,37,54,79,156,145,170,164,37,53,6,139,168,151,148,157,107,94,52,67,66,49,39,1,242,94,161,53,44,158,110,235,125,253,99,77,40,139,254,164,1,19,1,48,22,138,19,209,231,206,210,9,3,148,225,173,193,189,177,125,209,64,26,14,137,14,0,255,255,0,125,254,66,4,207,5,203,2,38,0,38,0,0,0,7,3,127,2,37,0,0,255,255,0,115,254,66,3,139,4,92,2,38,0,70,0,0,0,7,3,127,1,131,0,0,0,1,0,16,254,131,4,90,5,182,0,11,0,50,64,27,6,11,8,9,3,9,11,1,4,12,13,11,6,73,89,11,18,9,34,5,1,2,1,73,89,2,3,0,63,43,17,0,51,24,63,63,43,17,18,1,23,57,17,51,17,51,49,48,1,33,53,33,21,33,17,51,17,35,17,35,1,223,254,49,4,74,254,49,162,162,172,5,29,153,153,251,125,253,233,1,125,0,0,1,0,41,254,135,3,145,4,72,0,11,0,52,64,27,6,11,8,9,3,9,11,1,4,12,13,9,34,5,1,2,1,70,89,2,15,11,6,70,89,11,21,0,63,43,0,24,63,43,17,0,51,24,63,17,18,1,23,57,17,51,17,51,49,48,1,33,53,33,21,33,17,51,17,35,17,35,1,137,254,160,3,104,254,158,150,166,150,3,188,140,140,252,211,253,248,1,121,0,255,255,0,0,0,0,4,123,5,182,2,6,0,60,0,0,0,1,0,0,254,20,4,2,4,72,0,13,0,41,64,20,0,1,12,1,3,3,14,15,8,7,13,7,2,11,3,15,2,21,1,27,0,63,63,63,51,18,57,57,17,51,17,18,1,23,57,17,51,49,48,1,35,17,1,51,19,22,23,51,54,55,19,51,1,2,84,166,254,82,172,236,83,19,8,33,70,233,172,254,82,254,20,1,232,4,76,253,155,222,97,138,181,2,101,251,180,0,0,1,0,0,0,0,4,123,5,182,0,16,0,58,64,30,4,8,8,13,9,2,6,9,11,15,5,17,18,7,11,12,11,73,89,4,0,15,12,12,9,1,15,3,9,18,0,63,63,51,18,57,47,18,57,51,43,17,0,51,17,18,1,23,57,17,51,51,17,51,49,48,1,1,51,1,21,33,21,33,17,35,17,33,53,33,53,1,51,2,61,1,134,184,254,24,1,43,254,213,172,254,211,1,45,254,25,186,2,219,2,219,252,129,59,152,254,156,1,100,152,51,3,135,0,1,0,0,254,20,4,2,4,72,0,19,0,60,64,31,17,1,1,6,2,16,19,2,4,7,5,20,21,12,11,11,5,15,7,15,0,4,5,4,71,89,17,5,21,2,27,0,63,63,51,43,17,0,51,24,63,51,18,57,17,51,17,18,1,23,57,17,51,51,17,51,49,48,5,17,35,17,33,53,33,1,51,19,22,23,51,54,55,19,51,1,33,21,2,84,166,254,234,1,20,254,84,172,236,83,19,8,33,70,233,172,254,84,1,18,129,254,149,1,107,129,4,72,253,155,222,97,138,181,2,101,251,184,129,0,0,1,0,8,254,131,4,213,5,182,0,15,0,55,64,32,3,2,2,14,15,12,6,9,10,8,8,16,17,12,15,9,6,4,5,13,10,3,8,18,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,63,51,18,23,57,17,18,1,23,57,17,51,49,48,37,51,17,35,17,35,1,1,35,1,1,51,1,1,51,1,4,51,162,162,94,254,119,254,112,180,1,230,254,59,188,1,107,1,110,181,254,59,154,253,233,1,125,2,131,253,125,2,252,2,186,253,189,2,67,253,76,0,1,0,39,254,133,4,55,4,72,0,15,0,57,64,33,10,9,9,5,6,3,13,0,1,15,8,16,17,15,21,3,6,0,13,4,12,1,12,7,70,89,12,21,10,34,4,1,15,0,63,51,63,63,43,17,18,0,23,57,24,63,17,18,1,23,57,17,51,49,48,1,1,51,1,1,51,1,1,51,17,35,17,35,1,1,35,1,184,254,131,189,1,33,1,32,187,254,131,1,43,149,166,69,254,205,254,202,188,2,49,2,23,254,92,1,164,253,233,254,94,253,246,1,123,1,188,254,68,0,0,1,0,16,254,131,6,168,5,182,0,15,0,64,64,34,12,5,0,13,3,2,2,13,10,5,7,5,16,17,14,3,11,7,8,7,73,89,8,3,0,12,5,12,73,89,5,18,3,34,0,63,63,43,17,0,51,24,63,43,17,0,51,24,63,17,18,1,23,57,17,51,17,51,17,51,49,48,37,51,17,35,17,33,17,33,53,33,21,33,17,33,17,51,5,254,170,162,251,180,254,86,4,47,254,37,2,240,170,154,253,233,1,125,5,29,153,153,251,125,5,28,0,1,0,41,254,135,5,152,4,70,0,15,0,63,64,34,2,11,6,3,9,8,8,3,0,11,13,5,16,17,1,13,14,13,70,89,14,15,6,2,11,2,70,89,11,21,9,34,4,15,0,63,63,63,43,17,0,51,24,63,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,33,17,33,17,51,17,51,17,35,17,33,17,33,53,33,3,121,254,151,2,70,166,156,166,252,120,254,191,3,80,3,186,252,213,3,183,252,73,253,248,1,121,3,186,140,0,0,1,0,170,254,131,5,104,5,182,0,23,0,59,64,31,21,0,5,3,2,15,12,2,5,12,3,24,25,18,9,73,89,18,18,5,22,13,3,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,17,51,51,49,48,37,51,17,35,17,35,17,6,6,35,34,38,53,17,51,17,20,22,51,50,54,55,17,51,4,199,161,161,170,149,198,106,207,223,170,127,143,97,177,169,170,154,253,233,1,125,2,92,53,39,190,179,2,69,253,207,121,116,29,55,2,202,0,0,1,0,156,254,133,4,195,4,72,0,22,0,59,64,31,1,21,9,6,14,12,11,11,14,21,3,23,24,3,18,70,89,3,3,14,7,22,15,14,9,70,89,14,21,12,34,0,63,63,43,0,24,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,51,17,51,49,48,1,17,20,51,50,54,55,17,51,17,51,17,35,17,35,17,6,6,35,34,38,53,17,1,66,219,91,166,105,166,150,166,150,105,179,113,164,186,4,72,254,112,192,56,67,1,213,252,71,253,246,1,123,1,240,72,59,172,147,1,156,0,1,0,170,0,0,4,199,5,182,0,22,0,74,64,38,5,2,11,21,21,8,22,13,17,17,16,16,22,2,3,23,24,20,0,8,0,73,89,11,8,22,8,9,9,8,22,3,3,17,18,14,3,3,0,63,51,63,18,23,57,47,47,47,17,51,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,51,17,51,17,51,49,48,1,32,17,17,51,17,20,22,51,17,51,17,54,55,17,51,17,35,17,6,7,17,35,2,117,254,53,170,135,154,125,134,163,172,172,168,129,125,2,0,1,113,2,69,253,207,119,118,1,92,254,170,13,60,2,207,250,74,2,88,65,17,254,207,0,1,0,156,0,0,4,29,4,72,0,23,0,74,64,38,1,22,6,16,16,3,17,8,12,12,11,11,17,22,3,24,25,15,19,3,19,70,89,6,3,17,3,4,4,3,17,3,12,9,23,15,12,21,0,63,63,51,18,23,57,47,47,47,17,51,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,51,17,51,17,51,49,48,1,17,20,23,17,51,17,54,55,17,51,17,35,17,6,7,21,35,53,35,34,38,53,17,1,66,200,119,113,133,166,166,128,118,119,22,160,184,4,72,254,112,186,6,1,45,254,221,24,89,1,213,251,184,1,240,91,26,248,234,170,149,1,156,0,1,0,201,0,0,4,229,5,182,0,18,0,47,64,23,2,17,17,18,9,8,8,18,20,19,4,13,73,89,2,18,4,4,9,18,18,0,3,0,63,63,51,57,47,18,57,43,17,18,1,57,57,17,51,17,51,17,51,49,48,19,51,17,36,51,50,22,21,17,35,17,52,38,35,34,6,7,17,35,201,170,1,0,196,207,223,170,127,143,107,186,149,170,5,182,253,164,92,191,177,253,186,2,49,120,118,34,50,253,53,0,0,1,0,176,0,0,4,66,4,72,0,18,0,47,64,23,0,18,11,7,7,8,18,8,20,19,14,3,70,89,11,14,14,8,9,15,0,8,21,0,63,51,63,18,57,47,57,43,17,18,1,57,57,17,51,17,51,17,51,49,48,33,17,52,35,34,6,7,17,35,17,51,17,54,54,51,50,22,21,17,3,154,217,88,156,119,166,166,95,186,114,163,190,1,141,193,49,74,254,45,4,72,254,14,69,62,168,151,254,102,0,2,0,61,255,236,6,63,5,205,0,32,0,39,0,81,64,42,5,3,0,36,17,17,8,30,37,16,16,24,30,0,4,40,41,17,30,7,30,73,89,36,7,2,7,2,27,12,27,20,73,89,27,19,12,33,73,89,12,4,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,51,43,17,0,51,17,18,1,23,57,17,51,17,51,51,17,51,17,51,51,49,48,19,52,55,51,6,21,20,51,51,55,18,0,33,32,0,17,21,33,18,0,51,50,54,55,21,6,6,35,32,0,3,34,38,1,34,2,7,33,16,38,61,27,145,20,113,34,5,29,1,77,1,23,1,41,1,40,251,220,14,1,5,247,101,202,141,114,221,130,254,198,254,163,19,142,155,3,175,209,240,16,3,110,203,3,135,73,54,50,60,103,43,1,42,1,71,254,133,254,143,69,254,248,254,239,31,43,156,39,30,1,100,1,76,118,2,35,254,245,249,1,9,251,0,0,2,0,51,255,236,4,221,4,90,0,31,0,38,0,76,64,40,10,8,5,22,13,36,21,21,29,13,3,5,5,39,40,22,3,12,3,70,89,35,12,7,12,7,0,17,17,32,70,89,17,16,0,25,70,89,0,22,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,51,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,51,49,48,5,34,0,39,36,53,52,55,51,6,21,20,51,51,55,54,54,51,50,18,21,21,33,22,22,51,50,54,55,21,6,6,3,34,6,7,33,52,38,3,74,243,254,236,6,254,246,25,141,20,106,21,6,34,250,183,207,241,253,12,6,172,173,101,159,98,88,157,160,134,151,14,2,61,140,20,1,30,252,4,221,69,50,47,59,103,35,202,224,254,247,226,105,198,195,32,42,148,38,33,3,227,164,158,157,165,0,2,0,61,254,131,6,63,5,205,0,34,0,41,0,93,64,49,11,9,6,38,23,23,14,3,33,34,39,22,22,30,34,3,6,5,42,43,34,34,32,19,23,3,13,3,73,89,38,13,8,13,8,0,18,18,35,73,89,18,4,0,26,74,89,0,19,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,51,43,17,0,51,24,63,63,17,18,1,23,57,17,51,17,51,17,51,51,17,51,17,51,51,49,48,5,36,0,3,34,38,53,52,55,51,6,21,20,51,51,55,18,0,33,32,0,17,21,33,18,0,51,50,54,55,21,6,7,17,35,19,34,2,7,33,16,38,3,160,254,254,254,219,19,142,155,27,145,20,113,34,5,29,1,77,1,23,1,41,1,40,251,220,14,1,5,247,101,202,141,176,235,166,76,209,240,16,3,110,203,12,29,1,90,1,49,118,117,73,54,50,60,103,43,1,42,1,71,254,133,254,143,69,254,248,254,239,31,43,156,62,5,254,149,6,178,254,245,249,1,9,251,0,2,0,51,254,135,4,221,4,90,0,33,0,40,0,88,64,47,10,8,5,22,13,32,33,38,21,21,29,33,13,3,5,6,41,42,33,34,31,22,22,3,12,3,70,89,37,12,7,12,7,0,17,17,34,70,89,17,16,0,25,70,89,0,21,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,51,43,17,0,51,24,63,63,17,18,1,23,57,17,51,17,51,17,51,17,51,51,49,48,5,38,2,39,36,53,52,55,51,6,21,20,51,51,55,54,54,51,50,18,21,21,33,22,22,51,50,54,55,21,6,7,17,35,19,34,6,7,33,52,38,2,213,191,211,6,254,246,25,141,20,106,21,6,34,250,183,207,241,253,12,6,172,173,101,159,98,142,165,166,68,134,151,14,2,61,140,10,31,1,17,224,4,221,69,50,47,59,103,35,202,224,254,247,226,105,198,195,32,42,148,65,4,254,153,5,72,164,158,157,165,0,255,255,0,84,0,0,2,86,5,182,2,6,0,44,0,0,255,255,0,2,0,0,6,188,7,96,2,38,1,176,0,0,1,7,2,54,1,16,1,84,0,8,179,1,18,5,38,0,43,53,255,255,0,4,0,0,5,223,6,12,2,38,1,208,0,0,1,7,2,54,0,164,0,0,0,8,179,1,18,17,38,0,43,53,0,1,0,201,254,0,5,25,5,182,0,28,0,66,64,37,7,3,3,4,26,14,14,9,10,20,4,5,29,30,17,23,73,89,17,28,7,2,73,89,11,0,74,89,7,11,11,4,8,5,3,4,18,0,63,63,51,18,57,47,57,43,43,0,24,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,7,17,35,17,51,17,1,51,1,55,32,0,17,16,0,33,34,38,39,53,22,51,50,18,53,52,36,2,94,140,95,170,170,2,137,205,253,133,26,1,79,1,98,254,217,254,245,82,124,70,122,152,187,200,254,235,2,123,31,253,164,5,182,253,60,2,196,253,84,2,254,187,254,207,254,198,254,164,20,29,152,49,1,13,241,232,253,0,0,1,0,176,254,10,4,33,4,72,0,28,0,66,64,37,4,0,0,1,23,10,16,10,6,7,1,5,29,30,14,20,70,89,14,27,4,28,71,89,7,26,70,89,4,7,7,1,5,2,15,1,21,0,63,63,51,18,57,47,57,43,43,0,24,63,43,17,18,1,23,57,17,51,17,51,17,51,49,48,33,35,17,51,17,1,51,1,4,18,17,20,6,6,35,34,39,53,22,22,51,50,54,53,52,38,35,34,7,1,84,164,164,1,227,183,254,55,1,0,252,110,204,133,136,95,46,108,71,135,152,187,190,82,92,4,72,253,250,2,6,254,30,4,254,228,254,245,177,252,132,60,145,25,38,217,200,211,207,24,0,1,0,0,254,131,5,145,5,182,0,23,0,57,64,31,3,0,5,4,1,1,5,14,3,24,25,22,7,73,89,22,3,12,17,74,89,12,18,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,51,49,48,37,51,3,35,19,35,17,33,7,2,2,6,39,34,39,53,22,51,50,54,54,18,19,33,4,217,184,143,197,156,170,254,37,31,61,93,152,126,74,59,54,59,53,79,61,93,56,3,18,154,253,233,1,125,5,31,240,254,33,254,69,174,2,25,143,26,87,215,2,89,1,184,0,0,1,0,16,254,135,4,143,4,70,0,20,0,57,64,31,3,0,5,4,1,1,5,13,3,21,22,19,7,70,89,19,15,11,16,71,89,11,21,5,0,70,89,5,21,3,34,0,63,63,43,0,24,63,43,0,24,63,43,17,18,1,23,57,17,51,17,51,51,49,48,37,51,3,35,19,35,17,33,2,2,6,35,34,39,53,22,51,50,18,19,33,3,223,176,129,172,125,166,254,181,28,94,152,118,58,28,22,28,113,137,34,2,129,143,253,248,1,121,3,184,254,152,254,100,192,10,127,6,1,217,1,246,0,0,1,0,201,254,0,5,31,5,182,0,21,0,61,64,32,18,14,14,15,19,11,11,0,0,6,15,3,22,23,18,13,73,89,18,18,15,20,16,3,15,18,3,9,73,89,3,28,0,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,37,16,0,33,34,38,39,53,22,51,32,17,17,33,17,35,17,51,17,33,17,51,5,31,254,230,254,251,82,122,77,123,135,1,140,252,254,170,170,3,2,170,150,254,194,254,168,19,30,150,49,1,247,2,35,253,80,5,182,253,146,2,110,0,1,0,176,254,10,4,98,4,72,0,21,0,71,64,39,15,11,11,12,16,8,8,19,19,2,12,3,22,23,15,10,70,89,15,15,31,15,2,11,3,15,15,12,17,13,15,12,21,0,5,70,89,0,27,0,63,43,0,24,63,63,51,18,57,47,95,94,93,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,34,39,53,22,51,50,54,53,17,33,17,35,17,51,17,33,17,51,17,16,2,2,211,132,93,111,102,125,118,253,156,166,166,2,100,168,207,254,10,58,149,61,198,207,1,189,254,18,4,72,254,53,1,203,251,235,254,244,254,227,0,1,0,201,254,131,5,215,5,182,0,15,0,68,64,36,12,8,8,9,13,3,0,5,4,1,1,5,9,3,16,17,12,7,73,89,12,12,5,14,10,3,9,18,5,0,73,89,5,18,3,34,0,63,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,51,51,17,51,17,51,49,48,37,51,3,35,19,35,17,33,17,35,17,51,17,33,17,51,5,31,184,145,197,158,170,252,254,170,170,3,2,170,154,253,233,1,125,2,176,253,80,5,182,253,146,2,110,0,0,1,0,176,254,135,5,18,4,70,0,15,0,68,64,36,1,13,13,14,8,5,2,10,9,6,6,10,14,3,16,17,1,12,70,89,1,1,10,3,15,15,14,21,10,5,70,89,10,21,8,34,0,63,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,51,51,17,51,17,51,49,48,1,17,33,17,51,17,51,3,35,19,35,17,33,17,35,17,1,86,2,102,166,176,129,172,125,166,253,154,166,4,70,254,55,1,201,252,73,253,248,1,121,1,238,254,18,4,70,0,0,1,0,170,254,131,4,199,5,182,0,23,0,61,64,32,15,12,2,3,21,5,5,0,0,3,12,3,24,25,18,9,73,89,18,18,1,22,13,3,3,34,1,4,73,89,1,18,0,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,33,35,17,35,17,51,17,6,6,35,34,38,53,17,51,17,20,22,51,50,54,55,17,51,4,199,170,162,162,149,198,106,207,223,170,127,143,97,177,169,170,254,131,2,23,1,194,53,39,190,179,2,69,253,207,121,116,29,55,2,202,0,1,0,156,254,133,4,45,4,72,0,22,0,61,64,32,1,21,11,12,6,14,14,9,9,12,21,3,23,24,3,18,70,89,3,3,10,7,22,15,12,34,10,13,70,89,10,21,0,63,43,0,24,63,63,51,18,57,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,49,48,1,17,20,51,50,54,55,17,51,17,35,17,35,17,51,17,6,6,35,34,38,53,17,1,66,219,91,166,105,166,149,166,149,105,179,113,164,186,4,72,254,112,192,56,67,1,213,251,184,254,133,2,10,1,97,72,59,172,147,1,156,0,1,0,201,254,131,7,41,5,182,0,24,0,72,64,37,9,6,6,7,17,14,12,19,18,15,15,19,7,3,25,26,23,22,2,11,2,19,8,19,14,73,89,19,18,17,34,12,8,3,0,7,18,0,63,51,63,51,63,63,43,17,18,0,57,57,17,51,51,17,18,1,23,57,17,51,17,51,51,51,17,51,17,51,49,48,33,1,35,23,22,21,17,35,17,33,1,51,1,51,17,51,3,35,19,35,17,52,55,35,1,3,80,254,16,8,7,7,157,1,0,1,209,8,1,209,254,184,143,199,158,170,14,8,254,12,5,16,127,192,47,252,94,5,182,251,74,4,182,250,228,253,233,1,125,3,174,132,220,250,242,0,0,1,0,176,254,135,5,223,4,70,0,24,0,63,64,32,19,20,8,5,10,9,6,6,10,20,3,25,26,11,18,0,18,15,3,21,15,20,21,10,5,70,89,10,15,21,8,34,0,63,63,51,43,0,24,63,63,51,18,57,57,17,51,17,18,1,23,57,17,51,17,51,51,17,51,49,48,37,55,55,1,51,17,51,3,35,19,35,17,7,7,1,35,1,38,39,17,35,17,51,1,22,2,233,31,43,1,41,211,176,129,172,125,147,20,58,254,229,139,254,229,53,20,148,203,1,41,45,160,93,118,2,211,252,73,253,248,1,121,3,137,58,153,253,74,2,184,134,75,252,119,4,70,253,45,110,255,255,0,84,0,0,2,86,5,182,2,6,0,44,0,0,255,255,0,0,0,0,5,16,7,94,2,38,0,36,0,0,1,7,2,54,0,57,1,82,0,8,179,2,15,5,38,0,43,53,255,255,0,94,255,236,3,205,6,12,2,38,0,68,0,0,1,6,2,54,232,0,0,8,179,2,37,17,38,0,43,53,255,255,0,0,0,0,5,16,7,37,2,38,0,36,0,0,1,7,0,106,0,61,1,82,0,10,180,3,2,36,5,38,0,43,53,53,255,255,0,94,255,236,3,205,5,211,2,38,0,68,0,0,1,6,0,106,243,0,0,10,180,3,2,58,17,38,0,43,53,53,255,255,255,254,0,0,6,129,5,182,2,6,0,136,0,0,255,255,0,94,255,236,6,115,4,92,2,6,0,168,0,0,255,255,0,201,0,0,3,248,7,94,2,38,0,40,0,0,1,7,2,54,0,16,1,82,0,8,179,1,12,5,38,0,43,53,255,255,0,115,255,236,4,18,6,12,2,38,0,72,0,0,1,6,2,54,12,0,0,8,179,2,27,17,38,0,43,53,0,2,0,117,255,236,5,88,5,205,0,18,0,25,0,61,64,32,23,14,16,22,22,9,9,2,14,3,26,27,15,23,73,89,15,15,12,6,12,19,73,89,12,19,6,0,73,89,6,4,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,34,7,53,54,54,51,32,0,17,16,0,33,32,17,53,33,2,0,3,50,18,55,33,16,22,2,152,227,226,115,210,134,1,75,1,111,254,166,254,203,253,172,4,47,17,254,249,195,210,249,16,252,135,204,5,53,76,158,38,32,254,113,254,155,254,162,254,113,2,235,70,1,10,1,14,251,78,1,13,247,254,248,252,0,0,2,0,102,255,236,4,6,4,92,0,20,0,27,0,59,64,31,25,9,24,11,3,3,17,9,3,28,29,10,25,70,89,10,10,6,0,6,21,70,89,6,22,0,14,70,89,0,16,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,51,17,51,49,48,1,50,0,17,16,0,35,34,2,53,53,33,38,38,35,34,6,7,53,54,54,19,50,54,55,33,20,22,1,250,245,1,23,254,253,218,208,243,2,244,5,179,166,98,165,95,89,162,154,133,154,12,253,195,141,4,92,254,212,254,251,254,248,254,201,1,12,225,105,204,187,33,41,147,40,34,252,27,165,156,157,164,0,255,255,0,117,255,236,5,88,7,37,2,38,2,225,0,0,1,7,0,106,0,147,1,82,0,10,180,3,2,47,5,38,0,43,53,53,255,255,0,102,255,236,4,6,5,211,2,38,2,226,0,0,1,6,0,106,234,0,0,10,180,3,2,49,17,38,0,43,53,53,255,255,0,2,0,0,6,188,7,37,2,38,1,176,0,0,1,7,0,106,1,16,1,82,0,10,180,2,1,39,5,38,0,43,53,53,255,255,0,4,0,0,5,223,5,211,2,38,1,208,0,0,1,7,0,106,0,162,0,0,0,10,180,2,1,39,17,38,0,43,53,53,255,255,0,74,255,236,4,53,7,37,2,38,1,177,0,0,1,7,0,106,255,243,1,82,0,10,180,2,1,62,5,38,0,43,53,53,255,255,0,68,255,236,3,127,5,211,2,38,1,209,0,0,1,6,0,106,148,0,0,10,180,2,1,56,17,38,0,43,53,53,0,1,0,74,255,236,4,55,5,182,0,25,0,64,64,35,0,19,21,25,15,3,3,25,19,22,8,5,26,27,25,22,23,22,73,89,0,18,74,89,0,0,6,23,3,6,12,74,89,6,19,0,63,43,0,24,63,18,57,47,43,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,4,4,21,20,4,33,32,39,53,22,22,51,50,54,53,52,38,35,35,53,1,33,53,33,21,1,252,1,23,1,36,254,205,254,234,254,255,163,96,222,106,199,202,225,223,140,1,238,253,78,3,135,3,63,9,211,193,206,232,79,158,46,50,153,144,134,138,141,1,222,153,139,0,0,1,0,27,254,20,3,166,4,72,0,25,0,64,64,35,0,19,21,25,15,4,4,25,19,22,9,5,26,27,25,22,23,22,70,89,0,18,71,89,0,0,7,23,15,7,12,70,89,7,27,0,63,43,0,24,63,18,57,47,43,43,17,0,51,17,18,1,23,57,17,51,17,51,17,51,49,48,1,30,2,21,20,0,35,34,39,53,22,51,50,54,53,52,38,35,35,53,1,33,53,33,21,1,172,149,230,127,254,216,239,234,138,183,200,161,197,214,202,121,1,197,253,137,3,56,1,207,7,114,202,136,222,254,238,70,154,86,190,160,164,170,114,1,254,142,123,0,255,255,0,203,0,0,5,82,6,180,2,38,1,178,0,0,1,7,1,77,0,180,1,82,0,8,179,1,19,5,38,0,43,53,255,255,0,176,0,0,4,98,5,98,2,38,1,210,0,0,1,6,1,77,49,0,0,8,179,1,17,17,38,0,43,53,255,255,0,203,0,0,5,82,7,37,2,38,1,178,0,0,1,7,0,106,0,190,1,82,0,10,180,2,1,37,5,38,0,43,53,53,255,255,0,176,0,0,4,98,5,211,2,38,1,210,0,0,1,6,0,106,61,0,0,10,180,2,1,35,17,38,0,43,53,53,255,255,0,125,255,236,5,190,7,37,2,38,0,50,0,0,1,7,0,106,0,209,1,82,0,10,180,3,2,45,5,38,0,43,53,53,255,255,0,115,255,236,4,98,5,211,2,38,0,82,0,0,1,6,0,106,29,0,0,10,180,3,2,46,17,38,0,43,53,53,255,255,0,125,255,236,5,190,5,205,2,6,2,126,0,0,255,255,0,115,255,236,4,98,4,92,2,6,2,127,0,0,255,255,0,125,255,236,5,190,7,37,2,38,2,126,0,0,1,7,0,106,0,209,1,82,0,10,180,4,3,47,5,38,0,43,53,53,255,255,0,115,255,236,4,98,5,211,2,38,2,127,0,0,1,6,0,106,27,0,0,10,180,4,3,48,17,38,0,43,53,53,255,255,0,61,255,236,4,137,7,37,2,38,1,199,0,0,1,7,0,106,255,237,1,82,0,10,180,2,1,48,5,38,0,43,53,53,255,255,0,57,255,236,3,125,5,211,2,38,1,231,0,0,1,6,0,106,142,0,0,10,180,2,1,48,17,38,0,43,53,53,255,255,0,27,255,236,4,248,6,180,2,38,1,189,0,0,1,7,1,77,0,47,1,82,0,8,179,1,26,5,38,0,43,53,255,255,0,2,254,20,4,6,5,98,2,38,0,92,0,0,1,6,1,77,173,0,0,8,179,1,25,17,38,0,43,53,255,255,0,27,255,236,4,248,7,37,2,38,1,189,0,0,1,7,0,106,0,59,1,82,0,10,180,2,1,44,5,38,0,43,53,53,255,255,0,2,254,20,4,6,5,211,2,38,0,92,0,0,1,6,0,106,183,0,0,10,180,2,1,43,17,38,0,43,53,53,255,255,0,27,255,236,4,248,7,115,2,38,1,189,0,0,1,7,1,83,0,141,1,82,0,10,180,2,1,42,5,38,0,43,53,53,255,255,0,2,254,20,4,6,6,33,2,38,0,92,0,0,1,6,1,83,4,0,0,10,180,2,1,41,17,38,0,43,53,53,255,255,0,170,0,0,4,199,7,37,2,38,1,193,0,0,1,7,0,106,0,106,1,82,0,10,180,2,1,41,5,38,0,43,53,53,255,255,0,156,0,0,4,45,5,211,2,38,1,225,0,0,1,6,0,106,23,0,0,10,180,2,1,40,17,38,0,43,53,53,0,1,0,201,254,131,4,8,5,182,0,9,0,45,64,24,4,9,6,7,1,7,9,3,10,11,9,4,73,89,9,18,7,34,0,3,73,89,0,3,0,63,43,0,24,63,63,43,17,18,1,23,57,17,51,17,51,49,48,19,33,21,33,17,51,17,35,17,35,201,3,63,253,107,161,161,170,5,182,153,251,125,253,233,1,125,0,1,0,176,254,135,3,66,4,70,0,9,0,45,64,24,4,9,6,7,1,7,9,3,10,11,9,4,70,89,9,21,7,34,0,3,70,89,0,15,0,63,43,0,24,63,63,43,17,18,1,23,57,17,51,17,51,49,48,19,33,21,33,17,51,17,35,17,35,176,2,146,254,20,150,166,150,4,70,140,252,213,253,248,1,121,255,255,0,201,0,0,6,10,7,37,2,38,1,197,0,0,1,7,0,106,1,27,1,82,0,10,180,4,3,45,5,38,0,43,53,53,255,255,0,176,0,0,5,121,5,211,2,38,1,229,0,0,1,7,0,106,0,197,0,0,0,10,180,4,3,44,17,38,0,43,53,53,255,255,0,47,254,117,4,8,5,182,2,38,2,155,0,0,0,7,3,128,0,147,0,0,255,255,0,18,254,117,3,66,4,72,2,38,2,156,0,0,0,6,3,129,117,0,255,255,0,8,254,117,4,201,5,182,0,38,0,59,0,0,0,7,3,128,3,88,0,0,255,255,0,39,254,117,4,52,4,72,0,38,0,91,0,0,0,7,3,129,2,195,0,0,0,1,0,6,0,0,4,150,5,182,0,17,0,59,64,34,15,2,17,1,16,13,4,10,7,9,6,11,12,19,18,10,17,0,17,73,89,7,13,15,4,0,0,2,12,15,18,5,2,3,0,63,51,63,51,18,57,47,57,18,57,51,43,17,0,51,17,18,1,23,57,49,48,19,33,1,51,1,1,51,1,33,21,33,1,35,1,1,35,1,33,127,1,51,254,119,188,1,107,1,108,183,254,112,1,60,254,186,1,189,193,254,119,254,112,182,1,191,254,186,3,84,2,98,253,187,2,69,253,158,152,253,68,2,131,253,125,2,188,0,0,1,0,39,0,0,4,8,4,72,0,17,0,59,64,34,15,2,17,1,16,13,4,10,7,9,6,11,12,19,18,10,17,0,17,71,89,7,13,15,4,0,0,2,12,15,21,5,2,15,0,63,51,63,51,18,57,47,57,18,57,51,43,17,0,51,17,18,1,23,57,49,48,19,33,1,51,1,1,51,1,33,21,33,1,35,1,1,35,1,33,117,1,18,254,180,189,1,33,1,32,187,254,178,1,24,254,226,1,104,188,254,205,254,202,188,1,102,254,232,2,119,1,209,254,92,1,164,254,47,129,254,10,1,188,254,68,1,246,0,0,2,0,131,0,0,4,55,5,182,0,10,0,19,0,52,64,26,4,19,19,7,15,0,7,0,21,20,3,12,73,89,3,3,8,5,8,18,74,89,8,18,5,3,0,63,63,43,17,18,0,57,24,47,43,17,18,1,57,57,17,51,17,51,17,51,49,48,19,52,36,33,51,17,51,17,33,32,36,1,35,34,6,21,20,22,51,51,131,1,36,1,32,198,170,254,99,254,245,254,244,3,10,186,222,194,182,203,217,1,164,212,206,2,112,250,74,213,1,219,124,142,143,132,255,255,0,115,255,236,4,55,6,20,2,6,0,71,0,0,0,2,0,131,255,236,6,119,5,182,0,25,0,35,0,70,64,36,30,3,24,10,10,7,35,15,18,18,35,3,3,36,37,6,27,73,89,24,6,16,6,16,0,8,3,12,32,0,32,74,89,21,0,19,0,63,50,43,17,0,51,24,63,18,57,57,47,47,57,43,17,18,1,23,57,17,51,17,51,51,18,57,17,51,49,48,5,34,38,53,52,36,33,51,17,51,17,20,51,50,54,53,17,51,17,20,6,35,34,38,39,6,19,35,34,6,21,16,33,50,54,53,2,78,226,233,1,42,1,34,145,170,230,100,121,170,207,184,118,159,51,113,41,151,212,194,1,33,127,141,18,209,208,217,222,2,112,251,183,236,123,110,1,230,254,24,174,206,82,90,170,2,192,139,150,254,244,119,112,0,0,2,0,115,255,236,6,135,6,20,0,34,0,46,0,81,64,41,44,19,12,32,32,29,26,38,3,6,6,38,19,3,47,48,30,0,13,16,26,22,4,4,16,22,22,42,70,89,22,16,0,35,16,35,70,89,9,16,22,0,63,51,43,17,0,51,24,63,43,17,18,0,57,24,47,18,57,18,57,63,17,18,1,23,57,17,51,17,51,51,51,18,57,17,51,49,48,37,50,54,53,17,51,17,20,6,35,34,38,39,35,6,6,35,34,2,17,16,18,51,50,22,23,51,38,38,53,17,51,17,20,22,33,50,54,53,53,52,38,35,32,17,20,22,4,254,118,107,168,200,189,129,158,43,8,75,185,129,208,232,231,207,106,159,63,12,2,8,166,109,253,185,162,146,148,162,254,226,139,119,132,136,1,57,254,189,200,197,91,113,113,91,1,41,1,12,1,12,1,47,77,85,17,112,27,1,190,251,140,160,137,185,206,35,231,201,254,78,214,210,0,1,0,78,255,236,6,129,5,203,0,42,0,75,64,40,6,19,40,25,31,34,34,22,25,19,1,13,6,43,44,23,2,1,2,1,74,89,2,32,2,32,37,16,37,28,73,89,37,19,16,9,74,89,16,4,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,21,20,6,7,21,4,19,22,22,51,50,54,53,17,51,17,20,6,35,34,38,39,38,38,1,174,201,193,192,213,154,128,103,177,103,84,93,246,130,214,245,178,156,1,98,6,2,108,124,119,112,168,210,189,202,208,2,2,205,2,172,143,147,132,108,127,55,69,114,72,80,196,167,141,183,26,8,51,254,209,150,127,121,135,1,205,254,41,198,199,209,200,150,145,0,1,0,80,255,236,5,197,4,92,0,37,0,75,64,40,18,30,10,36,2,5,5,36,30,32,14,24,6,38,39,33,15,14,15,14,70,89,15,3,15,3,8,27,27,20,70,89,27,16,8,0,70,89,8,22,0,63,43,0,24,63,43,17,18,0,57,57,24,47,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,37,50,17,17,51,17,20,6,35,32,3,38,38,35,35,53,51,32,53,52,35,34,6,7,39,54,54,51,50,22,21,20,7,21,22,22,23,22,4,66,221,166,187,196,254,134,16,5,141,148,140,111,1,33,242,75,135,77,57,85,163,104,184,211,192,99,123,5,9,119,1,12,1,57,254,189,202,195,1,77,99,88,141,172,162,36,34,135,40,36,155,134,184,57,8,20,122,106,211,0,1,0,78,254,131,4,209,5,203,0,35,0,74,64,40,25,26,30,35,33,32,32,22,26,35,4,16,6,36,37,26,5,4,5,4,74,89,5,5,35,19,35,30,73,89,35,18,33,34,19,12,74,89,19,4,0,63,43,0,24,63,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,52,38,35,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,21,20,6,7,21,22,22,21,17,51,17,35,17,35,3,131,229,226,217,209,205,225,164,135,105,195,105,84,97,254,132,220,253,189,163,184,195,172,162,172,1,156,133,139,143,147,132,107,128,58,66,114,74,78,196,167,140,183,25,8,25,179,148,254,254,253,233,1,125,0,0,1,0,80,254,135,4,16,4,90,0,30,0,74,64,40,7,18,25,30,28,27,27,21,30,18,3,13,6,32,31,21,4,3,4,3,70,89,4,4,30,15,30,25,70,89,30,21,28,34,15,10,70,89,15,16,0,63,43,0,24,63,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,52,33,35,53,51,32,53,52,38,35,34,7,39,54,51,50,22,21,20,7,21,22,22,21,21,51,17,35,17,35,2,213,254,203,150,117,1,57,133,119,153,150,61,161,203,191,213,203,126,112,157,166,149,1,45,199,141,172,82,80,70,135,74,154,135,182,57,11,37,137,102,156,253,248,1,121,0,0,1,0,0,255,233,7,33,5,182,0,35,0,58,64,29,20,35,26,29,29,35,9,3,36,37,27,27,7,18,18,1,73,89,18,3,23,12,7,12,74,89,32,7,19,0,63,51,43,17,0,51,24,63,43,17,18,0,57,24,47,17,18,1,23,57,17,51,17,51,49,48,1,33,7,2,2,6,6,35,34,39,53,22,51,50,54,54,18,18,19,33,17,20,22,51,50,54,53,17,51,17,20,6,35,34,38,53,4,12,254,72,31,43,76,83,130,100,69,64,50,63,49,64,44,56,74,55,2,239,111,115,112,113,168,205,188,196,200,5,31,240,254,174,254,68,210,102,25,143,26,62,104,1,2,1,233,1,174,251,207,137,121,121,135,1,205,254,41,193,204,204,197,0,0,1,0,16,255,236,6,41,4,70,0,29,0,58,64,29,0,14,5,8,8,14,22,3,31,30,6,6,20,28,28,16,70,89,28,15,3,25,20,25,71,89,11,20,22,0,63,51,43,17,0,51,24,63,43,17,18,0,57,24,47,17,18,1,23,57,17,51,17,51,49,48,1,20,22,51,50,17,17,51,17,20,6,35,34,38,53,17,33,2,2,6,35,34,39,53,22,51,50,18,19,33,3,207,104,119,213,166,187,190,188,203,254,197,28,94,152,118,58,28,22,28,113,137,34,2,113,1,131,137,131,1,10,1,59,254,189,202,195,196,203,2,61,254,152,254,100,192,10,127,6,1,217,1,246,0,0,1,0,201,255,236,7,94,5,182,0,25,0,67,64,35,23,0,15,6,9,22,18,18,19,9,15,19,3,26,27,22,17,73,89,22,7,22,7,19,24,20,3,19,18,12,3,73,89,12,19,0,63,43,0,24,63,63,51,18,57,57,47,47,43,17,18,1,23,57,17,51,17,51,17,51,17,51,51,49,48,1,20,22,51,50,54,53,17,51,17,20,6,35,34,38,53,17,33,17,35,17,51,17,33,17,51,4,246,110,115,112,113,166,200,191,195,200,253,39,170,170,2,217,170,1,133,137,121,121,135,1,205,254,41,191,206,203,198,1,51,253,80,5,182,253,146,2,110,0,0,1,0,176,255,236,6,168,4,72,0,24,0,77,64,42,5,2,19,10,13,1,22,22,23,13,19,23,3,25,26,1,21,70,89,15,1,31,1,2,11,3,1,11,1,11,23,3,24,15,23,21,16,8,70,89,16,22,0,63,43,0,24,63,63,51,18,57,57,47,47,95,94,93,43,17,18,1,23,57,17,51,17,51,17,51,17,51,51,49,48,1,17,33,17,51,17,20,22,51,50,17,17,51,17,20,6,35,34,38,53,53,33,17,35,17,1,86,2,80,166,106,119,213,166,187,192,186,205,253,176,166,4,72,254,53,1,203,253,61,137,133,1,12,1,57,254,189,202,195,198,201,115,254,18,4,72,0,0,1,0,125,255,236,5,154,5,203,0,28,0,58,64,31,22,8,27,2,2,15,28,8,4,29,30,0,28,73,89,0,0,5,12,12,19,73,89,12,4,5,25,73,89,5,19,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,33,21,16,0,33,32,0,17,52,18,36,51,50,22,23,7,38,38,35,32,0,17,16,0,51,32,17,33,3,102,2,52,254,204,254,201,254,187,254,147,179,1,85,234,120,237,83,66,90,214,87,254,245,254,222,1,11,247,1,180,254,127,2,240,86,254,161,254,177,1,145,1,96,229,1,84,181,49,39,148,38,46,254,197,254,227,254,227,254,195,1,215,0,0,1,0,115,255,236,4,176,4,92,0,25,0,58,64,31,18,7,24,2,2,12,25,7,4,26,27,0,25,70,89,0,0,4,10,10,15,70,89,10,16,4,21,70,89,4,22,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,33,21,16,33,32,0,17,16,0,33,50,23,7,38,35,34,6,21,20,22,51,50,54,53,33,2,178,1,254,253,254,254,238,254,215,1,67,1,33,212,175,59,168,166,205,229,204,197,169,175,254,170,2,63,67,253,240,1,39,1,16,1,14,1,43,80,131,74,222,210,207,223,160,157,0,0,1,0,16,255,236,4,244,5,182,0,20,0,57,64,29,5,19,10,13,13,3,19,0,4,21,22,11,11,16,1,16,8,73,89,16,19,4,0,1,0,73,89,1,3,0,63,43,17,0,51,24,63,43,17,18,0,57,24,47,17,18,1,23,57,17,51,17,51,49,48,19,53,33,21,33,17,20,22,51,50,17,17,51,17,20,6,35,34,38,53,17,16,4,60,254,47,119,114,232,168,211,189,198,205,5,29,153,153,252,104,137,123,1,0,1,207,254,41,192,205,206,195,3,160,0,0,1,0,41,255,236,4,135,4,70,0,20,0,54,64,28,2,16,7,10,10,0,16,18,4,21,22,1,18,19,18,70,89,8,8,13,19,15,13,5,70,89,13,22,0,63,43,0,24,63,18,57,47,43,17,0,51,17,18,1,23,57,17,51,17,51,49,48,1,33,17,20,22,51,50,17,17,51,17,20,6,35,34,38,53,17,33,53,33,3,129,254,166,109,118,215,166,189,192,192,201,254,168,3,88,3,186,253,201,137,131,1,4,1,65,254,189,202,195,203,196,2,63,140,0,1,0,111,255,236,4,88,5,203,0,38,0,71,64,38,21,32,12,0,36,35,5,27,17,35,0,32,6,39,40,35,15,18,15,18,74,89,15,15,29,3,29,24,74,89,29,19,3,9,74,89,3,4,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,19,52,36,51,32,23,7,38,38,35,34,6,21,20,22,51,51,21,35,34,6,21,20,22,51,50,55,21,6,33,32,36,53,52,54,55,53,38,38,156,1,8,225,1,2,209,94,105,181,101,140,159,209,200,217,213,222,232,202,183,233,199,175,254,251,254,244,254,219,207,188,170,180,4,92,169,198,144,120,68,52,123,114,128,147,141,142,138,142,141,92,158,77,220,197,151,192,22,8,25,178,255,255,0,90,255,236,3,135,4,92,2,6,1,130,0,0,255,255,0,0,254,117,5,107,5,182,0,38,1,181,0,0,0,7,3,128,3,250,0,0,255,255,0,16,254,117,4,115,4,72,2,38,1,213,0,0,0,7,3,129,3,2,0,0,255,255,0,0,254,160,5,16,5,188,2,38,0,36,0,0,0,7,2,103,4,233,0,0,255,255,0,94,254,160,3,205,4,90,2,38,0,68,0,0,0,7,2,103,4,121,0,0,255,255,0,0,0,0,5,16,7,225,2,38,0,36,0,0,1,7,2,102,4,252,1,82,0,8,179,2,19,5,38,0,43,53,255,255,0,94,255,236,3,205,6,143,2,38,0,68,0,0,1,7,2,102,4,166,0,0,0,8,179,2,41,17,38,0,43,53,255,255,0,0,0,0,5,16,7,209,2,38,0,36,0,0,1,7,3,119,4,229,1,82,0,10,180,3,2,21,5,38,0,43,53,53,255,255,0,94,255,236,4,65,6,127,2,38,0,68,0,0,1,7,3,119,4,147,0,0,0,10,180,3,2,43,17,38,0,43,53,53,255,255,0,0,0,0,5,16,7,209,2,38,0,36,0,0,1,7,3,120,4,221,1,82,0,10,180,3,2,21,5,38,0,43,53,53,255,255,0,45,255,236,3,205,6,127,2,38,0,68,0,0,1,7,3,120,4,147,0,0,0,10,180,3,2,43,17,38,0,43,53,53,255,255,0,0,0,0,5,16,8,74,2,38,0,36,0,0,1,7,3,121,4,217,1,82,0,10,180,3,2,21,5,38,0,43,53,53,255,255,0,94,255,236,4,23,6,248,2,38,0,68,0,0,1,7,3,121,4,156,0,0,0,10,180,3,2,43,17,38,0,43,53,53,255,255,0,0,0,0,5,16,8,98,2,38,0,36,0,0,1,7,3,122,4,229,1,82,0,10,180,3,2,45,5,38,0,43,53,53,255,255,0,94,255,236,3,205,7,16,2,38,0,68,0,0,1,7,3,122,4,145,0,0,0,10,180,3,2,67,17,38,0,43,53,53,255,255,0,0,254,160,5,16,7,115,2,38,0,36,0,0,0,39,2,103,4,233,0,0,1,7,1,75,0,43,1,82,0,8,179,3,41,5,38,0,43,53,255,255,0,94,254,160,3,205,6,33,2,38,0,68,0,0,0,39,2,103,4,121,0,0,1,6,1,75,212,0,0,8,179,3,62,17,38,0,43,53,255,255,0,0,0,0,5,16,8,19,2,38,0,36,0,0,1,7,3,123,4,236,1,82,0,10,180,3,2,23,5,38,0,43,53,53,255,255,0,94,255,236,3,205,6,193,2,38,0,68,0,0,1,7,3,123,4,154,0,0,0,10,180,3,2,45,17,38,0,43,53,53,255,255,0,0,0,0,5,16,8,19,2,38,0,36,0,0,1,7,3,124,4,233,1,82,0,10,180,3,2,23,5,38,0,43,53,53,255,255,0,94,255,236,3,205,6,193,2,38,0,68,0,0,1,7,3,124,4,152,0,0,0,10,180,3,2,45,17,38,0,43,53,53,255,255,0,0,0,0,5,16,8,88,2,38,0,36,0,0,1,7,3,125,4,233,1,82,0,10,180,3,2,33,5,38,0,43,53,53,255,255,0,94,255,236,3,205,7,6,2,38,0,68,0,0,1,7,3,125,4,160,0,0,0,10,180,3,2,55,17,38,0,43,53,53,255,255,0,0,0,0,5,16,8,94,2,38,0,36,0,0,1,7,3,126,4,227,1,82,0,10,180,3,2,39,5,38,0,43,53,53,255,255,0,94,255,236,3,205,7,12,2,38,0,68,0,0,1,7,3,126,4,152,0,0,0,10,180,3,2,61,17,38,0,43,53,53,255,255,0,0,254,160,5,16,7,73,2,38,0,36,0,0,0,39,1,78,0,45,1,100,1,7,2,103,4,233,0,0,0,8,179,2,15,5,38,0,43,53,255,255,0,94,254,160,3,205,5,229,2,38,0,68,0,0,0,38,1,78,216,0,1,7,2,103,4,121,0,0,0,8,179,2,37,17,38,0,43,53,255,255,0,201,254,160,3,248,5,182,2,38,0,40,0,0,0,7,2,103,4,193,0,0,255,255,0,115,254,160,4,18,4,92,2,38,0,72,0,0,0,7,2,103,4,184,0,0,255,255,0,201,0,0,3,248,7,225,2,38,0,40,0,0,1,7,2,102,4,209,1,82,0,8,179,1,16,5,38,0,43,53,255,255,0,115,255,236,4,18,6,143,2,38,0,72,0,0,1,7,2,102,4,201,0,0,0,8,179,2,31,17,38,0,43,53,255,255,0,201,0,0,3,248,7,47,2,38,0,40,0,0,1,7,1,82,255,228,1,82,0,8,179,1,21,5,38,0,43,53,255,255,0,115,255,236,4,18,5,221,2,38,0,72,0,0,1,6,1,82,208,0,0,8,179,2,36,17,38,0,43,53,255,255,0,201,0,0,4,111,7,209,2,38,0,40,0,0,1,7,3,119,4,193,1,82,0,10,180,2,1,18,5,38,0,43,53,53,255,255,0,115,255,236,4,92,6,127,2,38,0,72,0,0,1,7,3,119,4,174,0,0,0,10,180,3,2,33,17,38,0,43,53,53,255,255,0,93,0,0,3,248,7,209,2,38,0,40,0,0,1,7,3,120,4,195,1,82,0,10,180,2,1,18,5,38,0,43,53,53,255,255,0,74,255,236,4,18,6,127,2,38,0,72,0,0,1,7,3,120,4,176,0,0,0,10,180,3,2,33,17,38,0,43,53,53,255,255,0,201,0,0,4,57,8,74,2,38,0,40,0,0,1,7,3,121,4,190,1,82,0,10,180,2,1,18,5,38,0,43,53,53,255,255,0,115,255,236,4,29,6,248,2,38,0,72,0,0,1,7,3,121,4,162,0,0,0,10,180,3,2,33,17,38,0,43,53,53,255,255,0,201,0,0,3,248,8,98,2,38,0,40,0,0,1,7,3,122,4,184,1,82,0,10,180,2,1,42,5,38,0,43,53,53,255,255,0,115,255,236,4,18,7,16,2,38,0,72,0,0,1,7,3,122,4,162,0,0,0,10,180,3,2,57,17,38,0,43,53,53,255,255,0,201,254,160,3,248,7,115,2,38,0,40,0,0,0,39,2,103,4,190,0,0,1,7,1,75,0,2,1,82,0,8,179,2,37,5,38,0,43,53,255,255,0,115,254,160,4,18,6,33,2,38,0,72,0,0,0,39,2,103,4,176,0,0,1,6,1,75,241,0,0,8,179,3,52,17,38,0,43,53,255,255,0,84,0,0,2,86,7,225,2,38,0,44,0,0,1,7,2,102,3,201,1,82,0,8,179,1,16,5,38,0,43,53,255,255,0,123,0,0,1,230,6,143,2,38,0,243,0,0,1,7,2,102,3,115,0,0,0,8,179,1,8,17,38,0,43,53,255,255,0,84,254,160,2,86,5,182,2,38,0,44,0,0,0,7,2,103,3,180,0,0,255,255,0,157,254,160,1,102,5,223,2,38,0,76,0,0,0,7,2,103,3,98,0,0,255,255,0,125,254,160,5,190,5,205,2,38,0,50,0,0,0,7,2,103,5,127,0,0,255,255,0,115,254,160,4,98,4,92,2,38,0,82,0,0,0,7,2,103,4,201,0,0,255,255,0,125,255,236,5,190,7,225,2,38,0,50,0,0,1,7,2,102,5,143,1,82,0,8,179,2,28,5,38,0,43,53,255,255,0,115,255,236,4,98,6,143,2,38,0,82,0,0,1,7,2,102,4,217,0,0,0,8,179,2,29,17,38,0,43,53,255,255,0,125,255,236,5,190,7,209,2,38,0,50,0,0,1,7,3,119,5,125,1,82,0,10,180,3,2,30,5,38,0,43,53,53,255,255,0,115,255,236,4,117,6,127,2,38,0,82,0,0,1,7,3,119,4,199,0,0,0,10,180,3,2,31,17,38,0,43,53,53,255,255,0,125,255,236,5,190,7,209,2,38,0,50,0,0,1,7,3,120,5,125,1,82,0,10,180,3,2,30,5,38,0,43,53,53,255,255,0,97,255,236,4,98,6,127,2,38,0,82,0,0,1,7,3,120,4,199,0,0,0,10,180,3,2,31,17,38,0,43,53,53,255,255,0,125,255,236,5,190,8,74,2,38,0,50,0,0,1,7,3,121,5,123,1,82,0,10,180,3,2,30,5,38,0,43,53,53,255,255,0,115,255,236,4,98,6,248,2,38,0,82,0,0,1,7,3,121,4,199,0,0,0,10,180,3,2,31,17,38,0,43,53,53,255,255,0,125,255,236,5,190,8,98,2,38,0,50,0,0,1,7,3,122,5,121,1,82,0,10,180,3,2,54,5,38,0,43,53,53,255,255,0,115,255,236,4,98,7,16,2,38,0,82,0,0,1,7,3,122,4,197,0,0,0,10,180,3,2,55,17,38,0,43,53,53,255,255,0,125,254,160,5,190,7,115,2,38,0,50,0,0,0,39,2,103,5,127,0,0,1,7,1,75,0,193,1,82,0,8,179,3,49,5,38,0,43,53,255,255,0,115,254,160,4,98,6,33,2,38,0,82,0,0,0,39,2,103,4,205,0,0,1,6,1,75,14,0,0,8,179,3,50,17,38,0,43,53,255,255,0,125,255,236,6,100,7,115,2,38,2,95,0,0,1,7,0,118,1,43,1,82,0,8,179,2,43,5,38,0,43,53,255,255,0,115,255,236,5,25,6,33,2,38,2,96,0,0,1,6,0,118,109,0,0,8,179,2,43,17,38,0,43,53,255,255,0,125,255,236,6,100,7,115,2,38,2,95,0,0,1,7,0,67,0,135,1,82,0,8,179,2,35,5,38,0,43,53,255,255,0,115,255,236,5,25,6,33,2,38,2,96,0,0,1,6,0,67,212,0,0,8,179,2,36,17,38,0,43,53,255,255,0,125,255,236,6,100,7,225,2,38,2,95,0,0,1,7,2,102,5,143,1,82,0,8,179,2,38,5,38,0,43,53,255,255,0,115,255,236,5,25,6,143,2,38,2,96,0,0,1,7,2,102,4,217,0,0,0,8,179,2,39,17,38,0,43,53,255,255,0,125,255,236,6,100,7,47,2,38,2,95,0,0,1,7,1,82,0,160,1,82,0,8,179,2,43,5,38,0,43,53,255,255,0,115,255,236,5,25,5,221,2,38,2,96,0,0,1,6,1,82,245,0,0,8,179,2,35,17,38,0,43,53,255,255,0,125,254,160,6,100,6,20,2,38,2,95,0,0,0,7,2,103,5,123,0,0,255,255,0,115,254,160,5,25,4,240,2,38,2,96,0,0,0,7,2,103,4,201,0,0,255,255,0,186,254,160,5,25,5,182,2,38,0,56,0,0,0,7,2,103,5,74,0,0,255,255,0,164,254,160,4,57,4,72,2,38,0,88,0,0,0,7,2,103,4,184,0,0,255,255,0,186,255,236,5,25,7,225,2,38,0,56,0,0,1,7,2,102,5,84,1,82,0,8,179,1,22,5,38,0,43,53,255,255,0,164,255,236,4,57,6,143,2,38,0,88,0,0,1,7,2,102,4,213,0,0,0,8,179,1,25,17,38,0,43,53,255,255,0,186,255,236,6,123,7,115,2,38,2,97,0,0,1,7,0,118,0,238,1,82,0,8,179,1,37,5,38,0,43,53,255,255,0,164,255,236,5,150,6,33,2,38,2,98,0,0,1,6,0,118,121,0,0,8,179,1,38,17,38,0,43,53,255,255,0,186,255,236,6,123,7,115,2,38,2,97,0,0,1,7,0,67,0,90,1,82,0,8,179,1,29,5,38,0,43,53,255,255,0,164,255,236,5,150,6,33,2,38,2,98,0,0,1,6,0,67,187,0,0,8,179,1,31,17,38,0,43,53,255,255,0,186,255,236,6,123,7,225,2,38,2,97,0,0,1,7,2,102,5,96,1,82,0,8,179,1,32,5,38,0,43,53,255,255,0,164,255,236,5,150,6,143,2,38,2,98,0,0,1,7,2,102,4,219,0,0,0,8,179,1,34,17,38,0,43,53,255,255,0,186,255,236,6,123,7,47,2,38,2,97,0,0,1,7,1,82,0,127,1,82,0,8,179,1,37,5,38,0,43,53,255,255,0,164,255,236,5,150,5,221,2,38,2,98,0,0,1,6,1,82,255,0,0,8,179,1,30,17,38,0,43,53,255,255,0,186,254,160,6,123,6,20,2,38,2,97,0,0,0,7,2,103,5,76,0,0,255,255,0,164,254,160,5,150,4,242,2,38,2,98,0,0,0,7,2,103,4,178,0,0,255,255,0,0,254,160,4,123,5,182,2,38,0,60,0,0,0,7,2,103,4,156,0,0,255,255,0,2,254,20,4,6,4,72,2,38,0,92,0,0,0,7,2,103,5,158,255,253,255,255,0,0,0,0,4,123,7,225,2,38,0,60,0,0,1,7,2,102,4,170,1,82,0,8,179,1,13,5,38,0,43,53,255,255,0,2,254,20,4,6,6,143,2,38,0,92,0,0,1,7,2,102,4,106,0,0,0,8,179,1,26,17,38,0,43,53,255,255,0,0,0,0,4,123,7,47,2,38,0,60,0,0,1,7,1,82,255,194,1,82,0,8,179,1,18,5,38,0,43,53,255,255,0,2,254,20,4,6,5,221,2,38,0,92,0,0,1,6,1,82,138,0,0,8,179,1,31,17,38,0,43,53,255,255,0,115,254,197,4,211,6,20,2,38,0,211,0,0,0,7,0,66,0,180,0,0,0,2,251,229,4,217,254,180,6,33,0,9,0,19,0,30,64,12,4,10,14,14,0,0,21,15,6,128,11,1,0,47,51,26,205,50,17,1,51,17,51,18,57,57,49,48,1,35,38,38,39,53,51,22,22,23,5,35,38,38,39,53,51,22,22,23,254,180,96,52,177,37,186,28,99,49,254,156,96,56,174,37,187,28,99,49,4,217,42,202,63,21,61,174,68,25,44,200,63,21,61,174,68,0,0,2,252,113,4,217,255,174,6,127,0,13,0,21,0,40,64,17,21,0,6,17,17,23,3,6,10,21,10,21,10,17,192,6,1,0,47,51,26,204,57,57,47,47,17,18,57,17,1,51,17,51,57,57,49,48,1,35,38,39,6,7,35,53,55,54,55,51,22,23,39,54,55,51,21,6,7,35,254,211,94,112,99,114,97,94,53,112,52,176,66,151,80,73,54,172,83,120,96,4,217,75,91,101,65,25,60,123,77,94,166,194,91,112,21,110,96,0,0,2,251,154,4,217,254,215,6,127,0,13,0,21,0,42,64,18,6,14,17,17,0,0,23,3,6,10,15,10,15,10,19,192,6,1,0,47,51,26,204,57,57,47,47,17,18,57,17,1,51,17,51,18,57,57,49,48,1,35,38,39,6,7,35,53,55,54,55,51,22,23,37,35,38,39,53,51,22,23,254,215,94,97,114,106,105,94,53,112,52,176,66,151,253,238,95,120,84,172,52,75,4,217,65,101,96,70,23,60,123,77,94,166,172,94,112,21,108,97,0,2,252,113,4,217,255,123,6,248,0,13,0,31,0,52,64,24,16,19,0,19,27,3,6,6,22,14,14,33,3,10,6,18,10,18,10,25,30,192,6,1,0,47,51,26,204,50,57,57,47,47,17,18,57,17,1,51,17,51,51,18,23,57,17,51,49,48,1,35,38,39,6,7,35,53,55,54,55,51,22,23,19,20,7,7,35,39,54,54,53,52,38,35,34,7,53,54,51,50,254,211,94,112,99,114,97,94,53,112,52,176,66,151,168,127,6,80,10,57,63,57,43,46,26,25,55,195,4,217,75,91,101,65,25,60,123,77,94,166,1,123,103,29,81,131,9,32,38,37,25,6,80,6,0,2,252,104,4,217,254,231,7,16,0,23,0,37,0,58,64,27,24,30,9,9,21,21,39,27,30,34,30,25,17,9,0,5,12,34,0,12,12,0,34,3,21,192,25,0,47,26,204,23,57,47,47,47,17,51,16,196,51,17,51,17,18,57,17,1,51,17,51,18,57,57,49,48,1,34,46,2,35,34,6,7,35,54,54,51,50,30,2,51,50,54,55,51,6,6,19,35,38,39,6,7,35,53,55,54,55,51,22,23,254,45,37,71,67,63,28,40,42,14,91,13,101,75,37,73,67,62,27,40,42,12,90,11,99,94,94,97,114,106,105,94,53,112,52,176,66,151,6,53,30,37,30,49,50,106,113,30,36,30,49,49,104,115,254,164,65,101,96,70,23,60,123,77,94,166,0,2,252,121,4,217,254,199,6,193,0,7,0,20,0,36,64,15,7,4,10,10,18,18,22,3,64,7,17,10,128,14,8,0,47,51,26,221,50,212,26,205,17,1,51,17,51,18,57,57,49,48,1,54,55,51,21,6,7,35,19,32,3,51,22,22,51,50,54,55,51,6,6,253,94,80,49,172,86,119,96,62,254,236,15,102,9,76,106,98,86,8,105,11,149,5,244,104,101,21,114,93,254,252,1,4,72,57,65,64,120,140,0,2,252,121,4,217,254,199,6,193,0,7,0,20,0,36,64,15,7,4,10,10,18,18,22,4,64,1,17,10,128,14,8,0,47,51,26,221,50,212,26,205,17,1,51,17,51,18,57,57,49,48,1,35,38,39,53,51,22,23,3,32,3,51,22,22,51,50,54,55,51,6,6,253,209,94,119,86,172,52,75,53,254,236,15,102,9,76,106,98,86,8,105,11,149,5,221,93,114,21,108,97,254,229,1,4,72,57,65,64,120,140,0,2,252,121,4,217,254,199,7,6,0,17,0,30,0,46,64,21,8,0,0,5,13,3,20,20,28,28,32,11,16,4,4,24,24,27,20,128,18,0,47,26,205,50,51,17,57,47,196,50,17,1,51,17,51,18,23,57,17,51,49,48,1,20,7,7,35,39,54,54,53,52,38,35,34,7,53,54,51,50,3,32,3,51,22,22,51,50,54,55,51,6,6,254,49,127,6,82,10,57,66,57,44,37,36,22,62,192,149,254,236,15,102,9,76,106,98,86,8,105,11,149,6,121,100,29,41,90,9,32,37,37,26,6,78,8,253,211,1,4,72,57,65,64,120,140,0,2,252,104,4,217,254,231,7,12,0,23,0,36,0,48,64,21,26,34,9,9,21,38,5,12,12,30,30,24,21,64,17,9,0,33,26,128,24,0,47,26,221,50,214,196,51,26,205,17,51,17,57,47,51,17,1,51,50,17,57,57,49,48,1,34,46,2,35,34,6,7,35,54,54,51,50,30,2,51,50,54,55,51,6,6,3,32,3,51,22,22,51,50,54,55,51,6,6,254,45,37,71,67,63,28,40,42,14,91,13,100,76,37,73,67,62,27,40,42,12,90,11,99,221,254,236,15,102,9,76,106,98,86,8,105,11,149,6,51,30,36,30,48,50,104,113,30,36,30,49,49,103,114,254,166,1,4,72,57,65,64,120,140,0,1,0,49,254,66,1,109,0,0,0,15,0,26,64,11,0,5,5,2,10,3,16,17,13,8,3,0,47,204,50,17,18,1,23,57,17,51,49,48,23,52,39,51,22,21,20,6,35,34,39,53,22,51,50,54,223,139,123,158,102,99,65,50,32,54,37,51,238,103,135,120,132,91,103,16,108,10,48,0,0,1,0,25,254,117,1,113,0,154,0,11,0,24,64,9,10,0,6,0,12,13,8,3,0,0,47,204,50,17,18,1,57,57,17,51,49,48,37,17,16,35,34,39,53,22,51,50,53,17,1,113,228,56,60,41,61,94,154,254,223,254,252,24,140,19,100,1,48,0,0,1,0,25,254,117,1,113,0,143,0,11,0,24,64,9,10,0,6,0,12,13,8,3,0,0,47,204,50,17,18,1,57,57,17,51,49,48,37,17,16,35,34,39,53,22,51,50,53,17,1,113,228,56,60,41,61,94,143,254,234,254,252,24,140,19,100,1,37,0,255,255,0,52,0,0,2,67,5,182,0,7,0,20,255,120,0,0,0,2,0,115,255,236,4,23,4,115,0,11,0,23,0,40,64,20,12,6,18,0,6,0,24,25,9,21,75,89,9,38,3,15,77,89,3,25,0,63,43,0,24,63,43,17,18,1,57,57,17,51,17,51,49,48,1,16,2,35,34,2,17,16,18,51,50,18,1,20,22,51,50,54,53,52,38,35,34,6,4,23,247,222,217,246,249,218,216,249,253,4,155,142,141,158,158,143,141,154,2,47,254,245,254,200,1,53,1,14,1,15,1,53,254,203,254,241,208,232,234,206,204,236,233,0,0,1,0,45,0,0,2,55,4,94,0,10,0,38,64,17,9,1,1,0,8,0,11,12,7,4,7,4,1,9,16,1,24,0,63,63,18,57,57,47,47,17,18,1,57,57,17,51,17,51,49,48,33,35,17,52,55,6,7,7,39,1,51,2,55,161,8,67,62,150,90,1,127,139,2,49,239,140,67,48,112,114,1,35,0,1,0,41,0,0,3,215,4,115,0,25,0,44,64,24,7,19,0,19,23,14,1,5,26,27,16,10,75,89,16,38,24,23,1,23,76,89,1,24,0,63,43,17,0,51,24,63,43,17,18,1,23,57,17,51,49,48,33,33,53,1,62,2,53,52,38,35,34,6,7,39,54,51,50,22,21,20,6,7,5,23,33,3,215,252,82,1,145,157,113,44,139,119,88,156,92,90,192,242,198,218,130,186,254,185,2,2,190,133,1,47,119,104,83,65,87,103,61,74,109,168,168,150,115,187,128,231,6,0,0,1,0,94,254,149,4,27,4,116,0,39,0,71,64,38,3,4,27,0,19,7,7,0,4,22,34,13,6,40,41,4,23,22,23,22,75,89,23,23,10,37,37,30,75,89,37,38,10,17,75,89,10,37,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,0,57,17,18,1,23,57,17,51,17,51,17,51,49,48,1,20,6,7,21,22,22,21,20,4,33,34,38,39,53,22,22,51,32,17,16,33,35,53,51,50,54,53,52,38,35,34,6,7,39,54,54,51,50,22,3,238,157,144,176,170,254,222,254,245,116,193,91,95,215,96,1,123,254,94,144,146,171,200,147,126,96,170,109,84,90,235,130,213,236,3,7,140,178,30,8,22,180,146,209,225,35,44,158,47,49,1,41,1,10,143,151,134,107,122,52,70,112,71,81,195,0,0,2,0,23,254,168,4,102,4,94,0,10,0,18,0,66,64,33,18,5,9,2,2,11,7,3,0,3,5,3,19,20,1,5,18,5,77,89,9,18,14,15,15,7,18,18,3,7,16,3,36,0,63,63,18,57,47,18,57,17,51,17,51,43,17,0,51,17,18,1,23,57,17,51,51,51,17,51,17,51,49,48,37,35,17,35,17,33,53,1,51,17,51,33,17,52,55,35,6,7,1,4,102,217,168,253,50,2,190,184,217,254,134,12,10,41,68,254,57,27,254,141,1,115,125,3,198,252,68,1,92,218,222,86,92,253,158,0,0,1,0,133,254,149,4,29,4,95,0,26,0,58,64,31,15,3,25,20,8,20,23,3,4,28,27,0,17,75,89,0,0,6,21,21,24,76,89,21,16,6,12,75,89,6,37,0,63,43,0,24,63,43,17,18,0,57,24,47,43,17,18,1,23,57,17,51,17,51,49,48,1,50,4,21,20,0,35,34,39,53,22,22,51,50,54,53,16,33,34,7,39,19,33,21,33,3,54,2,45,231,1,9,254,223,254,247,130,70,208,101,176,195,254,137,94,160,86,55,2,215,253,183,37,115,2,38,229,199,227,254,254,79,160,45,51,166,157,1,50,29,55,2,172,153,254,73,23,0,255,255,0,117,255,236,4,47,5,203,2,6,0,25,0,0,0,1,0,94,254,169,4,43,4,95,0,6,0,31,64,16,1,5,5,0,2,3,7,8,3,2,76,89,3,16,0,36,0,63,63,43,17,18,1,23,57,17,51,49,48,1,1,33,53,33,21,1,1,29,2,94,252,227,3,205,253,170,254,169,5,29,153,133,250,207,255,255,0,104,255,236,4,41,5,203,2,6,0,27,0,0,0,2,0,106,254,149,4,37,4,116,0,23,0,37,0,65,64,34,27,17,34,10,10,0,0,4,17,3,38,39,14,30,77,89,10,20,14,14,2,20,20,24,75,89,20,38,2,7,77,89,2,37,0,63,43,0,24,63,43,17,18,0,57,24,47,18,57,43,17,18,1,23,57,17,51,17,51,17,51,49,48,1,16,33,34,39,53,22,51,50,18,19,35,6,6,35,34,38,53,52,18,51,50,22,18,1,34,6,21,20,22,51,50,54,54,53,52,38,38,4,37,253,104,116,68,80,102,240,245,11,12,55,182,114,194,228,255,208,149,223,120,254,20,143,156,144,147,91,153,88,82,147,1,239,252,166,20,143,26,1,41,1,51,83,87,232,208,228,1,8,153,254,219,1,48,184,164,144,165,74,128,70,105,178,102,0,255,255,0,29,0,0,5,196,6,31,0,39,0,73,2,182,0,0,0,6,0,73,0,0,0,2,0,92,2,221,5,170,5,193,0,34,0,51,0,90,64,46,44,48,48,46,42,38,38,40,10,0,28,17,5,17,22,0,40,46,6,53,52,43,49,36,3,45,47,45,41,47,35,35,40,28,10,20,8,3,3,40,41,25,20,20,41,3,0,63,51,47,51,16,205,50,47,51,18,57,57,17,51,17,51,17,51,17,18,23,57,17,18,1,23,57,17,51,17,51,17,51,17,51,17,51,17,51,49,48,1,20,6,35,34,39,53,22,51,50,53,52,38,38,39,38,38,53,52,54,51,50,23,7,38,35,34,6,21,20,22,22,23,22,22,1,3,35,23,17,35,17,51,19,19,51,17,35,17,55,35,3,2,72,149,124,145,74,106,119,148,23,54,85,120,81,142,110,125,92,34,100,83,60,75,18,43,95,129,80,1,166,201,8,6,119,188,195,203,180,127,6,8,211,3,172,98,109,33,108,40,100,33,40,33,31,44,91,76,86,105,39,99,37,46,40,29,36,28,36,50,90,254,236,2,47,129,254,82,2,209,253,209,2,47,253,47,1,164,137,253,211,255,255,0,18,254,20,4,90,5,182,2,38,0,55,0,0,0,7,0,122,1,63,0,0,255,255,0,31,254,20,2,168,5,70,2,38,0,87,0,0,0,7,0,122,0,197,0,0,0,2,0,113,254,20,4,55,4,92,0,12,0,42,0,71,64,38,10,21,26,3,42,42,30,30,36,21,3,43,44,33,39,70,89,36,33,27,28,15,26,15,24,18,24,7,70,89,24,16,18,0,70,89,18,22,0,63,43,0,24,63,43,17,18,0,57,57,24,63,63,51,43,17,18,1,23,57,17,51,17,51,51,17,51,49,48,37,50,54,55,53,52,38,35,34,6,21,20,22,5,52,55,35,6,35,34,2,17,16,18,51,50,23,51,55,51,17,20,6,35,34,39,53,22,22,51,50,54,53,2,76,170,151,4,158,171,144,153,151,1,219,9,11,112,230,217,239,243,211,223,123,11,24,131,236,249,242,149,75,210,118,142,165,119,183,202,43,226,204,224,208,209,217,107,36,99,167,1,45,1,10,1,8,1,49,166,146,251,164,236,236,70,158,42,46,169,146,255,255,0,113,254,20,4,55,6,33,2,38,3,145,0,0,1,6,1,75,6,0,0,8,179,2,57,17,38,0,43,53,255,255,0,113,254,20,4,55,5,229,2,38,3,145,0,0,1,6,1,78,12,0,0,8,179,2,43,17,38,0,43,53,255,255,0,113,254,20,4,55,5,223,2,38,3,145,0,0,1,7,1,79,1,86,0,0,0,8,179,2,52,17,38,0,43,53,255,255,0,113,254,20,4,55,6,33,2,38,3,145,0,0,1,6,2,58,119,0,0,8,179,2,47,17,38,0,43,53,0,1,0,201,0,0,1,115,5,182,0,3,0,17,182,0,4,5,1,3,0,18,0,63,63,17,18,1,57,49,48,51,17,51,17,201,170,5,182,250,74,0,255,255,0,5,0,0,1,142,7,115,2,38,3,150,0,0,1,7,0,67,254,124,1,82,0,8,179,1,5,5,38,0,43,53,255,255,0,179,0,0,2,60,7,115,2,38,3,150,0,0,1,7,0,118,255,42,1,82,0,8,179,1,13,5,38,0,43,53,255,255,255,199,0,0,2,105,7,115,2,38,3,150,0,0,1,7,1,75,254,187,1,82,0,8,179,1,18,5,38,0,43,53,255,255,0,5,0,0,2,56,7,37,2,38,3,150,0,0,1,7,0,106,254,208,1,82,0,10,180,2,1,25,5,38,0,43,53,53,255,255,255,171,0,0,2,147,7,47,2,38,3,150,0,0,1,7,1,82,254,163,1,82,0,8,179,1,13,5,38,0,43,53,255,255,255,243,0,0,2,75,6,180,2,38,3,150,0,0,1,7,1,77,254,198,1,82,0,8,179,1,7,5,38,0,43,53,255,255,255,231,0,0,2,83,7,55,2,38,3,150,0,0,1,7,1,78,254,194,1,82,0,8,179,1,4,5,38,0,43,53,255,255,0,86,254,66,1,162,5,182,2,38,3,150,0,0,0,6,1,81,49,0,255,255,0,187,0,0,1,127,7,49,2,38,3,150,0,0,1,7,1,79,0,25,1,82,0,8,179,1,13,5,38,0,43,53,255,255,0,201,254,127,3,163,5,182,0,38,3,150,0,0,0,7,0,45,2,59,0,0,255,255,255,228,0,0,2,29,6,10,0,39,3,150,0,170,0,0,1,7,1,84,253,232,255,151,0,7,178,1,8,0,0,63,53,0,255,255,0,201,0,0,1,115,5,182,2,6,3,150,0,0,255,255,0,5,0,0,2,56,7,37,2,38,3,150,0,0,1,7,0,106,254,208,1,82,0,10,180,2,1,25,5,38,0,43,53,53,255,255,0,201,0,0,1,115,5,182,2,6,3,150,0,0,255,255,0,5,0,0,2,56,7,37,2,38,3,150,0,0,1,7,0,106,254,208,1,82,0,10,180,2,1,25,5,38,0,43,53,53,255,255,0,201,0,0,1,115,5,182,2,6,3,150,0,0,255,255,0,201,0,0,1,115,5,182,2,6,3,150,0,0,255,255,0,153,0,0,2,4,7,225,2,38,3,150,0,0,1,7,2,102,3,145,1,82,0,8,179,1,8,5,38,0,43,53,255,255,0,184,254,160,1,127,5,182,2,38,3,150,0,0,0,7,2,103,3,125,0,0,0,0,0,1,0,0,182,50,0,1,73,6,128,0,0,14,54,36,0,5,0,36,255,113,0,5,0,55,0,41,0,5,0,57,0,41,0,5,0,58,0,41,0,5,0,60,0,20,0,5,0,68,255,174,0,5,0,70,255,133,0,5,0,71,255,133,0,5,0,72,255,133,0,5,0,74,255,195,0,5,0,80,255,195,0,5,0,81,255,195,0,5,0,82,255,133,0,5,0,83,255,195,0,5,0,84,255,133,0,5,0,85,255,195,0,5,0,86,255,195,0,5,0,88,255,195,0,5,0,130,255,113,0,5,0,131,255,113,0,5,0,132,255,113,0,5,0,133,255,113,0,5,0,134,255,113,0,5,0,135,255,113,0,5,0,159,0,20,0,5,0,162,255,133,0,5,0,163,255,174,0,5,0,164,255,174,0,5,0,165,255,174,0,5,0,166,255,174,0,5,0,167,255,174,0,5,0,168,255,174,0,5,0,169,255,133,0,5,0,170,255,133,0,5,0,171,255,133,0,5,0,172,255,133,0,5,0,173,255,133,0,5,0,180,255,133,0,5,0,181,255,133,0,5,0,182,255,133,0,5,0,183,255,133,0,5,0,184,255,133,0,5,0,186,255,133,0,5,0,187,255,195,0,5,0,188,255,195,0,5,0,189,255,195,0,5,0,190,255,195,0,5,0,194,255,113,0,5,0,195,255,174,0,5,0,196,255,113,0,5,0,197,255,174,0,5,0,198,255,113,0,5,0,199,255,174,0,5,0,201,255,133,0,5,0,203,255,133,0,5,0,205,255,133,0,5,0,207,255,133,0,5,0,209,255,133,0,5,0,211,255,133,0,5,0,213,255,133,0,5,0,215,255,133,0,5,0,217,255,133,0,5,0,219,255,133,0,5,0,221,255,133,0,5,0,223,255,195,0,5,0,225,255,195,0,5,0,227,255,195,0,5,0,229,255,195,0,5,0,250,255,195,0,5,1,6,255,195,0,5,1,8,255,195,0,5,1,13,255,195,0,5,1,15,255,133,0,5,1,17,255,133,0,5,1,19,255,133,0,5,1,21,255,133,0,5,1,23,255,195,0,5,1,25,255,195,0,5,1,29,255,195,0,5,1,33,255,195,0,5,1,36,0,41,0,5,1,38,0,41,0,5,1,43,255,195,0,5,1,45,255,195,0,5,1,47,255,195,0,5,1,49,255,195,0,5,1,51,255,195,0,5,1,53,255,195,0,5,1,54,0,41,0,5,1,56,0,20,0,5,1,58,0,20,0,5,1,67,255,113,0,5,1,68,255,174,0,5,1,70,255,174,0,5,1,72,255,133,0,5,1,74,255,195,0,5,1,86,255,113,0,5,1,95,255,113,0,5,1,98,255,113,0,5,1,105,255,113,0,5,1,121,255,174,0,5,1,122,255,215,0,5,1,123,255,215,0,5,1,126,255,174,0,5,1,129,255,195,0,5,1,130,255,215,0,5,1,131,255,215,0,5,1,132,255,215,0,5,1,135,255,215,0,5,1,137,255,215,0,5,1,140,255,174,0,5,1,142,255,195,0,5,1,143,255,174,0,5,1,144,255,174,0,5,1,147,255,174,0,5,1,153,255,174,0,5,1,164,255,133,0,5,1,170,255,113,0,5,1,174,255,133,0,5,1,181,255,133,0,5,1,202,255,215,0,5,1,206,255,113,0,5,1,207,255,133,0,5,1,213,255,113,0,5,1,216,255,133,0,5,1,219,255,133,0,5,1,222,255,133,0,5,1,234,255,133,0,5,1,237,255,133,0,5,1,238,255,195,0,5,1,242,255,113,0,5,1,250,0,41,0,5,1,252,0,41,0,5,1,254,0,41,0,5,2,0,0,20,0,5,2,87,255,195,0,5,2,88,255,113,0,5,2,89,255,174,0,5,2,96,255,133,0,5,2,98,255,195,0,5,2,106,255,133,0,5,2,114,255,113,0,5,2,115,255,113,0,5,2,125,255,236,0,5,2,127,255,133,0,5,2,133,255,133,0,5,2,135,255,133,0,5,2,137,255,133,0,5,2,141,255,133,0,5,2,178,255,133,0,5,2,180,255,133,0,5,2,206,255,133,0,5,2,207,255,113,0,5,2,217,255,113,0,5,2,218,255,215,0,5,2,219,255,113,0,5,2,220,255,215,0,5,2,221,255,113,0,5,2,222,255,215,0,5,2,224,255,133,0,5,2,226,255,215,0,5,2,228,255,215,0,5,2,240,255,133,0,5,2,242,255,133,0,5,2,244,255,133,0,5,3,9,255,113,0,5,3,10,255,133,0,5,3,11,255,113,0,5,3,12,255,133,0,5,3,17,255,133,0,5,3,18,255,113,0,5,3,22,255,133,0,5,3,26,255,133,0,5,3,27,255,133,0,5,3,28,255,113,0,5,3,29,255,113,0,5,3,30,255,174,0,5,3,31,255,113,0,5,3,32,255,174,0,5,3,33,255,113,0,5,3,34,255,174,0,5,3,35,255,113,0,5,3,37,255,113,0,5,3,38,255,174,0,5,3,39,255,113,0,5,3,40,255,174,0,5,3,41,255,113,0,5,3,42,255,174,0,5,3,43,255,113,0,5,3,44,255,174,0,5,3,45,255,113,0,5,3,46,255,174,0,5,3,47,255,113,0,5,3,48,255,174,0,5,3,49,255,113,0,5,3,50,255,174,0,5,3,51,255,113,0,5,3,52,255,174,0,5,3,54,255,133,0,5,3,56,255,133,0,5,3,58,255,133,0,5,3,60,255,133,0,5,3,64,255,133,0,5,3,66,255,133,0,5,3,68,255,133,0,5,3,74,255,133,0,5,3,76,255,133,0,5,3,78,255,133,0,5,3,82,255,133,0,5,3,84,255,133,0,5,3,86,255,133,0,5,3,88,255,133,0,5,3,90,255,133,0,5,3,92,255,133,0,5,3,94,255,133,0,5,3,96,255,133,0,5,3,98,255,195,0,5,3,100,255,195,0,5,3,102,255,195,0,5,3,104,255,195,0,5,3,106,255,195,0,5,3,108,255,195,0,5,3,110,255,195,0,5,3,111,0,20,0,5,3,113,0,20,0,5,3,115,0,20,0,5,3,143,0,41,0,10,0,36,255,113,0,10,0,55,0,41,0,10,0,57,0,41,0,10,0,58,0,41,0,10,0,60,0,20,0,10,0,68,255,174,0,10,0,70,255,133,0,10,0,71,255,133,0,10,0,72,255,133,0,10,0,74,255,195,0,10,0,80,255,195,0,10,0,81,255,195,0,10,0,82,255,133,0,10,0,83,255,195,0,10,0,84,255,133,0,10,0,85,255,195,0,10,0,86,255,195,0,10,0,88,255,195,0,10,0,130,255,113,0,10,0,131,255,113,0,10,0,132,255,113,0,10,0,133,255,113,0,10,0,134,255,113,0,10,0,135,255,113,0,10,0,159,0,20,0,10,0,162,255,133,0,10,0,163,255,174,0,10,0,164,255,174,0,10,0,165,255,174,0,10,0,166,255,174,0,10,0,167,255,174,0,10,0,168,255,174,0,10,0,169,255,133,0,10,0,170,255,133,0,10,0,171,255,133,0,10,0,172,255,133,0,10,0,173,255,133,0,10,0,180,255,133,0,10,0,181,255,133,0,10,0,182,255,133,0,10,0,183,255,133,0,10,0,184,255,133,0,10,0,186,255,133,0,10,0,187,255,195,0,10,0,188,255,195,0,10,0,189,255,195,0,10,0,190,255,195,0,10,0,194,255,113,0,10,0,195,255,174,0,10,0,196,255,113,0,10,0,197,255,174,0,10,0,198,255,113,0,10,0,199,255,174,0,10,0,201,255,133,0,10,0,203,255,133,0,10,0,205,255,133,0,10,0,207,255,133,0,10,0,209,255,133,0,10,0,211,255,133,0,10,0,213,255,133,0,10,0,215,255,133,0,10,0,217,255,133,0,10,0,219,255,133,0,10,0,221,255,133,0,10,0,223,255,195,0,10,0,225,255,195,0,10,0,227,255,195,0,10,0,229,255,195,0,10,0,250,255,195,0,10,1,6,255,195,0,10,1,8,255,195,0,10,1,13,255,195,0,10,1,15,255,133,0,10,1,17,255,133,0,10,1,19,255,133,0,10,1,21,255,133,0,10,1,23,255,195,0,10,1,25,255,195,0,10,1,29,255,195,0,10,1,33,255,195,0,10,1,36,0,41,0,10,1,38,0,41,0,10,1,43,255,195,0,10,1,45,255,195,0,10,1,47,255,195,0,10,1,49,255,195,0,10,1,51,255,195,0,10,1,53,255,195,0,10,1,54,0,41,0,10,1,56,0,20,0,10,1,58,0,20,0,10,1,67,255,113,0,10,1,68,255,174,0,10,1,70,255,174,0,10,1,72,255,133,0,10,1,74,255,195,0,10,1,86,255,113,0,10,1,95,255,113,0,10,1,98,255,113,0,10,1,105,255,113,0,10,1,121,255,174,0,10,1,122,255,215,0,10,1,123,255,215,0,10,1,126,255,174,0,10,1,129,255,195,0,10,1,130,255,215,0,10,1,131,255,215,0,10,1,132,255,215,0,10,1,135,255,215,0,10,1,137,255,215,0,10,1,140,255,174,0,10,1,142,255,195,0,10,1,143,255,174,0,10,1,144,255,174,0,10,1,147,255,174,0,10,1,153,255,174,0,10,1,164,255,133,0,10,1,170,255,113,0,10,1,174,255,133,0,10,1,181,255,133,0,10,1,202,255,215,0,10,1,206,255,113,0,10,1,207,255,133,0,10,1,213,255,113,0,10,1,216,255,133,0,10,1,219,255,133,0,10,1,222,255,133,0,10,1,234,255,133,0,10,1,237,255,133,0,10,1,238,255,195,0,10,1,242,255,113,0,10,1,250,0,41,0,10,1,252,0,41,0,10,1,254,0,41,0,10,2,0,0,20,0,10,2,87,255,195,0,10,2,88,255,113,0,10,2,89,255,174,0,10,2,96,255,133,0,10,2,98,255,195,0,10,2,106,255,133,0,10,2,114,255,113,0,10,2,115,255,113,0,10,2,125,255,236,0,10,2,127,255,133,0,10,2,133,255,133,0,10,2,135,255,133,0,10,2,137,255,133,0,10,2,141,255,133,0,10,2,178,255,133,0,10,2,180,255,133,0,10,2,206,255,133,0,10,2,207,255,113,0,10,2,217,255,113,0,10,2,218,255,215,0,10,2,219,255,113,0,10,2,220,255,215,0,10,2,221,255,113,0,10,2,222,255,215,0,10,2,224,255,133,0,10,2,226,255,215,0,10,2,228,255,215,0,10,2,240,255,133,0,10,2,242,255,133,0,10,2,244,255,133,0,10,3,9,255,113,0,10,3,10,255,133,0,10,3,11,255,113,0,10,3,12,255,133,0,10,3,17,255,133,0,10,3,18,255,113,0,10,3,22,255,133,0,10,3,26,255,133,0,10,3,27,255,133,0,10,3,28,255,113,0,10,3,29,255,113,0,10,3,30,255,174,0,10,3,31,255,113,0,10,3,32,255,174,0,10,3,33,255,113,0,10,3,34,255,174,0,10,3,35,255,113,0,10,3,37,255,113,0,10,3,38,255,174,0,10,3,39,255,113,0,10,3,40,255,174,0,10,3,41,255,113,0,10,3,42,255,174,0,10,3,43,255,113,0,10,3,44,255,174,0,10,3,45,255,113,0,10,3,46,255,174,0,10,3,47,255,113,0,10,3,48,255,174,0,10,3,49,255,113,0,10,3,50,255,174,0,10,3,51,255,113,0,10,3,52,255,174,0,10,3,54,255,133,0,10,3,56,255,133,0,10,3,58,255,133,0,10,3,60,255,133,0,10,3,64,255,133,0,10,3,66,255,133,0,10,3,68,255,133,0,10,3,74,255,133,0,10,3,76,255,133,0,10,3,78,255,133,0,10,3,82,255,133,0,10,3,84,255,133,0,10,3,86,255,133,0,10,3,88,255,133,0,10,3,90,255,133,0,10,3,92,255,133,0,10,3,94,255,133,0,10,3,96,255,133,0,10,3,98,255,195,0,10,3,100,255,195,0,10,3,102,255,195,0,10,3,104,255,195,0,10,3,106,255,195,0,10,3,108,255,195,0,10,3,110,255,195,0,10,3,111,0,20,0,10,3,113,0,20,0,10,3,115,0,20,0,10,3,143,0,41,0,11,0,45,0,184,0,15,0,38,255,154,0,15,0,42,255,154,0,15,0,50,255,154,0,15,0,52,255,154,0,15,0,55,255,113,0,15,0,56,255,215,0,15,0,57,255,133,0,15,0,58,255,133,0,15,0,60,255,133,0,15,0,137,255,154,0,15,0,148,255,154,0,15,0,149,255,154,0,15,0,150,255,154,0,15,0,151,255,154,0,15,0,152,255,154,0,15,0,154,255,154,0,15,0,155,255,215,0,15,0,156,255,215,0,15,0,157,255,215,0,15,0,158,255,215,0,15,0,159,255,133,0,15,0,200,255,154,0,15,0,202,255,154,0,15,0,204,255,154,0,15,0,206,255,154,0,15,0,222,255,154,0,15,0,224,255,154,0,15,0,226,255,154,0,15,0,228,255,154,0,15,1,14,255,154,0,15,1,16,255,154,0,15,1,18,255,154,0,15,1,20,255,154,0,15,1,36,255,113,0,15,1,38,255,113,0,15,1,42,255,215,0,15,1,44,255,215,0,15,1,46,255,215,0,15,1,48,255,215,0,15,1,50,255,215,0,15,1,52,255,215,0,15,1,54,255,133,0,15,1,56,255,133,0,15,1,58,255,133,0,15,1,71,255,154,0,15,1,102,255,174,0,15,1,109,255,174,0,15,1,113,255,113,0,15,1,114,255,133,0,15,1,115,255,154,0,15,1,117,255,133,0,15,1,120,255,133,0,15,1,133,255,215,0,15,1,157,255,113,0,15,1,159,255,154,0,15,1,166,255,113,0,15,1,184,255,154,0,15,1,187,255,154,0,15,1,188,255,113,0,15,1,190,255,174,0,15,1,193,255,92,0,15,1,196,255,113,0,15,1,220,255,154,0,15,1,225,255,133,0,15,1,228,255,154,0,15,1,250,255,133,0,15,1,252,255,133,0,15,1,254,255,133,0,15,2,0,255,133,0,15,2,84,255,133,0,15,2,95,255,154,0,15,2,97,255,215,0,15,2,108,255,154,0,15,2,124,255,92,0,15,2,126,255,154,0,15,2,128,255,133,0,15,2,130,255,133,0,15,2,132,255,154,0,15,2,134,255,154,0,15,2,136,255,154,0,15,2,138,255,154,0,15,2,140,255,154,0,15,2,169,255,113,0,15,2,170,255,154,0,15,2,177,255,154,0,15,2,179,255,154,0,15,2,181,255,113,0,15,2,182,255,154,0,15,2,183,255,133,0,15,2,185,255,133,0,15,2,189,255,113,0,15,2,190,255,154,0,15,2,191,255,92,0,15,2,192,255,133,0,15,2,193,255,92,0,15,2,194,255,133,0,15,2,197,255,133,0,15,2,199,255,133,0,15,2,212,255,92,0,15,2,213,255,133,0,15,2,239,255,154,0,15,2,241,255,154,0,15,2,243,255,154,0,15,2,253,255,92,0,15,2,254,255,133,0,15,3,13,255,133,0,15,3,14,255,154,0,15,3,15,255,133,0,15,3,16,255,154,0,15,3,21,255,154,0,15,3,23,255,113,0,15,3,24,255,154,0,15,3,73,255,154,0,15,3,75,255,154,0,15,3,77,255,154,0,15,3,79,255,154,0,15,3,81,255,154,0,15,3,83,255,154,0,15,3,85,255,154,0,15,3,87,255,154,0,15,3,89,255,154,0,15,3,91,255,154,0,15,3,93,255,154,0,15,3,95,255,154,0,15,3,97,255,215,0,15,3,99,255,215,0,15,3,101,255,215,0,15,3,103,255,215,0,15,3,105,255,215,0,15,3,107,255,215,0,15,3,109,255,215,0,15,3,111,255,133,0,15,3,113,255,133,0,15,3,115,255,133,0,15,3,143,255,113,0,16,0,55,255,174,0,16,1,36,255,174,0,16,1,38,255,174,0,16,1,113,255,174,0,16,1,157,255,174,0,16,1,166,255,174,0,16,1,188,255,174,0,16,1,196,255,174,0,16,1,220,255,215,0,16,1,228,255,215,0,16,2,169,255,174,0,16,2,170,255,215,0,16,2,181,255,174,0,16,2,182,255,215,0,16,2,189,255,174,0,16,2,190,255,215,0,16,3,23,255,174,0,16,3,24,255,215,0,16,3,143,255,174,0,17,0,38,255,154,0,17,0,42,255,154,0,17,0,50,255,154,0,17,0,52,255,154,0,17,0,55,255,113,0,17,0,56,255,215,0,17,0,57,255,133,0,17,0,58,255,133,0,17,0,60,255,133,0,17,0,137,255,154,0,17,0,148,255,154,0,17,0,149,255,154,0,17,0,150,255,154,0,17,0,151,255,154,0,17,0,152,255,154,0,17,0,154,255,154,0,17,0,155,255,215,0,17,0,156,255,215,0,17,0,157,255,215,0,17,0,158,255,215,0,17,0,159,255,133,0,17,0,200,255,154,0,17,0,202,255,154,0,17,0,204,255,154,0,17,0,206,255,154,0,17,0,222,255,154,0,17,0,224,255,154,0,17,0,226,255,154,0,17,0,228,255,154,0,17,1,14,255,154,0,17,1,16,255,154,0,17,1,18,255,154,0,17,1,20,255,154,0,17,1,36,255,113,0,17,1,38,255,113,0,17,1,42,255,215,0,17,1,44,255,215,0,17,1,46,255,215,0,17,1,48,255,215,0,17,1,50,255,215,0,17,1,52,255,215,0,17,1,54,255,133,0,17,1,56,255,133,0,17,1,58,255,133,0,17,1,71,255,154,0,17,1,102,255,174,0,17,1,109,255,174,0,17,1,113,255,113,0,17,1,114,255,133,0,17,1,115,255,154,0,17,1,117,255,133,0,17,1,120,255,133,0,17,1,133,255,215,0,17,1,157,255,113,0,17,1,159,255,154,0,17,1,166,255,113,0,17,1,184,255,154,0,17,1,187,255,154,0,17,1,188,255,113,0,17,1,190,255,174,0,17,1,193,255,92,0,17,1,196,255,113,0,17,1,220,255,154,0,17,1,225,255,133,0,17,1,228,255,154,0,17,1,250,255,133,0,17,1,252,255,133,0,17,1,254,255,133,0,17,2,0,255,133,0,17,2,84,255,133,0,17,2,95,255,154,0,17,2,97,255,215,0,17,2,108,255,154,0,17,2,124,255,92,0,17,2,126,255,154,0,17,2,128,255,133,0,17,2,130,255,133,0,17,2,132,255,154,0,17,2,134,255,154,0,17,2,136,255,154,0,17,2,138,255,154,0,17,2,140,255,154,0,17,2,169,255,113,0,17,2,170,255,154,0,17,2,177,255,154,0,17,2,179,255,154,0,17,2,181,255,113,0,17,2,182,255,154,0,17,2,183,255,133,0,17,2,185,255,133,0,17,2,189,255,113,0,17,2,190,255,154,0,17,2,191,255,92,0,17,2,192,255,133,0,17,2,193,255,92,0,17,2,194,255,133,0,17,2,197,255,133,0,17,2,199,255,133,0,17,2,212,255,92,0,17,2,213,255,133,0,17,2,239,255,154,0,17,2,241,255,154,0,17,2,243,255,154,0,17,2,253,255,92,0,17,2,254,255,133,0,17,3,13,255,133,0,17,3,14,255,154,0,17,3,15,255,133,0,17,3,16,255,154,0,17,3,21,255,154,0,17,3,23,255,113,0,17,3,24,255,154,0,17,3,73,255,154,0,17,3,75,255,154,0,17,3,77,255,154,0,17,3,79,255,154,0,17,3,81,255,154,0,17,3,83,255,154,0,17,3,85,255,154,0,17,3,87,255,154,0,17,3,89,255,154,0,17,3,91,255,154,0,17,3,93,255,154,0,17,3,95,255,154,0,17,3,97,255,215,0,17,3,99,255,215,0,17,3,101,255,215,0,17,3,103,255,215,0,17,3,105,255,215,0,17,3,107,255,215,0,17,3,109,255,215,0,17,3,111,255,133,0,17,3,113,255,133,0,17,3,115,255,133,0,17,3,143,255,113,0,36,0,5,255,113,0,36,0,10,255,113,0,36,0,38,255,215,0,36,0,42,255,215,0,36,0,45,1,10,0,36,0,50,255,215,0,36,0,52,255,215,0,36,0,55,255,113,0,36,0,57,255,174,0,36,0,58,255,174,0,36,0,60,255,133,0,36,0,137,255,215,0,36,0,148,255,215,0,36,0,149,255,215,0,36,0,150,255,215,0,36,0,151,255,215,0,36,0,152,255,215,0,36,0,154,255,215,0,36,0,159,255,133,0,36,0,200,255,215,0,36,0,202,255,215,0,36,0,204,255,215,0,36,0,206,255,215,0,36,0,222,255,215,0,36,0,224,255,215,0,36,0,226,255,215,0,36,0,228,255,215,0,36,1,14,255,215,0,36,1,16,255,215,0,36,1,18,255,215,0,36,1,20,255,215,0,36,1,36,255,113,0,36,1,38,255,113,0,36,1,54,255,174,0,36,1,56,255,133,0,36,1,58,255,133,0,36,1,71,255,215,0,36,1,250,255,174,0,36,1,252,255,174,0,36,1,254,255,174,0,36,2,0,255,133,0,36,2,7,255,113,0,36,2,11,255,113,0,36,2,95,255,215,0,36,3,73,255,215,0,36,3,75,255,215,0,36,3,77,255,215,0,36,3,79,255,215,0,36,3,81,255,215,0,36,3,83,255,215,0,36,3,85,255,215,0,36,3,87,255,215,0,36,3,89,255,215,0,36,3,91,255,215,0,36,3,93,255,215,0,36,3,95,255,215,0,36,3,111,255,133,0,36,3,113,255,133,0,36,3,115,255,133,0,36,3,143,255,113,0,37,0,15,255,174,0,37,0,17,255,174,0,37,0,36,255,215,0,37,0,55,255,195,0,37,0,57,255,236,0,37,0,58,255,236,0,37,0,59,255,215,0,37,0,60,255,236,0,37,0,61,255,236,0,37,0,130,255,215,0,37,0,131,255,215,0,37,0,132,255,215,0,37,0,133,255,215,0,37,0,134,255,215,0,37,0,135,255,215,0,37,0,159,255,236,0,37,0,194,255,215,0,37,0,196,255,215,0,37,0,198,255,215,0,37,1,36,255,195,0,37,1,38,255,195,0,37,1,54,255,236,0,37,1,56,255,236,0,37,1,58,255,236,0,37,1,59,255,236,0,37,1,61,255,236,0,37,1,63,255,236,0,37,1,67,255,215,0,37,1,160,255,236,0,37,1,250,255,236,0,37,1,252,255,236,0,37,1,254,255,236,0,37,2,0,255,236,0,37,2,8,255,174,0,37,2,12,255,174,0,37,2,88,255,215,0,37,3,29,255,215,0,37,3,31,255,215,0,37,3,33,255,215,0,37,3,35,255,215,0,37,3,37,255,215,0,37,3,39,255,215,0,37,3,41,255,215,0,37,3,43,255,215,0,37,3,45,255,215,0,37,3,47,255,215,0,37,3,49,255,215,0,37,3,51,255,215,0,37,3,111,255,236,0,37,3,113,255,236,0,37,3,115,255,236,0,37,3,143,255,195,0,38,0,38,255,215,0,38,0,42,255,215,0,38,0,50,255,215,0,38,0,52,255,215,0,38,0,137,255,215,0,38,0,148,255,215,0,38,0,149,255,215,0,38,0,150,255,215,0,38,0,151,255,215,0,38,0,152,255,215,0,38,0,154,255,215,0,38,0,200,255,215,0,38,0,202,255,215,0,38,0,204,255,215,0,38,0,206,255,215,0,38,0,222,255,215,0,38,0,224,255,215,0,38,0,226,255,215,0,38,0,228,255,215,0,38,1,14,255,215,0,38,1,16,255,215,0,38,1,18,255,215,0,38,1,20,255,215,0,38,1,71,255,215,0,38,2,95,255,215,0,38,3,73,255,215,0,38,3,75,255,215,0,38,3,77,255,215,0,38,3,79,255,215,0,38,3,81,255,215,0,38,3,83,255,215,0,38,3,85,255,215,0,38,3,87,255,215,0,38,3,89,255,215,0,38,3,91,255,215,0,38,3,93,255,215,0,38,3,95,255,215,0,39,0,15,255,174,0,39,0,17,255,174,0,39,0,36,255,215,0,39,0,55,255,195,0,39,0,57,255,236,0,39,0,58,255,236,0,39,0,59,255,215,0,39,0,60,255,236,0,39,0,61,255,236,0,39,0,130,255,215,0,39,0,131,255,215,0,39,0,132,255,215,0,39,0,133,255,215,0,39,0,134,255,215,0,39,0,135,255,215,0,39,0,159,255,236,0,39,0,194,255,215,0,39,0,196,255,215,0,39,0,198,255,215,0,39,1,36,255,195,0,39,1,38,255,195,0,39,1,54,255,236,0,39,1,56,255,236,0,39,1,58,255,236,0,39,1,59,255,236,0,39,1,61,255,236,0,39,1,63,255,236,0,39,1,67,255,215,0,39,1,160,255,236,0,39,1,250,255,236,0,39,1,252,255,236,0,39,1,254,255,236,0,39,2,0,255,236,0,39,2,8,255,174,0,39,2,12,255,174,0,39,2,88,255,215,0,39,3,29,255,215,0,39,3,31,255,215,0,39,3,33,255,215,0,39,3,35,255,215,0,39,3,37,255,215,0,39,3,39,255,215,0,39,3,41,255,215,0,39,3,43,255,215,0,39,3,45,255,215,0,39,3,47,255,215,0,39,3,49,255,215,0,39,3,51,255,215,0,39,3,111,255,236,0,39,3,113,255,236,0,39,3,115,255,236,0,39,3,143,255,195,0,40,0,45,0,123,0,41,0,15,255,133,0,41,0,17,255,133,0,41,0,34,0,41,0,41,0,36,255,215,0,41,0,130,255,215,0,41,0,131,255,215,0,41,0,132,255,215,0,41,0,133,255,215,0,41,0,134,255,215,0,41,0,135,255,215,0,41,0,194,255,215,0,41,0,196,255,215,0,41,0,198,255,215,0,41,1,67,255,215,0,41,2,8,255,133,0,41,2,12,255,133,0,41,2,88,255,215,0,41,3,29,255,215,0,41,3,31,255,215,0,41,3,33,255,215,0,41,3,35,255,215,0,41,3,37,255,215,0,41,3,39,255,215,0,41,3,41,255,215,0,41,3,43,255,215,0,41,3,45,255,215,0,41,3,47,255,215,0,41,3,49,255,215,0,41,3,51,255,215,0,46,0,38,255,215,0,46,0,42,255,215,0,46,0,50,255,215,0,46,0,52,255,215,0,46,0,137,255,215,0,46,0,148,255,215,0,46,0,149,255,215,0,46,0,150,255,215,0,46,0,151,255,215,0,46,0,152,255,215,0,46,0,154,255,215,0,46,0,200,255,215,0,46,0,202,255,215,0,46,0,204,255,215,0,46,0,206,255,215,0,46,0,222,255,215,0,46,0,224,255,215,0,46,0,226,255,215,0,46,0,228,255,215,0,46,1,14,255,215,0,46,1,16,255,215,0,46,1,18,255,215,0,46,1,20,255,215,0,46,1,71,255,215,0,46,2,95,255,215,0,46,3,73,255,215,0,46,3,75,255,215,0,46,3,77,255,215,0,46,3,79,255,215,0,46,3,81,255,215,0,46,3,83,255,215,0,46,3,85,255,215,0,46,3,87,255,215,0,46,3,89,255,215,0,46,3,91,255,215,0,46,3,93,255,215,0,46,3,95,255,215,0,47,0,5,255,92,0,47,0,10,255,92,0,47,0,38,255,215,0,47,0,42,255,215,0,47,0,50,255,215,0,47,0,52,255,215,0,47,0,55,255,215,0,47,0,56,255,236,0,47,0,57,255,215,0,47,0,58,255,215,0,47,0,60,255,195,0,47,0,137,255,215,0,47,0,148,255,215,0,47,0,149,255,215,0,47,0,150,255,215,0,47,0,151,255,215,0,47,0,152,255,215,0,47,0,154,255,215,0,47,0,155,255,236,0,47,0,156,255,236,0,47,0,157,255,236,0,47,0,158,255,236,0,47,0,159,255,195,0,47,0,200,255,215,0,47,0,202,255,215,0,47,0,204,255,215,0,47,0,206,255,215,0,47,0,222,255,215,0,47,0,224,255,215,0,47,0,226,255,215,0,47,0,228,255,215,0,47,1,14,255,215,0,47,1,16,255,215,0,47,1,18,255,215,0,47,1,20,255,215,0,47,1,36,255,215,0,47,1,38,255,215,0,47,1,42,255,236,0,47,1,44,255,236,0,47,1,46,255,236,0,47,1,48,255,236,0,47,1,50,255,236,0,47,1,52,255,236,0,47,1,54,255,215,0,47,1,56,255,195,0,47,1,58,255,195,0,47,1,71,255,215,0,47,1,250,255,215,0,47,1,252,255,215,0,47,1,254,255,215,0,47,2,0,255,195,0,47,2,7,255,92,0,47,2,11,255,92,0,47,2,95,255,215,0,47,2,97,255,236,0,47,3,73,255,215,0,47,3,75,255,215,0,47,3,77,255,215,0,47,3,79,255,215,0,47,3,81,255,215,0,47,3,83,255,215,0,47,3,85,255,215,0,47,3,87,255,215,0,47,3,89,255,215,0,47,3,91,255,215,0,47,3,93,255,215,0,47,3,95,255,215,0,47,3,97,255,236,0,47,3,99,255,236,0,47,3,101,255,236,0,47,3,103,255,236,0,47,3,105,255,236,0,47,3,107,255,236,0,47,3,109,255,236,0,47,3,111,255,195,0,47,3,113,255,195,0,47,3,115,255,195,0,47,3,143,255,215,0,50,0,15,255,174,0,50,0,17,255,174,0,50,0,36,255,215,0,50,0,55,255,195,0,50,0,57,255,236,0,50,0,58,255,236,0,50,0,59,255,215,0,50,0,60,255,236,0,50,0,61,255,236,0,50,0,130,255,215,0,50,0,131,255,215,0,50,0,132,255,215,0,50,0,133,255,215,0,50,0,134,255,215,0,50,0,135,255,215,0,50,0,159,255,236,0,50,0,194,255,215,0,50,0,196,255,215,0,50,0,198,255,215,0,50,1,36,255,195,0,50,1,38,255,195,0,50,1,54,255,236,0,50,1,56,255,236,0,50,1,58,255,236,0,50,1,59,255,236,0,50,1,61,255,236,0,50,1,63,255,236,0,50,1,67,255,215,0,50,1,160,255,236,0,50,1,250,255,236,0,50,1,252,255,236,0,50,1,254,255,236,0,50,2,0,255,236,0,50,2,8,255,174,0,50,2,12,255,174,0,50,2,88,255,215,0,50,3,29,255,215,0,50,3,31,255,215,0,50,3,33,255,215,0,50,3,35,255,215,0,50,3,37,255,215,0,50,3,39,255,215,0,50,3,41,255,215,0,50,3,43,255,215,0,50,3,45,255,215,0,50,3,47,255,215,0,50,3,49,255,215,0,50,3,51,255,215,0,50,3,111,255,236,0,50,3,113,255,236,0,50,3,115,255,236,0,50,3,143,255,195,0,51,0,15,254,246,0,51,0,17,254,246,0,51,0,36,255,154,0,51,0,59,255,215,0,51,0,61,255,236,0,51,0,130,255,154,0,51,0,131,255,154,0,51,0,132,255,154,0,51,0,133,255,154,0,51,0,134,255,154,0,51,0,135,255,154,0,51,0,194,255,154,0,51,0,196,255,154,0,51,0,198,255,154,0,51,1,59,255,236,0,51,1,61,255,236,0,51,1,63,255,236,0,51,1,67,255,154,0,51,2,8,254,246,0,51,2,12,254,246,0,51,2,88,255,154,0,51,3,29,255,154,0,51,3,31,255,154,0,51,3,33,255,154,0,51,3,35,255,154,0,51,3,37,255,154,0,51,3,39,255,154,0,51,3,41,255,154,0,51,3,43,255,154,0,51,3,45,255,154,0,51,3,47,255,154,0,51,3,49,255,154,0,51,3,51,255,154,0,52,0,15,255,174,0,52,0,17,255,174,0,52,0,36,255,215,0,52,0,55,255,195,0,52,0,57,255,236,0,52,0,58,255,236,0,52,0,59,255,215,0,52,0,60,255,236,0,52,0,61,255,236,0,52,0,130,255,215,0,52,0,131,255,215,0,52,0,132,255,215,0,52,0,133,255,215,0,52,0,134,255,215,0,52,0,135,255,215,0,52,0,159,255,236,0,52,0,194,255,215,0,52,0,196,255,215,0,52,0,198,255,215,0,52,1,36,255,195,0,52,1,38,255,195,0,52,1,54,255,236,0,52,1,56,255,236,0,52,1,58,255,236,0,52,1,59,255,236,0,52,1,61,255,236,0,52,1,63,255,236,0,52,1,67,255,215,0,52,1,160,255,236,0,52,1,250,255,236,0,52,1,252,255,236,0,52,1,254,255,236,0,52,2,0,255,236,0,52,2,8,255,174,0,52,2,12,255,174,0,52,2,88,255,215,0,52,3,29,255,215,0,52,3,31,255,215,0,52,3,33,255,215,0,52,3,35,255,215,0,52,3,37,255,215,0,52,3,39,255,215,0,52,3,41,255,215,0,52,3,43,255,215,0,52,3,45,255,215,0,52,3,47,255,215,0,52,3,49,255,215,0,52,3,51,255,215,0,52,3,111,255,236,0,52,3,113,255,236,0,52,3,115,255,236,0,52,3,143,255,195,0,55,0,15,255,133,0,55,0,16,255,174,0,55,0,17,255,133,0,55,0,34,0,41,0,55,0,36,255,113,0,55,0,38,255,215,0,55,0,42,255,215,0,55,0,50,255,215,0,55,0,52,255,215,0,55,0,55,0,41,0,55,0,68,255,92,0,55,0,70,255,113,0,55,0,71,255,113,0,55,0,72,255,113,0,55,0,74,255,113,0,55,0,80,255,154,0,55,0,81,255,154,0,55,0,82,255,113,0,55,0,83,255,154,0,55,0,84,255,113,0,55,0,85,255,154,0,55,0,86,255,133,0,55,0,88,255,154,0,55,0,89,255,215,0,55,0,90,255,215,0,55,0,91,255,215,0,55,0,92,255,215,0,55,0,93,255,174,0,55,0,130,255,113,0,55,0,131,255,113,0,55,0,132,255,113,0,55,0,133,255,113,0,55,0,134,255,113,0,55,0,135,255,113,0,55,0,137,255,215,0,55,0,148,255,215,0,55,0,149,255,215,0,55,0,150,255,215,0,55,0,151,255,215,0,55,0,152,255,215,0,55,0,154,255,215,0,55,0,162,255,113,0,55,0,163,255,92,0,55,0,164,255,92,0,55,0,165,255,92,0,55,0,166,255,92,0,55,0,167,255,92,0,55,0,168,255,92,0,55,0,169,255,113,0,55,0,170,255,113,0,55,0,171,255,113,0,55,0,172,255,113,0,55,0,173,255,113,0,55,0,180,255,113,0,55,0,181,255,113,0,55,0,182,255,113,0,55,0,183,255,113,0,55,0,184,255,113,0,55,0,186,255,113,0,55,0,187,255,154,0,55,0,188,255,154,0,55,0,189,255,154,0,55,0,190,255,154,0,55,0,191,255,215,0,55,0,194,255,113,0,55,0,195,255,92,0,55,0,196,255,113,0,55,0,197,255,92,0,55,0,198,255,113,0,55,0,199,255,92,0,55,0,200,255,215,0,55,0,201,255,113,0,55,0,202,255,215,0,55,0,203,255,113,0,55,0,204,255,215,0,55,0,205,255,113,0,55,0,206,255,215,0,55,0,207,255,113,0,55,0,209,255,113,0,55,0,211,255,113,0,55,0,213,255,113,0,55,0,215,255,113,0,55,0,217,255,113,0,55,0,219,255,113,0,55,0,221,255,113,0,55,0,222,255,215,0,55,0,223,255,113,0,55,0,224,255,215,0,55,0,225,255,113,0,55,0,226,255,215,0,55,0,227,255,113,0,55,0,228,255,215,0,55,0,229,255,113,0,55,0,250,255,154,0,55,1,6,255,154,0,55,1,8,255,154,0,55,1,13,255,154,0,55,1,14,255,215,0,55,1,15,255,113,0,55,1,16,255,215,0,55,1,17,255,113,0,55,1,18,255,215,0,55,1,19,255,113,0,55,1,20,255,215,0,55,1,21,255,113,0,55,1,23,255,154,0,55,1,25,255,154,0,55,1,29,255,133,0,55,1,33,255,133,0,55,1,36,0,41,0,55,1,38,0,41,0,55,1,43,255,154,0,55,1,45,255,154,0,55,1,47,255,154,0,55,1,49,255,154,0,55,1,51,255,154,0,55,1,53,255,154,0,55,1,55,255,215,0,55,1,60,255,174,0,55,1,62,255,174,0,55,1,64,255,174,0,55,1,67,255,113,0,55,1,68,255,92,0,55,1,70,255,92,0,55,1,71,255,215,0,55,1,72,255,113,0,55,1,74,255,133,0,55,1,251,255,215,0,55,1,253,255,215,0,55,2,2,255,174,0,55,2,3,255,174,0,55,2,4,255,174,0,55,2,8,255,133,0,55,2,12,255,133,0,55,2,87,255,154,0,55,2,88,255,113,0,55,2,89,255,92,0,55,2,95,255,215,0,55,2,96,255,113,0,55,2,98,255,154,0,55,3,29,255,113,0,55,3,30,255,92,0,55,3,31,255,113,0,55,3,32,255,92,0,55,3,33,255,113,0,55,3,34,255,92,0,55,3,35,255,113,0,55,3,37,255,113,0,55,3,38,255,92,0,55,3,39,255,113,0,55,3,40,255,92,0,55,3,41,255,113,0,55,3,42,255,92,0,55,3,43,255,113,0,55,3,44,255,92,0,55,3,45,255,113,0,55,3,46,255,92,0,55,3,47,255,113,0,55,3,48,255,92,0,55,3,49,255,113,0,55,3,50,255,92,0,55,3,51,255,113,0,55,3,52,255,92,0,55,3,54,255,113,0,55,3,56,255,113,0,55,3,58,255,113,0,55,3,60,255,113,0,55,3,64,255,113,0,55,3,66,255,113,0,55,3,68,255,113,0,55,3,73,255,215,0,55,3,74,255,113,0,55,3,75,255,215,0,55,3,76,255,113,0,55,3,77,255,215,0,55,3,78,255,113,0,55,3,79,255,215,0,55,3,81,255,215,0,55,3,82,255,113,0,55,3,83,255,215,0,55,3,84,255,113,0,55,3,85,255,215,0,55,3,86,255,113,0,55,3,87,255,215,0,55,3,88,255,113,0,55,3,89,255,215,0,55,3,90,255,113,0,55,3,91,255,215,0,55,3,92,255,113,0,55,3,93,255,215,0,55,3,94,255,113,0,55,3,95,255,215,0,55,3,96,255,113,0,55,3,98,255,154,0,55,3,100,255,154,0,55,3,102,255,154,0,55,3,104,255,154,0,55,3,106,255,154,0,55,3,108,255,154,0,55,3,110,255,154,0,55,3,112,255,215,0,55,3,143,0,41,0,56,0,15,255,215,0,56,0,17,255,215,0,56,0,36,255,236,0,56,0,130,255,236,0,56,0,131,255,236,0,56,0,132,255,236,0,56,0,133,255,236,0,56,0,134,255,236,0,56,0,135,255,236,0,56,0,194,255,236,0,56,0,196,255,236,0,56,0,198,255,236,0,56,1,67,255,236,0,56,2,8,255,215,0,56,2,12,255,215,0,56,2,88,255,236,0,56,3,29,255,236,0,56,3,31,255,236,0,56,3,33,255,236,0,56,3,35,255,236,0,56,3,37,255,236,0,56,3,39,255,236,0,56,3,41,255,236,0,56,3,43,255,236,0,56,3,45,255,236,0,56,3,47,255,236,0,56,3,49,255,236,0,56,3,51,255,236,0,57,0,15,255,154,0,57,0,17,255,154,0,57,0,34,0,41,0,57,0,36,255,174,0,57,0,38,255,236,0,57,0,42,255,236,0,57,0,50,255,236,0,57,0,52,255,236,0,57,0,68,255,215,0,57,0,70,255,215,0,57,0,71,255,215,0,57,0,72,255,215,0,57,0,74,255,236,0,57,0,80,255,236,0,57,0,81,255,236,0,57,0,82,255,215,0,57,0,83,255,236,0,57,0,84,255,215,0,57,0,85,255,236,0,57,0,86,255,236,0,57,0,88,255,236,0,57,0,130,255,174,0,57,0,131,255,174,0,57,0,132,255,174,0,57,0,133,255,174,0,57,0,134,255,174,0,57,0,135,255,174,0,57,0,137,255,236,0,57,0,148,255,236,0,57,0,149,255,236,0,57,0,150,255,236,0,57,0,151,255,236,0,57,0,152,255,236,0,57,0,154,255,236,0,57,0,162,255,215,0,57,0,163,255,215,0,57,0,164,255,215,0,57,0,165,255,215,0,57,0,166,255,215,0,57,0,167,255,215,0,57,0,168,255,215,0,57,0,169,255,215,0,57,0,170,255,215,0,57,0,171,255,215,0,57,0,172,255,215,0,57,0,173,255,215,0,57,0,180,255,215,0,57,0,181,255,215,0,57,0,182,255,215,0,57,0,183,255,215,0,57,0,184,255,215,0,57,0,186,255,215,0,57,0,187,255,236,0,57,0,188,255,236,0,57,0,189,255,236,0,57,0,190,255,236,0,57,0,194,255,174,0,57,0,195,255,215,0,57,0,196,255,174,0,57,0,197,255,215,0,57,0,198,255,174,0,57,0,199,255,215,0,57,0,200,255,236,0,57,0,201,255,215,0,57,0,202,255,236,0,57,0,203,255,215,0,57,0,204,255,236,0,57,0,205,255,215,0,57,0,206,255,236,0,57,0,207,255,215,0,57,0,209,255,215,0,57,0,211,255,215,0,57,0,213,255,215,0,57,0,215,255,215,0,57,0,217,255,215,0,57,0,219,255,215,0,57,0,221,255,215,0,57,0,222,255,236,0,57,0,223,255,236,0,57,0,224,255,236,0,57,0,225,255,236,0,57,0,226,255,236,0,57,0,227,255,236,0,57,0,228,255,236,0,57,0,229,255,236,0,57,0,250,255,236,0,57,1,6,255,236,0,57,1,8,255,236,0,57,1,13,255,236,0,57,1,14,255,236,0,57,1,15,255,215,0,57,1,16,255,236,0,57,1,17,255,215,0,57,1,18,255,236,0,57,1,19,255,215,0,57,1,20,255,236,0,57,1,21,255,215,0,57,1,23,255,236,0,57,1,25,255,236,0,57,1,29,255,236,0,57,1,33,255,236,0,57,1,43,255,236,0,57,1,45,255,236,0,57,1,47,255,236,0,57,1,49,255,236,0,57,1,51,255,236,0,57,1,53,255,236,0,57,1,67,255,174,0,57,1,68,255,215,0,57,1,70,255,215,0,57,1,71,255,236,0,57,1,72,255,215,0,57,1,74,255,236,0,57,2,8,255,154,0,57,2,12,255,154,0,57,2,87,255,236,0,57,2,88,255,174,0,57,2,89,255,215,0,57,2,95,255,236,0,57,2,96,255,215,0,57,2,98,255,236,0,57,3,29,255,174,0,57,3,30,255,215,0,57,3,31,255,174,0,57,3,32,255,215,0,57,3,33,255,174,0,57,3,34,255,215,0,57,3,35,255,174,0,57,3,37,255,174,0,57,3,38,255,215,0,57,3,39,255,174,0,57,3,40,255,215,0,57,3,41,255,174,0,57,3,42,255,215,0,57,3,43,255,174,0,57,3,44,255,215,0,57,3,45,255,174,0,57,3,46,255,215,0,57,3,47,255,174,0,57,3,48,255,215,0,57,3,49,255,174,0,57,3,50,255,215,0,57,3,51,255,174,0,57,3,52,255,215,0,57,3,54,255,215,0,57,3,56,255,215,0,57,3,58,255,215,0,57,3,60,255,215,0,57,3,64,255,215,0,57,3,66,255,215,0,57,3,68,255,215,0,57,3,73,255,236,0,57,3,74,255,215,0,57,3,75,255,236,0,57,3,76,255,215,0,57,3,77,255,236,0,57,3,78,255,215,0,57,3,79,255,236,0,57,3,81,255,236,0,57,3,82,255,215,0,57,3,83,255,236,0,57,3,84,255,215,0,57,3,85,255,236,0,57,3,86,255,215,0,57,3,87,255,236,0,57,3,88,255,215,0,57,3,89,255,236,0,57,3,90,255,215,0,57,3,91,255,236,0,57,3,92,255,215,0,57,3,93,255,236,0,57,3,94,255,215,0,57,3,95,255,236,0,57,3,96,255,215,0,57,3,98,255,236,0,57,3,100,255,236,0,57,3,102,255,236,0,57,3,104,255,236,0,57,3,106,255,236,0,57,3,108,255,236,0,57,3,110,255,236,0,58,0,15,255,154,0,58,0,17,255,154,0,58,0,34,0,41,0,58,0,36,255,174,0,58,0,38,255,236,0,58,0,42,255,236,0,58,0,50,255,236,0,58,0,52,255,236,0,58,0,68,255,215,0,58,0,70,255,215,0,58,0,71,255,215,0,58,0,72,255,215,0,58,0,74,255,236,0,58,0,80,255,236,0,58,0,81,255,236,0,58,0,82,255,215,0,58,0,83,255,236,0,58,0,84,255,215,0,58,0,85,255,236,0,58,0,86,255,236,0,58,0,88,255,236,0,58,0,130,255,174,0,58,0,131,255,174,0,58,0,132,255,174,0,58,0,133,255,174,0,58,0,134,255,174,0,58,0,135,255,174,0,58,0,137,255,236,0,58,0,148,255,236,0,58,0,149,255,236,0,58,0,150,255,236,0,58,0,151,255,236,0,58,0,152,255,236,0,58,0,154,255,236,0,58,0,162,255,215,0,58,0,163,255,215,0,58,0,164,255,215,0,58,0,165,255,215,0,58,0,166,255,215,0,58,0,167,255,215,0,58,0,168,255,215,0,58,0,169,255,215,0,58,0,170,255,215,0,58,0,171,255,215,0,58,0,172,255,215,0,58,0,173,255,215,0,58,0,180,255,215,0,58,0,181,255,215,0,58,0,182,255,215,0,58,0,183,255,215,0,58,0,184,255,215,0,58,0,186,255,215,0,58,0,187,255,236,0,58,0,188,255,236,0,58,0,189,255,236,0,58,0,190,255,236,0,58,0,194,255,174,0,58,0,195,255,215,0,58,0,196,255,174,0,58,0,197,255,215,0,58,0,198,255,174,0,58,0,199,255,215,0,58,0,200,255,236,0,58,0,201,255,215,0,58,0,202,255,236,0,58,0,203,255,215,0,58,0,204,255,236,0,58,0,205,255,215,0,58,0,206,255,236,0,58,0,207,255,215,0,58,0,209,255,215,0,58,0,211,255,215,0,58,0,213,255,215,0,58,0,215,255,215,0,58,0,217,255,215,0,58,0,219,255,215,0,58,0,221,255,215,0,58,0,222,255,236,0,58,0,223,255,236,0,58,0,224,255,236,0,58,0,225,255,236,0,58,0,226,255,236,0,58,0,227,255,236,0,58,0,228,255,236,0,58,0,229,255,236,0,58,0,250,255,236,0,58,1,6,255,236,0,58,1,8,255,236,0,58,1,13,255,236,0,58,1,14,255,236,0,58,1,15,255,215,0,58,1,16,255,236,0,58,1,17,255,215,0,58,1,18,255,236,0,58,1,19,255,215,0,58,1,20,255,236,0,58,1,21,255,215,0,58,1,23,255,236,0,58,1,25,255,236,0,58,1,29,255,236,0,58,1,33,255,236,0,58,1,43,255,236,0,58,1,45,255,236,0,58,1,47,255,236,0,58,1,49,255,236,0,58,1,51,255,236,0,58,1,53,255,236,0,58,1,67,255,174,0,58,1,68,255,215,0,58,1,70,255,215,0,58,1,71,255,236,0,58,1,72,255,215,0,58,1,74,255,236,0,58,2,8,255,154,0,58,2,12,255,154,0,58,2,87,255,236,0,58,2,88,255,174,0,58,2,89,255,215,0,58,2,95,255,236,0,58,2,96,255,215,0,58,2,98,255,236,0,58,3,29,255,174,0,58,3,30,255,215,0,58,3,31,255,174,0,58,3,32,255,215,0,58,3,33,255,174,0,58,3,34,255,215,0,58,3,35,255,174,0,58,3,37,255,174,0,58,3,38,255,215,0,58,3,39,255,174,0,58,3,40,255,215,0,58,3,41,255,174,0,58,3,42,255,215,0,58,3,43,255,174,0,58,3,44,255,215,0,58,3,45,255,174,0,58,3,46,255,215,0,58,3,47,255,174,0,58,3,48,255,215,0,58,3,49,255,174,0,58,3,50,255,215,0,58,3,51,255,174,0,58,3,52,255,215,0,58,3,54,255,215,0,58,3,56,255,215,0,58,3,58,255,215,0,58,3,60,255,215,0,58,3,64,255,215,0,58,3,66,255,215,0,58,3,68,255,215,0,58,3,73,255,236,0,58,3,74,255,215,0,58,3,75,255,236,0,58,3,76,255,215,0,58,3,77,255,236,0,58,3,78,255,215,0,58,3,79,255,236,0,58,3,81,255,236,0,58,3,82,255,215,0,58,3,83,255,236,0,58,3,84,255,215,0,58,3,85,255,236,0,58,3,86,255,215,0,58,3,87,255,236,0,58,3,88,255,215,0,58,3,89,255,236,0,58,3,90,255,215,0,58,3,91,255,236,0,58,3,92,255,215,0,58,3,93,255,236,0,58,3,94,255,215,0,58,3,95,255,236,0,58,3,96,255,215,0,58,3,98,255,236,0,58,3,100,255,236,0,58,3,102,255,236,0,58,3,104,255,236,0,58,3,106,255,236,0,58,3,108,255,236,0,58,3,110,255,236,0,59,0,38,255,215,0,59,0,42,255,215,0,59,0,50,255,215,0,59,0,52,255,215,0,59,0,137,255,215,0,59,0,148,255,215,0,59,0,149,255,215,0,59,0,150,255,215,0,59,0,151,255,215,0,59,0,152,255,215,0,59,0,154,255,215,0,59,0,200,255,215,0,59,0,202,255,215,0,59,0,204,255,215,0,59,0,206,255,215,0,59,0,222,255,215,0,59,0,224,255,215,0,59,0,226,255,215,0,59,0,228,255,215,0,59,1,14,255,215,0,59,1,16,255,215,0,59,1,18,255,215,0,59,1,20,255,215,0,59,1,71,255,215,0,59,2,95,255,215,0,59,3,73,255,215,0,59,3,75,255,215,0,59,3,77,255,215,0,59,3,79,255,215,0,59,3,81,255,215,0,59,3,83,255,215,0,59,3,85,255,215,0,59,3,87,255,215,0,59,3,89,255,215,0,59,3,91,255,215,0,59,3,93,255,215,0,59,3,95,255,215,0,60,0,15,255,133,0,60,0,17,255,133,0,60,0,34,0,41,0,60,0,36,255,133,0,60,0,38,255,215,0,60,0,42,255,215,0,60,0,50,255,215,0,60,0,52,255,215,0,60,0,68,255,154,0,60,0,70,255,154,0,60,0,71,255,154,0,60,0,72,255,154,0,60,0,74,255,215,0,60,0,80,255,195,0,60,0,81,255,195,0,60,0,82,255,154,0,60,0,83,255,195,0,60,0,84,255,154,0,60,0,85,255,195,0,60,0,86,255,174,0,60,0,88,255,195,0,60,0,93,255,215,0,60,0,130,255,133,0,60,0,131,255,133,0,60,0,132,255,133,0,60,0,133,255,133,0,60,0,134,255,133,0,60,0,135,255,133,0,60,0,137,255,215,0,60,0,148,255,215,0,60,0,149,255,215,0,60,0,150,255,215,0,60,0,151,255,215,0,60,0,152,255,215,0,60,0,154,255,215,0,60,0,162,255,154,0,60,0,163,255,154,0,60,0,164,255,154,0,60,0,165,255,154,0,60,0,166,255,154,0,60,0,167,255,154,0,60,0,168,255,154,0,60,0,169,255,154,0,60,0,170,255,154,0,60,0,171,255,154,0,60,0,172,255,154,0,60,0,173,255,154,0,60,0,180,255,154,0,60,0,181,255,154,0,60,0,182,255,154,0,60,0,183,255,154,0,60,0,184,255,154,0,60,0,186,255,154,0,60,0,187,255,195,0,60,0,188,255,195,0,60,0,189,255,195,0,60,0,190,255,195,0,60,0,194,255,133,0,60,0,195,255,154,0,60,0,196,255,133,0,60,0,197,255,154,0,60,0,198,255,133,0,60,0,199,255,154,0,60,0,200,255,215,0,60,0,201,255,154,0,60,0,202,255,215,0,60,0,203,255,154,0,60,0,204,255,215,0,60,0,205,255,154,0,60,0,206,255,215,0,60,0,207,255,154,0,60,0,209,255,154,0,60,0,211,255,154,0,60,0,213,255,154,0,60,0,215,255,154,0,60,0,217,255,154,0,60,0,219,255,154,0,60,0,221,255,154,0,60,0,222,255,215,0,60,0,223,255,215,0,60,0,224,255,215,0,60,0,225,255,215,0,60,0,226,255,215,0,60,0,227,255,215,0,60,0,228,255,215,0,60,0,229,255,215,0,60,0,250,255,195,0,60,1,6,255,195,0,60,1,8,255,195,0,60,1,13,255,195,0,60,1,14,255,215,0,60,1,15,255,154,0,60,1,16,255,215,0,60,1,17,255,154,0,60,1,18,255,215,0,60,1,19,255,154,0,60,1,20,255,215,0,60,1,21,255,154,0,60,1,23,255,195,0,60,1,25,255,195,0,60,1,29,255,174,0,60,1,33,255,174,0,60,1,43,255,195,0,60,1,45,255,195,0,60,1,47,255,195,0,60,1,49,255,195,0,60,1,51,255,195,0,60,1,53,255,195,0,60,1,60,255,215,0,60,1,62,255,215,0,60,1,64,255,215,0,60,1,67,255,133,0,60,1,68,255,154,0,60,1,70,255,154,0,60,1,71,255,215,0,60,1,72,255,154,0,60,1,74,255,174,0,60,2,8,255,133,0,60,2,12,255,133,0,60,2,87,255,195,0,60,2,88,255,133,0,60,2,89,255,154,0,60,2,95,255,215,0,60,2,96,255,154,0,60,2,98,255,195,0,60,3,29,255,133,0,60,3,30,255,154,0,60,3,31,255,133,0,60,3,32,255,154,0,60,3,33,255,133,0,60,3,34,255,154,0,60,3,35,255,133,0,60,3,37,255,133,0,60,3,38,255,154,0,60,3,39,255,133,0,60,3,40,255,154,0,60,3,41,255,133,0,60,3,42,255,154,0,60,3,43,255,133,0,60,3,44,255,154,0,60,3,45,255,133,0,60,3,46,255,154,0,60,3,47,255,133,0,60,3,48,255,154,0,60,3,49,255,133,0,60,3,50,255,154,0,60,3,51,255,133,0,60,3,52,255,154,0,60,3,54,255,154,0,60,3,56,255,154,0,60,3,58,255,154,0,60,3,60,255,154,0,60,3,64,255,154,0,60,3,66,255,154,0,60,3,68,255,154,0,60,3,73,255,215,0,60,3,74,255,154,0,60,3,75,255,215,0,60,3,76,255,154,0,60,3,77,255,215,0,60,3,78,255,154,0,60,3,79,255,215,0,60,3,81,255,215,0,60,3,82,255,154,0,60,3,83,255,215,0,60,3,84,255,154,0,60,3,85,255,215,0,60,3,86,255,154,0,60,3,87,255,215,0,60,3,88,255,154,0,60,3,89,255,215,0,60,3,90,255,154,0,60,3,91,255,215,0,60,3,92,255,154,0,60,3,93,255,215,0,60,3,94,255,154,0,60,3,95,255,215,0,60,3,96,255,154,0,60,3,98,255,195,0,60,3,100,255,195,0,60,3,102,255,195,0,60,3,104,255,195,0,60,3,106,255,195,0,60,3,108,255,195,0,60,3,110,255,195,0,61,0,38,255,236,0,61,0,42,255,236,0,61,0,50,255,236,0,61,0,52,255,236,0,61,0,137,255,236,0,61,0,148,255,236,0,61,0,149,255,236,0,61,0,150,255,236,0,61,0,151,255,236,0,61,0,152,255,236,0,61,0,154,255,236,0,61,0,200,255,236,0,61,0,202,255,236,0,61,0,204,255,236,0,61,0,206,255,236,0,61,0,222,255,236,0,61,0,224,255,236,0,61,0,226,255,236,0,61,0,228,255,236,0,61,1,14,255,236,0,61,1,16,255,236,0,61,1,18,255,236,0,61,1,20,255,236,0,61,1,71,255,236,0,61,2,95,255,236,0,61,3,73,255,236,0,61,3,75,255,236,0,61,3,77,255,236,0,61,3,79,255,236,0,61,3,81,255,236,0,61,3,83,255,236,0,61,3,85,255,236,0,61,3,87,255,236,0,61,3,89,255,236,0,61,3,91,255,236,0,61,3,93,255,236,0,61,3,95,255,236,0,62,0,45,0,184,0,68,0,5,255,236,0,68,0,10,255,236,0,68,2,7,255,236,0,68,2,11,255,236,0,69,0,5,255,236,0,69,0,10,255,236,0,69,0,89,255,215,0,69,0,90,255,215,0,69,0,91,255,215,0,69,0,92,255,215,0,69,0,93,255,236,0,69,0,191,255,215,0,69,1,55,255,215,0,69,1,60,255,236,0,69,1,62,255,236,0,69,1,64,255,236,0,69,1,251,255,215,0,69,1,253,255,215,0,69,2,7,255,236,0,69,2,11,255,236,0,69,3,112,255,215,0,70,0,5,0,41,0,70,0,10,0,41,0,70,2,7,0,41,0,70,2,11,0,41,0,72,0,5,255,236,0,72,0,10,255,236,0,72,0,89,255,215,0,72,0,90,255,215,0,72,0,91,255,215,0,72,0,92,255,215,0,72,0,93,255,236,0,72,0,191,255,215,0,72,1,55,255,215,0,72,1,60,255,236,0,72,1,62,255,236,0,72,1,64,255,236,0,72,1,251,255,215,0,72,1,253,255,215,0,72,2,7,255,236,0,72,2,11,255,236,0,72,3,112,255,215,0,73,0,5,0,123,0,73,0,10,0,123,0,73,2,7,0,123,0,73,2,11,0,123,0,75,0,5,255,236,0,75,0,10,255,236,0,75,2,7,255,236,0,75,2,11,255,236,0,78,0,70,255,215,0,78,0,71,255,215,0,78,0,72,255,215,0,78,0,82,255,215,0,78,0,84,255,215,0,78,0,162,255,215,0,78,0,169,255,215,0,78,0,170,255,215,0,78,0,171,255,215,0,78,0,172,255,215,0,78,0,173,255,215,0,78,0,180,255,215,0,78,0,181,255,215,0,78,0,182,255,215,0,78,0,183,255,215,0,78,0,184,255,215,0,78,0,186,255,215,0,78,0,201,255,215,0,78,0,203,255,215,0,78,0,205,255,215,0,78,0,207,255,215,0,78,0,209,255,215,0,78,0,211,255,215,0,78,0,213,255,215,0,78,0,215,255,215,0,78,0,217,255,215,0,78,0,219,255,215,0,78,0,221,255,215,0,78,1,15,255,215,0,78,1,17,255,215,0,78,1,19,255,215,0,78,1,21,255,215,0,78,1,72,255,215,0,78,2,96,255,215,0,78,3,54,255,215,0,78,3,56,255,215,0,78,3,58,255,215,0,78,3,60,255,215,0,78,3,64,255,215,0,78,3,66,255,215,0,78,3,68,255,215,0,78,3,74,255,215,0,78,3,76,255,215,0,78,3,78,255,215,0,78,3,82,255,215,0,78,3,84,255,215,0,78,3,86,255,215,0,78,3,88,255,215,0,78,3,90,255,215,0,78,3,92,255,215,0,78,3,94,255,215,0,78,3,96,255,215,0,80,0,5,255,236,0,80,0,10,255,236,0,80,2,7,255,236,0,80,2,11,255,236,0,81,0,5,255,236,0,81,0,10,255,236,0,81,2,7,255,236,0,81,2,11,255,236,0,82,0,5,255,236,0,82,0,10,255,236,0,82,0,89,255,215,0,82,0,90,255,215,0,82,0,91,255,215,0,82,0,92,255,215,0,82,0,93,255,236,0,82,0,191,255,215,0,82,1,55,255,215,0,82,1,60,255,236,0,82,1,62,255,236,0,82,1,64,255,236,0,82,1,251,255,215,0,82,1,253,255,215,0,82,2,7,255,236,0,82,2,11,255,236,0,82,3,112,255,215,0,83,0,5,255,236,0,83,0,10,255,236,0,83,0,89,255,215,0,83,0,90,255,215,0,83,0,91,255,215,0,83,0,92,255,215,0,83,0,93,255,236,0,83,0,191,255,215,0,83,1,55,255,215,0,83,1,60,255,236,0,83,1,62,255,236,0,83,1,64,255,236,0,83,1,251,255,215,0,83,1,253,255,215,0,83,2,7,255,236,0,83,2,11,255,236,0,83,3,112,255,215,0,85,0,5,0,82,0,85,0,10,0,82,0,85,0,68,255,215,0,85,0,70,255,215,0,85,0,71,255,215,0,85,0,72,255,215,0,85,0,74,255,236,0,85,0,82,255,215,0,85,0,84,255,215,0,85,0,162,255,215,0,85,0,163,255,215,0,85,0,164,255,215,0,85,0,165,255,215,0,85,0,166,255,215,0,85,0,167,255,215,0,85,0,168,255,215,0,85,0,169,255,215,0,85,0,170,255,215,0,85,0,171,255,215,0,85,0,172,255,215,0,85,0,173,255,215,0,85,0,180,255,215,0,85,0,181,255,215,0,85,0,182,255,215,0,85,0,183,255,215,0,85,0,184,255,215,0,85,0,186,255,215,0,85,0,195,255,215,0,85,0,197,255,215,0,85,0,199,255,215,0,85,0,201,255,215,0,85,0,203,255,215,0,85,0,205,255,215,0,85,0,207,255,215,0,85,0,209,255,215,0,85,0,211,255,215,0,85,0,213,255,215,0,85,0,215,255,215,0,85,0,217,255,215,0,85,0,219,255,215,0,85,0,221,255,215,0,85,0,223,255,236,0,85,0,225,255,236,0,85,0,227,255,236,0,85,0,229,255,236,0,85,1,15,255,215,0,85,1,17,255,215,0,85,1,19,255,215,0,85,1,21,255,215,0,85,1,68,255,215,0,85,1,70,255,215,0,85,1,72,255,215,0,85,2,7,0,82,0,85,2,11,0,82,0,85,2,89,255,215,0,85,2,96,255,215,0,85,3,30,255,215,0,85,3,32,255,215,0,85,3,34,255,215,0,85,3,38,255,215,0,85,3,40,255,215,0,85,3,42,255,215,0,85,3,44,255,215,0,85,3,46,255,215,0,85,3,48,255,215,0,85,3,50,255,215,0,85,3,52,255,215,0,85,3,54,255,215,0,85,3,56,255,215,0,85,3,58,255,215,0,85,3,60,255,215,0,85,3,64,255,215,0,85,3,66,255,215,0,85,3,68,255,215,0,85,3,74,255,215,0,85,3,76,255,215,0,85,3,78,255,215,0,85,3,82,255,215,0,85,3,84,255,215,0,85,3,86,255,215,0,85,3,88,255,215,0,85,3,90,255,215,0,85,3,92,255,215,0,85,3,94,255,215,0,85,3,96,255,215,0,87,0,5,0,41,0,87,0,10,0,41,0,87,2,7,0,41,0,87,2,11,0,41,0,89,0,5,0,82,0,89,0,10,0,82,0,89,0,15,255,174,0,89,0,17,255,174,0,89,0,34,0,41,0,89,2,7,0,82,0,89,2,8,255,174,0,89,2,11,0,82,0,89,2,12,255,174,0,90,0,5,0,82,0,90,0,10,0,82,0,90,0,15,255,174,0,90,0,17,255,174,0,90,0,34,0,41,0,90,2,7,0,82,0,90,2,8,255,174,0,90,2,11,0,82,0,90,2,12,255,174,0,91,0,70,255,215,0,91,0,71,255,215,0,91,0,72,255,215,0,91,0,82,255,215,0,91,0,84,255,215,0,91,0,162,255,215,0,91,0,169,255,215,0,91,0,170,255,215,0,91,0,171,255,215,0,91,0,172,255,215,0,91,0,173,255,215,0,91,0,180,255,215,0,91,0,181,255,215,0,91,0,182,255,215,0,91,0,183,255,215,0,91,0,184,255,215,0,91,0,186,255,215,0,91,0,201,255,215,0,91,0,203,255,215,0,91,0,205,255,215,0,91,0,207,255,215,0,91,0,209,255,215,0,91,0,211,255,215,0,91,0,213,255,215,0,91,0,215,255,215,0,91,0,217,255,215,0,91,0,219,255,215,0,91,0,221,255,215,0,91,1,15,255,215,0,91,1,17,255,215,0,91,1,19,255,215,0,91,1,21,255,215,0,91,1,72,255,215,0,91,2,96,255,215,0,91,3,54,255,215,0,91,3,56,255,215,0,91,3,58,255,215,0,91,3,60,255,215,0,91,3,64,255,215,0,91,3,66,255,215,0,91,3,68,255,215,0,91,3,74,255,215,0,91,3,76,255,215,0,91,3,78,255,215,0,91,3,82,255,215,0,91,3,84,255,215,0,91,3,86,255,215,0,91,3,88,255,215,0,91,3,90,255,215,0,91,3,92,255,215,0,91,3,94,255,215,0,91,3,96,255,215,0,92,0,5,0,82,0,92,0,10,0,82,0,92,0,15,255,174,0,92,0,17,255,174,0,92,0,34,0,41,0,92,2,7,0,82,0,92,2,8,255,174,0,92,2,11,0,82,0,92,2,12,255,174,0,94,0,45,0,184,0,130,0,5,255,113,0,130,0,10,255,113,0,130,0,38,255,215,0,130,0,42,255,215,0,130,0,45,1,10,0,130,0,50,255,215,0,130,0,52,255,215,0,130,0,55,255,113,0,130,0,57,255,174,0,130,0,58,255,174,0,130,0,60,255,133,0,130,0,137,255,215,0,130,0,148,255,215,0,130,0,149,255,215,0,130,0,150,255,215,0,130,0,151,255,215,0,130,0,152,255,215,0,130,0,154,255,215,0,130,0,159,255,133,0,130,0,200,255,215,0,130,0,202,255,215,0,130,0,204,255,215,0,130,0,206,255,215,0,130,0,222,255,215,0,130,0,224,255,215,0,130,0,226,255,215,0,130,0,228,255,215,0,130,1,14,255,215,0,130,1,16,255,215,0,130,1,18,255,215,0,130,1,20,255,215,0,130,1,36,255,113,0,130,1,38,255,113,0,130,1,54,255,174,0,130,1,56,255,133,0,130,1,58,255,133,0,130,1,71,255,215,0,130,1,250,255,174,0,130,1,252,255,174,0,130,1,254,255,174,0,130,2,0,255,133,0,130,2,7,255,113,0,130,2,11,255,113,0,130,2,95,255,215,0,130,3,73,255,215,0,130,3,75,255,215,0,130,3,77,255,215,0,130,3,79,255,215,0,130,3,81,255,215,0,130,3,83,255,215,0,130,3,85,255,215,0,130,3,87,255,215,0,130,3,89,255,215,0,130,3,91,255,215,0,130,3,93,255,215,0,130,3,95,255,215,0,130,3,111,255,133,0,130,3,113,255,133,0,130,3,115,255,133,0,130,3,143,255,113,0,131,0,5,255,113,0,131,0,10,255,113,0,131,0,38,255,215,0,131,0,42,255,215,0,131,0,45,1,10,0,131,0,50,255,215,0,131,0,52,255,215,0,131,0,55,255,113,0,131,0,57,255,174,0,131,0,58,255,174,0,131,0,60,255,133,0,131,0,137,255,215,0,131,0,148,255,215,0,131,0,149,255,215,0,131,0,150,255,215,0,131,0,151,255,215,0,131,0,152,255,215,0,131,0,154,255,215,0,131,0,159,255,133,0,131,0,200,255,215,0,131,0,202,255,215,0,131,0,204,255,215,0,131,0,206,255,215,0,131,0,222,255,215,0,131,0,224,255,215,0,131,0,226,255,215,0,131,0,228,255,215,0,131,1,14,255,215,0,131,1,16,255,215,0,131,1,18,255,215,0,131,1,20,255,215,0,131,1,36,255,113,0,131,1,38,255,113,0,131,1,54,255,174,0,131,1,56,255,133,0,131,1,58,255,133,0,131,1,71,255,215,0,131,1,250,255,174,0,131,1,252,255,174,0,131,1,254,255,174,0,131,2,0,255,133,0,131,2,7,255,113,0,131,2,11,255,113,0,131,2,95,255,215,0,131,3,73,255,215,0,131,3,75,255,215,0,131,3,77,255,215,0,131,3,79,255,215,0,131,3,81,255,215,0,131,3,83,255,215,0,131,3,85,255,215,0,131,3,87,255,215,0,131,3,89,255,215,0,131,3,91,255,215,0,131,3,93,255,215,0,131,3,95,255,215,0,131,3,111,255,133,0,131,3,113,255,133,0,131,3,115,255,133,0,131,3,143,255,113,0,132,0,5,255,113,0,132,0,10,255,113,0,132,0,38,255,215,0,132,0,42,255,215,0,132,0,45,1,10,0,132,0,50,255,215,0,132,0,52,255,215,0,132,0,55,255,113,0,132,0,57,255,174,0,132,0,58,255,174,0,132,0,60,255,133,0,132,0,137,255,215,0,132,0,148,255,215,0,132,0,149,255,215,0,132,0,150,255,215,0,132,0,151,255,215,0,132,0,152,255,215,0,132,0,154,255,215,0,132,0,159,255,133,0,132,0,200,255,215,0,132,0,202,255,215,0,132,0,204,255,215,0,132,0,206,255,215,0,132,0,222,255,215,0,132,0,224,255,215,0,132,0,226,255,215,0,132,0,228,255,215,0,132,1,14,255,215,0,132,1,16,255,215,0,132,1,18,255,215,0,132,1,20,255,215,0,132,1,36,255,113,0,132,1,38,255,113,0,132,1,54,255,174,0,132,1,56,255,133,0,132,1,58,255,133,0,132,1,71,255,215,0,132,1,250,255,174,0,132,1,252,255,174,0,132,1,254,255,174,0,132,2,0,255,133,0,132,2,7,255,113,0,132,2,11,255,113,0,132,2,95,255,215,0,132,3,73,255,215,0,132,3,75,255,215,0,132,3,77,255,215,0,132,3,79,255,215,0,132,3,81,255,215,0,132,3,83,255,215,0,132,3,85,255,215,0,132,3,87,255,215,0,132,3,89,255,215,0,132,3,91,255,215,0,132,3,93,255,215,0,132,3,95,255,215,0,132,3,111,255,133,0,132,3,113,255,133,0,132,3,115,255,133,0,132,3,143,255,113,0,133,0,5,255,113,0,133,0,10,255,113,0,133,0,38,255,215,0,133,0,42,255,215,0,133,0,45,1,10,0,133,0,50,255,215,0,133,0,52,255,215,0,133,0,55,255,113,0,133,0,57,255,174,0,133,0,58,255,174,0,133,0,60,255,133,0,133,0,137,255,215,0,133,0,148,255,215,0,133,0,149,255,215,0,133,0,150,255,215,0,133,0,151,255,215,0,133,0,152,255,215,0,133,0,154,255,215,0,133,0,159,255,133,0,133,0,200,255,215,0,133,0,202,255,215,0,133,0,204,255,215,0,133,0,206,255,215,0,133,0,222,255,215,0,133,0,224,255,215,0,133,0,226,255,215,0,133,0,228,255,215,0,133,1,14,255,215,0,133,1,16,255,215,0,133,1,18,255,215,0,133,1,20,255,215,0,133,1,36,255,113,0,133,1,38,255,113,0,133,1,54,255,174,0,133,1,56,255,133,0,133,1,58,255,133,0,133,1,71,255,215,0,133,1,250,255,174,0,133,1,252,255,174,0,133,1,254,255,174,0,133,2,0,255,133,0,133,2,7,255,113,0,133,2,11,255,113,0,133,2,95,255,215,0,133,3,73,255,215,0,133,3,75,255,215,0,133,3,77,255,215,0,133,3,79,255,215,0,133,3,81,255,215,0,133,3,83,255,215,0,133,3,85,255,215,0,133,3,87,255,215,0,133,3,89,255,215,0,133,3,91,255,215,0,133,3,93,255,215,0,133,3,95,255,215,0,133,3,111,255,133,0,133,3,113,255,133,0,133,3,115,255,133,0,133,3,143,255,113,0,134,0,5,255,113,0,134,0,10,255,113,0,134,0,38,255,215,0,134,0,42,255,215,0,134,0,45,1,10,0,134,0,50,255,215,0,134,0,52,255,215,0,134,0,55,255,113,0,134,0,57,255,174,0,134,0,58,255,174,0,134,0,60,255,133,0,134,0,137,255,215,0,134,0,148,255,215,0,134,0,149,255,215,0,134,0,150,255,215,0,134,0,151,255,215,0,134,0,152,255,215,0,134,0,154,255,215,0,134,0,159,255,133,0,134,0,200,255,215,0,134,0,202,255,215,0,134,0,204,255,215,0,134,0,206,255,215,0,134,0,222,255,215,0,134,0,224,255,215,0,134,0,226,255,215,0,134,0,228,255,215,0,134,1,14,255,215,0,134,1,16,255,215,0,134,1,18,255,215,0,134,1,20,255,215,0,134,1,36,255,113,0,134,1,38,255,113,0,134,1,54,255,174,0,134,1,56,255,133,0,134,1,58,255,133,0,134,1,71,255,215,0,134,1,250,255,174,0,134,1,252,255,174,0,134,1,254,255,174,0,134,2,0,255,133,0,134,2,7,255,113,0,134,2,11,255,113,0,134,2,95,255,215,0,134,3,73,255,215,0,134,3,75,255,215,0,134,3,77,255,215,0,134,3,79,255,215,0,134,3,81,255,215,0,134,3,83,255,215,0,134,3,85,255,215,0,134,3,87,255,215,0,134,3,89,255,215,0,134,3,91,255,215,0,134,3,93,255,215,0,134,3,95,255,215,0,134,3,111,255,133,0,134,3,113,255,133,0,134,3,115,255,133,0,134,3,143,255,113,0,135,0,5,255,113,0,135,0,10,255,113,0,135,0,38,255,215,0,135,0,42,255,215,0,135,0,45,1,10,0,135,0,50,255,215,0,135,0,52,255,215,0,135,0,55,255,113,0,135,0,57,255,174,0,135,0,58,255,174,0,135,0,60,255,133,0,135,0,137,255,215,0,135,0,148,255,215,0,135,0,149,255,215,0,135,0,150,255,215,0,135,0,151,255,215,0,135,0,152,255,215,0,135,0,154,255,215,0,135,0,159,255,133,0,135,0,200,255,215,0,135,0,202,255,215,0,135,0,204,255,215,0,135,0,206,255,215,0,135,0,222,255,215,0,135,0,224,255,215,0,135,0,226,255,215,0,135,0,228,255,215,0,135,1,14,255,215,0,135,1,16,255,215,0,135,1,18,255,215,0,135,1,20,255,215,0,135,1,36,255,113,0,135,1,38,255,113,0,135,1,54,255,174,0,135,1,56,255,133,0,135,1,58,255,133,0,135,1,71,255,215,0,135,1,250,255,174,0,135,1,252,255,174,0,135,1,254,255,174,0,135,2,0,255,133,0,135,2,7,255,113,0,135,2,11,255,113,0,135,2,95,255,215,0,135,3,73,255,215,0,135,3,75,255,215,0,135,3,77,255,215,0,135,3,79,255,215,0,135,3,81,255,215,0,135,3,83,255,215,0,135,3,85,255,215,0,135,3,87,255,215,0,135,3,89,255,215,0,135,3,91,255,215,0,135,3,93,255,215,0,135,3,95,255,215,0,135,3,111,255,133,0,135,3,113,255,133,0,135,3,115,255,133,0,135,3,143,255,113,0,136,0,45,0,123,0,137,0,38,255,215,0,137,0,42,255,215,0,137,0,50,255,215,0,137,0,52,255,215,0,137,0,137,255,215,0,137,0,148,255,215,0,137,0,149,255,215,0,137,0,150,255,215,0,137,0,151,255,215,0,137,0,152,255,215,0,137,0,154,255,215,0,137,0,200,255,215,0,137,0,202,255,215,0,137,0,204,255,215,0,137,0,206,255,215,0,137,0,222,255,215,0,137,0,224,255,215,0,137,0,226,255,215,0,137,0,228,255,215,0,137,1,14,255,215,0,137,1,16,255,215,0,137,1,18,255,215,0,137,1,20,255,215,0,137,1,71,255,215,0,137,2,95,255,215,0,137,3,73,255,215,0,137,3,75,255,215,0,137,3,77,255,215,0,137,3,79,255,215,0,137,3,81,255,215,0,137,3,83,255,215,0,137,3,85,255,215,0,137,3,87,255,215,0,137,3,89,255,215,0,137,3,91,255,215,0,137,3,93,255,215,0,137,3,95,255,215,0,138,0,45,0,123,0,139,0,45,0,123,0,140,0,45,0,123,0,141,0,45,0,123,0,146,0,15,255,174,0,146,0,17,255,174,0,146,0,36,255,215,0,146,0,55,255,195,0,146,0,57,255,236,0,146,0,58,255,236,0,146,0,59,255,215,0,146,0,60,255,236,0,146,0,61,255,236,0,146,0,130,255,215,0,146,0,131,255,215,0,146,0,132,255,215,0,146,0,133,255,215,0,146,0,134,255,215,0,146,0,135,255,215,0,146,0,159,255,236,0,146,0,194,255,215,0,146,0,196,255,215,0,146,0,198,255,215,0,146,1,36,255,195,0,146,1,38,255,195,0,146,1,54,255,236,0,146,1,56,255,236,0,146,1,58,255,236,0,146,1,59,255,236,0,146,1,61,255,236,0,146,1,63,255,236,0,146,1,67,255,215,0,146,1,160,255,236,0,146,1,250,255,236,0,146,1,252,255,236,0,146,1,254,255,236,0,146,2,0,255,236,0,146,2,8,255,174,0,146,2,12,255,174,0,146,2,88,255,215,0,146,3,29,255,215,0,146,3,31,255,215,0,146,3,33,255,215,0,146,3,35,255,215,0,146,3,37,255,215,0,146,3,39,255,215,0,146,3,41,255,215,0,146,3,43,255,215,0,146,3,45,255,215,0,146,3,47,255,215,0,146,3,49,255,215,0,146,3,51,255,215,0,146,3,111,255,236,0,146,3,113,255,236,0,146,3,115,255,236,0,146,3,143,255,195,0,148,0,15,255,174,0,148,0,17,255,174,0,148,0,36,255,215,0,148,0,55,255,195,0,148,0,57,255,236,0,148,0,58,255,236,0,148,0,59,255,215,0,148,0,60,255,236,0,148,0,61,255,236,0,148,0,130,255,215,0,148,0,131,255,215,0,148,0,132,255,215,0,148,0,133,255,215,0,148,0,134,255,215,0,148,0,135,255,215,0,148,0,159,255,236,0,148,0,194,255,215,0,148,0,196,255,215,0,148,0,198,255,215,0,148,1,36,255,195,0,148,1,38,255,195,0,148,1,54,255,236,0,148,1,56,255,236,0,148,1,58,255,236,0,148,1,59,255,236,0,148,1,61,255,236,0,148,1,63,255,236,0,148,1,67,255,215,0,148,1,160,255,236,0,148,1,250,255,236,0,148,1,252,255,236,0,148,1,254,255,236,0,148,2,0,255,236,0,148,2,8,255,174,0,148,2,12,255,174,0,148,2,88,255,215,0,148,3,29,255,215,0,148,3,31,255,215,0,148,3,33,255,215,0,148,3,35,255,215,0,148,3,37,255,215,0,148,3,39,255,215,0,148,3,41,255,215,0,148,3,43,255,215,0,148,3,45,255,215,0,148,3,47,255,215,0,148,3,49,255,215,0,148,3,51,255,215,0,148,3,111,255,236,0,148,3,113,255,236,0,148,3,115,255,236,0,148,3,143,255,195,0,149,0,15,255,174,0,149,0,17,255,174,0,149,0,36,255,215,0,149,0,55,255,195,0,149,0,57,255,236,0,149,0,58,255,236,0,149,0,59,255,215,0,149,0,60,255,236,0,149,0,61,255,236,0,149,0,130,255,215,0,149,0,131,255,215,0,149,0,132,255,215,0,149,0,133,255,215,0,149,0,134,255,215,0,149,0,135,255,215,0,149,0,159,255,236,0,149,0,194,255,215,0,149,0,196,255,215,0,149,0,198,255,215,0,149,1,36,255,195,0,149,1,38,255,195,0,149,1,54,255,236,0,149,1,56,255,236,0,149,1,58,255,236,0,149,1,59,255,236,0,149,1,61,255,236,0,149,1,63,255,236,0,149,1,67,255,215,0,149,1,160,255,236,0,149,1,250,255,236,0,149,1,252,255,236,0,149,1,254,255,236,0,149,2,0,255,236,0,149,2,8,255,174,0,149,2,12,255,174,0,149,2,88,255,215,0,149,3,29,255,215,0,149,3,31,255,215,0,149,3,33,255,215,0,149,3,35,255,215,0,149,3,37,255,215,0,149,3,39,255,215,0,149,3,41,255,215,0,149,3,43,255,215,0,149,3,45,255,215,0,149,3,47,255,215,0,149,3,49,255,215,0,149,3,51,255,215,0,149,3,111,255,236,0,149,3,113,255,236,0,149,3,115,255,236,0,149,3,143,255,195,0,150,0,15,255,174,0,150,0,17,255,174,0,150,0,36,255,215,0,150,0,55,255,195,0,150,0,57,255,236,0,150,0,58,255,236,0,150,0,59,255,215,0,150,0,60,255,236,0,150,0,61,255,236,0,150,0,130,255,215,0,150,0,131,255,215,0,150,0,132,255,215,0,150,0,133,255,215,0,150,0,134,255,215,0,150,0,135,255,215,0,150,0,159,255,236,0,150,0,194,255,215,0,150,0,196,255,215,0,150,0,198,255,215,0,150,1,36,255,195,0,150,1,38,255,195,0,150,1,54,255,236,0,150,1,56,255,236,0,150,1,58,255,236,0,150,1,59,255,236,0,150,1,61,255,236,0,150,1,63,255,236,0,150,1,67,255,215,0,150,1,160,255,236,0,150,1,250,255,236,0,150,1,252,255,236,0,150,1,254,255,236,0,150,2,0,255,236,0,150,2,8,255,174,0,150,2,12,255,174,0,150,2,88,255,215,0,150,3,29,255,215,0,150,3,31,255,215,0,150,3,33,255,215,0,150,3,35,255,215,0,150,3,37,255,215,0,150,3,39,255,215,0,150,3,41,255,215,0,150,3,43,255,215,0,150,3,45,255,215,0,150,3,47,255,215,0,150,3,49,255,215,0,150,3,51,255,215,0,150,3,111,255,236,0,150,3,113,255,236,0,150,3,115,255,236,0,150,3,143,255,195,0,151,0,15,255,174,0,151,0,17,255,174,0,151,0,36,255,215,0,151,0,55,255,195,0,151,0,57,255,236,0,151,0,58,255,236,0,151,0,59,255,215,0,151,0,60,255,236,0,151,0,61,255,236,0,151,0,130,255,215,0,151,0,131,255,215,0,151,0,132,255,215,0,151,0,133,255,215,0,151,0,134,255,215,0,151,0,135,255,215,0,151,0,159,255,236,0,151,0,194,255,215,0,151,0,196,255,215,0,151,0,198,255,215,0,151,1,36,255,195,0,151,1,38,255,195,0,151,1,54,255,236,0,151,1,56,255,236,0,151,1,58,255,236,0,151,1,59,255,236,0,151,1,61,255,236,0,151,1,63,255,236,0,151,1,67,255,215,0,151,1,160,255,236,0,151,1,250,255,236,0,151,1,252,255,236,0,151,1,254,255,236,0,151,2,0,255,236,0,151,2,8,255,174,0,151,2,12,255,174,0,151,2,88,255,215,0,151,3,29,255,215,0,151,3,31,255,215,0,151,3,33,255,215,0,151,3,35,255,215,0,151,3,37,255,215,0,151,3,39,255,215,0,151,3,41,255,215,0,151,3,43,255,215,0,151,3,45,255,215,0,151,3,47,255,215,0,151,3,49,255,215,0,151,3,51,255,215,0,151,3,111,255,236,0,151,3,113,255,236,0,151,3,115,255,236,0,151,3,143,255,195,0,152,0,15,255,174,0,152,0,17,255,174,0,152,0,36,255,215,0,152,0,55,255,195,0,152,0,57,255,236,0,152,0,58,255,236,0,152,0,59,255,215,0,152,0,60,255,236,0,152,0,61,255,236,0,152,0,130,255,215,0,152,0,131,255,215,0,152,0,132,255,215,0,152,0,133,255,215,0,152,0,134,255,215,0,152,0,135,255,215,0,152,0,159,255,236,0,152,0,194,255,215,0,152,0,196,255,215,0,152,0,198,255,215,0,152,1,36,255,195,0,152,1,38,255,195,0,152,1,54,255,236,0,152,1,56,255,236,0,152,1,58,255,236,0,152,1,59,255,236,0,152,1,61,255,236,0,152,1,63,255,236,0,152,1,67,255,215,0,152,1,160,255,236,0,152,1,250,255,236,0,152,1,252,255,236,0,152,1,254,255,236,0,152,2,0,255,236,0,152,2,8,255,174,0,152,2,12,255,174,0,152,2,88,255,215,0,152,3,29,255,215,0,152,3,31,255,215,0,152,3,33,255,215,0,152,3,35,255,215,0,152,3,37,255,215,0,152,3,39,255,215,0,152,3,41,255,215,0,152,3,43,255,215,0,152,3,45,255,215,0,152,3,47,255,215,0,152,3,49,255,215,0,152,3,51,255,215,0,152,3,111,255,236,0,152,3,113,255,236,0,152,3,115,255,236,0,152,3,143,255,195,0,154,0,15,255,174,0,154,0,17,255,174,0,154,0,36,255,215,0,154,0,55,255,195,0,154,0,57,255,236,0,154,0,58,255,236,0,154,0,59,255,215,0,154,0,60,255,236,0,154,0,61,255,236,0,154,0,130,255,215,0,154,0,131,255,215,0,154,0,132,255,215,0,154,0,133,255,215,0,154,0,134,255,215,0,154,0,135,255,215,0,154,0,159,255,236,0,154,0,194,255,215,0,154,0,196,255,215,0,154,0,198,255,215,0,154,1,36,255,195,0,154,1,38,255,195,0,154,1,54,255,236,0,154,1,56,255,236,0,154,1,58,255,236,0,154,1,59,255,236,0,154,1,61,255,236,0,154,1,63,255,236,0,154,1,67,255,215,0,154,1,160,255,236,0,154,1,250,255,236,0,154,1,252,255,236,0,154,1,254,255,236,0,154,2,0,255,236,0,154,2,8,255,174,0,154,2,12,255,174,0,154,2,88,255,215,0,154,3,29,255,215,0,154,3,31,255,215,0,154,3,33,255,215,0,154,3,35,255,215,0,154,3,37,255,215,0,154,3,39,255,215,0,154,3,41,255,215,0,154,3,43,255,215,0,154,3,45,255,215,0,154,3,47,255,215,0,154,3,49,255,215,0,154,3,51,255,215,0,154,3,111,255,236,0,154,3,113,255,236,0,154,3,115,255,236,0,154,3,143,255,195,0,155,0,15,255,215,0,155,0,17,255,215,0,155,0,36,255,236,0,155,0,130,255,236,0,155,0,131,255,236,0,155,0,132,255,236,0,155,0,133,255,236,0,155,0,134,255,236,0,155,0,135,255,236,0,155,0,194,255,236,0,155,0,196,255,236,0,155,0,198,255,236,0,155,1,67,255,236,0,155,2,8,255,215,0,155,2,12,255,215,0,155,2,88,255,236,0,155,3,29,255,236,0,155,3,31,255,236,0,155,3,33,255,236,0,155,3,35,255,236,0,155,3,37,255,236,0,155,3,39,255,236,0,155,3,41,255,236,0,155,3,43,255,236,0,155,3,45,255,236,0,155,3,47,255,236,0,155,3,49,255,236,0,155,3,51,255,236,0,156,0,15,255,215,0,156,0,17,255,215,0,156,0,36,255,236,0,156,0,130,255,236,0,156,0,131,255,236,0,156,0,132,255,236,0,156,0,133,255,236,0,156,0,134,255,236,0,156,0,135,255,236,0,156,0,194,255,236,0,156,0,196,255,236,0,156,0,198,255,236,0,156,1,67,255,236,0,156,2,8,255,215,0,156,2,12,255,215,0,156,2,88,255,236,0,156,3,29,255,236,0,156,3,31,255,236,0,156,3,33,255,236,0,156,3,35,255,236,0,156,3,37,255,236,0,156,3,39,255,236,0,156,3,41,255,236,0,156,3,43,255,236,0,156,3,45,255,236,0,156,3,47,255,236,0,156,3,49,255,236,0,156,3,51,255,236,0,157,0,15,255,215,0,157,0,17,255,215,0,157,0,36,255,236,0,157,0,130,255,236,0,157,0,131,255,236,0,157,0,132,255,236,0,157,0,133,255,236,0,157,0,134,255,236,0,157,0,135,255,236,0,157,0,194,255,236,0,157,0,196,255,236,0,157,0,198,255,236,0,157,1,67,255,236,0,157,2,8,255,215,0,157,2,12,255,215,0,157,2,88,255,236,0,157,3,29,255,236,0,157,3,31,255,236,0,157,3,33,255,236,0,157,3,35,255,236,0,157,3,37,255,236,0,157,3,39,255,236,0,157,3,41,255,236,0,157,3,43,255,236,0,157,3,45,255,236,0,157,3,47,255,236,0,157,3,49,255,236,0,157,3,51,255,236,0,158,0,15,255,215,0,158,0,17,255,215,0,158,0,36,255,236,0,158,0,130,255,236,0,158,0,131,255,236,0,158,0,132,255,236,0,158,0,133,255,236,0,158,0,134,255,236,0,158,0,135,255,236,0,158,0,194,255,236,0,158,0,196,255,236,0,158,0,198,255,236,0,158,1,67,255,236,0,158,2,8,255,215,0,158,2,12,255,215,0,158,2,88,255,236,0,158,3,29,255,236,0,158,3,31,255,236,0,158,3,33,255,236,0,158,3,35,255,236,0,158,3,37,255,236,0,158,3,39,255,236,0,158,3,41,255,236,0,158,3,43,255,236,0,158,3,45,255,236,0,158,3,47,255,236,0,158,3,49,255,236,0,158,3,51,255,236,0,159,0,15,255,133,0,159,0,17,255,133,0,159,0,34,0,41,0,159,0,36,255,133,0,159,0,38,255,215,0,159,0,42,255,215,0,159,0,50,255,215,0,159,0,52,255,215,0,159,0,68,255,154,0,159,0,70,255,154,0,159,0,71,255,154,0,159,0,72,255,154,0,159,0,74,255,215,0,159,0,80,255,195,0,159,0,81,255,195,0,159,0,82,255,154,0,159,0,83,255,195,0,159,0,84,255,154,0,159,0,85,255,195,0,159,0,86,255,174,0,159,0,88,255,195,0,159,0,93,255,215,0,159,0,130,255,133,0,159,0,131,255,133,0,159,0,132,255,133,0,159,0,133,255,133,0,159,0,134,255,133,0,159,0,135,255,133,0,159,0,137,255,215,0,159,0,148,255,215,0,159,0,149,255,215,0,159,0,150,255,215,0,159,0,151,255,215,0,159,0,152,255,215,0,159,0,154,255,215,0,159,0,162,255,154,0,159,0,163,255,154,0,159,0,164,255,154,0,159,0,165,255,154,0,159,0,166,255,154,0,159,0,167,255,154,0,159,0,168,255,154,0,159,0,169,255,154,0,159,0,170,255,154,0,159,0,171,255,154,0,159,0,172,255,154,0,159,0,173,255,154,0,159,0,180,255,154,0,159,0,181,255,154,0,159,0,182,255,154,0,159,0,183,255,154,0,159,0,184,255,154,0,159,0,186,255,154,0,159,0,187,255,195,0,159,0,188,255,195,0,159,0,189,255,195,0,159,0,190,255,195,0,159,0,194,255,133,0,159,0,195,255,154,0,159,0,196,255,133,0,159,0,197,255,154,0,159,0,198,255,133,0,159,0,199,255,154,0,159,0,200,255,215,0,159,0,201,255,154,0,159,0,202,255,215,0,159,0,203,255,154,0,159,0,204,255,215,0,159,0,205,255,154,0,159,0,206,255,215,0,159,0,207,255,154,0,159,0,209,255,154,0,159,0,211,255,154,0,159,0,213,255,154,0,159,0,215,255,154,0,159,0,217,255,154,0,159,0,219,255,154,0,159,0,221,255,154,0,159,0,222,255,215,0,159,0,223,255,215,0,159,0,224,255,215,0,159,0,225,255,215,0,159,0,226,255,215,0,159,0,227,255,215,0,159,0,228,255,215,0,159,0,229,255,215,0,159,0,250,255,195,0,159,1,6,255,195,0,159,1,8,255,195,0,159,1,13,255,195,0,159,1,14,255,215,0,159,1,15,255,154,0,159,1,16,255,215,0,159,1,17,255,154,0,159,1,18,255,215,0,159,1,19,255,154,0,159,1,20,255,215,0,159,1,21,255,154,0,159,1,23,255,195,0,159,1,25,255,195,0,159,1,29,255,174,0,159,1,33,255,174,0,159,1,43,255,195,0,159,1,45,255,195,0,159,1,47,255,195,0,159,1,49,255,195,0,159,1,51,255,195,0,159,1,53,255,195,0,159,1,60,255,215,0,159,1,62,255,215,0,159,1,64,255,215,0,159,1,67,255,133,0,159,1,68,255,154,0,159,1,70,255,154,0,159,1,71,255,215,0,159,1,72,255,154,0,159,1,74,255,174,0,159,2,8,255,133,0,159,2,12,255,133,0,159,2,87,255,195,0,159,2,88,255,133,0,159,2,89,255,154,0,159,2,95,255,215,0,159,2,96,255,154,0,159,2,98,255,195,0,159,3,29,255,133,0,159,3,30,255,154,0,159,3,31,255,133,0,159,3,32,255,154,0,159,3,33,255,133,0,159,3,34,255,154,0,159,3,35,255,133,0,159,3,37,255,133,0,159,3,38,255,154,0,159,3,39,255,133,0,159,3,40,255,154,0,159,3,41,255,133,0,159,3,42,255,154,0,159,3,43,255,133,0,159,3,44,255,154,0,159,3,45,255,133,0,159,3,46,255,154,0,159,3,47,255,133,0,159,3,48,255,154,0,159,3,49,255,133,0,159,3,50,255,154,0,159,3,51,255,133,0,159,3,52,255,154,0,159,3,54,255,154,0,159,3,56,255,154,0,159,3,58,255,154,0,159,3,60,255,154,0,159,3,64,255,154,0,159,3,66,255,154,0,159,3,68,255,154,0,159,3,73,255,215,0,159,3,74,255,154,0,159,3,75,255,215,0,159,3,76,255,154,0,159,3,77,255,215,0,159,3,78,255,154,0,159,3,79,255,215,0,159,3,81,255,215,0,159,3,82,255,154,0,159,3,83,255,215,0,159,3,84,255,154,0,159,3,85,255,215,0,159,3,86,255,154,0,159,3,87,255,215,0,159,3,88,255,154,0,159,3,89,255,215,0,159,3,90,255,154,0,159,3,91,255,215,0,159,3,92,255,154,0,159,3,93,255,215,0,159,3,94,255,154,0,159,3,95,255,215,0,159,3,96,255,154,0,159,3,98,255,195,0,159,3,100,255,195,0,159,3,102,255,195,0,159,3,104,255,195,0,159,3,106,255,195,0,159,3,108,255,195,0,159,3,110,255,195,0,160,0,15,254,246,0,160,0,17,254,246,0,160,0,36,255,154,0,160,0,59,255,215,0,160,0,61,255,236,0,160,0,130,255,154,0,160,0,131,255,154,0,160,0,132,255,154,0,160,0,133,255,154,0,160,0,134,255,154,0,160,0,135,255,154,0,160,0,194,255,154,0,160,0,196,255,154,0,160,0,198,255,154,0,160,1,59,255,236,0,160,1,61,255,236,0,160,1,63,255,236,0,160,1,67,255,154,0,160,2,8,254,246,0,160,2,12,254,246,0,160,2,88,255,154,0,160,3,29,255,154,0,160,3,31,255,154,0,160,3,33,255,154,0,160,3,35,255,154,0,160,3,37,255,154,0,160,3,39,255,154,0,160,3,41,255,154,0,160,3,43,255,154,0,160,3,45,255,154,0,160,3,47,255,154,0,160,3,49,255,154,0,160,3,51,255,154,0,162,0,5,255,236,0,162,0,10,255,236,0,162,2,7,255,236,0,162,2,11,255,236,0,163,0,5,255,236,0,163,0,10,255,236,0,163,2,7,255,236,0,163,2,11,255,236,0,164,0,5,255,236,0,164,0,10,255,236,0,164,2,7,255,236,0,164,2,11,255,236,0,165,0,5,255,236,0,165,0,10,255,236,0,165,2,7,255,236,0,165,2,11,255,236,0,166,0,5,255,236,0,166,0,10,255,236,0,166,2,7,255,236,0,166,2,11,255,236,0,167,0,5,255,236,0,167,0,10,255,236,0,167,2,7,255,236,0,167,2,11,255,236,0,170,0,5,255,236,0,170,0,10,255,236,0,170,0,89,255,215,0,170,0,90,255,215,0,170,0,91,255,215,0,170,0,92,255,215,0,170,0,93,255,236,0,170,0,191,255,215,0,170,1,55,255,215,0,170,1,60,255,236,0,170,1,62,255,236,0,170,1,64,255,236,0,170,1,251,255,215,0,170,1,253,255,215,0,170,2,7,255,236,0,170,2,11,255,236,0,170,3,112,255,215,0,171,0,5,255,236,0,171,0,10,255,236,0,171,0,89,255,215,0,171,0,90,255,215,0,171,0,91,255,215,0,171,0,92,255,215,0,171,0,93,255,236,0,171,0,191,255,215,0,171,1,55,255,215,0,171,1,60,255,236,0,171,1,62,255,236,0,171,1,64,255,236,0,171,1,251,255,215,0,171,1,253,255,215,0,171,2,7,255,236,0,171,2,11,255,236,0,171,3,112,255,215,0,172,0,5,255,236,0,172,0,10,255,236,0,172,0,89,255,215,0,172,0,90,255,215,0,172,0,91,255,215,0,172,0,92,255,215,0,172,0,93,255,236,0,172,0,191,255,215,0,172,1,55,255,215,0,172,1,60,255,236,0,172,1,62,255,236,0,172,1,64,255,236,0,172,1,251,255,215,0,172,1,253,255,215,0,172,2,7,255,236,0,172,2,11,255,236,0,172,3,112,255,215,0,173,0,5,255,236,0,173,0,10,255,236,0,173,0,89,255,215,0,173,0,90,255,215,0,173,0,91,255,215,0,173,0,92,255,215,0,173,0,93,255,236,0,173,0,191,255,215,0,173,1,55,255,215,0,173,1,60,255,236,0,173,1,62,255,236,0,173,1,64,255,236,0,173,1,251,255,215,0,173,1,253,255,215,0,173,2,7,255,236,0,173,2,11,255,236,0,173,3,112,255,215,0,178,0,5,255,236,0,178,0,10,255,236,0,178,0,89,255,215,0,178,0,90,255,215,0,178,0,91,255,215,0,178,0,92,255,215,0,178,0,93,255,236,0,178,0,191,255,215,0,178,1,55,255,215,0,178,1,60,255,236,0,178,1,62,255,236,0,178,1,64,255,236,0,178,1,251,255,215,0,178,1,253,255,215,0,178,2,7,255,236,0,178,2,11,255,236,0,178,3,112,255,215,0,180,0,5,255,236,0,180,0,10,255,236,0,180,0,89,255,215,0,180,0,90,255,215,0,180,0,91,255,215,0,180,0,92,255,215,0,180,0,93,255,236,0,180,0,191,255,215,0,180,1,55,255,215,0,180,1,60,255,236,0,180,1,62,255,236,0,180,1,64,255,236,0,180,1,251,255,215,0,180,1,253,255,215,0,180,2,7,255,236,0,180,2,11,255,236,0,180,3,112,255,215,0,181,0,5,255,236,0,181,0,10,255,236,0,181,0,89,255,215,0,181,0,90,255,215,0,181,0,91,255,215,0,181,0,92,255,215,0,181,0,93,255,236,0,181,0,191,255,215,0,181,1,55,255,215,0,181,1,60,255,236,0,181,1,62,255,236,0,181,1,64,255,236,0,181,1,251,255,215,0,181,1,253,255,215,0,181,2,7,255,236,0,181,2,11,255,236,0,181,3,112,255,215,0,182,0,5,255,236,0,182,0,10,255,236,0,182,0,89,255,215,0,182,0,90,255,215,0,182,0,91,255,215,0,182,0,92,255,215,0,182,0,93,255,236,0,182,0,191,255,215,0,182,1,55,255,215,0,182,1,60,255,236,0,182,1,62,255,236,0,182,1,64,255,236,0,182,1,251,255,215,0,182,1,253,255,215,0,182,2,7,255,236,0,182,2,11,255,236,0,182,3,112,255,215,0,184,0,5,255,215,0,184,0,10,255,215,0,184,2,7,255,215,0,184,2,11,255,215,0,186,0,5,255,236,0,186,0,10,255,236,0,186,0,89,255,215,0,186,0,90,255,215,0,186,0,91,255,215,0,186,0,92,255,215,0,186,0,93,255,236,0,186,0,191,255,215,0,186,1,55,255,215,0,186,1,60,255,236,0,186,1,62,255,236,0,186,1,64,255,236,0,186,1,251,255,215,0,186,1,253,255,215,0,186,2,7,255,236,0,186,2,11,255,236,0,186,3,112,255,215,0,191,0,5,0,82,0,191,0,10,0,82,0,191,0,15,255,174,0,191,0,17,255,174,0,191,0,34,0,41,0,191,2,7,0,82,0,191,2,8,255,174,0,191,2,11,0,82,0,191,2,12,255,174,0,192,0,5,255,236,0,192,0,10,255,236,0,192,0,89,255,215,0,192,0,90,255,215,0,192,0,91,255,215,0,192,0,92,255,215,0,192,0,93,255,236,0,192,0,191,255,215,0,192,1,55,255,215,0,192,1,60,255,236,0,192,1,62,255,236,0,192,1,64,255,236,0,192,1,251,255,215,0,192,1,253,255,215,0,192,2,7,255,236,0,192,2,11,255,236,0,192,3,112,255,215,0,193,0,5,0,82,0,193,0,10,0,82,0,193,0,15,255,174,0,193,0,17,255,174,0,193,0,34,0,41,0,193,2,7,0,82,0,193,2,8,255,174,0,193,2,11,0,82,0,193,2,12,255,174,0,194,0,5,255,113,0,194,0,10,255,113,0,194,0,38,255,215,0,194,0,42,255,215,0,194,0,45,1,10,0,194,0,50,255,215,0,194,0,52,255,215,0,194,0,55,255,113,0,194,0,57,255,174,0,194,0,58,255,174,0,194,0,60,255,133,0,194,0,137,255,215,0,194,0,148,255,215,0,194,0,149,255,215,0,194,0,150,255,215,0,194,0,151,255,215,0,194,0,152,255,215,0,194,0,154,255,215,0,194,0,159,255,133,0,194,0,200,255,215,0,194,0,202,255,215,0,194,0,204,255,215,0,194,0,206,255,215,0,194,0,222,255,215,0,194,0,224,255,215,0,194,0,226,255,215,0,194,0,228,255,215,0,194,1,14,255,215,0,194,1,16,255,215,0,194,1,18,255,215,0,194,1,20,255,215,0,194,1,36,255,113,0,194,1,38,255,113,0,194,1,54,255,174,0,194,1,56,255,133,0,194,1,58,255,133,0,194,1,71,255,215,0,194,1,250,255,174,0,194,1,252,255,174,0,194,1,254,255,174,0,194,2,0,255,133,0,194,2,7,255,113,0,194,2,11,255,113,0,194,2,95,255,215,0,194,3,73,255,215,0,194,3,75,255,215,0,194,3,77,255,215,0,194,3,79,255,215,0,194,3,81,255,215,0,194,3,83,255,215,0,194,3,85,255,215,0,194,3,87,255,215,0,194,3,89,255,215,0,194,3,91,255,215,0,194,3,93,255,215,0,194,3,95,255,215,0,194,3,111,255,133,0,194,3,113,255,133,0,194,3,115,255,133,0,194,3,143,255,113,0,195,0,5,255,236,0,195,0,10,255,236,0,195,2,7,255,236,0,195,2,11,255,236,0,196,0,5,255,113,0,196,0,10,255,113,0,196,0,38,255,215,0,196,0,42,255,215,0,196,0,45,1,10,0,196,0,50,255,215,0,196,0,52,255,215,0,196,0,55,255,113,0,196,0,57,255,174,0,196,0,58,255,174,0,196,0,60,255,133,0,196,0,137,255,215,0,196,0,148,255,215,0,196,0,149,255,215,0,196,0,150,255,215,0,196,0,151,255,215,0,196,0,152,255,215,0,196,0,154,255,215,0,196,0,159,255,133,0,196,0,200,255,215,0,196,0,202,255,215,0,196,0,204,255,215,0,196,0,206,255,215,0,196,0,222,255,215,0,196,0,224,255,215,0,196,0,226,255,215,0,196,0,228,255,215,0,196,1,14,255,215,0,196,1,16,255,215,0,196,1,18,255,215,0,196,1,20,255,215,0,196,1,36,255,113,0,196,1,38,255,113,0,196,1,54,255,174,0,196,1,56,255,133,0,196,1,58,255,133,0,196,1,71,255,215,0,196,1,250,255,174,0,196,1,252,255,174,0,196,1,254,255,174,0,196,2,0,255,133,0,196,2,7,255,113,0,196,2,11,255,113,0,196,2,95,255,215,0,196,3,73,255,215,0,196,3,75,255,215,0,196,3,77,255,215,0,196,3,79,255,215,0,196,3,81,255,215,0,196,3,83,255,215,0,196,3,85,255,215,0,196,3,87,255,215,0,196,3,89,255,215,0,196,3,91,255,215,0,196,3,93,255,215,0,196,3,95,255,215,0,196,3,111,255,133,0,196,3,113,255,133,0,196,3,115,255,133,0,196,3,143,255,113,0,197,0,5,255,236,0,197,0,10,255,236,0,197,2,7,255,236,0,197,2,11,255,236,0,198,0,5,255,113,0,198,0,10,255,113,0,198,0,38,255,215,0,198,0,42,255,215,0,198,0,45,1,10,0,198,0,50,255,215,0,198,0,52,255,215,0,198,0,55,255,113,0,198,0,57,255,174,0,198,0,58,255,174,0,198,0,60,255,133,0,198,0,137,255,215,0,198,0,148,255,215,0,198,0,149,255,215,0,198,0,150,255,215,0,198,0,151,255,215,0,198,0,152,255,215,0,198,0,154,255,215,0,198,0,159,255,133,0,198,0,200,255,215,0,198,0,202,255,215,0,198,0,204,255,215,0,198,0,206,255,215,0,198,0,222,255,215,0,198,0,224,255,215,0,198,0,226,255,215,0,198,0,228,255,215,0,198,1,14,255,215,0,198,1,16,255,215,0,198,1,18,255,215,0,198,1,20,255,215,0,198,1,36,255,113,0,198,1,38,255,113,0,198,1,54,255,174,0,198,1,56,255,133,0,198,1,58,255,133,0,198,1,71,255,215,0,198,1,250,255,174,0,198,1,252,255,174,0,198,1,254,255,174,0,198,2,0,255,133,0,198,2,7,255,113,0,198,2,11,255,113,0,198,2,95,255,215,0,198,3,73,255,215,0,198,3,75,255,215,0,198,3,77,255,215,0,198,3,79,255,215,0,198,3,81,255,215,0,198,3,83,255,215,0,198,3,85,255,215,0,198,3,87,255,215,0,198,3,89,255,215,0,198,3,91,255,215,0,198,3,93,255,215,0,198,3,95,255,215,0,198,3,111,255,133,0,198,3,113,255,133,0,198,3,115,255,133,0,198,3,143,255,113,0,199,0,5,255,236,0,199,0,10,255,236,0,199,2,7,255,236,0,199,2,11,255,236,0,200,0,38,255,215,0,200,0,42,255,215,0,200,0,50,255,215,0,200,0,52,255,215,0,200,0,137,255,215,0,200,0,148,255,215,0,200,0,149,255,215,0,200,0,150,255,215,0,200,0,151,255,215,0,200,0,152,255,215,0,200,0,154,255,215,0,200,0,200,255,215,0,200,0,202,255,215,0,200,0,204,255,215,0,200,0,206,255,215,0,200,0,222,255,215,0,200,0,224,255,215,0,200,0,226,255,215,0,200,0,228,255,215,0,200,1,14,255,215,0,200,1,16,255,215,0,200,1,18,255,215,0,200,1,20,255,215,0,200,1,71,255,215,0,200,2,95,255,215,0,200,3,73,255,215,0,200,3,75,255,215,0,200,3,77,255,215,0,200,3,79,255,215,0,200,3,81,255,215,0,200,3,83,255,215,0,200,3,85,255,215,0,200,3,87,255,215,0,200,3,89,255,215,0,200,3,91,255,215,0,200,3,93,255,215,0,200,3,95,255,215,0,202,0,38,255,215,0,202,0,42,255,215,0,202,0,50,255,215,0,202,0,52,255,215,0,202,0,137,255,215,0,202,0,148,255,215,0,202,0,149,255,215,0,202,0,150,255,215,0,202,0,151,255,215,0,202,0,152,255,215,0,202,0,154,255,215,0,202,0,200,255,215,0,202,0,202,255,215,0,202,0,204,255,215,0,202,0,206,255,215,0,202,0,222,255,215,0,202,0,224,255,215,0,202,0,226,255,215,0,202,0,228,255,215,0,202,1,14,255,215,0,202,1,16,255,215,0,202,1,18,255,215,0,202,1,20,255,215,0,202,1,71,255,215,0,202,2,95,255,215,0,202,3,73,255,215,0,202,3,75,255,215,0,202,3,77,255,215,0,202,3,79,255,215,0,202,3,81,255,215,0,202,3,83,255,215,0,202,3,85,255,215,0,202,3,87,255,215,0,202,3,89,255,215,0,202,3,91,255,215,0,202,3,93,255,215,0,202,3,95,255,215,0,204,0,38,255,215,0,204,0,42,255,215,0,204,0,50,255,215,0,204,0,52,255,215,0,204,0,137,255,215,0,204,0,148,255,215,0,204,0,149,255,215,0,204,0,150,255,215,0,204,0,151,255,215,0,204,0,152,255,215,0,204,0,154,255,215,0,204,0,200,255,215,0,204,0,202,255,215,0,204,0,204,255,215,0,204,0,206,255,215,0,204,0,222,255,215,0,204,0,224,255,215,0,204,0,226,255,215,0,204,0,228,255,215,0,204,1,14,255,215,0,204,1,16,255,215,0,204,1,18,255,215,0,204,1,20,255,215,0,204,1,71,255,215,0,204,2,95,255,215,0,204,3,73,255,215,0,204,3,75,255,215,0,204,3,77,255,215,0,204,3,79,255,215,0,204,3,81,255,215,0,204,3,83,255,215,0,204,3,85,255,215,0,204,3,87,255,215,0,204,3,89,255,215,0,204,3,91,255,215,0,204,3,93,255,215,0,204,3,95,255,215,0,206,0,38,255,215,0,206,0,42,255,215,0,206,0,50,255,215,0,206,0,52,255,215,0,206,0,137,255,215,0,206,0,148,255,215,0,206,0,149,255,215,0,206,0,150,255,215,0,206,0,151,255,215,0,206,0,152,255,215,0,206,0,154,255,215,0,206,0,200,255,215,0,206,0,202,255,215,0,206,0,204,255,215,0,206,0,206,255,215,0,206,0,222,255,215,0,206,0,224,255,215,0,206,0,226,255,215,0,206,0,228,255,215,0,206,1,14,255,215,0,206,1,16,255,215,0,206,1,18,255,215,0,206,1,20,255,215,0,206,1,71,255,215,0,206,2,95,255,215,0,206,3,73,255,215,0,206,3,75,255,215,0,206,3,77,255,215,0,206,3,79,255,215,0,206,3,81,255,215,0,206,3,83,255,215,0,206,3,85,255,215,0,206,3,87,255,215,0,206,3,89,255,215,0,206,3,91,255,215,0,206,3,93,255,215,0,206,3,95,255,215,0,208,0,15,255,174,0,208,0,17,255,174,0,208,0,36,255,215,0,208,0,55,255,195,0,208,0,57,255,236,0,208,0,58,255,236,0,208,0,59,255,215,0,208,0,60,255,236,0,208,0,61,255,236,0,208,0,130,255,215,0,208,0,131,255,215,0,208,0,132,255,215,0,208,0,133,255,215,0,208,0,134,255,215,0,208,0,135,255,215,0,208,0,159,255,236,0,208,0,194,255,215,0,208,0,196,255,215,0,208,0,198,255,215,0,208,1,36,255,195,0,208,1,38,255,195,0,208,1,54,255,236,0,208,1,56,255,236,0,208,1,58,255,236,0,208,1,59,255,236,0,208,1,61,255,236,0,208,1,63,255,236,0,208,1,67,255,215,0,208,1,160,255,236,0,208,1,250,255,236,0,208,1,252,255,236,0,208,1,254,255,236,0,208,2,0,255,236,0,208,2,8,255,174,0,208,2,12,255,174,0,208,2,88,255,215,0,208,3,29,255,215,0,208,3,31,255,215,0,208,3,33,255,215,0,208,3,35,255,215,0,208,3,37,255,215,0,208,3,39,255,215,0,208,3,41,255,215,0,208,3,43,255,215,0,208,3,45,255,215,0,208,3,47,255,215,0,208,3,49,255,215,0,208,3,51,255,215,0,208,3,111,255,236,0,208,3,113,255,236,0,208,3,115,255,236,0,208,3,143,255,195,0,209,0,5,0,82,0,209,0,10,0,82,0,209,0,12,0,143,0,209,0,34,0,164,0,209,0,64,0,143,0,209,0,69,0,61,0,209,0,75,0,61,0,209,0,78,0,61,0,209,0,79,0,61,0,209,0,96,0,143,0,209,0,231,0,61,0,209,0,233,0,123,0,209,2,7,0,82,0,209,2,11,0,82,0,210,0,15,255,174,0,210,0,17,255,174,0,210,0,36,255,215,0,210,0,55,255,195,0,210,0,57,255,236,0,210,0,58,255,236,0,210,0,59,255,215,0,210,0,60,255,236,0,210,0,61,255,236,0,210,0,130,255,215,0,210,0,131,255,215,0,210,0,132,255,215,0,210,0,133,255,215,0,210,0,134,255,215,0,210,0,135,255,215,0,210,0,159,255,236,0,210,0,194,255,215,0,210,0,196,255,215,0,210,0,198,255,215,0,210,1,36,255,195,0,210,1,38,255,195,0,210,1,54,255,236,0,210,1,56,255,236,0,210,1,58,255,236,0,210,1,59,255,236,0,210,1,61,255,236,0,210,1,63,255,236,0,210,1,67,255,215,0,210,1,160,255,236,0,210,1,250,255,236,0,210,1,252,255,236,0,210,1,254,255,236,0,210,2,0,255,236,0,210,2,8,255,174,0,210,2,12,255,174,0,210,2,88,255,215,0,210,3,29,255,215,0,210,3,31,255,215,0,210,3,33,255,215,0,210,3,35,255,215,0,210,3,37,255,215,0,210,3,39,255,215,0,210,3,41,255,215,0,210,3,43,255,215,0,210,3,45,255,215,0,210,3,47,255,215,0,210,3,49,255,215,0,210,3,51,255,215,0,210,3,111,255,236,0,210,3,113,255,236,0,210,3,115,255,236,0,210,3,143,255,195,0,212,0,45,0,123,0,213,0,5,255,236,0,213,0,10,255,236,0,213,0,89,255,215,0,213,0,90,255,215,0,213,0,91,255,215,0,213,0,92,255,215,0,213,0,93,255,236,0,213,0,191,255,215,0,213,1,55,255,215,0,213,1,60,255,236,0,213,1,62,255,236,0,213,1,64,255,236,0,213,1,251,255,215,0,213,1,253,255,215,0,213,2,7,255,236,0,213,2,11,255,236,0,213,3,112,255,215,0,214,0,45,0,123,0,215,0,5,255,236,0,215,0,10,255,236,0,215,0,89,255,215,0,215,0,90,255,215,0,215,0,91,255,215,0,215,0,92,255,215,0,215,0,93,255,236,0,215,0,191,255,215,0,215,1,55,255,215,0,215,1,60,255,236,0,215,1,62,255,236,0,215,1,64,255,236,0,215,1,251,255,215,0,215,1,253,255,215,0,215,2,7,255,236,0,215,2,11,255,236,0,215,3,112,255,215,0,216,0,45,0,123,0,217,0,5,255,236,0,217,0,10,255,236,0,217,0,89,255,215,0,217,0,90,255,215,0,217,0,91,255,215,0,217,0,92,255,215,0,217,0,93,255,236,0,217,0,191,255,215,0,217,1,55,255,215,0,217,1,60,255,236,0,217,1,62,255,236,0,217,1,64,255,236,0,217,1,251,255,215,0,217,1,253,255,215,0,217,2,7,255,236,0,217,2,11,255,236,0,217,3,112,255,215,0,218,0,45,0,123,0,219,0,5,255,236,0,219,0,10,255,236,0,219,0,89,255,215,0,219,0,90,255,215,0,219,0,91,255,215,0,219,0,92,255,215,0,219,0,93,255,236,0,219,0,191,255,215,0,219,1,55,255,215,0,219,1,60,255,236,0,219,1,62,255,236,0,219,1,64,255,236,0,219,1,251,255,215,0,219,1,253,255,215,0,219,2,7,255,236,0,219,2,11,255,236,0,219,3,112,255,215,0,220,0,45,0,123,0,221,0,5,255,236,0,221,0,10,255,236,0,221,0,89,255,215,0,221,0,90,255,215,0,221,0,91,255,215,0,221,0,92,255,215,0,221,0,93,255,236,0,221,0,191,255,215,0,221,1,55,255,215,0,221,1,60,255,236,0,221,1,62,255,236,0,221,1,64,255,236,0,221,1,251,255,215,0,221,1,253,255,215,0,221,2,7,255,236,0,221,2,11,255,236,0,221,3,112,255,215,0,231,0,5,255,236,0,231,0,10,255,236,0,231,2,7,255,236,0,231,2,11,255,236,0,248,0,38,255,215,0,248,0,42,255,215,0,248,0,50,255,215,0,248,0,52,255,215,0,248,0,137,255,215,0,248,0,148,255,215,0,248,0,149,255,215,0,248,0,150,255,215,0,248,0,151,255,215,0,248,0,152,255,215,0,248,0,154,255,215,0,248,0,200,255,215,0,248,0,202,255,215,0,248,0,204,255,215,0,248,0,206,255,215,0,248,0,222,255,215,0,248,0,224,255,215,0,248,0,226,255,215,0,248,0,228,255,215,0,248,1,14,255,215,0,248,1,16,255,215,0,248,1,18,255,215,0,248,1,20,255,215,0,248,1,71,255,215,0,248,2,95,255,215,0,248,3,73,255,215,0,248,3,75,255,215,0,248,3,77,255,215,0,248,3,79,255,215,0,248,3,81,255,215,0,248,3,83,255,215,0,248,3,85,255,215,0,248,3,87,255,215,0,248,3,89,255,215,0,248,3,91,255,215,0,248,3,93,255,215,0,248,3,95,255,215,0,249,0,70,255,215,0,249,0,71,255,215,0,249,0,72,255,215,0,249,0,82,255,215,0,249,0,84,255,215,0,249,0,162,255,215,0,249,0,169,255,215,0,249,0,170,255,215,0,249,0,171,255,215,0,249,0,172,255,215,0,249,0,173,255,215,0,249,0,180,255,215,0,249,0,181,255,215,0,249,0,182,255,215,0,249,0,183,255,215,0,249,0,184,255,215,0,249,0,186,255,215,0,249,0,201,255,215,0,249,0,203,255,215,0,249,0,205,255,215,0,249,0,207,255,215,0,249,0,209,255,215,0,249,0,211,255,215,0,249,0,213,255,215,0,249,0,215,255,215,0,249,0,217,255,215,0,249,0,219,255,215,0,249,0,221,255,215,0,249,1,15,255,215,0,249,1,17,255,215,0,249,1,19,255,215,0,249,1,21,255,215,0,249,1,72,255,215,0,249,2,96,255,215,0,249,3,54,255,215,0,249,3,56,255,215,0,249,3,58,255,215,0,249,3,60,255,215,0,249,3,64,255,215,0,249,3,66,255,215,0,249,3,68,255,215,0,249,3,74,255,215,0,249,3,76,255,215,0,249,3,78,255,215,0,249,3,82,255,215,0,249,3,84,255,215,0,249,3,86,255,215,0,249,3,88,255,215,0,249,3,90,255,215,0,249,3,92,255,215,0,249,3,94,255,215,0,249,3,96,255,215,0,250,0,70,255,215,0,250,0,71,255,215,0,250,0,72,255,215,0,250,0,82,255,215,0,250,0,84,255,215,0,250,0,162,255,215,0,250,0,169,255,215,0,250,0,170,255,215,0,250,0,171,255,215,0,250,0,172,255,215,0,250,0,173,255,215,0,250,0,180,255,215,0,250,0,181,255,215,0,250,0,182,255,215,0,250,0,183,255,215,0,250,0,184,255,215,0,250,0,186,255,215,0,250,0,201,255,215,0,250,0,203,255,215,0,250,0,205,255,215,0,250,0,207,255,215,0,250,0,209,255,215,0,250,0,211,255,215,0,250,0,213,255,215,0,250,0,215,255,215,0,250,0,217,255,215,0,250,0,219,255,215,0,250,0,221,255,215,0,250,1,15,255,215,0,250,1,17,255,215,0,250,1,19,255,215,0,250,1,21,255,215,0,250,1,72,255,215,0,250,2,96,255,215,0,250,3,54,255,215,0,250,3,56,255,215,0,250,3,58,255,215,0,250,3,60,255,215,0,250,3,64,255,215,0,250,3,66,255,215,0,250,3,68,255,215,0,250,3,74,255,215,0,250,3,76,255,215,0,250,3,78,255,215,0,250,3,82,255,215,0,250,3,84,255,215,0,250,3,86,255,215,0,250,3,88,255,215,0,250,3,90,255,215,0,250,3,92,255,215,0,250,3,94,255,215,0,250,3,96,255,215,0,251,0,5,255,92,0,251,0,10,255,92,0,251,0,38,255,215,0,251,0,42,255,215,0,251,0,50,255,215,0,251,0,52,255,215,0,251,0,55,255,215,0,251,0,56,255,236,0,251,0,57,255,215,0,251,0,58,255,215,0,251,0,60,255,195,0,251,0,137,255,215,0,251,0,148,255,215,0,251,0,149,255,215,0,251,0,150,255,215,0,251,0,151,255,215,0,251,0,152,255,215,0,251,0,154,255,215,0,251,0,155,255,236,0,251,0,156,255,236,0,251,0,157,255,236,0,251,0,158,255,236,0,251,0,159,255,195,0,251,0,200,255,215,0,251,0,202,255,215,0,251,0,204,255,215,0,251,0,206,255,215,0,251,0,222,255,215,0,251,0,224,255,215,0,251,0,226,255,215,0,251,0,228,255,215,0,251,1,14,255,215,0,251,1,16,255,215,0,251,1,18,255,215,0,251,1,20,255,215,0,251,1,36,255,215,0,251,1,38,255,215,0,251,1,42,255,236,0,251,1,44,255,236,0,251,1,46,255,236,0,251,1,48,255,236,0,251,1,50,255,236,0,251,1,52,255,236,0,251,1,54,255,215,0,251,1,56,255,195,0,251,1,58,255,195,0,251,1,71,255,215,0,251,1,250,255,215,0,251,1,252,255,215,0,251,1,254,255,215,0,251,2,0,255,195,0,251,2,7,255,92,0,251,2,11,255,92,0,251,2,95,255,215,0,251,2,97,255,236,0,251,3,73,255,215,0,251,3,75,255,215,0,251,3,77,255,215,0,251,3,79,255,215,0,251,3,81,255,215,0,251,3,83,255,215,0,251,3,85,255,215,0,251,3,87,255,215,0,251,3,89,255,215,0,251,3,91,255,215,0,251,3,93,255,215,0,251,3,95,255,215,0,251,3,97,255,236,0,251,3,99,255,236,0,251,3,101,255,236,0,251,3,103,255,236,0,251,3,105,255,236,0,251,3,107,255,236,0,251,3,109,255,236,0,251,3,111,255,195,0,251,3,113,255,195,0,251,3,115,255,195,0,251,3,143,255,215,0,253,0,5,255,92,0,253,0,10,255,92,0,253,0,38,255,215,0,253,0,42,255,215,0,253,0,50,255,215,0,253,0,52,255,215,0,253,0,55,255,215,0,253,0,56,255,236,0,253,0,57,255,215,0,253,0,58,255,215,0,253,0,60,255,195,0,253,0,137,255,215,0,253,0,148,255,215,0,253,0,149,255,215,0,253,0,150,255,215,0,253,0,151,255,215,0,253,0,152,255,215,0,253,0,154,255,215,0,253,0,155,255,236,0,253,0,156,255,236,0,253,0,157,255,236,0,253,0,158,255,236,0,253,0,159,255,195,0,253,0,200,255,215,0,253,0,202,255,215,0,253,0,204,255,215,0,253,0,206,255,215,0,253,0,222,255,215,0,253,0,224,255,215,0,253,0,226,255,215,0,253,0,228,255,215,0,253,1,14,255,215,0,253,1,16,255,215,0,253,1,18,255,215,0,253,1,20,255,215,0,253,1,36,255,215,0,253,1,38,255,215,0,253,1,42,255,236,0,253,1,44,255,236,0,253,1,46,255,236,0,253,1,48,255,236,0,253,1,50,255,236,0,253,1,52,255,236,0,253,1,54,255,215,0,253,1,56,255,195,0,253,1,58,255,195,0,253,1,71,255,215,0,253,1,250,255,215,0,253,1,252,255,215,0,253,1,254,255,215,0,253,2,0,255,195,0,253,2,7,255,92,0,253,2,11,255,92,0,253,2,95,255,215,0,253,2,97,255,236,0,253,3,73,255,215,0,253,3,75,255,215,0,253,3,77,255,215,0,253,3,79,255,215,0,253,3,81,255,215,0,253,3,83,255,215,0,253,3,85,255,215,0,253,3,87,255,215,0,253,3,89,255,215,0,253,3,91,255,215,0,253,3,93,255,215,0,253,3,95,255,215,0,253,3,97,255,236,0,253,3,99,255,236,0,253,3,101,255,236,0,253,3,103,255,236,0,253,3,105,255,236,0,253,3,107,255,236,0,253,3,109,255,236,0,253,3,111,255,195,0,253,3,113,255,195,0,253,3,115,255,195,0,253,3,143,255,215,0,255,0,5,255,92,0,255,0,10,255,92,0,255,0,38,255,215,0,255,0,42,255,215,0,255,0,50,255,215,0,255,0,52,255,215,0,255,0,55,255,215,0,255,0,56,255,236,0,255,0,57,255,215,0,255,0,58,255,215,0,255,0,60,255,195,0,255,0,137,255,215,0,255,0,148,255,215,0,255,0,149,255,215,0,255,0,150,255,215,0,255,0,151,255,215,0,255,0,152,255,215,0,255,0,154,255,215,0,255,0,155,255,236,0,255,0,156,255,236,0,255,0,157,255,236,0,255,0,158,255,236,0,255,0,159,255,195,0,255,0,200,255,215,0,255,0,202,255,215,0,255,0,204,255,215,0,255,0,206,255,215,0,255,0,222,255,215,0,255,0,224,255,215,0,255,0,226,255,215,0,255,0,228,255,215,0,255,1,14,255,215,0,255,1,16,255,215,0,255,1,18,255,215,0,255,1,20,255,215,0,255,1,36,255,215,0,255,1,38,255,215,0,255,1,42,255,236,0,255,1,44,255,236,0,255,1,46,255,236,0,255,1,48,255,236,0,255,1,50,255,236,0,255,1,52,255,236,0,255,1,54,255,215,0,255,1,56,255,195,0,255,1,58,255,195,0,255,1,71,255,215,0,255,1,250,255,215,0,255,1,252,255,215,0,255,1,254,255,215,0,255,2,0,255,195,0,255,2,7,255,92,0,255,2,11,255,92,0,255,2,95,255,215,0,255,2,97,255,236,0,255,3,73,255,215,0,255,3,75,255,215,0,255,3,77,255,215,0,255,3,79,255,215,0,255,3,81,255,215,0,255,3,83,255,215,0,255,3,85,255,215,0,255,3,87,255,215,0,255,3,89,255,215,0,255,3,91,255,215,0,255,3,93,255,215,0,255,3,95,255,215,0,255,3,97,255,236,0,255,3,99,255,236,0,255,3,101,255,236,0,255,3,103,255,236,0,255,3,105,255,236,0,255,3,107,255,236,0,255,3,109,255,236,0,255,3,111,255,195,0,255,3,113,255,195,0,255,3,115,255,195,0,255,3,143,255,215,1,0,0,5,0,82,1,0,0,10,0,82,1,0,0,12,0,143,1,0,0,34,0,143,1,0,0,64,0,143,1,0,0,69,0,61,1,0,0,75,0,61,1,0,0,78,0,61,1,0,0,79,0,61,1,0,0,96,0,143,1,0,0,231,0,61,1,0,0,233,0,143,1,0,2,7,0,82,1,0,2,11,0,82,1,1,0,5,255,92,1,1,0,10,255,92,1,1,0,38,255,215,1,1,0,42,255,215,1,1,0,50,255,215,1,1,0,52,255,215,1,1,0,55,255,215,1,1,0,56,255,236,1,1,0,57,255,215,1,1,0,58,255,215,1,1,0,60,255,195,1,1,0,137,255,215,1,1,0,148,255,215,1,1,0,149,255,215,1,1,0,150,255,215,1,1,0,151,255,215,1,1,0,152,255,215,1,1,0,154,255,215,1,1,0,155,255,236,1,1,0,156,255,236,1,1,0,157,255,236,1,1,0,158,255,236,1,1,0,159,255,195,1,1,0,200,255,215,1,1,0,202,255,215,1,1,0,204,255,215,1,1,0,206,255,215,1,1,0,222,255,215,1,1,0,224,255,215,1,1,0,226,255,215,1,1,0,228,255,215,1,1,1,14,255,215,1,1,1,16,255,215,1,1,1,18,255,215,1,1,1,20,255,215,1,1,1,36,255,215,1,1,1,38,255,215,1,1,1,42,255,236,1,1,1,44,255,236,1,1,1,46,255,236,1,1,1,48,255,236,1,1,1,50,255,236,1,1,1,52,255,236,1,1,1,54,255,215,1,1,1,56,255,195,1,1,1,58,255,195,1,1,1,71,255,215,1,1,1,250,255,215,1,1,1,252,255,215,1,1,1,254,255,215,1,1,2,0,255,195,1,1,2,7,255,92,1,1,2,11,255,92,1,1,2,95,255,215,1,1,2,97,255,236,1,1,3,73,255,215,1,1,3,75,255,215,1,1,3,77,255,215,1,1,3,79,255,215,1,1,3,81,255,215,1,1,3,83,255,215,1,1,3,85,255,215,1,1,3,87,255,215,1,1,3,89,255,215,1,1,3,91,255,215,1,1,3,93,255,215,1,1,3,95,255,215,1,1,3,97,255,236,1,1,3,99,255,236,1,1,3,101,255,236,1,1,3,103,255,236,1,1,3,105,255,236,1,1,3,107,255,236,1,1,3,109,255,236,1,1,3,111,255,195,1,1,3,113,255,195,1,1,3,115,255,195,1,1,3,143,255,215,1,3,0,5,255,92,1,3,0,10,255,92,1,3,0,38,255,215,1,3,0,42,255,215,1,3,0,50,255,215,1,3,0,52,255,215,1,3,0,55,255,215,1,3,0,56,255,236,1,3,0,57,255,215,1,3,0,58,255,215,1,3,0,60,255,195,1,3,0,137,255,215,1,3,0,148,255,215,1,3,0,149,255,215,1,3,0,150,255,215,1,3,0,151,255,215,1,3,0,152,255,215,1,3,0,154,255,215,1,3,0,155,255,236,1,3,0,156,255,236,1,3,0,157,255,236,1,3,0,158,255,236,1,3,0,159,255,195,1,3,0,200,255,215,1,3,0,202,255,215,1,3,0,204,255,215,1,3,0,206,255,215,1,3,0,222,255,215,1,3,0,224,255,215,1,3,0,226,255,215,1,3,0,228,255,215,1,3,1,14,255,215,1,3,1,16,255,215,1,3,1,18,255,215,1,3,1,20,255,215,1,3,1,36,255,215,1,3,1,38,255,215,1,3,1,42,255,236,1,3,1,44,255,236,1,3,1,46,255,236,1,3,1,48,255,236,1,3,1,50,255,236,1,3,1,52,255,236,1,3,1,54,255,215,1,3,1,56,255,195,1,3,1,58,255,195,1,3,1,71,255,215,1,3,1,250,255,215,1,3,1,252,255,215,1,3,1,254,255,215,1,3,2,0,255,195,1,3,2,7,255,92,1,3,2,11,255,92,1,3,2,95,255,215,1,3,2,97,255,236,1,3,3,73,255,215,1,3,3,75,255,215,1,3,3,77,255,215,1,3,3,79,255,215,1,3,3,81,255,215,1,3,3,83,255,215,1,3,3,85,255,215,1,3,3,87,255,215,1,3,3,89,255,215,1,3,3,91,255,215,1,3,3,93,255,215,1,3,3,95,255,215,1,3,3,97,255,236,1,3,3,99,255,236,1,3,3,101,255,236,1,3,3,103,255,236,1,3,3,105,255,236,1,3,3,107,255,236,1,3,3,109,255,236,1,3,3,111,255,195,1,3,3,113,255,195,1,3,3,115,255,195,1,3,3,143,255,215,1,8,0,5,255,236,1,8,0,10,255,236,1,8,2,7,255,236,1,8,2,11,255,236,1,14,0,15,255,174,1,14,0,17,255,174,1,14,0,36,255,215,1,14,0,55,255,195,1,14,0,57,255,236,1,14,0,58,255,236,1,14,0,59,255,215,1,14,0,60,255,236,1,14,0,61,255,236,1,14,0,130,255,215,1,14,0,131,255,215,1,14,0,132,255,215,1,14,0,133,255,215,1,14,0,134,255,215,1,14,0,135,255,215,1,14,0,159,255,236,1,14,0,194,255,215,1,14,0,196,255,215,1,14,0,198,255,215,1,14,1,36,255,195,1,14,1,38,255,195,1,14,1,54,255,236,1,14,1,56,255,236,1,14,1,58,255,236,1,14,1,59,255,236,1,14,1,61,255,236,1,14,1,63,255,236,1,14,1,67,255,215,1,14,1,160,255,236,1,14,1,250,255,236,1,14,1,252,255,236,1,14,1,254,255,236,1,14,2,0,255,236,1,14,2,8,255,174,1,14,2,12,255,174,1,14,2,88,255,215,1,14,3,29,255,215,1,14,3,31,255,215,1,14,3,33,255,215,1,14,3,35,255,215,1,14,3,37,255,215,1,14,3,39,255,215,1,14,3,41,255,215,1,14,3,43,255,215,1,14,3,45,255,215,1,14,3,47,255,215,1,14,3,49,255,215,1,14,3,51,255,215,1,14,3,111,255,236,1,14,3,113,255,236,1,14,3,115,255,236,1,14,3,143,255,195,1,16,0,15,255,174,1,16,0,17,255,174,1,16,0,36,255,215,1,16,0,55,255,195,1,16,0,57,255,236,1,16,0,58,255,236,1,16,0,59,255,215,1,16,0,60,255,236,1,16,0,61,255,236,1,16,0,130,255,215,1,16,0,131,255,215,1,16,0,132,255,215,1,16,0,133,255,215,1,16,0,134,255,215,1,16,0,135,255,215,1,16,0,159,255,236,1,16,0,194,255,215,1,16,0,196,255,215,1,16,0,198,255,215,1,16,1,36,255,195,1,16,1,38,255,195,1,16,1,54,255,236,1,16,1,56,255,236,1,16,1,58,255,236,1,16,1,59,255,236,1,16,1,61,255,236,1,16,1,63,255,236,1,16,1,67,255,215,1,16,1,160,255,236,1,16,1,250,255,236,1,16,1,252,255,236,1,16,1,254,255,236,1,16,2,0,255,236,1,16,2,8,255,174,1,16,2,12,255,174,1,16,2,88,255,215,1,16,3,29,255,215,1,16,3,31,255,215,1,16,3,33,255,215,1,16,3,35,255,215,1,16,3,37,255,215,1,16,3,39,255,215,1,16,3,41,255,215,1,16,3,43,255,215,1,16,3,45,255,215,1,16,3,47,255,215,1,16,3,49,255,215,1,16,3,51,255,215,1,16,3,111,255,236,1,16,3,113,255,236,1,16,3,115,255,236,1,16,3,143,255,195,1,18,0,15,255,174,1,18,0,17,255,174,1,18,0,36,255,215,1,18,0,55,255,195,1,18,0,57,255,236,1,18,0,58,255,236,1,18,0,59,255,215,1,18,0,60,255,236,1,18,0,61,255,236,1,18,0,130,255,215,1,18,0,131,255,215,1,18,0,132,255,215,1,18,0,133,255,215,1,18,0,134,255,215,1,18,0,135,255,215,1,18,0,159,255,236,1,18,0,194,255,215,1,18,0,196,255,215,1,18,0,198,255,215,1,18,1,36,255,195,1,18,1,38,255,195,1,18,1,54,255,236,1,18,1,56,255,236,1,18,1,58,255,236,1,18,1,59,255,236,1,18,1,61,255,236,1,18,1,63,255,236,1,18,1,67,255,215,1,18,1,160,255,236,1,18,1,250,255,236,1,18,1,252,255,236,1,18,1,254,255,236,1,18,2,0,255,236,1,18,2,8,255,174,1,18,2,12,255,174,1,18,2,88,255,215,1,18,3,29,255,215,1,18,3,31,255,215,1,18,3,33,255,215,1,18,3,35,255,215,1,18,3,37,255,215,1,18,3,39,255,215,1,18,3,41,255,215,1,18,3,43,255,215,1,18,3,45,255,215,1,18,3,47,255,215,1,18,3,49,255,215,1,18,3,51,255,215,1,18,3,111,255,236,1,18,3,113,255,236,1,18,3,115,255,236,1,18,3,143,255,195,1,20,0,45,0,123,1,23,0,5,0,82,1,23,0,10,0,82,1,23,0,68,255,215,1,23,0,70,255,215,1,23,0,71,255,215,1,23,0,72,255,215,1,23,0,74,255,236,1,23,0,82,255,215,1,23,0,84,255,215,1,23,0,162,255,215,1,23,0,163,255,215,1,23,0,164,255,215,1,23,0,165,255,215,1,23,0,166,255,215,1,23,0,167,255,215,1,23,0,168,255,215,1,23,0,169,255,215,1,23,0,170,255,215,1,23,0,171,255,215,1,23,0,172,255,215,1,23,0,173,255,215,1,23,0,180,255,215,1,23,0,181,255,215,1,23,0,182,255,215,1,23,0,183,255,215,1,23,0,184,255,215,1,23,0,186,255,215,1,23,0,195,255,215,1,23,0,197,255,215,1,23,0,199,255,215,1,23,0,201,255,215,1,23,0,203,255,215,1,23,0,205,255,215,1,23,0,207,255,215,1,23,0,209,255,215,1,23,0,211,255,215,1,23,0,213,255,215,1,23,0,215,255,215,1,23,0,217,255,215,1,23,0,219,255,215,1,23,0,221,255,215,1,23,0,223,255,236,1,23,0,225,255,236,1,23,0,227,255,236,1,23,0,229,255,236,1,23,1,15,255,215,1,23,1,17,255,215,1,23,1,19,255,215,1,23,1,21,255,215,1,23,1,68,255,215,1,23,1,70,255,215,1,23,1,72,255,215,1,23,2,7,0,82,1,23,2,11,0,82,1,23,2,89,255,215,1,23,2,96,255,215,1,23,3,30,255,215,1,23,3,32,255,215,1,23,3,34,255,215,1,23,3,38,255,215,1,23,3,40,255,215,1,23,3,42,255,215,1,23,3,44,255,215,1,23,3,46,255,215,1,23,3,48,255,215,1,23,3,50,255,215,1,23,3,52,255,215,1,23,3,54,255,215,1,23,3,56,255,215,1,23,3,58,255,215,1,23,3,60,255,215,1,23,3,64,255,215,1,23,3,66,255,215,1,23,3,68,255,215,1,23,3,74,255,215,1,23,3,76,255,215,1,23,3,78,255,215,1,23,3,82,255,215,1,23,3,84,255,215,1,23,3,86,255,215,1,23,3,88,255,215,1,23,3,90,255,215,1,23,3,92,255,215,1,23,3,94,255,215,1,23,3,96,255,215,1,25,0,5,0,82,1,25,0,10,0,82,1,25,0,68,255,215,1,25,0,70,255,215,1,25,0,71,255,215,1,25,0,72,255,215,1,25,0,74,255,236,1,25,0,82,255,215,1,25,0,84,255,215,1,25,0,162,255,215,1,25,0,163,255,215,1,25,0,164,255,215,1,25,0,165,255,215,1,25,0,166,255,215,1,25,0,167,255,215,1,25,0,168,255,215,1,25,0,169,255,215,1,25,0,170,255,215,1,25,0,171,255,215,1,25,0,172,255,215,1,25,0,173,255,215,1,25,0,180,255,215,1,25,0,181,255,215,1,25,0,182,255,215,1,25,0,183,255,215,1,25,0,184,255,215,1,25,0,186,255,215,1,25,0,195,255,215,1,25,0,197,255,215,1,25,0,199,255,215,1,25,0,201,255,215,1,25,0,203,255,215,1,25,0,205,255,215,1,25,0,207,255,215,1,25,0,209,255,215,1,25,0,211,255,215,1,25,0,213,255,215,1,25,0,215,255,215,1,25,0,217,255,215,1,25,0,219,255,215,1,25,0,221,255,215,1,25,0,223,255,236,1,25,0,225,255,236,1,25,0,227,255,236,1,25,0,229,255,236,1,25,1,15,255,215,1,25,1,17,255,215,1,25,1,19,255,215,1,25,1,21,255,215,1,25,1,68,255,215,1,25,1,70,255,215,1,25,1,72,255,215,1,25,2,7,0,82,1,25,2,11,0,82,1,25,2,89,255,215,1,25,2,96,255,215,1,25,3,30,255,215,1,25,3,32,255,215,1,25,3,34,255,215,1,25,3,38,255,215,1,25,3,40,255,215,1,25,3,42,255,215,1,25,3,44,255,215,1,25,3,46,255,215,1,25,3,48,255,215,1,25,3,50,255,215,1,25,3,52,255,215,1,25,3,54,255,215,1,25,3,56,255,215,1,25,3,58,255,215,1,25,3,60,255,215,1,25,3,64,255,215,1,25,3,66,255,215,1,25,3,68,255,215,1,25,3,74,255,215,1,25,3,76,255,215,1,25,3,78,255,215,1,25,3,82,255,215,1,25,3,84,255,215,1,25,3,86,255,215,1,25,3,88,255,215,1,25,3,90,255,215,1,25,3,92,255,215,1,25,3,94,255,215,1,25,3,96,255,215,1,27,0,5,0,82,1,27,0,10,0,82,1,27,0,68,255,215,1,27,0,70,255,215,1,27,0,71,255,215,1,27,0,72,255,215,1,27,0,74,255,236,1,27,0,82,255,215,1,27,0,84,255,215,1,27,0,162,255,215,1,27,0,163,255,215,1,27,0,164,255,215,1,27,0,165,255,215,1,27,0,166,255,215,1,27,0,167,255,215,1,27,0,168,255,215,1,27,0,169,255,215,1,27,0,170,255,215,1,27,0,171,255,215,1,27,0,172,255,215,1,27,0,173,255,215,1,27,0,180,255,215,1,27,0,181,255,215,1,27,0,182,255,215,1,27,0,183,255,215,1,27,0,184,255,215,1,27,0,186,255,215,1,27,0,195,255,215,1,27,0,197,255,215,1,27,0,199,255,215,1,27,0,201,255,215,1,27,0,203,255,215,1,27,0,205,255,215,1,27,0,207,255,215,1,27,0,209,255,215,1,27,0,211,255,215,1,27,0,213,255,215,1,27,0,215,255,215,1,27,0,217,255,215,1,27,0,219,255,215,1,27,0,221,255,215,1,27,0,223,255,236,1,27,0,225,255,236,1,27,0,227,255,236,1,27,0,229,255,236,1,27,1,15,255,215,1,27,1,17,255,215,1,27,1,19,255,215,1,27,1,21,255,215,1,27,1,68,255,215,1,27,1,70,255,215,1,27,1,72,255,215,1,27,2,7,0,82,1,27,2,11,0,82,1,27,2,89,255,215,1,27,2,96,255,215,1,27,3,30,255,215,1,27,3,32,255,215,1,27,3,34,255,215,1,27,3,38,255,215,1,27,3,40,255,215,1,27,3,42,255,215,1,27,3,44,255,215,1,27,3,46,255,215,1,27,3,48,255,215,1,27,3,50,255,215,1,27,3,52,255,215,1,27,3,54,255,215,1,27,3,56,255,215,1,27,3,58,255,215,1,27,3,60,255,215,1,27,3,64,255,215,1,27,3,66,255,215,1,27,3,68,255,215,1,27,3,74,255,215,1,27,3,76,255,215,1,27,3,78,255,215,1,27,3,82,255,215,1,27,3,84,255,215,1,27,3,86,255,215,1,27,3,88,255,215,1,27,3,90,255,215,1,27,3,92,255,215,1,27,3,94,255,215,1,27,3,96,255,215,1,36,0,15,255,133,1,36,0,16,255,174,1,36,0,17,255,133,1,36,0,34,0,41,1,36,0,36,255,113,1,36,0,38,255,215,1,36,0,42,255,215,1,36,0,50,255,215,1,36,0,52,255,215,1,36,0,55,0,41,1,36,0,68,255,92,1,36,0,70,255,113,1,36,0,71,255,113,1,36,0,72,255,113,1,36,0,74,255,113,1,36,0,80,255,154,1,36,0,81,255,154,1,36,0,82,255,113,1,36,0,83,255,154,1,36,0,84,255,113,1,36,0,85,255,154,1,36,0,86,255,133,1,36,0,88,255,154,1,36,0,89,255,215,1,36,0,90,255,215,1,36,0,91,255,215,1,36,0,92,255,215,1,36,0,93,255,174,1,36,0,130,255,113,1,36,0,131,255,113,1,36,0,132,255,113,1,36,0,133,255,113,1,36,0,134,255,113,1,36,0,135,255,113,1,36,0,137,255,215,1,36,0,148,255,215,1,36,0,149,255,215,1,36,0,150,255,215,1,36,0,151,255,215,1,36,0,152,255,215,1,36,0,154,255,215,1,36,0,162,255,113,1,36,0,163,255,92,1,36,0,164,255,92,1,36,0,165,255,92,1,36,0,166,255,92,1,36,0,167,255,92,1,36,0,168,255,92,1,36,0,169,255,113,1,36,0,170,255,113,1,36,0,171,255,113,1,36,0,172,255,113,1,36,0,173,255,113,1,36,0,180,255,113,1,36,0,181,255,113,1,36,0,182,255,113,1,36,0,183,255,113,1,36,0,184,255,113,1,36,0,186,255,113,1,36,0,187,255,154,1,36,0,188,255,154,1,36,0,189,255,154,1,36,0,190,255,154,1,36,0,191,255,215,1,36,0,194,255,113,1,36,0,195,255,92,1,36,0,196,255,113,1,36,0,197,255,92,1,36,0,198,255,113,1,36,0,199,255,92,1,36,0,200,255,215,1,36,0,201,255,113,1,36,0,202,255,215,1,36,0,203,255,113,1,36,0,204,255,215,1,36,0,205,255,113,1,36,0,206,255,215,1,36,0,207,255,113,1,36,0,209,255,113,1,36,0,211,255,113,1,36,0,213,255,113,1,36,0,215,255,113,1,36,0,217,255,113,1,36,0,219,255,113,1,36,0,221,255,113,1,36,0,222,255,215,1,36,0,223,255,113,1,36,0,224,255,215,1,36,0,225,255,113,1,36,0,226,255,215,1,36,0,227,255,113,1,36,0,228,255,215,1,36,0,229,255,113,1,36,0,250,255,154,1,36,1,6,255,154,1,36,1,8,255,154,1,36,1,13,255,154,1,36,1,14,255,215,1,36,1,15,255,113,1,36,1,16,255,215,1,36,1,17,255,113,1,36,1,18,255,215,1,36,1,19,255,113,1,36,1,20,255,215,1,36,1,21,255,113,1,36,1,23,255,154,1,36,1,25,255,154,1,36,1,29,255,133,1,36,1,33,255,133,1,36,1,36,0,41,1,36,1,38,0,41,1,36,1,43,255,154,1,36,1,45,255,154,1,36,1,47,255,154,1,36,1,49,255,154,1,36,1,51,255,154,1,36,1,53,255,154,1,36,1,55,255,215,1,36,1,60,255,174,1,36,1,62,255,174,1,36,1,64,255,174,1,36,1,67,255,113,1,36,1,68,255,92,1,36,1,70,255,92,1,36,1,71,255,215,1,36,1,72,255,113,1,36,1,74,255,133,1,36,1,251,255,215,1,36,1,253,255,215,1,36,2,2,255,174,1,36,2,3,255,174,1,36,2,4,255,174,1,36,2,8,255,133,1,36,2,12,255,133,1,36,2,87,255,154,1,36,2,88,255,113,1,36,2,89,255,92,1,36,2,95,255,215,1,36,2,96,255,113,1,36,2,98,255,154,1,36,3,29,255,113,1,36,3,30,255,92,1,36,3,31,255,113,1,36,3,32,255,92,1,36,3,33,255,113,1,36,3,34,255,92,1,36,3,35,255,113,1,36,3,37,255,113,1,36,3,38,255,92,1,36,3,39,255,113,1,36,3,40,255,92,1,36,3,41,255,113,1,36,3,42,255,92,1,36,3,43,255,113,1,36,3,44,255,92,1,36,3,45,255,113,1,36,3,46,255,92,1,36,3,47,255,113,1,36,3,48,255,92,1,36,3,49,255,113,1,36,3,50,255,92,1,36,3,51,255,113,1,36,3,52,255,92,1,36,3,54,255,113,1,36,3,56,255,113,1,36,3,58,255,113,1,36,3,60,255,113,1,36,3,64,255,113,1,36,3,66,255,113,1,36,3,68,255,113,1,36,3,73,255,215,1,36,3,74,255,113,1,36,3,75,255,215,1,36,3,76,255,113,1,36,3,77,255,215,1,36,3,78,255,113,1,36,3,79,255,215,1,36,3,81,255,215,1,36,3,82,255,113,1,36,3,83,255,215,1,36,3,84,255,113,1,36,3,85,255,215,1,36,3,86,255,113,1,36,3,87,255,215,1,36,3,88,255,113,1,36,3,89,255,215,1,36,3,90,255,113,1,36,3,91,255,215,1,36,3,92,255,113,1,36,3,93,255,215,1,36,3,94,255,113,1,36,3,95,255,215,1,36,3,96,255,113,1,36,3,98,255,154,1,36,3,100,255,154,1,36,3,102,255,154,1,36,3,104,255,154,1,36,3,106,255,154,1,36,3,108,255,154,1,36,3,110,255,154,1,36,3,112,255,215,1,36,3,143,0,41,1,37,0,5,0,41,1,37,0,10,0,41,1,37,2,7,0,41,1,37,2,11,0,41,1,38,0,15,255,133,1,38,0,16,255,174,1,38,0,17,255,133,1,38,0,34,0,41,1,38,0,36,255,113,1,38,0,38,255,215,1,38,0,42,255,215,1,38,0,50,255,215,1,38,0,52,255,215,1,38,0,55,0,41,1,38,0,68,255,92,1,38,0,70,255,113,1,38,0,71,255,113,1,38,0,72,255,113,1,38,0,74,255,113,1,38,0,80,255,154,1,38,0,81,255,154,1,38,0,82,255,113,1,38,0,83,255,154,1,38,0,84,255,113,1,38,0,85,255,154,1,38,0,86,255,133,1,38,0,88,255,154,1,38,0,89,255,215,1,38,0,90,255,215,1,38,0,91,255,215,1,38,0,92,255,215,1,38,0,93,255,174,1,38,0,130,255,113,1,38,0,131,255,113,1,38,0,132,255,113,1,38,0,133,255,113,1,38,0,134,255,113,1,38,0,135,255,113,1,38,0,137,255,215,1,38,0,148,255,215,1,38,0,149,255,215,1,38,0,150,255,215,1,38,0,151,255,215,1,38,0,152,255,215,1,38,0,154,255,215,1,38,0,162,255,113,1,38,0,163,255,92,1,38,0,164,255,92,1,38,0,165,255,92,1,38,0,166,255,92,1,38,0,167,255,92,1,38,0,168,255,92,1,38,0,169,255,113,1,38,0,170,255,113,1,38,0,171,255,113,1,38,0,172,255,113,1,38,0,173,255,113,1,38,0,180,255,113,1,38,0,181,255,113,1,38,0,182,255,113,1,38,0,183,255,113,1,38,0,184,255,113,1,38,0,186,255,113,1,38,0,187,255,154,1,38,0,188,255,154,1,38,0,189,255,154,1,38,0,190,255,154,1,38,0,191,255,215,1,38,0,194,255,113,1,38,0,195,255,92,1,38,0,196,255,113,1,38,0,197,255,92,1,38,0,198,255,113,1,38,0,199,255,92,1,38,0,200,255,215,1,38,0,201,255,113,1,38,0,202,255,215,1,38,0,203,255,113,1,38,0,204,255,215,1,38,0,205,255,113,1,38,0,206,255,215,1,38,0,207,255,113,1,38,0,209,255,113,1,38,0,211,255,113,1,38,0,213,255,113,1,38,0,215,255,113,1,38,0,217,255,113,1,38,0,219,255,113,1,38,0,221,255,113,1,38,0,222,255,215,1,38,0,223,255,113,1,38,0,224,255,215,1,38,0,225,255,113,1,38,0,226,255,215,1,38,0,227,255,113,1,38,0,228,255,215,1,38,0,229,255,113,1,38,0,250,255,154,1,38,1,6,255,154,1,38,1,8,255,154,1,38,1,13,255,154,1,38,1,14,255,215,1,38,1,15,255,113,1,38,1,16,255,215,1,38,1,17,255,113,1,38,1,18,255,215,1,38,1,19,255,113,1,38,1,20,255,215,1,38,1,21,255,113,1,38,1,23,255,154,1,38,1,25,255,154,1,38,1,29,255,133,1,38,1,33,255,133,1,38,1,36,0,41,1,38,1,38,0,41,1,38,1,43,255,154,1,38,1,45,255,154,1,38,1,47,255,154,1,38,1,49,255,154,1,38,1,51,255,154,1,38,1,53,255,154,1,38,1,55,255,215,1,38,1,60,255,174,1,38,1,62,255,174,1,38,1,64,255,174,1,38,1,67,255,113,1,38,1,68,255,92,1,38,1,70,255,92,1,38,1,71,255,215,1,38,1,72,255,113,1,38,1,74,255,133,1,38,1,251,255,215,1,38,1,253,255,215,1,38,2,2,255,174,1,38,2,3,255,174,1,38,2,4,255,174,1,38,2,8,255,133,1,38,2,12,255,133,1,38,2,87,255,154,1,38,2,88,255,113,1,38,2,89,255,92,1,38,2,95,255,215,1,38,2,96,255,113,1,38,2,98,255,154,1,38,3,29,255,113,1,38,3,30,255,92,1,38,3,31,255,113,1,38,3,32,255,92,1,38,3,33,255,113,1,38,3,34,255,92,1,38,3,35,255,113,1,38,3,37,255,113,1,38,3,38,255,92,1,38,3,39,255,113,1,38,3,40,255,92,1,38,3,41,255,113,1,38,3,42,255,92,1,38,3,43,255,113,1,38,3,44,255,92,1,38,3,45,255,113,1,38,3,46,255,92,1,38,3,47,255,113,1,38,3,48,255,92,1,38,3,49,255,113,1,38,3,50,255,92,1,38,3,51,255,113,1,38,3,52,255,92,1,38,3,54,255,113,1,38,3,56,255,113,1,38,3,58,255,113,1,38,3,60,255,113,1,38,3,64,255,113,1,38,3,66,255,113,1,38,3,68,255,113,1,38,3,73,255,215,1,38,3,74,255,113,1,38,3,75,255,215,1,38,3,76,255,113,1,38,3,77,255,215,1,38,3,78,255,113,1,38,3,79,255,215,1,38,3,81,255,215,1,38,3,82,255,113,1,38,3,83,255,215,1,38,3,84,255,113,1,38,3,85,255,215,1,38,3,86,255,113,1,38,3,87,255,215,1,38,3,88,255,113,1,38,3,89,255,215,1,38,3,90,255,113,1,38,3,91,255,215,1,38,3,92,255,113,1,38,3,93,255,215,1,38,3,94,255,113,1,38,3,95,255,215,1,38,3,96,255,113,1,38,3,98,255,154,1,38,3,100,255,154,1,38,3,102,255,154,1,38,3,104,255,154,1,38,3,106,255,154,1,38,3,108,255,154,1,38,3,110,255,154,1,38,3,112,255,215,1,38,3,143,0,41,1,39,0,5,0,41,1,39,0,10,0,41,1,39,2,7,0,41,1,39,2,11,0,41,1,40,0,15,255,133,1,40,0,16,255,174,1,40,0,17,255,133,1,40,0,34,0,41,1,40,0,36,255,113,1,40,0,38,255,215,1,40,0,42,255,215,1,40,0,50,255,215,1,40,0,52,255,215,1,40,0,55,0,41,1,40,0,68,255,92,1,40,0,70,255,113,1,40,0,71,255,113,1,40,0,72,255,113,1,40,0,74,255,113,1,40,0,80,255,154,1,40,0,81,255,154,1,40,0,82,255,113,1,40,0,83,255,154,1,40,0,84,255,113,1,40,0,85,255,154,1,40,0,86,255,133,1,40,0,88,255,154,1,40,0,89,255,215,1,40,0,90,255,215,1,40,0,91,255,215,1,40,0,92,255,215,1,40,0,93,255,174,1,40,0,130,255,113,1,40,0,131,255,113,1,40,0,132,255,113,1,40,0,133,255,113,1,40,0,134,255,113,1,40,0,135,255,113,1,40,0,137,255,215,1,40,0,148,255,215,1,40,0,149,255,215,1,40,0,150,255,215,1,40,0,151,255,215,1,40,0,152,255,215,1,40,0,154,255,215,1,40,0,162,255,113,1,40,0,163,255,92,1,40,0,164,255,92,1,40,0,165,255,92,1,40,0,166,255,92,1,40,0,167,255,92,1,40,0,168,255,92,1,40,0,169,255,113,1,40,0,170,255,113,1,40,0,171,255,113,1,40,0,172,255,113,1,40,0,173,255,113,1,40,0,180,255,113,1,40,0,181,255,113,1,40,0,182,255,113,1,40,0,183,255,113,1,40,0,184,255,113,1,40,0,186,255,113,1,40,0,187,255,154,1,40,0,188,255,154,1,40,0,189,255,154,1,40,0,190,255,154,1,40,0,191,255,215,1,40,0,194,255,113,1,40,0,195,255,92,1,40,0,196,255,113,1,40,0,197,255,92,1,40,0,198,255,113,1,40,0,199,255,92,1,40,0,200,255,215,1,40,0,201,255,113,1,40,0,202,255,215,1,40,0,203,255,113,1,40,0,204,255,215,1,40,0,205,255,113,1,40,0,206,255,215,1,40,0,207,255,113,1,40,0,209,255,113,1,40,0,211,255,113,1,40,0,213,255,113,1,40,0,215,255,113,1,40,0,217,255,113,1,40,0,219,255,113,1,40,0,221,255,113,1,40,0,222,255,215,1,40,0,223,255,113,1,40,0,224,255,215,1,40,0,225,255,113,1,40,0,226,255,215,1,40,0,227,255,113,1,40,0,228,255,215,1,40,0,229,255,113,1,40,0,250,255,154,1,40,1,6,255,154,1,40,1,8,255,154,1,40,1,13,255,154,1,40,1,14,255,215,1,40,1,15,255,113,1,40,1,16,255,215,1,40,1,17,255,113,1,40,1,18,255,215,1,40,1,19,255,113,1,40,1,20,255,215,1,40,1,21,255,113,1,40,1,23,255,154,1,40,1,25,255,154,1,40,1,29,255,133,1,40,1,33,255,133,1,40,1,36,0,41,1,40,1,38,0,41,1,40,1,43,255,154,1,40,1,45,255,154,1,40,1,47,255,154,1,40,1,49,255,154,1,40,1,51,255,154,1,40,1,53,255,154,1,40,1,55,255,215,1,40,1,60,255,174,1,40,1,62,255,174,1,40,1,64,255,174,1,40,1,67,255,113,1,40,1,68,255,92,1,40,1,70,255,92,1,40,1,71,255,215,1,40,1,72,255,113,1,40,1,74,255,133,1,40,1,251,255,215,1,40,1,253,255,215,1,40,2,2,255,174,1,40,2,3,255,174,1,40,2,4,255,174,1,40,2,8,255,133,1,40,2,12,255,133,1,40,2,87,255,154,1,40,2,88,255,113,1,40,2,89,255,92,1,40,2,95,255,215,1,40,2,96,255,113,1,40,2,98,255,154,1,40,3,29,255,113,1,40,3,30,255,92,1,40,3,31,255,113,1,40,3,32,255,92,1,40,3,33,255,113,1,40,3,34,255,92,1,40,3,35,255,113,1,40,3,37,255,113,1,40,3,38,255,92,1,40,3,39,255,113,1,40,3,40,255,92,1,40,3,41,255,113,1,40,3,42,255,92,1,40,3,43,255,113,1,40,3,44,255,92,1,40,3,45,255,113,1,40,3,46,255,92,1,40,3,47,255,113,1,40,3,48,255,92,1,40,3,49,255,113,1,40,3,50,255,92,1,40,3,51,255,113,1,40,3,52,255,92,1,40,3,54,255,113,1,40,3,56,255,113,1,40,3,58,255,113,1,40,3,60,255,113,1,40,3,64,255,113,1,40,3,66,255,113,1,40,3,68,255,113,1,40,3,73,255,215,1,40,3,74,255,113,1,40,3,75,255,215,1,40,3,76,255,113,1,40,3,77,255,215,1,40,3,78,255,113,1,40,3,79,255,215,1,40,3,81,255,215,1,40,3,82,255,113,1,40,3,83,255,215,1,40,3,84,255,113,1,40,3,85,255,215,1,40,3,86,255,113,1,40,3,87,255,215,1,40,3,88,255,113,1,40,3,89,255,215,1,40,3,90,255,113,1,40,3,91,255,215,1,40,3,92,255,113,1,40,3,93,255,215,1,40,3,94,255,113,1,40,3,95,255,215,1,40,3,96,255,113,1,40,3,98,255,154,1,40,3,100,255,154,1,40,3,102,255,154,1,40,3,104,255,154,1,40,3,106,255,154,1,40,3,108,255,154,1,40,3,110,255,154,1,40,3,112,255,215,1,40,3,143,0,41,1,42,0,15,255,215,1,42,0,17,255,215,1,42,0,36,255,236,1,42,0,130,255,236,1,42,0,131,255,236,1,42,0,132,255,236,1,42,0,133,255,236,1,42,0,134,255,236,1,42,0,135,255,236,1,42,0,194,255,236,1,42,0,196,255,236,1,42,0,198,255,236,1,42,1,67,255,236,1,42,2,8,255,215,1,42,2,12,255,215,1,42,2,88,255,236,1,42,3,29,255,236,1,42,3,31,255,236,1,42,3,33,255,236,1,42,3,35,255,236,1,42,3,37,255,236,1,42,3,39,255,236,1,42,3,41,255,236,1,42,3,43,255,236,1,42,3,45,255,236,1,42,3,47,255,236,1,42,3,49,255,236,1,42,3,51,255,236,1,44,0,15,255,215,1,44,0,17,255,215,1,44,0,36,255,236,1,44,0,130,255,236,1,44,0,131,255,236,1,44,0,132,255,236,1,44,0,133,255,236,1,44,0,134,255,236,1,44,0,135,255,236,1,44,0,194,255,236,1,44,0,196,255,236,1,44,0,198,255,236,1,44,1,67,255,236,1,44,2,8,255,215,1,44,2,12,255,215,1,44,2,88,255,236,1,44,3,29,255,236,1,44,3,31,255,236,1,44,3,33,255,236,1,44,3,35,255,236,1,44,3,37,255,236,1,44,3,39,255,236,1,44,3,41,255,236,1,44,3,43,255,236,1,44,3,45,255,236,1,44,3,47,255,236,1,44,3,49,255,236,1,44,3,51,255,236,1,46,0,15,255,215,1,46,0,17,255,215,1,46,0,36,255,236,1,46,0,130,255,236,1,46,0,131,255,236,1,46,0,132,255,236,1,46,0,133,255,236,1,46,0,134,255,236,1,46,0,135,255,236,1,46,0,194,255,236,1,46,0,196,255,236,1,46,0,198,255,236,1,46,1,67,255,236,1,46,2,8,255,215,1,46,2,12,255,215,1,46,2,88,255,236,1,46,3,29,255,236,1,46,3,31,255,236,1,46,3,33,255,236,1,46,3,35,255,236,1,46,3,37,255,236,1,46,3,39,255,236,1,46,3,41,255,236,1,46,3,43,255,236,1,46,3,45,255,236,1,46,3,47,255,236,1,46,3,49,255,236,1,46,3,51,255,236,1,48,0,15,255,215,1,48,0,17,255,215,1,48,0,36,255,236,1,48,0,130,255,236,1,48,0,131,255,236,1,48,0,132,255,236,1,48,0,133,255,236,1,48,0,134,255,236,1,48,0,135,255,236,1,48,0,194,255,236,1,48,0,196,255,236,1,48,0,198,255,236,1,48,1,67,255,236,1,48,2,8,255,215,1,48,2,12,255,215,1,48,2,88,255,236,1,48,3,29,255,236,1,48,3,31,255,236,1,48,3,33,255,236,1,48,3,35,255,236,1,48,3,37,255,236,1,48,3,39,255,236,1,48,3,41,255,236,1,48,3,43,255,236,1,48,3,45,255,236,1,48,3,47,255,236,1,48,3,49,255,236,1,48,3,51,255,236,1,50,0,15,255,215,1,50,0,17,255,215,1,50,0,36,255,236,1,50,0,130,255,236,1,50,0,131,255,236,1,50,0,132,255,236,1,50,0,133,255,236,1,50,0,134,255,236,1,50,0,135,255,236,1,50,0,194,255,236,1,50,0,196,255,236,1,50,0,198,255,236,1,50,1,67,255,236,1,50,2,8,255,215,1,50,2,12,255,215,1,50,2,88,255,236,1,50,3,29,255,236,1,50,3,31,255,236,1,50,3,33,255,236,1,50,3,35,255,236,1,50,3,37,255,236,1,50,3,39,255,236,1,50,3,41,255,236,1,50,3,43,255,236,1,50,3,45,255,236,1,50,3,47,255,236,1,50,3,49,255,236,1,50,3,51,255,236,1,52,0,15,255,215,1,52,0,17,255,215,1,52,0,36,255,236,1,52,0,130,255,236,1,52,0,131,255,236,1,52,0,132,255,236,1,52,0,133,255,236,1,52,0,134,255,236,1,52,0,135,255,236,1,52,0,194,255,236,1,52,0,196,255,236,1,52,0,198,255,236,1,52,1,67,255,236,1,52,2,8,255,215,1,52,2,12,255,215,1,52,2,88,255,236,1,52,3,29,255,236,1,52,3,31,255,236,1,52,3,33,255,236,1,52,3,35,255,236,1,52,3,37,255,236,1,52,3,39,255,236,1,52,3,41,255,236,1,52,3,43,255,236,1,52,3,45,255,236,1,52,3,47,255,236,1,52,3,49,255,236,1,52,3,51,255,236,1,54,0,15,255,154,1,54,0,17,255,154,1,54,0,34,0,41,1,54,0,36,255,174,1,54,0,38,255,236,1,54,0,42,255,236,1,54,0,50,255,236,1,54,0,52,255,236,1,54,0,68,255,215,1,54,0,70,255,215,1,54,0,71,255,215,1,54,0,72,255,215,1,54,0,74,255,236,1,54,0,80,255,236,1,54,0,81,255,236,1,54,0,82,255,215,1,54,0,83,255,236,1,54,0,84,255,215,1,54,0,85,255,236,1,54,0,86,255,236,1,54,0,88,255,236,1,54,0,130,255,174,1,54,0,131,255,174,1,54,0,132,255,174,1,54,0,133,255,174,1,54,0,134,255,174,1,54,0,135,255,174,1,54,0,137,255,236,1,54,0,148,255,236,1,54,0,149,255,236,1,54,0,150,255,236,1,54,0,151,255,236,1,54,0,152,255,236,1,54,0,154,255,236,1,54,0,162,255,215,1,54,0,163,255,215,1,54,0,164,255,215,1,54,0,165,255,215,1,54,0,166,255,215,1,54,0,167,255,215,1,54,0,168,255,215,1,54,0,169,255,215,1,54,0,170,255,215,1,54,0,171,255,215,1,54,0,172,255,215,1,54,0,173,255,215,1,54,0,180,255,215,1,54,0,181,255,215,1,54,0,182,255,215,1,54,0,183,255,215,1,54,0,184,255,215,1,54,0,186,255,215,1,54,0,187,255,236,1,54,0,188,255,236,1,54,0,189,255,236,1,54,0,190,255,236,1,54,0,194,255,174,1,54,0,195,255,215,1,54,0,196,255,174,1,54,0,197,255,215,1,54,0,198,255,174,1,54,0,199,255,215,1,54,0,200,255,236,1,54,0,201,255,215,1,54,0,202,255,236,1,54,0,203,255,215,1,54,0,204,255,236,1,54,0,205,255,215,1,54,0,206,255,236,1,54,0,207,255,215,1,54,0,209,255,215,1,54,0,211,255,215,1,54,0,213,255,215,1,54,0,215,255,215,1,54,0,217,255,215,1,54,0,219,255,215,1,54,0,221,255,215,1,54,0,222,255,236,1,54,0,223,255,236,1,54,0,224,255,236,1,54,0,225,255,236,1,54,0,226,255,236,1,54,0,227,255,236,1,54,0,228,255,236,1,54,0,229,255,236,1,54,0,250,255,236,1,54,1,6,255,236,1,54,1,8,255,236,1,54,1,13,255,236,1,54,1,14,255,236,1,54,1,15,255,215,1,54,1,16,255,236,1,54,1,17,255,215,1,54,1,18,255,236,1,54,1,19,255,215,1,54,1,20,255,236,1,54,1,21,255,215,1,54,1,23,255,236,1,54,1,25,255,236,1,54,1,29,255,236,1,54,1,33,255,236,1,54,1,43,255,236,1,54,1,45,255,236,1,54,1,47,255,236,1,54,1,49,255,236,1,54,1,51,255,236,1,54,1,53,255,236,1,54,1,67,255,174,1,54,1,68,255,215,1,54,1,70,255,215,1,54,1,71,255,236,1,54,1,72,255,215,1,54,1,74,255,236,1,54,2,8,255,154,1,54,2,12,255,154,1,54,2,87,255,236,1,54,2,88,255,174,1,54,2,89,255,215,1,54,2,95,255,236,1,54,2,96,255,215,1,54,2,98,255,236,1,54,3,29,255,174,1,54,3,30,255,215,1,54,3,31,255,174,1,54,3,32,255,215,1,54,3,33,255,174,1,54,3,34,255,215,1,54,3,35,255,174,1,54,3,37,255,174,1,54,3,38,255,215,1,54,3,39,255,174,1,54,3,40,255,215,1,54,3,41,255,174,1,54,3,42,255,215,1,54,3,43,255,174,1,54,3,44,255,215,1,54,3,45,255,174,1,54,3,46,255,215,1,54,3,47,255,174,1,54,3,48,255,215,1,54,3,49,255,174,1,54,3,50,255,215,1,54,3,51,255,174,1,54,3,52,255,215,1,54,3,54,255,215,1,54,3,56,255,215,1,54,3,58,255,215,1,54,3,60,255,215,1,54,3,64,255,215,1,54,3,66,255,215,1,54,3,68,255,215,1,54,3,73,255,236,1,54,3,74,255,215,1,54,3,75,255,236,1,54,3,76,255,215,1,54,3,77,255,236,1,54,3,78,255,215,1,54,3,79,255,236,1,54,3,81,255,236,1,54,3,82,255,215,1,54,3,83,255,236,1,54,3,84,255,215,1,54,3,85,255,236,1,54,3,86,255,215,1,54,3,87,255,236,1,54,3,88,255,215,1,54,3,89,255,236,1,54,3,90,255,215,1,54,3,91,255,236,1,54,3,92,255,215,1,54,3,93,255,236,1,54,3,94,255,215,1,54,3,95,255,236,1,54,3,96,255,215,1,54,3,98,255,236,1,54,3,100,255,236,1,54,3,102,255,236,1,54,3,104,255,236,1,54,3,106,255,236,1,54,3,108,255,236,1,54,3,110,255,236,1,55,0,5,0,82,1,55,0,10,0,82,1,55,0,15,255,174,1,55,0,17,255,174,1,55,0,34,0,41,1,55,2,7,0,82,1,55,2,8,255,174,1,55,2,11,0,82,1,55,2,12,255,174,1,56,0,15,255,133,1,56,0,17,255,133,1,56,0,34,0,41,1,56,0,36,255,133,1,56,0,38,255,215,1,56,0,42,255,215,1,56,0,50,255,215,1,56,0,52,255,215,1,56,0,68,255,154,1,56,0,70,255,154,1,56,0,71,255,154,1,56,0,72,255,154,1,56,0,74,255,215,1,56,0,80,255,195,1,56,0,81,255,195,1,56,0,82,255,154,1,56,0,83,255,195,1,56,0,84,255,154,1,56,0,85,255,195,1,56,0,86,255,174,1,56,0,88,255,195,1,56,0,93,255,215,1,56,0,130,255,133,1,56,0,131,255,133,1,56,0,132,255,133,1,56,0,133,255,133,1,56,0,134,255,133,1,56,0,135,255,133,1,56,0,137,255,215,1,56,0,148,255,215,1,56,0,149,255,215,1,56,0,150,255,215,1,56,0,151,255,215,1,56,0,152,255,215,1,56,0,154,255,215,1,56,0,162,255,154,1,56,0,163,255,154,1,56,0,164,255,154,1,56,0,165,255,154,1,56,0,166,255,154,1,56,0,167,255,154,1,56,0,168,255,154,1,56,0,169,255,154,1,56,0,170,255,154,1,56,0,171,255,154,1,56,0,172,255,154,1,56,0,173,255,154,1,56,0,180,255,154,1,56,0,181,255,154,1,56,0,182,255,154,1,56,0,183,255,154,1,56,0,184,255,154,1,56,0,186,255,154,1,56,0,187,255,195,1,56,0,188,255,195,1,56,0,189,255,195,1,56,0,190,255,195,1,56,0,194,255,133,1,56,0,195,255,154,1,56,0,196,255,133,1,56,0,197,255,154,1,56,0,198,255,133,1,56,0,199,255,154,1,56,0,200,255,215,1,56,0,201,255,154,1,56,0,202,255,215,1,56,0,203,255,154,1,56,0,204,255,215,1,56,0,205,255,154,1,56,0,206,255,215,1,56,0,207,255,154,1,56,0,209,255,154,1,56,0,211,255,154,1,56,0,213,255,154,1,56,0,215,255,154,1,56,0,217,255,154,1,56,0,219,255,154,1,56,0,221,255,154,1,56,0,222,255,215,1,56,0,223,255,215,1,56,0,224,255,215,1,56,0,225,255,215,1,56,0,226,255,215,1,56,0,227,255,215,1,56,0,228,255,215,1,56,0,229,255,215,1,56,0,250,255,195,1,56,1,6,255,195,1,56,1,8,255,195,1,56,1,13,255,195,1,56,1,14,255,215,1,56,1,15,255,154,1,56,1,16,255,215,1,56,1,17,255,154,1,56,1,18,255,215,1,56,1,19,255,154,1,56,1,20,255,215,1,56,1,21,255,154,1,56,1,23,255,195,1,56,1,25,255,195,1,56,1,29,255,174,1,56,1,33,255,174,1,56,1,43,255,195,1,56,1,45,255,195,1,56,1,47,255,195,1,56,1,49,255,195,1,56,1,51,255,195,1,56,1,53,255,195,1,56,1,60,255,215,1,56,1,62,255,215,1,56,1,64,255,215,1,56,1,67,255,133,1,56,1,68,255,154,1,56,1,70,255,154,1,56,1,71,255,215,1,56,1,72,255,154,1,56,1,74,255,174,1,56,2,8,255,133,1,56,2,12,255,133,1,56,2,87,255,195,1,56,2,88,255,133,1,56,2,89,255,154,1,56,2,95,255,215,1,56,2,96,255,154,1,56,2,98,255,195,1,56,3,29,255,133,1,56,3,30,255,154,1,56,3,31,255,133,1,56,3,32,255,154,1,56,3,33,255,133,1,56,3,34,255,154,1,56,3,35,255,133,1,56,3,37,255,133,1,56,3,38,255,154,1,56,3,39,255,133,1,56,3,40,255,154,1,56,3,41,255,133,1,56,3,42,255,154,1,56,3,43,255,133,1,56,3,44,255,154,1,56,3,45,255,133,1,56,3,46,255,154,1,56,3,47,255,133,1,56,3,48,255,154,1,56,3,49,255,133,1,56,3,50,255,154,1,56,3,51,255,133,1,56,3,52,255,154,1,56,3,54,255,154,1,56,3,56,255,154,1,56,3,58,255,154,1,56,3,60,255,154,1,56,3,64,255,154,1,56,3,66,255,154,1,56,3,68,255,154,1,56,3,73,255,215,1,56,3,74,255,154,1,56,3,75,255,215,1,56,3,76,255,154,1,56,3,77,255,215,1,56,3,78,255,154,1,56,3,79,255,215,1,56,3,81,255,215,1,56,3,82,255,154,1,56,3,83,255,215,1,56,3,84,255,154,1,56,3,85,255,215,1,56,3,86,255,154,1,56,3,87,255,215,1,56,3,88,255,154,1,56,3,89,255,215,1,56,3,90,255,154,1,56,3,91,255,215,1,56,3,92,255,154,1,56,3,93,255,215,1,56,3,94,255,154,1,56,3,95,255,215,1,56,3,96,255,154,1,56,3,98,255,195,1,56,3,100,255,195,1,56,3,102,255,195,1,56,3,104,255,195,1,56,3,106,255,195,1,56,3,108,255,195,1,56,3,110,255,195,1,57,0,5,0,82,1,57,0,10,0,82,1,57,0,15,255,174,1,57,0,17,255,174,1,57,0,34,0,41,1,57,2,7,0,82,1,57,2,8,255,174,1,57,2,11,0,82,1,57,2,12,255,174,1,58,0,15,255,133,1,58,0,17,255,133,1,58,0,34,0,41,1,58,0,36,255,133,1,58,0,38,255,215,1,58,0,42,255,215,1,58,0,50,255,215,1,58,0,52,255,215,1,58,0,68,255,154,1,58,0,70,255,154,1,58,0,71,255,154,1,58,0,72,255,154,1,58,0,74,255,215,1,58,0,80,255,195,1,58,0,81,255,195,1,58,0,82,255,154,1,58,0,83,255,195,1,58,0,84,255,154,1,58,0,85,255,195,1,58,0,86,255,174,1,58,0,88,255,195,1,58,0,93,255,215,1,58,0,130,255,133,1,58,0,131,255,133,1,58,0,132,255,133,1,58,0,133,255,133,1,58,0,134,255,133,1,58,0,135,255,133,1,58,0,137,255,215,1,58,0,148,255,215,1,58,0,149,255,215,1,58,0,150,255,215,1,58,0,151,255,215,1,58,0,152,255,215,1,58,0,154,255,215,1,58,0,162,255,154,1,58,0,163,255,154,1,58,0,164,255,154,1,58,0,165,255,154,1,58,0,166,255,154,1,58,0,167,255,154,1,58,0,168,255,154,1,58,0,169,255,154,1,58,0,170,255,154,1,58,0,171,255,154,1,58,0,172,255,154,1,58,0,173,255,154,1,58,0,180,255,154,1,58,0,181,255,154,1,58,0,182,255,154,1,58,0,183,255,154,1,58,0,184,255,154,1,58,0,186,255,154,1,58,0,187,255,195,1,58,0,188,255,195,1,58,0,189,255,195,1,58,0,190,255,195,1,58,0,194,255,133,1,58,0,195,255,154,1,58,0,196,255,133,1,58,0,197,255,154,1,58,0,198,255,133,1,58,0,199,255,154,1,58,0,200,255,215,1,58,0,201,255,154,1,58,0,202,255,215,1,58,0,203,255,154,1,58,0,204,255,215,1,58,0,205,255,154,1,58,0,206,255,215,1,58,0,207,255,154,1,58,0,209,255,154,1,58,0,211,255,154,1,58,0,213,255,154,1,58,0,215,255,154,1,58,0,217,255,154,1,58,0,219,255,154,1,58,0,221,255,154,1,58,0,222,255,215,1,58,0,223,255,215,1,58,0,224,255,215,1,58,0,225,255,215,1,58,0,226,255,215,1,58,0,227,255,215,1,58,0,228,255,215,1,58,0,229,255,215,1,58,0,250,255,195,1,58,1,6,255,195,1,58,1,8,255,195,1,58,1,13,255,195,1,58,1,14,255,215,1,58,1,15,255,154,1,58,1,16,255,215,1,58,1,17,255,154,1,58,1,18,255,215,1,58,1,19,255,154,1,58,1,20,255,215,1,58,1,21,255,154,1,58,1,23,255,195,1,58,1,25,255,195,1,58,1,29,255,174,1,58,1,33,255,174,1,58,1,43,255,195,1,58,1,45,255,195,1,58,1,47,255,195,1,58,1,49,255,195,1,58,1,51,255,195,1,58,1,53,255,195,1,58,1,60,255,215,1,58,1,62,255,215,1,58,1,64,255,215,1,58,1,67,255,133,1,58,1,68,255,154,1,58,1,70,255,154,1,58,1,71,255,215,1,58,1,72,255,154,1,58,1,74,255,174,1,58,2,8,255,133,1,58,2,12,255,133,1,58,2,87,255,195,1,58,2,88,255,133,1,58,2,89,255,154,1,58,2,95,255,215,1,58,2,96,255,154,1,58,2,98,255,195,1,58,3,29,255,133,1,58,3,30,255,154,1,58,3,31,255,133,1,58,3,32,255,154,1,58,3,33,255,133,1,58,3,34,255,154,1,58,3,35,255,133,1,58,3,37,255,133,1,58,3,38,255,154,1,58,3,39,255,133,1,58,3,40,255,154,1,58,3,41,255,133,1,58,3,42,255,154,1,58,3,43,255,133,1,58,3,44,255,154,1,58,3,45,255,133,1,58,3,46,255,154,1,58,3,47,255,133,1,58,3,48,255,154,1,58,3,49,255,133,1,58,3,50,255,154,1,58,3,51,255,133,1,58,3,52,255,154,1,58,3,54,255,154,1,58,3,56,255,154,1,58,3,58,255,154,1,58,3,60,255,154,1,58,3,64,255,154,1,58,3,66,255,154,1,58,3,68,255,154,1,58,3,73,255,215,1,58,3,74,255,154,1,58,3,75,255,215,1,58,3,76,255,154,1,58,3,77,255,215,1,58,3,78,255,154,1,58,3,79,255,215,1,58,3,81,255,215,1,58,3,82,255,154,1,58,3,83,255,215,1,58,3,84,255,154,1,58,3,85,255,215,1,58,3,86,255,154,1,58,3,87,255,215,1,58,3,88,255,154,1,58,3,89,255,215,1,58,3,90,255,154,1,58,3,91,255,215,1,58,3,92,255,154,1,58,3,93,255,215,1,58,3,94,255,154,1,58,3,95,255,215,1,58,3,96,255,154,1,58,3,98,255,195,1,58,3,100,255,195,1,58,3,102,255,195,1,58,3,104,255,195,1,58,3,106,255,195,1,58,3,108,255,195,1,58,3,110,255,195,1,59,0,38,255,236,1,59,0,42,255,236,1,59,0,50,255,236,1,59,0,52,255,236,1,59,0,137,255,236,1,59,0,148,255,236,1,59,0,149,255,236,1,59,0,150,255,236,1,59,0,151,255,236,1,59,0,152,255,236,1,59,0,154,255,236,1,59,0,200,255,236,1,59,0,202,255,236,1,59,0,204,255,236,1,59,0,206,255,236,1,59,0,222,255,236,1,59,0,224,255,236,1,59,0,226,255,236,1,59,0,228,255,236,1,59,1,14,255,236,1,59,1,16,255,236,1,59,1,18,255,236,1,59,1,20,255,236,1,59,1,71,255,236,1,59,2,95,255,236,1,59,3,73,255,236,1,59,3,75,255,236,1,59,3,77,255,236,1,59,3,79,255,236,1,59,3,81,255,236,1,59,3,83,255,236,1,59,3,85,255,236,1,59,3,87,255,236,1,59,3,89,255,236,1,59,3,91,255,236,1,59,3,93,255,236,1,59,3,95,255,236,1,61,0,38,255,236,1,61,0,42,255,236,1,61,0,50,255,236,1,61,0,52,255,236,1,61,0,137,255,236,1,61,0,148,255,236,1,61,0,149,255,236,1,61,0,150,255,236,1,61,0,151,255,236,1,61,0,152,255,236,1,61,0,154,255,236,1,61,0,200,255,236,1,61,0,202,255,236,1,61,0,204,255,236,1,61,0,206,255,236,1,61,0,222,255,236,1,61,0,224,255,236,1,61,0,226,255,236,1,61,0,228,255,236,1,61,1,14,255,236,1,61,1,16,255,236,1,61,1,18,255,236,1,61,1,20,255,236,1,61,1,71,255,236,1,61,2,95,255,236,1,61,3,73,255,236,1,61,3,75,255,236,1,61,3,77,255,236,1,61,3,79,255,236,1,61,3,81,255,236,1,61,3,83,255,236,1,61,3,85,255,236,1,61,3,87,255,236,1,61,3,89,255,236,1,61,3,91,255,236,1,61,3,93,255,236,1,61,3,95,255,236,1,63,0,38,255,236,1,63,0,42,255,236,1,63,0,50,255,236,1,63,0,52,255,236,1,63,0,137,255,236,1,63,0,148,255,236,1,63,0,149,255,236,1,63,0,150,255,236,1,63,0,151,255,236,1,63,0,152,255,236,1,63,0,154,255,236,1,63,0,200,255,236,1,63,0,202,255,236,1,63,0,204,255,236,1,63,0,206,255,236,1,63,0,222,255,236,1,63,0,224,255,236,1,63,0,226,255,236,1,63,0,228,255,236,1,63,1,14,255,236,1,63,1,16,255,236,1,63,1,18,255,236,1,63,1,20,255,236,1,63,1,71,255,236,1,63,2,95,255,236,1,63,3,73,255,236,1,63,3,75,255,236,1,63,3,77,255,236,1,63,3,79,255,236,1,63,3,81,255,236,1,63,3,83,255,236,1,63,3,85,255,236,1,63,3,87,255,236,1,63,3,89,255,236,1,63,3,91,255,236,1,63,3,93,255,236,1,63,3,95,255,236,1,67,0,5,255,113,1,67,0,10,255,113,1,67,0,38,255,215,1,67,0,42,255,215,1,67,0,45,1,10,1,67,0,50,255,215,1,67,0,52,255,215,1,67,0,55,255,113,1,67,0,57,255,174,1,67,0,58,255,174,1,67,0,60,255,133,1,67,0,137,255,215,1,67,0,148,255,215,1,67,0,149,255,215,1,67,0,150,255,215,1,67,0,151,255,215,1,67,0,152,255,215,1,67,0,154,255,215,1,67,0,159,255,133,1,67,0,200,255,215,1,67,0,202,255,215,1,67,0,204,255,215,1,67,0,206,255,215,1,67,0,222,255,215,1,67,0,224,255,215,1,67,0,226,255,215,1,67,0,228,255,215,1,67,1,14,255,215,1,67,1,16,255,215,1,67,1,18,255,215,1,67,1,20,255,215,1,67,1,36,255,113,1,67,1,38,255,113,1,67,1,54,255,174,1,67,1,56,255,133,1,67,1,58,255,133,1,67,1,71,255,215,1,67,1,250,255,174,1,67,1,252,255,174,1,67,1,254,255,174,1,67,2,0,255,133,1,67,2,7,255,113,1,67,2,11,255,113,1,67,2,95,255,215,1,67,3,73,255,215,1,67,3,75,255,215,1,67,3,77,255,215,1,67,3,79,255,215,1,67,3,81,255,215,1,67,3,83,255,215,1,67,3,85,255,215,1,67,3,87,255,215,1,67,3,89,255,215,1,67,3,91,255,215,1,67,3,93,255,215,1,67,3,95,255,215,1,67,3,111,255,133,1,67,3,113,255,133,1,67,3,115,255,133,1,67,3,143,255,113,1,68,0,5,255,236,1,68,0,10,255,236,1,68,2,7,255,236,1,68,2,11,255,236,1,69,0,45,0,123,1,71,0,15,255,174,1,71,0,17,255,174,1,71,0,36,255,215,1,71,0,55,255,195,1,71,0,57,255,236,1,71,0,58,255,236,1,71,0,59,255,215,1,71,0,60,255,236,1,71,0,61,255,236,1,71,0,130,255,215,1,71,0,131,255,215,1,71,0,132,255,215,1,71,0,133,255,215,1,71,0,134,255,215,1,71,0,135,255,215,1,71,0,159,255,236,1,71,0,194,255,215,1,71,0,196,255,215,1,71,0,198,255,215,1,71,1,36,255,195,1,71,1,38,255,195,1,71,1,54,255,236,1,71,1,56,255,236,1,71,1,58,255,236,1,71,1,59,255,236,1,71,1,61,255,236,1,71,1,63,255,236,1,71,1,67,255,215,1,71,1,160,255,236,1,71,1,250,255,236,1,71,1,252,255,236,1,71,1,254,255,236,1,71,2,0,255,236,1,71,2,8,255,174,1,71,2,12,255,174,1,71,2,88,255,215,1,71,3,29,255,215,1,71,3,31,255,215,1,71,3,33,255,215,1,71,3,35,255,215,1,71,3,37,255,215,1,71,3,39,255,215,1,71,3,41,255,215,1,71,3,43,255,215,1,71,3,45,255,215,1,71,3,47,255,215,1,71,3,49,255,215,1,71,3,51,255,215,1,71,3,111,255,236,1,71,3,113,255,236,1,71,3,115,255,236,1,71,3,143,255,195,1,86,0,5,255,113,1,86,0,10,255,113,1,86,1,102,255,215,1,86,1,109,255,215,1,86,1,113,255,113,1,86,1,114,255,133,1,86,1,115,255,215,1,86,1,117,255,174,1,86,1,120,255,133,1,86,2,7,255,113,1,86,2,11,255,113,1,86,2,84,255,133,1,91,0,15,255,174,1,91,0,17,255,174,1,91,1,86,255,215,1,91,1,95,255,215,1,91,1,98,255,215,1,91,1,100,255,236,1,91,1,105,255,215,1,91,1,112,255,236,1,91,1,113,255,195,1,91,1,114,255,236,1,91,1,116,255,215,1,91,1,117,255,236,1,91,1,120,255,236,1,91,1,136,255,236,1,91,2,8,255,174,1,91,2,12,255,174,1,91,2,84,255,236,1,92,0,15,255,133,1,92,0,17,255,133,1,92,1,86,255,133,1,92,1,95,255,133,1,92,1,98,255,133,1,92,1,102,255,215,1,92,1,105,255,133,1,92,1,109,255,215,1,92,1,115,255,195,1,92,1,118,255,236,1,92,1,121,255,154,1,92,1,122,255,174,1,92,1,123,255,195,1,92,1,124,255,195,1,92,1,125,255,195,1,92,1,126,255,154,1,92,1,129,255,195,1,92,1,130,255,174,1,92,1,132,255,195,1,92,1,134,255,195,1,92,1,135,255,195,1,92,1,137,255,195,1,92,1,140,255,154,1,92,1,142,255,154,1,92,1,143,255,154,1,92,1,144,255,154,1,92,1,146,255,195,1,92,1,147,255,154,1,92,1,149,255,195,1,92,1,150,255,195,1,92,1,152,255,195,1,92,1,153,255,154,1,92,1,154,255,195,1,92,1,155,255,195,1,92,2,8,255,133,1,92,2,12,255,133,1,92,2,33,255,236,1,93,1,113,255,215,1,93,1,114,255,236,1,93,1,120,255,236,1,93,2,84,255,236,1,94,0,5,255,215,1,94,0,10,255,215,1,94,2,7,255,215,1,94,2,11,255,215,1,95,0,5,255,113,1,95,0,10,255,113,1,95,1,102,255,215,1,95,1,109,255,215,1,95,1,113,255,113,1,95,1,114,255,133,1,95,1,115,255,215,1,95,1,117,255,174,1,95,1,120,255,133,1,95,2,7,255,113,1,95,2,11,255,113,1,95,2,84,255,133,1,96,0,15,255,174,1,96,0,17,255,174,1,96,1,86,255,215,1,96,1,95,255,215,1,96,1,98,255,215,1,96,1,105,255,215,1,96,1,116,255,215,1,96,2,8,255,174,1,96,2,12,255,174,1,97,0,15,255,133,1,97,0,16,255,174,1,97,0,17,255,133,1,97,1,86,255,92,1,97,1,95,255,92,1,97,1,98,255,92,1,97,1,102,255,195,1,97,1,105,255,92,1,97,1,109,255,195,1,97,1,115,255,154,1,97,1,118,255,195,1,97,1,121,255,113,1,97,1,122,255,154,1,97,1,123,255,154,1,97,1,124,255,174,1,97,1,125,255,154,1,97,1,126,255,113,1,97,1,128,255,215,1,97,1,129,255,195,1,97,1,130,255,154,1,97,1,132,255,154,1,97,1,134,255,174,1,97,1,135,255,154,1,97,1,137,255,154,1,97,1,138,255,215,1,97,1,140,255,113,1,97,1,142,255,154,1,97,1,143,255,113,1,97,1,144,255,113,1,97,1,146,255,154,1,97,1,147,255,113,1,97,1,148,255,215,1,97,1,149,255,154,1,97,1,150,255,154,1,97,1,152,255,154,1,97,1,153,255,113,1,97,1,154,255,154,1,97,1,155,255,154,1,97,2,2,255,174,1,97,2,3,255,174,1,97,2,4,255,174,1,97,2,8,255,133,1,97,2,12,255,133,1,97,2,33,255,195,1,97,2,83,255,215,1,98,0,5,255,113,1,98,0,10,255,113,1,98,1,102,255,215,1,98,1,109,255,215,1,98,1,113,255,113,1,98,1,114,255,133,1,98,1,115,255,215,1,98,1,117,255,174,1,98,1,120,255,133,1,98,2,7,255,113,1,98,2,11,255,113,1,98,2,84,255,133,1,100,1,102,255,236,1,100,1,109,255,236,1,100,1,115,255,195,1,102,0,15,255,174,1,102,0,17,255,174,1,102,1,86,255,215,1,102,1,95,255,215,1,102,1,98,255,215,1,102,1,100,255,236,1,102,1,105,255,215,1,102,1,112,255,236,1,102,1,113,255,195,1,102,1,114,255,236,1,102,1,116,255,215,1,102,1,117,255,236,1,102,1,120,255,236,1,102,1,136,255,236,1,102,2,8,255,174,1,102,2,12,255,174,1,102,2,84,255,236,1,104,1,102,255,215,1,104,1,109,255,215,1,104,1,115,255,195,1,104,1,141,255,236,1,104,1,145,255,236,1,105,0,5,255,113,1,105,0,10,255,113,1,105,1,102,255,215,1,105,1,109,255,215,1,105,1,113,255,113,1,105,1,114,255,133,1,105,1,115,255,215,1,105,1,117,255,174,1,105,1,120,255,133,1,105,2,7,255,113,1,105,2,11,255,113,1,105,2,84,255,133,1,109,0,15,255,174,1,109,0,17,255,174,1,109,1,86,255,215,1,109,1,95,255,215,1,109,1,98,255,215,1,109,1,100,255,236,1,109,1,105,255,215,1,109,1,112,255,236,1,109,1,113,255,195,1,109,1,114,255,236,1,109,1,116,255,215,1,109,1,117,255,236,1,109,1,120,255,236,1,109,1,136,255,236,1,109,2,8,255,174,1,109,2,12,255,174,1,109,2,84,255,236,1,111,0,15,254,246,1,111,0,17,254,246,1,111,1,86,255,154,1,111,1,95,255,154,1,111,1,98,255,154,1,111,1,100,255,236,1,111,1,105,255,154,1,111,1,116,255,215,1,111,1,136,255,215,1,111,2,8,254,246,1,111,2,12,254,246,1,113,0,15,255,133,1,113,0,16,255,174,1,113,0,17,255,133,1,113,1,86,255,92,1,113,1,95,255,92,1,113,1,98,255,92,1,113,1,102,255,195,1,113,1,105,255,92,1,113,1,109,255,195,1,113,1,115,255,154,1,113,1,118,255,195,1,113,1,121,255,113,1,113,1,122,255,154,1,113,1,123,255,154,1,113,1,124,255,174,1,113,1,125,255,154,1,113,1,126,255,113,1,113,1,128,255,215,1,113,1,129,255,195,1,113,1,130,255,154,1,113,1,132,255,154,1,113,1,134,255,174,1,113,1,135,255,154,1,113,1,137,255,154,1,113,1,138,255,215,1,113,1,140,255,113,1,113,1,142,255,154,1,113,1,143,255,113,1,113,1,144,255,113,1,113,1,146,255,154,1,113,1,147,255,113,1,113,1,148,255,215,1,113,1,149,255,154,1,113,1,150,255,154,1,113,1,152,255,154,1,113,1,153,255,113,1,113,1,154,255,154,1,113,1,155,255,154,1,113,2,2,255,174,1,113,2,3,255,174,1,113,2,4,255,174,1,113,2,8,255,133,1,113,2,12,255,133,1,113,2,33,255,195,1,113,2,83,255,215,1,114,0,15,255,133,1,114,0,17,255,133,1,114,1,86,255,133,1,114,1,95,255,133,1,114,1,98,255,133,1,114,1,102,255,215,1,114,1,105,255,133,1,114,1,109,255,215,1,114,1,115,255,195,1,114,1,118,255,236,1,114,1,121,255,154,1,114,1,122,255,174,1,114,1,123,255,195,1,114,1,124,255,195,1,114,1,125,255,195,1,114,1,126,255,154,1,114,1,129,255,195,1,114,1,130,255,174,1,114,1,132,255,195,1,114,1,134,255,195,1,114,1,135,255,195,1,114,1,137,255,195,1,114,1,140,255,154,1,114,1,142,255,154,1,114,1,143,255,154,1,114,1,144,255,154,1,114,1,146,255,195,1,114,1,147,255,154,1,114,1,149,255,195,1,114,1,150,255,195,1,114,1,152,255,195,1,114,1,153,255,154,1,114,1,154,255,195,1,114,1,155,255,195,1,114,2,8,255,133,1,114,2,12,255,133,1,114,2,33,255,236,1,115,0,15,255,154,1,115,0,17,255,154,1,115,1,86,255,215,1,115,1,95,255,215,1,115,1,98,255,215,1,115,1,100,255,195,1,115,1,105,255,215,1,115,1,112,255,236,1,115,1,113,255,174,1,115,1,114,255,195,1,115,1,116,255,236,1,115,1,120,255,195,1,115,1,136,255,236,1,115,2,8,255,154,1,115,2,12,255,154,1,115,2,84,255,195,1,116,1,102,255,215,1,116,1,109,255,215,1,116,1,115,255,195,1,116,1,141,255,236,1,116,1,145,255,236,1,117,0,15,255,133,1,117,0,17,255,133,1,117,1,86,255,174,1,117,1,95,255,174,1,117,1,98,255,174,1,117,1,102,255,236,1,117,1,105,255,174,1,117,1,109,255,236,1,117,2,8,255,133,1,117,2,12,255,133,1,118,1,113,255,215,1,118,1,114,255,236,1,118,1,120,255,236,1,118,2,84,255,236,1,120,0,15,255,133,1,120,0,17,255,133,1,120,1,86,255,133,1,120,1,95,255,133,1,120,1,98,255,133,1,120,1,102,255,215,1,120,1,105,255,133,1,120,1,109,255,215,1,120,1,115,255,195,1,120,1,118,255,236,1,120,1,121,255,154,1,120,1,122,255,174,1,120,1,123,255,195,1,120,1,124,255,195,1,120,1,125,255,195,1,120,1,126,255,154,1,120,1,129,255,195,1,120,1,130,255,174,1,120,1,132,255,195,1,120,1,134,255,195,1,120,1,135,255,195,1,120,1,137,255,195,1,120,1,140,255,154,1,120,1,142,255,154,1,120,1,143,255,154,1,120,1,144,255,154,1,120,1,146,255,195,1,120,1,147,255,154,1,120,1,149,255,195,1,120,1,150,255,195,1,120,1,152,255,195,1,120,1,153,255,154,1,120,1,154,255,195,1,120,1,155,255,195,1,120,2,8,255,133,1,120,2,12,255,133,1,120,2,33,255,236,1,121,1,136,0,41,1,123,0,5,255,236,1,123,0,10,255,236,1,123,2,7,255,236,1,123,2,11,255,236,1,124,0,5,255,174,1,124,0,10,255,174,1,124,1,141,255,236,1,124,1,145,255,236,1,124,2,7,255,174,1,124,2,11,255,174,1,126,1,136,0,41,1,128,0,15,255,174,1,128,0,17,255,174,1,128,1,136,255,236,1,128,2,8,255,174,1,128,2,12,255,174,1,131,0,16,255,154,1,131,1,121,255,215,1,131,1,126,255,215,1,131,1,129,255,215,1,131,1,140,255,215,1,131,1,141,255,215,1,131,1,143,255,215,1,131,1,144,255,215,1,131,1,145,255,215,1,131,1,147,255,215,1,131,1,153,255,215,1,131,2,2,255,154,1,131,2,3,255,154,1,131,2,4,255,154,1,132,0,5,255,236,1,132,0,10,255,236,1,132,2,7,255,236,1,132,2,11,255,236,1,133,0,15,255,215,1,133,0,17,255,215,1,133,2,8,255,215,1,133,2,12,255,215,1,134,0,5,255,174,1,134,0,10,255,174,1,134,1,141,255,236,1,134,1,145,255,236,1,134,2,7,255,174,1,134,2,11,255,174,1,135,1,121,255,215,1,135,1,126,255,215,1,135,1,140,255,215,1,135,1,143,255,215,1,135,1,144,255,215,1,135,1,147,255,215,1,135,1,153,255,215,1,136,0,5,255,133,1,136,0,10,255,133,1,136,1,121,255,236,1,136,1,126,255,236,1,136,1,128,255,215,1,136,1,138,255,215,1,136,1,140,255,236,1,136,1,141,255,215,1,136,1,143,255,236,1,136,1,144,255,236,1,136,1,145,255,215,1,136,1,147,255,236,1,136,1,153,255,236,1,136,2,7,255,133,1,136,2,11,255,133,1,138,0,15,255,174,1,138,0,17,255,174,1,138,1,136,255,236,1,138,2,8,255,174,1,138,2,12,255,174,1,140,0,5,255,236,1,140,0,10,255,236,1,140,1,128,255,215,1,140,1,138,255,215,1,140,2,7,255,236,1,140,2,11,255,236,1,142,0,5,255,236,1,142,0,10,255,236,1,142,1,128,255,215,1,142,1,138,255,215,1,142,2,7,255,236,1,142,2,11,255,236,1,144,0,15,255,236,1,144,0,17,255,236,1,144,2,8,255,236,1,144,2,12,255,236,1,147,0,5,255,236,1,147,0,10,255,236,1,147,1,128,255,215,1,147,1,138,255,215,1,147,2,7,255,236,1,147,2,11,255,236,1,148,0,15,255,195,1,148,0,16,255,215,1,148,0,17,255,195,1,148,1,121,255,215,1,148,1,126,255,215,1,148,1,129,255,215,1,148,1,140,255,215,1,148,1,143,255,215,1,148,1,144,255,215,1,148,1,147,255,215,1,148,1,153,255,215,1,148,2,2,255,215,1,148,2,3,255,215,1,148,2,4,255,215,1,148,2,8,255,195,1,148,2,12,255,195,1,151,0,5,255,215,1,151,0,10,255,215,1,151,2,7,255,215,1,151,2,11,255,215,1,153,0,5,255,236,1,153,0,10,255,236,1,153,1,128,255,215,1,153,1,138,255,215,1,153,2,7,255,236,1,153,2,11,255,236,1,157,0,5,255,174,1,157,0,10,255,174,1,157,1,157,255,133,1,157,1,166,255,133,1,157,1,168,255,215,1,157,1,188,255,154,1,157,1,189,255,215,1,157,1,193,255,154,1,157,1,196,255,133,1,157,1,220,255,215,1,157,1,221,255,215,1,157,1,225,255,215,1,157,1,228,255,215,1,157,1,246,255,215,1,157,2,7,255,174,1,157,2,11,255,174,1,157,2,110,255,174,1,157,2,124,255,154,1,157,2,128,255,174,1,157,2,130,255,174,1,157,2,151,255,174,1,157,2,155,255,174,1,157,2,167,255,174,1,157,2,169,255,133,1,157,2,170,255,215,1,157,2,181,255,154,1,157,2,182,255,215,1,157,2,183,255,154,1,157,2,184,255,215,1,157,2,185,255,154,1,157,2,186,255,215,1,157,2,189,255,133,1,157,2,190,255,215,1,157,2,191,255,154,1,157,2,192,255,215,1,157,2,193,255,154,1,157,2,194,255,215,1,157,2,212,255,154,1,157,2,213,255,215,1,157,2,247,255,215,1,157,2,248,255,215,1,157,2,249,255,215,1,157,2,250,255,215,1,157,2,251,255,215,1,157,2,252,255,215,1,157,2,253,255,154,1,157,2,254,255,215,1,157,3,3,255,174,1,157,3,13,255,154,1,157,3,14,255,195,1,157,3,15,255,154,1,157,3,16,255,195,1,157,3,23,255,133,1,157,3,24,255,215,1,158,0,15,255,133,1,158,0,16,255,174,1,158,0,17,255,133,1,158,1,159,255,215,1,158,1,164,255,154,1,158,1,170,255,113,1,158,1,174,255,154,1,158,1,181,255,154,1,158,1,184,255,215,1,158,1,187,255,215,1,158,1,188,0,41,1,158,1,190,255,174,1,158,1,204,255,154,1,158,1,205,255,154,1,158,1,206,255,133,1,158,1,207,255,113,1,158,1,208,255,215,1,158,1,209,255,215,1,158,1,210,255,154,1,158,1,211,255,154,1,158,1,212,255,154,1,158,1,213,255,133,1,158,1,214,255,154,1,158,1,215,255,154,1,158,1,216,255,113,1,158,1,217,255,154,1,158,1,218,255,154,1,158,1,219,255,113,1,158,1,220,255,174,1,158,1,221,255,174,1,158,1,222,255,113,1,158,1,223,255,215,1,158,1,224,255,154,1,158,1,225,255,154,1,158,1,226,255,154,1,158,1,227,255,154,1,158,1,228,255,174,1,158,1,229,255,154,1,158,1,230,255,154,1,158,1,231,255,215,1,158,1,232,255,154,1,158,1,233,255,195,1,158,1,234,255,113,1,158,1,236,255,154,1,158,1,237,255,113,1,158,1,238,255,133,1,158,1,242,255,133,1,158,1,243,255,154,1,158,1,245,255,154,1,158,1,246,255,174,1,158,1,247,255,154,1,158,1,249,255,154,1,158,2,2,255,174,1,158,2,3,255,174,1,158,2,4,255,174,1,158,2,8,255,133,1,158,2,12,255,133,1,158,2,106,255,113,1,158,2,107,255,154,1,158,2,108,255,215,1,158,2,109,255,215,1,158,2,113,255,154,1,158,2,114,255,113,1,158,2,115,255,133,1,158,2,117,255,154,1,158,2,119,255,154,1,158,2,121,255,154,1,158,2,125,255,154,1,158,2,126,255,215,1,158,2,127,255,113,1,158,2,129,255,215,1,158,2,131,255,215,1,158,2,132,255,215,1,158,2,133,255,113,1,158,2,134,255,215,1,158,2,135,255,113,1,158,2,136,255,215,1,158,2,137,255,113,1,158,2,138,255,215,1,158,2,139,255,215,1,158,2,140,255,215,1,158,2,141,255,113,1,158,2,150,255,154,1,158,2,154,255,154,1,158,2,158,255,154,1,158,2,160,255,215,1,158,2,162,255,215,1,158,2,164,255,154,1,158,2,166,255,154,1,158,2,170,255,174,1,158,2,172,255,154,1,158,2,174,255,154,1,158,2,176,255,154,1,158,2,177,255,215,1,158,2,178,255,113,1,158,2,179,255,215,1,158,2,180,255,113,1,158,2,181,0,41,1,158,2,182,255,174,1,158,2,184,255,174,1,158,2,186,255,174,1,158,2,188,255,215,1,158,2,190,255,174,1,158,2,192,255,154,1,158,2,194,255,154,1,158,2,196,255,154,1,158,2,197,255,154,1,158,2,198,255,113,1,158,2,199,255,154,1,158,2,200,255,113,1,158,2,203,255,215,1,158,2,205,255,154,1,158,2,206,255,154,1,158,2,207,255,133,1,158,2,209,255,154,1,158,2,211,255,154,1,158,2,213,255,154,1,158,2,215,255,154,1,158,2,217,255,113,1,158,2,219,255,113,1,158,2,221,255,113,1,158,2,224,255,113,1,158,2,230,255,215,1,158,2,232,255,215,1,158,2,234,255,195,1,158,2,236,255,154,1,158,2,238,255,154,1,158,2,239,255,215,1,158,2,240,255,113,1,158,2,241,255,215,1,158,2,242,255,113,1,158,2,243,255,215,1,158,2,244,255,113,1,158,2,246,255,215,1,158,2,248,255,174,1,158,2,250,255,174,1,158,2,252,255,174,1,158,2,254,255,154,1,158,3,0,255,154,1,158,3,2,255,154,1,158,3,6,255,215,1,158,3,8,255,215,1,158,3,9,255,113,1,158,3,10,255,113,1,158,3,11,255,113,1,158,3,12,255,113,1,158,3,14,255,154,1,158,3,16,255,154,1,158,3,17,255,154,1,158,3,18,255,133,1,158,3,20,255,154,1,158,3,21,255,215,1,158,3,22,255,113,1,158,3,24,255,174,1,158,3,26,255,113,1,158,3,27,255,154,1,158,3,28,255,133,1,159,1,159,255,215,1,159,1,184,255,215,1,159,1,187,255,215,1,159,1,190,255,215,1,159,1,225,255,215,1,159,2,108,255,215,1,159,2,126,255,215,1,159,2,132,255,215,1,159,2,134,255,215,1,159,2,136,255,215,1,159,2,138,255,215,1,159,2,140,255,215,1,159,2,177,255,215,1,159,2,179,255,215,1,159,2,192,255,215,1,159,2,194,255,215,1,159,2,197,255,215,1,159,2,199,255,215,1,159,2,213,255,215,1,159,2,239,255,215,1,159,2,241,255,215,1,159,2,243,255,215,1,159,2,254,255,215,1,159,3,9,255,215,1,159,3,11,255,215,1,159,3,14,255,215,1,159,3,16,255,215,1,159,3,21,255,215,1,160,3,14,255,215,1,160,3,16,255,215,1,164,0,5,255,174,1,164,0,10,255,174,1,164,1,157,255,133,1,164,1,166,255,133,1,164,1,168,255,215,1,164,1,188,255,154,1,164,1,189,255,215,1,164,1,193,255,154,1,164,1,196,255,133,1,164,1,220,255,215,1,164,1,221,255,215,1,164,1,225,255,215,1,164,1,228,255,215,1,164,1,246,255,215,1,164,2,7,255,174,1,164,2,11,255,174,1,164,2,110,255,174,1,164,2,124,255,154,1,164,2,128,255,174,1,164,2,130,255,174,1,164,2,151,255,174,1,164,2,155,255,174,1,164,2,167,255,174,1,164,2,169,255,133,1,164,2,170,255,215,1,164,2,181,255,154,1,164,2,182,255,215,1,164,2,183,255,154,1,164,2,184,255,215,1,164,2,185,255,154,1,164,2,186,255,215,1,164,2,189,255,133,1,164,2,190,255,215,1,164,2,191,255,154,1,164,2,192,255,215,1,164,2,193,255,154,1,164,2,194,255,215,1,164,2,212,255,154,1,164,2,213,255,215,1,164,2,247,255,215,1,164,2,248,255,215,1,164,2,249,255,215,1,164,2,250,255,215,1,164,2,251,255,215,1,164,2,252,255,215,1,164,2,253,255,154,1,164,2,254,255,215,1,164,3,3,255,174,1,164,3,13,255,154,1,164,3,14,255,195,1,164,3,15,255,154,1,164,3,16,255,195,1,164,3,23,255,133,1,164,3,24,255,215,1,165,0,5,255,174,1,165,0,10,255,174,1,165,1,157,255,133,1,165,1,166,255,133,1,165,1,168,255,215,1,165,1,188,255,154,1,165,1,189,255,215,1,165,1,193,255,154,1,165,1,196,255,133,1,165,1,220,255,215,1,165,1,221,255,215,1,165,1,225,255,215,1,165,1,228,255,215,1,165,1,246,255,215,1,165,2,7,255,174,1,165,2,11,255,174,1,165,2,110,255,174,1,165,2,124,255,154,1,165,2,128,255,174,1,165,2,130,255,174,1,165,2,151,255,174,1,165,2,155,255,174,1,165,2,167,255,174,1,165,2,169,255,133,1,165,2,170,255,215,1,165,2,181,255,154,1,165,2,182,255,215,1,165,2,183,255,154,1,165,2,184,255,215,1,165,2,185,255,154,1,165,2,186,255,215,1,165,2,189,255,133,1,165,2,190,255,215,1,165,2,191,255,154,1,165,2,192,255,215,1,165,2,193,255,154,1,165,2,194,255,215,1,165,2,212,255,154,1,165,2,213,255,215,1,165,2,247,255,215,1,165,2,248,255,215,1,165,2,249,255,215,1,165,2,250,255,215,1,165,2,251,255,215,1,165,2,252,255,215,1,165,2,253,255,154,1,165,2,254,255,215,1,165,3,3,255,174,1,165,3,13,255,154,1,165,3,14,255,195,1,165,3,15,255,154,1,165,3,16,255,195,1,165,3,23,255,133,1,165,3,24,255,215,1,166,0,5,255,174,1,166,0,10,255,174,1,166,1,157,255,133,1,166,1,166,255,133,1,166,1,168,255,215,1,166,1,188,255,154,1,166,1,189,255,215,1,166,1,193,255,154,1,166,1,196,255,133,1,166,1,220,255,215,1,166,1,221,255,215,1,166,1,225,255,215,1,166,1,228,255,215,1,166,1,246,255,215,1,166,2,7,255,174,1,166,2,11,255,174,1,166,2,110,255,174,1,166,2,124,255,154,1,166,2,128,255,174,1,166,2,130,255,174,1,166,2,151,255,174,1,166,2,155,255,174,1,166,2,167,255,174,1,166,2,169,255,133,1,166,2,170,255,215,1,166,2,181,255,154,1,166,2,182,255,215,1,166,2,183,255,154,1,166,2,184,255,215,1,166,2,185,255,154,1,166,2,186,255,215,1,166,2,189,255,133,1,166,2,190,255,215,1,166,2,191,255,154,1,166,2,192,255,215,1,166,2,193,255,154,1,166,2,194,255,215,1,166,2,212,255,154,1,166,2,213,255,215,1,166,2,247,255,215,1,166,2,248,255,215,1,166,2,249,255,215,1,166,2,250,255,215,1,166,2,251,255,215,1,166,2,252,255,215,1,166,2,253,255,154,1,166,2,254,255,215,1,166,3,3,255,174,1,166,3,13,255,154,1,166,3,14,255,195,1,166,3,15,255,154,1,166,3,16,255,195,1,166,3,23,255,133,1,166,3,24,255,215,1,167,1,159,255,215,1,167,1,184,255,215,1,167,1,187,255,215,1,167,1,190,255,215,1,167,1,193,255,215,1,167,1,225,255,215,1,167,2,108,255,215,1,167,2,124,255,215,1,167,2,126,255,215,1,167,2,132,255,215,1,167,2,134,255,215,1,167,2,136,255,215,1,167,2,138,255,215,1,167,2,140,255,215,1,167,2,177,255,215,1,167,2,179,255,215,1,167,2,191,255,215,1,167,2,192,255,215,1,167,2,193,255,215,1,167,2,194,255,215,1,167,2,197,255,154,1,167,2,199,255,154,1,167,2,212,255,215,1,167,2,213,255,215,1,167,2,239,255,215,1,167,2,241,255,215,1,167,2,243,255,215,1,167,2,253,255,215,1,167,2,254,255,215,1,167,3,9,255,215,1,167,3,11,255,215,1,167,3,14,255,215,1,167,3,16,255,215,1,167,3,21,255,215,1,167,3,25,255,236,1,168,0,15,255,133,1,168,0,17,255,133,1,168,1,159,255,236,1,168,1,164,255,154,1,168,1,170,255,113,1,168,1,174,255,154,1,168,1,181,255,154,1,168,1,184,255,236,1,168,1,187,255,236,1,168,1,190,255,195,1,168,1,201,255,236,1,168,1,206,255,174,1,168,1,207,255,215,1,168,1,213,255,174,1,168,1,216,255,215,1,168,1,219,255,215,1,168,1,222,255,215,1,168,1,225,255,215,1,168,1,234,255,215,1,168,1,235,0,102,1,168,1,237,255,215,1,168,1,238,255,236,1,168,1,242,255,174,1,168,1,244,0,102,1,168,2,8,255,133,1,168,2,12,255,133,1,168,2,106,255,215,1,168,2,108,255,236,1,168,2,114,255,113,1,168,2,115,255,174,1,168,2,126,255,236,1,168,2,127,255,215,1,168,2,132,255,236,1,168,2,133,255,215,1,168,2,134,255,236,1,168,2,135,255,215,1,168,2,136,255,236,1,168,2,137,255,215,1,168,2,138,255,236,1,168,2,140,255,236,1,168,2,141,255,215,1,168,2,152,0,102,1,168,2,168,0,102,1,168,2,177,255,236,1,168,2,178,255,215,1,168,2,179,255,236,1,168,2,180,255,215,1,168,2,192,255,215,1,168,2,194,255,215,1,168,2,197,255,215,1,168,2,198,255,195,1,168,2,199,255,215,1,168,2,200,255,195,1,168,2,206,255,154,1,168,2,207,255,174,1,168,2,213,255,215,1,168,2,217,255,113,1,168,2,219,255,113,1,168,2,221,255,113,1,168,2,224,255,215,1,168,2,239,255,236,1,168,2,240,255,215,1,168,2,241,255,236,1,168,2,242,255,215,1,168,2,243,255,236,1,168,2,244,255,215,1,168,2,254,255,215,1,168,3,9,255,113,1,168,3,10,255,215,1,168,3,11,255,113,1,168,3,12,255,215,1,168,3,17,255,154,1,168,3,18,255,174,1,168,3,21,255,236,1,168,3,22,255,215,1,168,3,26,255,215,1,168,3,27,255,154,1,168,3,28,255,174,1,170,0,5,255,113,1,170,0,10,255,113,1,170,1,157,255,154,1,170,1,166,255,154,1,170,1,188,255,113,1,170,1,190,255,215,1,170,1,193,255,154,1,170,1,196,255,154,1,170,1,220,255,215,1,170,1,225,255,215,1,170,1,228,255,215,1,170,2,7,255,113,1,170,2,11,255,113,1,170,2,110,255,215,1,170,2,124,255,154,1,170,2,128,255,174,1,170,2,130,255,174,1,170,2,151,255,215,1,170,2,155,255,215,1,170,2,167,255,215,1,170,2,169,255,154,1,170,2,170,255,215,1,170,2,181,255,113,1,170,2,182,255,215,1,170,2,183,255,133,1,170,2,185,255,133,1,170,2,189,255,154,1,170,2,190,255,215,1,170,2,191,255,154,1,170,2,192,255,215,1,170,2,193,255,154,1,170,2,194,255,215,1,170,2,197,255,154,1,170,2,199,255,154,1,170,2,212,255,154,1,170,2,213,255,215,1,170,2,225,255,215,1,170,2,227,255,215,1,170,2,253,255,154,1,170,2,254,255,215,1,170,3,3,255,215,1,170,3,13,255,113,1,170,3,14,255,215,1,170,3,15,255,113,1,170,3,16,255,215,1,170,3,23,255,154,1,170,3,24,255,215,1,171,0,5,255,215,1,171,0,10,255,215,1,171,1,170,255,236,1,171,1,193,255,215,1,171,2,7,255,215,1,171,2,11,255,215,1,171,2,114,255,236,1,171,2,124,255,215,1,171,2,191,255,215,1,171,2,193,255,215,1,171,2,197,255,215,1,171,2,199,255,215,1,171,2,212,255,215,1,171,2,217,255,236,1,171,2,219,255,236,1,171,2,221,255,236,1,171,2,253,255,215,1,172,0,15,255,174,1,172,0,17,255,174,1,172,2,8,255,174,1,172,2,12,255,174,1,172,2,128,255,236,1,172,2,130,255,236,1,172,2,183,255,236,1,172,2,185,255,236,1,172,3,13,255,215,1,172,3,15,255,215,1,173,0,15,255,133,1,173,0,16,255,174,1,173,0,17,255,133,1,173,1,159,255,215,1,173,1,164,255,154,1,173,1,170,255,113,1,173,1,174,255,154,1,173,1,181,255,154,1,173,1,184,255,215,1,173,1,187,255,215,1,173,1,188,0,41,1,173,1,190,255,174,1,173,1,204,255,154,1,173,1,205,255,154,1,173,1,206,255,133,1,173,1,207,255,113,1,173,1,208,255,215,1,173,1,209,255,215,1,173,1,210,255,154,1,173,1,211,255,154,1,173,1,212,255,154,1,173,1,213,255,133,1,173,1,214,255,154,1,173,1,215,255,154,1,173,1,216,255,113,1,173,1,217,255,154,1,173,1,218,255,154,1,173,1,219,255,113,1,173,1,220,255,174,1,173,1,221,255,174,1,173,1,222,255,113,1,173,1,223,255,215,1,173,1,224,255,154,1,173,1,225,255,154,1,173,1,226,255,154,1,173,1,227,255,154,1,173,1,228,255,174,1,173,1,229,255,154,1,173,1,230,255,154,1,173,1,231,255,215,1,173,1,232,255,154,1,173,1,233,255,195,1,173,1,234,255,113,1,173,1,236,255,154,1,173,1,237,255,113,1,173,1,238,255,133,1,173,1,242,255,133,1,173,1,243,255,154,1,173,1,245,255,154,1,173,1,246,255,174,1,173,1,247,255,154,1,173,1,249,255,154,1,173,2,2,255,174,1,173,2,3,255,174,1,173,2,4,255,174,1,173,2,8,255,133,1,173,2,12,255,133,1,173,2,106,255,113,1,173,2,107,255,154,1,173,2,108,255,215,1,173,2,109,255,215,1,173,2,113,255,154,1,173,2,114,255,113,1,173,2,115,255,133,1,173,2,117,255,154,1,173,2,119,255,154,1,173,2,121,255,154,1,173,2,125,255,154,1,173,2,126,255,215,1,173,2,127,255,113,1,173,2,129,255,215,1,173,2,131,255,215,1,173,2,132,255,215,1,173,2,133,255,113,1,173,2,134,255,215,1,173,2,135,255,113,1,173,2,136,255,215,1,173,2,137,255,113,1,173,2,138,255,215,1,173,2,139,255,215,1,173,2,140,255,215,1,173,2,141,255,113,1,173,2,150,255,154,1,173,2,154,255,154,1,173,2,158,255,154,1,173,2,160,255,215,1,173,2,162,255,215,1,173,2,164,255,154,1,173,2,166,255,154,1,173,2,170,255,174,1,173,2,172,255,154,1,173,2,174,255,154,1,173,2,176,255,154,1,173,2,177,255,215,1,173,2,178,255,113,1,173,2,179,255,215,1,173,2,180,255,113,1,173,2,181,0,41,1,173,2,182,255,174,1,173,2,184,255,174,1,173,2,186,255,174,1,173,2,188,255,215,1,173,2,190,255,174,1,173,2,192,255,154,1,173,2,194,255,154,1,173,2,196,255,154,1,173,2,197,255,154,1,173,2,198,255,113,1,173,2,199,255,154,1,173,2,200,255,113,1,173,2,203,255,215,1,173,2,205,255,154,1,173,2,206,255,154,1,173,2,207,255,133,1,173,2,209,255,154,1,173,2,211,255,154,1,173,2,213,255,154,1,173,2,215,255,154,1,173,2,217,255,113,1,173,2,219,255,113,1,173,2,221,255,113,1,173,2,224,255,113,1,173,2,230,255,215,1,173,2,232,255,215,1,173,2,234,255,195,1,173,2,236,255,154,1,173,2,238,255,154,1,173,2,239,255,215,1,173,2,240,255,113,1,173,2,241,255,215,1,173,2,242,255,113,1,173,2,243,255,215,1,173,2,244,255,113,1,173,2,246,255,215,1,173,2,248,255,174,1,173,2,250,255,174,1,173,2,252,255,174,1,173,2,254,255,154,1,173,3,0,255,154,1,173,3,2,255,154,1,173,3,6,255,215,1,173,3,8,255,215,1,173,3,9,255,113,1,173,3,10,255,113,1,173,3,11,255,113,1,173,3,12,255,113,1,173,3,14,255,154,1,173,3,16,255,154,1,173,3,17,255,154,1,173,3,18,255,133,1,173,3,20,255,154,1,173,3,21,255,215,1,173,3,22,255,113,1,173,3,24,255,174,1,173,3,26,255,113,1,173,3,27,255,154,1,173,3,28,255,133,1,174,1,163,0,225,1,174,2,234,0,41,1,174,3,14,255,215,1,174,3,16,255,215,1,176,1,159,255,215,1,176,1,184,255,215,1,176,1,187,255,215,1,176,1,190,255,215,1,176,1,193,255,215,1,176,1,225,255,215,1,176,2,108,255,215,1,176,2,124,255,215,1,176,2,126,255,215,1,176,2,132,255,215,1,176,2,134,255,215,1,176,2,136,255,215,1,176,2,138,255,215,1,176,2,140,255,215,1,176,2,177,255,215,1,176,2,179,255,215,1,176,2,191,255,215,1,176,2,192,255,215,1,176,2,193,255,215,1,176,2,194,255,215,1,176,2,197,255,154,1,176,2,199,255,154,1,176,2,212,255,215,1,176,2,213,255,215,1,176,2,239,255,215,1,176,2,241,255,215,1,176,2,243,255,215,1,176,2,253,255,215,1,176,2,254,255,215,1,176,3,9,255,215,1,176,3,11,255,215,1,176,3,14,255,215,1,176,3,16,255,215,1,176,3,21,255,215,1,176,3,25,255,236,1,177,0,15,255,174,1,177,0,17,255,174,1,177,2,8,255,174,1,177,2,12,255,174,1,177,2,128,255,236,1,177,2,130,255,236,1,177,2,183,255,236,1,177,2,185,255,236,1,177,3,13,255,215,1,177,3,15,255,215,1,180,1,159,255,215,1,180,1,184,255,215,1,180,1,187,255,215,1,180,1,190,255,215,1,180,1,193,255,215,1,180,1,225,255,215,1,180,2,108,255,215,1,180,2,124,255,215,1,180,2,126,255,215,1,180,2,132,255,215,1,180,2,134,255,215,1,180,2,136,255,215,1,180,2,138,255,215,1,180,2,140,255,215,1,180,2,177,255,215,1,180,2,179,255,215,1,180,2,191,255,215,1,180,2,192,255,215,1,180,2,193,255,215,1,180,2,194,255,215,1,180,2,197,255,154,1,180,2,199,255,154,1,180,2,212,255,215,1,180,2,213,255,215,1,180,2,239,255,215,1,180,2,241,255,215,1,180,2,243,255,215,1,180,2,253,255,215,1,180,2,254,255,215,1,180,3,9,255,215,1,180,3,11,255,215,1,180,3,14,255,215,1,180,3,16,255,215,1,180,3,21,255,215,1,180,3,25,255,236,1,184,0,15,255,174,1,184,0,17,255,174,1,184,1,157,255,236,1,184,1,164,255,215,1,184,1,166,255,236,1,184,1,168,255,215,1,184,1,170,255,215,1,184,1,174,255,215,1,184,1,176,255,215,1,184,1,177,255,236,1,184,1,181,255,215,1,184,1,188,255,195,1,184,1,189,255,215,1,184,1,191,255,215,1,184,1,193,255,215,1,184,1,196,255,236,1,184,1,199,255,236,1,184,1,206,255,236,1,184,1,213,255,236,1,184,1,242,255,236,1,184,2,8,255,174,1,184,2,12,255,174,1,184,2,114,255,215,1,184,2,115,255,236,1,184,2,122,255,236,1,184,2,124,255,215,1,184,2,128,255,236,1,184,2,130,255,236,1,184,2,159,255,215,1,184,2,161,255,236,1,184,2,169,255,236,1,184,2,181,255,195,1,184,2,183,255,236,1,184,2,185,255,236,1,184,2,187,255,215,1,184,2,189,255,236,1,184,2,191,255,215,1,184,2,193,255,215,1,184,2,202,255,215,1,184,2,206,255,215,1,184,2,207,255,236,1,184,2,212,255,215,1,184,2,217,255,215,1,184,2,219,255,215,1,184,2,221,255,215,1,184,2,229,255,215,1,184,2,231,255,236,1,184,2,245,255,236,1,184,2,247,255,215,1,184,2,249,255,215,1,184,2,251,255,215,1,184,2,253,255,215,1,184,3,5,255,215,1,184,3,7,255,215,1,184,3,13,255,215,1,184,3,15,255,215,1,184,3,17,255,215,1,184,3,18,255,236,1,184,3,23,255,236,1,184,3,27,255,215,1,184,3,28,255,236,1,186,0,15,254,246,1,186,0,17,254,246,1,186,1,164,255,133,1,186,1,170,255,154,1,186,1,174,255,133,1,186,1,176,255,215,1,186,1,181,255,133,1,186,1,191,255,215,1,186,1,206,255,154,1,186,1,213,255,154,1,186,1,242,255,154,1,186,2,8,254,246,1,186,2,12,254,246,1,186,2,114,255,154,1,186,2,115,255,154,1,186,2,118,255,236,1,186,2,159,255,215,1,186,2,187,255,215,1,186,2,202,255,215,1,186,2,206,255,133,1,186,2,207,255,154,1,186,2,217,255,154,1,186,2,219,255,154,1,186,2,221,255,154,1,186,2,229,255,215,1,186,3,5,255,215,1,186,3,7,255,215,1,186,3,9,255,174,1,186,3,11,255,174,1,186,3,17,255,133,1,186,3,18,255,154,1,186,3,27,255,133,1,186,3,28,255,154,1,187,1,159,255,215,1,187,1,184,255,215,1,187,1,187,255,215,1,187,1,190,255,215,1,187,1,225,255,215,1,187,2,108,255,215,1,187,2,126,255,215,1,187,2,132,255,215,1,187,2,134,255,215,1,187,2,136,255,215,1,187,2,138,255,215,1,187,2,140,255,215,1,187,2,177,255,215,1,187,2,179,255,215,1,187,2,192,255,215,1,187,2,194,255,215,1,187,2,197,255,215,1,187,2,199,255,215,1,187,2,213,255,215,1,187,2,239,255,215,1,187,2,241,255,215,1,187,2,243,255,215,1,187,2,254,255,215,1,187,3,9,255,215,1,187,3,11,255,215,1,187,3,14,255,215,1,187,3,16,255,215,1,187,3,21,255,215,1,188,0,15,255,133,1,188,0,16,255,174,1,188,0,17,255,133,1,188,1,159,255,215,1,188,1,164,255,154,1,188,1,170,255,113,1,188,1,174,255,154,1,188,1,181,255,154,1,188,1,184,255,215,1,188,1,187,255,215,1,188,1,188,0,41,1,188,1,190,255,174,1,188,1,204,255,154,1,188,1,205,255,154,1,188,1,206,255,133,1,188,1,207,255,113,1,188,1,208,255,215,1,188,1,209,255,215,1,188,1,210,255,154,1,188,1,211,255,154,1,188,1,212,255,154,1,188,1,213,255,133,1,188,1,214,255,154,1,188,1,215,255,154,1,188,1,216,255,113,1,188,1,217,255,154,1,188,1,218,255,154,1,188,1,219,255,113,1,188,1,220,255,174,1,188,1,221,255,174,1,188,1,222,255,113,1,188,1,223,255,215,1,188,1,224,255,154,1,188,1,225,255,154,1,188,1,226,255,154,1,188,1,227,255,154,1,188,1,228,255,174,1,188,1,229,255,154,1,188,1,230,255,154,1,188,1,231,255,215,1,188,1,232,255,154,1,188,1,233,255,195,1,188,1,234,255,113,1,188,1,236,255,154,1,188,1,237,255,113,1,188,1,238,255,133,1,188,1,242,255,133,1,188,1,243,255,154,1,188,1,245,255,154,1,188,1,246,255,174,1,188,1,247,255,154,1,188,1,249,255,154,1,188,2,2,255,174,1,188,2,3,255,174,1,188,2,4,255,174,1,188,2,8,255,133,1,188,2,12,255,133,1,188,2,106,255,113,1,188,2,107,255,154,1,188,2,108,255,215,1,188,2,109,255,215,1,188,2,113,255,154,1,188,2,114,255,113,1,188,2,115,255,133,1,188,2,117,255,154,1,188,2,119,255,154,1,188,2,121,255,154,1,188,2,125,255,154,1,188,2,126,255,215,1,188,2,127,255,113,1,188,2,129,255,215,1,188,2,131,255,215,1,188,2,132,255,215,1,188,2,133,255,113,1,188,2,134,255,215,1,188,2,135,255,113,1,188,2,136,255,215,1,188,2,137,255,113,1,188,2,138,255,215,1,188,2,139,255,215,1,188,2,140,255,215,1,188,2,141,255,113,1,188,2,150,255,154,1,188,2,154,255,154,1,188,2,158,255,154,1,188,2,160,255,215,1,188,2,162,255,215,1,188,2,164,255,154,1,188,2,166,255,154,1,188,2,170,255,174,1,188,2,172,255,154,1,188,2,174,255,154,1,188,2,176,255,154,1,188,2,177,255,215,1,188,2,178,255,113,1,188,2,179,255,215,1,188,2,180,255,113,1,188,2,181,0,41,1,188,2,182,255,174,1,188,2,184,255,174,1,188,2,186,255,174,1,188,2,188,255,215,1,188,2,190,255,174,1,188,2,192,255,154,1,188,2,194,255,154,1,188,2,196,255,154,1,188,2,197,255,154,1,188,2,198,255,113,1,188,2,199,255,154,1,188,2,200,255,113,1,188,2,203,255,215,1,188,2,205,255,154,1,188,2,206,255,154,1,188,2,207,255,133,1,188,2,209,255,154,1,188,2,211,255,154,1,188,2,213,255,154,1,188,2,215,255,154,1,188,2,217,255,113,1,188,2,219,255,113,1,188,2,221,255,113,1,188,2,224,255,113,1,188,2,230,255,215,1,188,2,232,255,215,1,188,2,234,255,195,1,188,2,236,255,154,1,188,2,238,255,154,1,188,2,239,255,215,1,188,2,240,255,113,1,188,2,241,255,215,1,188,2,242,255,113,1,188,2,243,255,215,1,188,2,244,255,113,1,188,2,246,255,215,1,188,2,248,255,174,1,188,2,250,255,174,1,188,2,252,255,174,1,188,2,254,255,154,1,188,3,0,255,154,1,188,3,2,255,154,1,188,3,6,255,215,1,188,3,8,255,215,1,188,3,9,255,113,1,188,3,10,255,113,1,188,3,11,255,113,1,188,3,12,255,113,1,188,3,14,255,154,1,188,3,16,255,154,1,188,3,17,255,154,1,188,3,18,255,133,1,188,3,20,255,154,1,188,3,21,255,215,1,188,3,22,255,113,1,188,3,24,255,174,1,188,3,26,255,113,1,188,3,27,255,154,1,188,3,28,255,133,1,189,0,15,255,133,1,189,0,17,255,133,1,189,1,159,255,236,1,189,1,164,255,154,1,189,1,170,255,113,1,189,1,174,255,154,1,189,1,181,255,154,1,189,1,184,255,236,1,189,1,187,255,236,1,189,1,190,255,195,1,189,1,201,255,236,1,189,1,206,255,174,1,189,1,207,255,215,1,189,1,213,255,174,1,189,1,216,255,215,1,189,1,219,255,215,1,189,1,222,255,215,1,189,1,225,255,215,1,189,1,234,255,215,1,189,1,235,0,102,1,189,1,237,255,215,1,189,1,238,255,236,1,189,1,242,255,174,1,189,1,244,0,102,1,189,2,8,255,133,1,189,2,12,255,133,1,189,2,106,255,215,1,189,2,108,255,236,1,189,2,114,255,113,1,189,2,115,255,174,1,189,2,126,255,236,1,189,2,127,255,215,1,189,2,132,255,236,1,189,2,133,255,215,1,189,2,134,255,236,1,189,2,135,255,215,1,189,2,136,255,236,1,189,2,137,255,215,1,189,2,138,255,236,1,189,2,140,255,236,1,189,2,141,255,215,1,189,2,152,0,102,1,189,2,168,0,102,1,189,2,177,255,236,1,189,2,178,255,215,1,189,2,179,255,236,1,189,2,180,255,215,1,189,2,192,255,215,1,189,2,194,255,215,1,189,2,197,255,215,1,189,2,198,255,195,1,189,2,199,255,215,1,189,2,200,255,195,1,189,2,206,255,154,1,189,2,207,255,174,1,189,2,213,255,215,1,189,2,217,255,113,1,189,2,219,255,113,1,189,2,221,255,113,1,189,2,224,255,215,1,189,2,239,255,236,1,189,2,240,255,215,1,189,2,241,255,236,1,189,2,242,255,215,1,189,2,243,255,236,1,189,2,244,255,215,1,189,2,254,255,215,1,189,3,9,255,113,1,189,3,10,255,215,1,189,3,11,255,113,1,189,3,12,255,215,1,189,3,17,255,154,1,189,3,18,255,174,1,189,3,21,255,236,1,189,3,22,255,215,1,189,3,26,255,215,1,189,3,27,255,154,1,189,3,28,255,174,1,190,0,15,255,174,1,190,0,17,255,174,1,190,1,157,255,215,1,190,1,164,255,215,1,190,1,166,255,215,1,190,1,168,255,195,1,190,1,170,255,215,1,190,1,174,255,215,1,190,1,176,255,215,1,190,1,177,255,215,1,190,1,181,255,215,1,190,1,188,255,195,1,190,1,189,255,195,1,190,1,191,255,215,1,190,1,196,255,215,1,190,1,199,255,215,1,190,1,206,255,236,1,190,1,213,255,236,1,190,1,242,255,236,1,190,2,8,255,174,1,190,2,12,255,174,1,190,2,114,255,215,1,190,2,115,255,236,1,190,2,122,255,215,1,190,2,128,255,236,1,190,2,130,255,236,1,190,2,159,255,215,1,190,2,161,255,215,1,190,2,169,255,215,1,190,2,181,255,195,1,190,2,183,255,195,1,190,2,185,255,195,1,190,2,187,255,215,1,190,2,189,255,215,1,190,2,202,255,215,1,190,2,206,255,215,1,190,2,207,255,236,1,190,2,217,255,215,1,190,2,219,255,215,1,190,2,221,255,215,1,190,2,229,255,215,1,190,2,231,255,215,1,190,2,245,255,215,1,190,2,247,255,195,1,190,2,249,255,195,1,190,2,251,255,195,1,190,3,5,255,215,1,190,3,7,255,215,1,190,3,13,255,215,1,190,3,15,255,215,1,190,3,17,255,215,1,190,3,18,255,236,1,190,3,23,255,215,1,190,3,27,255,215,1,190,3,28,255,236,1,191,1,159,255,215,1,191,1,184,255,215,1,191,1,187,255,215,1,191,1,190,255,215,1,191,1,193,255,215,1,191,1,225,255,215,1,191,2,108,255,215,1,191,2,124,255,215,1,191,2,126,255,215,1,191,2,132,255,215,1,191,2,134,255,215,1,191,2,136,255,215,1,191,2,138,255,215,1,191,2,140,255,215,1,191,2,177,255,215,1,191,2,179,255,215,1,191,2,191,255,215,1,191,2,192,255,215,1,191,2,193,255,215,1,191,2,194,255,215,1,191,2,197,255,154,1,191,2,199,255,154,1,191,2,212,255,215,1,191,2,213,255,215,1,191,2,239,255,215,1,191,2,241,255,215,1,191,2,243,255,215,1,191,2,253,255,215,1,191,2,254,255,215,1,191,3,9,255,215,1,191,3,11,255,215,1,191,3,14,255,215,1,191,3,16,255,215,1,191,3,21,255,215,1,191,3,25,255,236,1,192,1,163,0,225,1,192,2,234,0,41,1,192,3,14,255,215,1,192,3,16,255,215,1,195,1,163,0,225,1,195,2,234,0,41,1,195,3,14,255,215,1,195,3,16,255,215,1,196,0,5,255,174,1,196,0,10,255,174,1,196,1,157,255,133,1,196,1,166,255,133,1,196,1,168,255,215,1,196,1,188,255,154,1,196,1,189,255,215,1,196,1,193,255,154,1,196,1,196,255,133,1,196,1,220,255,215,1,196,1,221,255,215,1,196,1,225,255,215,1,196,1,228,255,215,1,196,1,246,255,215,1,196,2,7,255,174,1,196,2,11,255,174,1,196,2,110,255,174,1,196,2,124,255,154,1,196,2,128,255,174,1,196,2,130,255,174,1,196,2,151,255,174,1,196,2,155,255,174,1,196,2,167,255,174,1,196,2,169,255,133,1,196,2,170,255,215,1,196,2,181,255,154,1,196,2,182,255,215,1,196,2,183,255,154,1,196,2,184,255,215,1,196,2,185,255,154,1,196,2,186,255,215,1,196,2,189,255,133,1,196,2,190,255,215,1,196,2,191,255,154,1,196,2,192,255,215,1,196,2,193,255,154,1,196,2,194,255,215,1,196,2,212,255,154,1,196,2,213,255,215,1,196,2,247,255,215,1,196,2,248,255,215,1,196,2,249,255,215,1,196,2,250,255,215,1,196,2,251,255,215,1,196,2,252,255,215,1,196,2,253,255,154,1,196,2,254,255,215,1,196,3,3,255,174,1,196,3,13,255,154,1,196,3,14,255,195,1,196,3,15,255,154,1,196,3,16,255,195,1,196,3,23,255,133,1,196,3,24,255,215,1,198,0,5,255,174,1,198,0,10,255,174,1,198,1,157,255,133,1,198,1,166,255,133,1,198,1,168,255,215,1,198,1,188,255,154,1,198,1,189,255,215,1,198,1,193,255,154,1,198,1,196,255,133,1,198,1,220,255,215,1,198,1,221,255,215,1,198,1,225,255,215,1,198,1,228,255,215,1,198,1,246,255,215,1,198,2,7,255,174,1,198,2,11,255,174,1,198,2,110,255,174,1,198,2,124,255,154,1,198,2,128,255,174,1,198,2,130,255,174,1,198,2,151,255,174,1,198,2,155,255,174,1,198,2,167,255,174,1,198,2,169,255,133,1,198,2,170,255,215,1,198,2,181,255,154,1,198,2,182,255,215,1,198,2,183,255,154,1,198,2,184,255,215,1,198,2,185,255,154,1,198,2,186,255,215,1,198,2,189,255,133,1,198,2,190,255,215,1,198,2,191,255,154,1,198,2,192,255,215,1,198,2,193,255,154,1,198,2,194,255,215,1,198,2,212,255,154,1,198,2,213,255,215,1,198,2,247,255,215,1,198,2,248,255,215,1,198,2,249,255,215,1,198,2,250,255,215,1,198,2,251,255,215,1,198,2,252,255,215,1,198,2,253,255,154,1,198,2,254,255,215,1,198,3,3,255,174,1,198,3,13,255,154,1,198,3,14,255,195,1,198,3,15,255,154,1,198,3,16,255,195,1,198,3,23,255,133,1,198,3,24,255,215,1,199,0,15,255,174,1,199,0,17,255,174,1,199,1,157,255,236,1,199,1,164,255,215,1,199,1,166,255,236,1,199,1,168,255,215,1,199,1,170,255,215,1,199,1,174,255,215,1,199,1,176,255,215,1,199,1,177,255,236,1,199,1,181,255,215,1,199,1,188,255,195,1,199,1,189,255,215,1,199,1,191,255,215,1,199,1,193,255,215,1,199,1,196,255,236,1,199,1,199,255,236,1,199,1,206,255,236,1,199,1,213,255,236,1,199,1,242,255,236,1,199,2,8,255,174,1,199,2,12,255,174,1,199,2,114,255,215,1,199,2,115,255,236,1,199,2,122,255,236,1,199,2,124,255,215,1,199,2,128,255,236,1,199,2,130,255,236,1,199,2,159,255,215,1,199,2,161,255,236,1,199,2,169,255,236,1,199,2,181,255,195,1,199,2,183,255,236,1,199,2,185,255,236,1,199,2,187,255,215,1,199,2,189,255,236,1,199,2,191,255,215,1,199,2,193,255,215,1,199,2,202,255,215,1,199,2,206,255,215,1,199,2,207,255,236,1,199,2,212,255,215,1,199,2,217,255,215,1,199,2,219,255,215,1,199,2,221,255,215,1,199,2,229,255,215,1,199,2,231,255,236,1,199,2,245,255,236,1,199,2,247,255,215,1,199,2,249,255,215,1,199,2,251,255,215,1,199,2,253,255,215,1,199,3,5,255,215,1,199,3,7,255,215,1,199,3,13,255,215,1,199,3,15,255,215,1,199,3,17,255,215,1,199,3,18,255,236,1,199,3,23,255,236,1,199,3,27,255,215,1,199,3,28,255,236,1,200,0,15,255,174,1,200,0,17,255,174,1,200,1,157,255,236,1,200,1,164,255,215,1,200,1,166,255,236,1,200,1,168,255,215,1,200,1,170,255,215,1,200,1,174,255,215,1,200,1,176,255,215,1,200,1,177,255,236,1,200,1,181,255,215,1,200,1,188,255,195,1,200,1,189,255,215,1,200,1,191,255,215,1,200,1,193,255,215,1,200,1,196,255,236,1,200,1,199,255,236,1,200,1,206,255,236,1,200,1,213,255,236,1,200,1,242,255,236,1,200,2,8,255,174,1,200,2,12,255,174,1,200,2,114,255,215,1,200,2,115,255,236,1,200,2,122,255,236,1,200,2,124,255,215,1,200,2,128,255,236,1,200,2,130,255,236,1,200,2,159,255,215,1,200,2,161,255,236,1,200,2,169,255,236,1,200,2,181,255,195,1,200,2,183,255,236,1,200,2,185,255,236,1,200,2,187,255,215,1,200,2,189,255,236,1,200,2,191,255,215,1,200,2,193,255,215,1,200,2,202,255,215,1,200,2,206,255,215,1,200,2,207,255,236,1,200,2,212,255,215,1,200,2,217,255,215,1,200,2,219,255,215,1,200,2,221,255,215,1,200,2,229,255,215,1,200,2,231,255,236,1,200,2,245,255,236,1,200,2,247,255,215,1,200,2,249,255,215,1,200,2,251,255,215,1,200,2,253,255,215,1,200,3,5,255,215,1,200,3,7,255,215,1,200,3,13,255,215,1,200,3,15,255,215,1,200,3,17,255,215,1,200,3,18,255,236,1,200,3,23,255,236,1,200,3,27,255,215,1,200,3,28,255,236,1,202,0,5,255,236,1,202,0,10,255,236,1,202,2,7,255,236,1,202,2,11,255,236,1,204,1,233,0,41,1,205,0,15,255,154,1,205,0,16,255,215,1,205,0,17,255,154,1,205,1,206,255,195,1,205,1,207,255,236,1,205,1,213,255,195,1,205,1,216,255,236,1,205,1,219,255,236,1,205,1,222,255,236,1,205,1,234,255,236,1,205,1,237,255,236,1,205,1,242,255,195,1,205,2,2,255,215,1,205,2,3,255,215,1,205,2,4,255,215,1,205,2,8,255,154,1,205,2,12,255,154,1,205,2,106,255,236,1,205,2,115,255,195,1,205,2,127,255,236,1,205,2,133,255,236,1,205,2,135,255,236,1,205,2,137,255,236,1,205,2,141,255,236,1,205,2,178,255,236,1,205,2,180,255,236,1,205,2,207,255,195,1,205,2,224,255,236,1,205,2,240,255,236,1,205,2,242,255,236,1,205,2,244,255,236,1,205,3,10,255,236,1,205,3,12,255,236,1,205,3,18,255,195,1,205,3,22,255,236,1,205,3,26,255,236,1,205,3,28,255,195,1,206,0,5,255,236,1,206,0,10,255,236,1,206,2,7,255,236,1,206,2,11,255,236,1,207,0,5,255,236,1,207,0,10,255,236,1,207,2,7,255,236,1,207,2,11,255,236,1,208,1,207,255,215,1,208,1,216,255,215,1,208,1,219,255,215,1,208,1,222,255,215,1,208,1,225,255,215,1,208,1,234,255,215,1,208,1,237,255,215,1,208,2,106,255,215,1,208,2,127,255,215,1,208,2,133,255,215,1,208,2,135,255,215,1,208,2,137,255,215,1,208,2,141,255,215,1,208,2,178,255,215,1,208,2,180,255,215,1,208,2,192,255,215,1,208,2,194,255,215,1,208,2,198,255,215,1,208,2,200,255,215,1,208,2,213,255,215,1,208,2,224,255,215,1,208,2,240,255,215,1,208,2,242,255,215,1,208,2,244,255,215,1,208,2,254,255,215,1,208,3,10,255,215,1,208,3,12,255,215,1,208,3,22,255,215,1,208,3,26,255,215,1,209,1,233,0,41,1,212,1,207,255,215,1,212,1,216,255,215,1,212,1,219,255,215,1,212,1,222,255,215,1,212,1,225,255,215,1,212,1,234,255,215,1,212,1,237,255,215,1,212,2,106,255,215,1,212,2,127,255,215,1,212,2,133,255,215,1,212,2,135,255,215,1,212,2,137,255,215,1,212,2,141,255,215,1,212,2,178,255,215,1,212,2,180,255,215,1,212,2,192,255,215,1,212,2,194,255,215,1,212,2,198,255,215,1,212,2,200,255,215,1,212,2,213,255,215,1,212,2,224,255,215,1,212,2,240,255,215,1,212,2,242,255,215,1,212,2,244,255,215,1,212,2,254,255,215,1,212,3,10,255,215,1,212,3,12,255,215,1,212,3,22,255,215,1,212,3,26,255,215,1,216,0,5,255,236,1,216,0,10,255,236,1,216,1,208,255,215,1,216,1,220,255,236,1,216,1,221,255,236,1,216,1,223,255,215,1,216,1,225,255,236,1,216,1,228,255,236,1,216,1,246,255,236,1,216,2,7,255,236,1,216,2,11,255,236,1,216,2,160,255,215,1,216,2,170,255,236,1,216,2,182,255,236,1,216,2,188,255,215,1,216,2,190,255,236,1,216,2,192,255,236,1,216,2,194,255,236,1,216,2,203,255,215,1,216,2,213,255,236,1,216,2,230,255,215,1,216,2,248,255,236,1,216,2,250,255,236,1,216,2,252,255,236,1,216,2,254,255,236,1,216,3,6,255,215,1,216,3,8,255,215,1,216,3,14,255,236,1,216,3,16,255,236,1,216,3,24,255,236,1,218,0,5,255,236,1,218,0,10,255,236,1,218,1,208,255,215,1,218,1,220,255,236,1,218,1,221,255,236,1,218,1,223,255,215,1,218,1,225,255,236,1,218,1,228,255,236,1,218,1,246,255,236,1,218,2,7,255,236,1,218,2,11,255,236,1,218,2,160,255,215,1,218,2,170,255,236,1,218,2,182,255,236,1,218,2,188,255,215,1,218,2,190,255,236,1,218,2,192,255,236,1,218,2,194,255,236,1,218,2,203,255,215,1,218,2,213,255,236,1,218,2,230,255,215,1,218,2,248,255,236,1,218,2,250,255,236,1,218,2,252,255,236,1,218,2,254,255,236,1,218,3,6,255,215,1,218,3,8,255,215,1,218,3,14,255,236,1,218,3,16,255,236,1,218,3,24,255,236,1,220,0,15,255,154,1,220,0,16,255,215,1,220,0,17,255,154,1,220,1,206,255,195,1,220,1,207,255,236,1,220,1,213,255,195,1,220,1,216,255,236,1,220,1,219,255,236,1,220,1,222,255,236,1,220,1,234,255,236,1,220,1,237,255,236,1,220,1,242,255,195,1,220,2,2,255,215,1,220,2,3,255,215,1,220,2,4,255,215,1,220,2,8,255,154,1,220,2,12,255,154,1,220,2,106,255,236,1,220,2,115,255,195,1,220,2,127,255,236,1,220,2,133,255,236,1,220,2,135,255,236,1,220,2,137,255,236,1,220,2,141,255,236,1,220,2,178,255,236,1,220,2,180,255,236,1,220,2,207,255,195,1,220,2,224,255,236,1,220,2,240,255,236,1,220,2,242,255,236,1,220,2,244,255,236,1,220,3,10,255,236,1,220,3,12,255,236,1,220,3,18,255,195,1,220,3,22,255,236,1,220,3,26,255,236,1,220,3,28,255,195,1,221,0,15,255,174,1,221,0,17,255,174,1,221,1,206,255,215,1,221,1,213,255,215,1,221,1,242,255,215,1,221,2,8,255,174,1,221,2,12,255,174,1,221,2,115,255,215,1,221,2,207,255,215,1,221,3,18,255,215,1,221,3,28,255,215,1,222,0,5,255,236,1,222,0,10,255,236,1,222,1,208,255,215,1,222,1,220,255,236,1,222,1,221,255,236,1,222,1,223,255,215,1,222,1,225,255,236,1,222,1,228,255,236,1,222,1,246,255,236,1,222,2,7,255,236,1,222,2,11,255,236,1,222,2,160,255,215,1,222,2,170,255,236,1,222,2,182,255,236,1,222,2,188,255,215,1,222,2,190,255,236,1,222,2,192,255,236,1,222,2,194,255,236,1,222,2,203,255,215,1,222,2,213,255,236,1,222,2,230,255,215,1,222,2,248,255,236,1,222,2,250,255,236,1,222,2,252,255,236,1,222,2,254,255,236,1,222,3,6,255,215,1,222,3,8,255,215,1,222,3,14,255,236,1,222,3,16,255,236,1,222,3,24,255,236,1,223,1,207,255,215,1,223,1,216,255,215,1,223,1,219,255,215,1,223,1,222,255,215,1,223,1,225,255,215,1,223,1,234,255,215,1,223,1,237,255,215,1,223,2,106,255,215,1,223,2,127,255,215,1,223,2,133,255,215,1,223,2,135,255,215,1,223,2,137,255,215,1,223,2,141,255,215,1,223,2,178,255,215,1,223,2,180,255,215,1,223,2,192,255,215,1,223,2,194,255,215,1,223,2,198,255,215,1,223,2,200,255,215,1,223,2,213,255,215,1,223,2,224,255,215,1,223,2,240,255,215,1,223,2,242,255,215,1,223,2,244,255,215,1,223,2,254,255,215,1,223,3,10,255,215,1,223,3,12,255,215,1,223,3,22,255,215,1,223,3,26,255,215,1,224,0,5,255,236,1,224,0,10,255,236,1,224,2,7,255,236,1,224,2,11,255,236,1,227,0,5,255,236,1,227,0,10,255,236,1,227,2,7,255,236,1,227,2,11,255,236,1,228,0,5,255,133,1,228,0,10,255,133,1,228,1,208,255,215,1,228,1,220,255,154,1,228,1,221,255,195,1,228,1,223,255,215,1,228,1,225,255,174,1,228,1,228,255,154,1,228,1,246,255,195,1,228,2,7,255,133,1,228,2,11,255,133,1,228,2,109,255,215,1,228,2,129,255,215,1,228,2,131,255,215,1,228,2,139,255,215,1,228,2,160,255,215,1,228,2,170,255,154,1,228,2,182,255,154,1,228,2,184,255,195,1,228,2,186,255,195,1,228,2,188,255,215,1,228,2,190,255,154,1,228,2,192,255,174,1,228,2,194,255,174,1,228,2,198,255,215,1,228,2,200,255,215,1,228,2,203,255,215,1,228,2,213,255,174,1,228,2,230,255,215,1,228,2,234,255,215,1,228,2,248,255,195,1,228,2,250,255,195,1,228,2,252,255,195,1,228,2,254,255,174,1,228,3,6,255,215,1,228,3,8,255,215,1,228,3,14,255,154,1,228,3,16,255,154,1,228,3,24,255,154,1,230,0,5,255,133,1,230,0,10,255,133,1,230,1,208,255,215,1,230,1,220,255,154,1,230,1,221,255,195,1,230,1,223,255,215,1,230,1,225,255,174,1,230,1,228,255,154,1,230,1,246,255,195,1,230,2,7,255,133,1,230,2,11,255,133,1,230,2,109,255,215,1,230,2,129,255,215,1,230,2,131,255,215,1,230,2,139,255,215,1,230,2,160,255,215,1,230,2,170,255,154,1,230,2,182,255,154,1,230,2,184,255,195,1,230,2,186,255,195,1,230,2,188,255,215,1,230,2,190,255,154,1,230,2,192,255,174,1,230,2,194,255,174,1,230,2,198,255,215,1,230,2,200,255,215,1,230,2,203,255,215,1,230,2,213,255,174,1,230,2,230,255,215,1,230,2,234,255,215,1,230,2,248,255,195,1,230,2,250,255,195,1,230,2,252,255,195,1,230,2,254,255,174,1,230,3,6,255,215,1,230,3,8,255,215,1,230,3,14,255,154,1,230,3,16,255,154,1,230,3,24,255,154,1,231,0,5,255,236,1,231,0,10,255,236,1,231,1,208,255,215,1,231,1,220,255,236,1,231,1,221,255,236,1,231,1,223,255,215,1,231,1,225,255,236,1,231,1,228,255,236,1,231,1,246,255,236,1,231,2,7,255,236,1,231,2,11,255,236,1,231,2,160,255,215,1,231,2,170,255,236,1,231,2,182,255,236,1,231,2,188,255,215,1,231,2,190,255,236,1,231,2,192,255,236,1,231,2,194,255,236,1,231,2,203,255,215,1,231,2,213,255,236,1,231,2,230,255,215,1,231,2,248,255,236,1,231,2,250,255,236,1,231,2,252,255,236,1,231,2,254,255,236,1,231,3,6,255,215,1,231,3,8,255,215,1,231,3,14,255,236,1,231,3,16,255,236,1,231,3,24,255,236,1,232,0,5,255,236,1,232,0,10,255,236,1,232,1,208,255,215,1,232,1,220,255,236,1,232,1,221,255,236,1,232,1,223,255,215,1,232,1,225,255,236,1,232,1,228,255,236,1,232,1,246,255,236,1,232,2,7,255,236,1,232,2,11,255,236,1,232,2,160,255,215,1,232,2,170,255,236,1,232,2,182,255,236,1,232,2,188,255,215,1,232,2,190,255,236,1,232,2,192,255,236,1,232,2,194,255,236,1,232,2,203,255,215,1,232,2,213,255,236,1,232,2,230,255,215,1,232,2,248,255,236,1,232,2,250,255,236,1,232,2,252,255,236,1,232,2,254,255,236,1,232,3,6,255,215,1,232,3,8,255,215,1,232,3,14,255,236,1,232,3,16,255,236,1,232,3,24,255,236,1,234,0,5,255,236,1,234,0,10,255,236,1,234,2,7,255,236,1,234,2,11,255,236,1,235,0,5,255,236,1,235,0,10,255,236,1,235,2,7,255,236,1,235,2,11,255,236,1,235,3,14,255,215,1,235,3,16,255,215,1,236,0,15,255,154,1,236,0,16,255,215,1,236,0,17,255,154,1,236,1,206,255,195,1,236,1,207,255,236,1,236,1,213,255,195,1,236,1,216,255,236,1,236,1,219,255,236,1,236,1,222,255,236,1,236,1,234,255,236,1,236,1,237,255,236,1,236,1,242,255,195,1,236,2,2,255,215,1,236,2,3,255,215,1,236,2,4,255,215,1,236,2,8,255,154,1,236,2,12,255,154,1,236,2,106,255,236,1,236,2,115,255,195,1,236,2,127,255,236,1,236,2,133,255,236,1,236,2,135,255,236,1,236,2,137,255,236,1,236,2,141,255,236,1,236,2,178,255,236,1,236,2,180,255,236,1,236,2,207,255,195,1,236,2,224,255,236,1,236,2,240,255,236,1,236,2,242,255,236,1,236,2,244,255,236,1,236,3,10,255,236,1,236,3,12,255,236,1,236,3,18,255,195,1,236,3,22,255,236,1,236,3,26,255,236,1,236,3,28,255,195,1,242,0,5,255,133,1,242,0,10,255,133,1,242,1,208,255,215,1,242,1,220,255,154,1,242,1,221,255,195,1,242,1,223,255,215,1,242,1,225,255,174,1,242,1,228,255,154,1,242,1,246,255,195,1,242,2,7,255,133,1,242,2,11,255,133,1,242,2,109,255,215,1,242,2,129,255,215,1,242,2,131,255,215,1,242,2,139,255,215,1,242,2,160,255,215,1,242,2,170,255,154,1,242,2,182,255,154,1,242,2,184,255,195,1,242,2,186,255,195,1,242,2,188,255,215,1,242,2,190,255,154,1,242,2,192,255,174,1,242,2,194,255,174,1,242,2,198,255,215,1,242,2,200,255,215,1,242,2,203,255,215,1,242,2,213,255,174,1,242,2,230,255,215,1,242,2,234,255,215,1,242,2,248,255,195,1,242,2,250,255,195,1,242,2,252,255,195,1,242,2,254,255,174,1,242,3,6,255,215,1,242,3,8,255,215,1,242,3,14,255,154,1,242,3,16,255,154,1,242,3,24,255,154,1,243,0,5,255,133,1,243,0,10,255,133,1,243,1,208,255,215,1,243,1,220,255,154,1,243,1,221,255,195,1,243,1,223,255,215,1,243,1,225,255,174,1,243,1,228,255,154,1,243,1,246,255,195,1,243,2,7,255,133,1,243,2,11,255,133,1,243,2,109,255,215,1,243,2,129,255,215,1,243,2,131,255,215,1,243,2,139,255,215,1,243,2,160,255,215,1,243,2,170,255,154,1,243,2,182,255,154,1,243,2,184,255,195,1,243,2,186,255,195,1,243,2,188,255,215,1,243,2,190,255,154,1,243,2,192,255,174,1,243,2,194,255,174,1,243,2,198,255,215,1,243,2,200,255,215,1,243,2,203,255,215,1,243,2,213,255,174,1,243,2,230,255,215,1,243,2,234,255,215,1,243,2,248,255,195,1,243,2,250,255,195,1,243,2,252,255,195,1,243,2,254,255,174,1,243,3,6,255,215,1,243,3,8,255,215,1,243,3,14,255,154,1,243,3,16,255,154,1,243,3,24,255,154,1,244,0,5,255,236,1,244,0,10,255,236,1,244,2,7,255,236,1,244,2,11,255,236,1,244,3,14,255,215,1,244,3,16,255,215,1,245,1,207,255,215,1,245,1,216,255,215,1,245,1,219,255,215,1,245,1,222,255,215,1,245,1,225,255,215,1,245,1,234,255,215,1,245,1,237,255,215,1,245,2,106,255,215,1,245,2,127,255,215,1,245,2,133,255,215,1,245,2,135,255,215,1,245,2,137,255,215,1,245,2,141,255,215,1,245,2,178,255,215,1,245,2,180,255,215,1,245,2,192,255,215,1,245,2,194,255,215,1,245,2,198,255,215,1,245,2,200,255,215,1,245,2,213,255,215,1,245,2,224,255,215,1,245,2,240,255,215,1,245,2,242,255,215,1,245,2,244,255,215,1,245,2,254,255,215,1,245,3,10,255,215,1,245,3,12,255,215,1,245,3,22,255,215,1,245,3,26,255,215,1,246,0,15,255,174,1,246,0,17,255,174,1,246,1,206,255,215,1,246,1,213,255,215,1,246,1,242,255,215,1,246,2,8,255,174,1,246,2,12,255,174,1,246,2,115,255,215,1,246,2,207,255,215,1,246,3,18,255,215,1,246,3,28,255,215,1,248,0,15,255,133,1,248,0,16,255,174,1,248,0,17,255,133,1,248,1,159,255,215,1,248,1,164,255,154,1,248,1,170,255,113,1,248,1,174,255,154,1,248,1,181,255,154,1,248,1,184,255,215,1,248,1,187,255,215,1,248,1,188,0,41,1,248,1,190,255,174,1,248,1,204,255,154,1,248,1,205,255,154,1,248,1,206,255,133,1,248,1,207,255,113,1,248,1,208,255,215,1,248,1,209,255,215,1,248,1,210,255,154,1,248,1,211,255,154,1,248,1,212,255,154,1,248,1,213,255,133,1,248,1,214,255,154,1,248,1,215,255,154,1,248,1,216,255,113,1,248,1,217,255,154,1,248,1,218,255,154,1,248,1,219,255,113,1,248,1,220,255,174,1,248,1,221,255,174,1,248,1,222,255,113,1,248,1,223,255,215,1,248,1,224,255,154,1,248,1,225,255,154,1,248,1,226,255,154,1,248,1,227,255,154,1,248,1,228,255,174,1,248,1,229,255,154,1,248,1,230,255,154,1,248,1,231,255,215,1,248,1,232,255,154,1,248,1,233,255,195,1,248,1,234,255,113,1,248,1,236,255,154,1,248,1,237,255,113,1,248,1,238,255,133,1,248,1,242,255,133,1,248,1,243,255,154,1,248,1,245,255,154,1,248,1,246,255,174,1,248,1,247,255,154,1,248,1,249,255,154,1,248,2,2,255,174,1,248,2,3,255,174,1,248,2,4,255,174,1,248,2,8,255,133,1,248,2,12,255,133,1,248,2,106,255,113,1,248,2,107,255,154,1,248,2,108,255,215,1,248,2,109,255,215,1,248,2,113,255,154,1,248,2,114,255,113,1,248,2,115,255,133,1,248,2,117,255,154,1,248,2,119,255,154,1,248,2,121,255,154,1,248,2,125,255,154,1,248,2,126,255,215,1,248,2,127,255,113,1,248,2,129,255,215,1,248,2,131,255,215,1,248,2,132,255,215,1,248,2,133,255,113,1,248,2,134,255,215,1,248,2,135,255,113,1,248,2,136,255,215,1,248,2,137,255,113,1,248,2,138,255,215,1,248,2,139,255,215,1,248,2,140,255,215,1,248,2,141,255,113,1,248,2,150,255,154,1,248,2,154,255,154,1,248,2,158,255,154,1,248,2,160,255,215,1,248,2,162,255,215,1,248,2,164,255,154,1,248,2,166,255,154,1,248,2,170,255,174,1,248,2,172,255,154,1,248,2,174,255,154,1,248,2,176,255,154,1,248,2,177,255,215,1,248,2,178,255,113,1,248,2,179,255,215,1,248,2,180,255,113,1,248,2,181,0,41,1,248,2,182,255,174,1,248,2,184,255,174,1,248,2,186,255,174,1,248,2,188,255,215,1,248,2,190,255,174,1,248,2,192,255,154,1,248,2,194,255,154,1,248,2,196,255,154,1,248,2,197,255,154,1,248,2,198,255,113,1,248,2,199,255,154,1,248,2,200,255,113,1,248,2,203,255,215,1,248,2,205,255,154,1,248,2,206,255,154,1,248,2,207,255,133,1,248,2,209,255,154,1,248,2,211,255,154,1,248,2,213,255,154,1,248,2,215,255,154,1,248,2,217,255,113,1,248,2,219,255,113,1,248,2,221,255,113,1,248,2,224,255,113,1,248,2,230,255,215,1,248,2,232,255,215,1,248,2,234,255,195,1,248,2,236,255,154,1,248,2,238,255,154,1,248,2,239,255,215,1,248,2,240,255,113,1,248,2,241,255,215,1,248,2,242,255,113,1,248,2,243,255,215,1,248,2,244,255,113,1,248,2,246,255,215,1,248,2,248,255,174,1,248,2,250,255,174,1,248,2,252,255,174,1,248,2,254,255,154,1,248,3,0,255,154,1,248,3,2,255,154,1,248,3,6,255,215,1,248,3,8,255,215,1,248,3,9,255,113,1,248,3,10,255,113,1,248,3,11,255,113,1,248,3,12,255,113,1,248,3,14,255,154,1,248,3,16,255,154,1,248,3,17,255,154,1,248,3,18,255,133,1,248,3,20,255,154,1,248,3,21,255,215,1,248,3,22,255,113,1,248,3,24,255,174,1,248,3,26,255,113,1,248,3,27,255,154,1,248,3,28,255,133,1,249,0,15,255,154,1,249,0,16,255,215,1,249,0,17,255,154,1,249,1,206,255,195,1,249,1,207,255,236,1,249,1,213,255,195,1,249,1,216,255,236,1,249,1,219,255,236,1,249,1,222,255,236,1,249,1,234,255,236,1,249,1,237,255,236,1,249,1,242,255,195,1,249,2,2,255,215,1,249,2,3,255,215,1,249,2,4,255,215,1,249,2,8,255,154,1,249,2,12,255,154,1,249,2,106,255,236,1,249,2,115,255,195,1,249,2,127,255,236,1,249,2,133,255,236,1,249,2,135,255,236,1,249,2,137,255,236,1,249,2,141,255,236,1,249,2,178,255,236,1,249,2,180,255,236,1,249,2,207,255,195,1,249,2,224,255,236,1,249,2,240,255,236,1,249,2,242,255,236,1,249,2,244,255,236,1,249,3,10,255,236,1,249,3,12,255,236,1,249,3,18,255,195,1,249,3,22,255,236,1,249,3,26,255,236,1,249,3,28,255,195,1,250,0,15,255,154,1,250,0,17,255,154,1,250,0,34,0,41,1,250,0,36,255,174,1,250,0,38,255,236,1,250,0,42,255,236,1,250,0,50,255,236,1,250,0,52,255,236,1,250,0,68,255,215,1,250,0,70,255,215,1,250,0,71,255,215,1,250,0,72,255,215,1,250,0,74,255,236,1,250,0,80,255,236,1,250,0,81,255,236,1,250,0,82,255,215,1,250,0,83,255,236,1,250,0,84,255,215,1,250,0,85,255,236,1,250,0,86,255,236,1,250,0,88,255,236,1,250,0,130,255,174,1,250,0,131,255,174,1,250,0,132,255,174,1,250,0,133,255,174,1,250,0,134,255,174,1,250,0,135,255,174,1,250,0,137,255,236,1,250,0,148,255,236,1,250,0,149,255,236,1,250,0,150,255,236,1,250,0,151,255,236,1,250,0,152,255,236,1,250,0,154,255,236,1,250,0,162,255,215,1,250,0,163,255,215,1,250,0,164,255,215,1,250,0,165,255,215,1,250,0,166,255,215,1,250,0,167,255,215,1,250,0,168,255,215,1,250,0,169,255,215,1,250,0,170,255,215,1,250,0,171,255,215,1,250,0,172,255,215,1,250,0,173,255,215,1,250,0,180,255,215,1,250,0,181,255,215,1,250,0,182,255,215,1,250,0,183,255,215,1,250,0,184,255,215,1,250,0,186,255,215,1,250,0,187,255,236,1,250,0,188,255,236,1,250,0,189,255,236,1,250,0,190,255,236,1,250,0,194,255,174,1,250,0,195,255,215,1,250,0,196,255,174,1,250,0,197,255,215,1,250,0,198,255,174,1,250,0,199,255,215,1,250,0,200,255,236,1,250,0,201,255,215,1,250,0,202,255,236,1,250,0,203,255,215,1,250,0,204,255,236,1,250,0,205,255,215,1,250,0,206,255,236,1,250,0,207,255,215,1,250,0,209,255,215,1,250,0,211,255,215,1,250,0,213,255,215,1,250,0,215,255,215,1,250,0,217,255,215,1,250,0,219,255,215,1,250,0,221,255,215,1,250,0,222,255,236,1,250,0,223,255,236,1,250,0,224,255,236,1,250,0,225,255,236,1,250,0,226,255,236,1,250,0,227,255,236,1,250,0,228,255,236,1,250,0,229,255,236,1,250,0,250,255,236,1,250,1,6,255,236,1,250,1,8,255,236,1,250,1,13,255,236,1,250,1,14,255,236,1,250,1,15,255,215,1,250,1,16,255,236,1,250,1,17,255,215,1,250,1,18,255,236,1,250,1,19,255,215,1,250,1,20,255,236,1,250,1,21,255,215,1,250,1,23,255,236,1,250,1,25,255,236,1,250,1,29,255,236,1,250,1,33,255,236,1,250,1,43,255,236,1,250,1,45,255,236,1,250,1,47,255,236,1,250,1,49,255,236,1,250,1,51,255,236,1,250,1,53,255,236,1,250,1,67,255,174,1,250,1,68,255,215,1,250,1,70,255,215,1,250,1,71,255,236,1,250,1,72,255,215,1,250,1,74,255,236,1,250,2,8,255,154,1,250,2,12,255,154,1,250,2,87,255,236,1,250,2,88,255,174,1,250,2,89,255,215,1,250,2,95,255,236,1,250,2,96,255,215,1,250,2,98,255,236,1,250,3,29,255,174,1,250,3,30,255,215,1,250,3,31,255,174,1,250,3,32,255,215,1,250,3,33,255,174,1,250,3,34,255,215,1,250,3,35,255,174,1,250,3,37,255,174,1,250,3,38,255,215,1,250,3,39,255,174,1,250,3,40,255,215,1,250,3,41,255,174,1,250,3,42,255,215,1,250,3,43,255,174,1,250,3,44,255,215,1,250,3,45,255,174,1,250,3,46,255,215,1,250,3,47,255,174,1,250,3,48,255,215,1,250,3,49,255,174,1,250,3,50,255,215,1,250,3,51,255,174,1,250,3,52,255,215,1,250,3,54,255,215,1,250,3,56,255,215,1,250,3,58,255,215,1,250,3,60,255,215,1,250,3,64,255,215,1,250,3,66,255,215,1,250,3,68,255,215,1,250,3,73,255,236,1,250,3,74,255,215,1,250,3,75,255,236,1,250,3,76,255,215,1,250,3,77,255,236,1,250,3,78,255,215,1,250,3,79,255,236,1,250,3,81,255,236,1,250,3,82,255,215,1,250,3,83,255,236,1,250,3,84,255,215,1,250,3,85,255,236,1,250,3,86,255,215,1,250,3,87,255,236,1,250,3,88,255,215,1,250,3,89,255,236,1,250,3,90,255,215,1,250,3,91,255,236,1,250,3,92,255,215,1,250,3,93,255,236,1,250,3,94,255,215,1,250,3,95,255,236,1,250,3,96,255,215,1,250,3,98,255,236,1,250,3,100,255,236,1,250,3,102,255,236,1,250,3,104,255,236,1,250,3,106,255,236,1,250,3,108,255,236,1,250,3,110,255,236,1,251,0,5,0,82,1,251,0,10,0,82,1,251,0,15,255,174,1,251,0,17,255,174,1,251,0,34,0,41,1,251,2,7,0,82,1,251,2,8,255,174,1,251,2,11,0,82,1,251,2,12,255,174,1,252,0,15,255,154,1,252,0,17,255,154,1,252,0,34,0,41,1,252,0,36,255,174,1,252,0,38,255,236,1,252,0,42,255,236,1,252,0,50,255,236,1,252,0,52,255,236,1,252,0,68,255,215,1,252,0,70,255,215,1,252,0,71,255,215,1,252,0,72,255,215,1,252,0,74,255,236,1,252,0,80,255,236,1,252,0,81,255,236,1,252,0,82,255,215,1,252,0,83,255,236,1,252,0,84,255,215,1,252,0,85,255,236,1,252,0,86,255,236,1,252,0,88,255,236,1,252,0,130,255,174,1,252,0,131,255,174,1,252,0,132,255,174,1,252,0,133,255,174,1,252,0,134,255,174,1,252,0,135,255,174,1,252,0,137,255,236,1,252,0,148,255,236,1,252,0,149,255,236,1,252,0,150,255,236,1,252,0,151,255,236,1,252,0,152,255,236,1,252,0,154,255,236,1,252,0,162,255,215,1,252,0,163,255,215,1,252,0,164,255,215,1,252,0,165,255,215,1,252,0,166,255,215,1,252,0,167,255,215,1,252,0,168,255,215,1,252,0,169,255,215,1,252,0,170,255,215,1,252,0,171,255,215,1,252,0,172,255,215,1,252,0,173,255,215,1,252,0,180,255,215,1,252,0,181,255,215,1,252,0,182,255,215,1,252,0,183,255,215,1,252,0,184,255,215,1,252,0,186,255,215,1,252,0,187,255,236,1,252,0,188,255,236,1,252,0,189,255,236,1,252,0,190,255,236,1,252,0,194,255,174,1,252,0,195,255,215,1,252,0,196,255,174,1,252,0,197,255,215,1,252,0,198,255,174,1,252,0,199,255,215,1,252,0,200,255,236,1,252,0,201,255,215,1,252,0,202,255,236,1,252,0,203,255,215,1,252,0,204,255,236,1,252,0,205,255,215,1,252,0,206,255,236,1,252,0,207,255,215,1,252,0,209,255,215,1,252,0,211,255,215,1,252,0,213,255,215,1,252,0,215,255,215,1,252,0,217,255,215,1,252,0,219,255,215,1,252,0,221,255,215,1,252,0,222,255,236,1,252,0,223,255,236,1,252,0,224,255,236,1,252,0,225,255,236,1,252,0,226,255,236,1,252,0,227,255,236,1,252,0,228,255,236,1,252,0,229,255,236,1,252,0,250,255,236,1,252,1,6,255,236,1,252,1,8,255,236,1,252,1,13,255,236,1,252,1,14,255,236,1,252,1,15,255,215,1,252,1,16,255,236,1,252,1,17,255,215,1,252,1,18,255,236,1,252,1,19,255,215,1,252,1,20,255,236,1,252,1,21,255,215,1,252,1,23,255,236,1,252,1,25,255,236,1,252,1,29,255,236,1,252,1,33,255,236,1,252,1,43,255,236,1,252,1,45,255,236,1,252,1,47,255,236,1,252,1,49,255,236,1,252,1,51,255,236,1,252,1,53,255,236,1,252,1,67,255,174,1,252,1,68,255,215,1,252,1,70,255,215,1,252,1,71,255,236,1,252,1,72,255,215,1,252,1,74,255,236,1,252,2,8,255,154,1,252,2,12,255,154,1,252,2,87,255,236,1,252,2,88,255,174,1,252,2,89,255,215,1,252,2,95,255,236,1,252,2,96,255,215,1,252,2,98,255,236,1,252,3,29,255,174,1,252,3,30,255,215,1,252,3,31,255,174,1,252,3,32,255,215,1,252,3,33,255,174,1,252,3,34,255,215,1,252,3,35,255,174,1,252,3,37,255,174,1,252,3,38,255,215,1,252,3,39,255,174,1,252,3,40,255,215,1,252,3,41,255,174,1,252,3,42,255,215,1,252,3,43,255,174,1,252,3,44,255,215,1,252,3,45,255,174,1,252,3,46,255,215,1,252,3,47,255,174,1,252,3,48,255,215,1,252,3,49,255,174,1,252,3,50,255,215,1,252,3,51,255,174,1,252,3,52,255,215,1,252,3,54,255,215,1,252,3,56,255,215,1,252,3,58,255,215,1,252,3,60,255,215,1,252,3,64,255,215,1,252,3,66,255,215,1,252,3,68,255,215,1,252,3,73,255,236,1,252,3,74,255,215,1,252,3,75,255,236,1,252,3,76,255,215,1,252,3,77,255,236,1,252,3,78,255,215,1,252,3,79,255,236,1,252,3,81,255,236,1,252,3,82,255,215,1,252,3,83,255,236,1,252,3,84,255,215,1,252,3,85,255,236,1,252,3,86,255,215,1,252,3,87,255,236,1,252,3,88,255,215,1,252,3,89,255,236,1,252,3,90,255,215,1,252,3,91,255,236,1,252,3,92,255,215,1,252,3,93,255,236,1,252,3,94,255,215,1,252,3,95,255,236,1,252,3,96,255,215,1,252,3,98,255,236,1,252,3,100,255,236,1,252,3,102,255,236,1,252,3,104,255,236,1,252,3,106,255,236,1,252,3,108,255,236,1,252,3,110,255,236,1,253,0,5,0,82,1,253,0,10,0,82,1,253,0,15,255,174,1,253,0,17,255,174,1,253,0,34,0,41,1,253,2,7,0,82,1,253,2,8,255,174,1,253,2,11,0,82,1,253,2,12,255,174,1,254,0,15,255,154,1,254,0,17,255,154,1,254,0,34,0,41,1,254,0,36,255,174,1,254,0,38,255,236,1,254,0,42,255,236,1,254,0,50,255,236,1,254,0,52,255,236,1,254,0,68,255,215,1,254,0,70,255,215,1,254,0,71,255,215,1,254,0,72,255,215,1,254,0,74,255,236,1,254,0,80,255,236,1,254,0,81,255,236,1,254,0,82,255,215,1,254,0,83,255,236,1,254,0,84,255,215,1,254,0,85,255,236,1,254,0,86,255,236,1,254,0,88,255,236,1,254,0,130,255,174,1,254,0,131,255,174,1,254,0,132,255,174,1,254,0,133,255,174,1,254,0,134,255,174,1,254,0,135,255,174,1,254,0,137,255,236,1,254,0,148,255,236,1,254,0,149,255,236,1,254,0,150,255,236,1,254,0,151,255,236,1,254,0,152,255,236,1,254,0,154,255,236,1,254,0,162,255,215,1,254,0,163,255,215,1,254,0,164,255,215,1,254,0,165,255,215,1,254,0,166,255,215,1,254,0,167,255,215,1,254,0,168,255,215,1,254,0,169,255,215,1,254,0,170,255,215,1,254,0,171,255,215,1,254,0,172,255,215,1,254,0,173,255,215,1,254,0,180,255,215,1,254,0,181,255,215,1,254,0,182,255,215,1,254,0,183,255,215,1,254,0,184,255,215,1,254,0,186,255,215,1,254,0,187,255,236,1,254,0,188,255,236,1,254,0,189,255,236,1,254,0,190,255,236,1,254,0,194,255,174,1,254,0,195,255,215,1,254,0,196,255,174,1,254,0,197,255,215,1,254,0,198,255,174,1,254,0,199,255,215,1,254,0,200,255,236,1,254,0,201,255,215,1,254,0,202,255,236,1,254,0,203,255,215,1,254,0,204,255,236,1,254,0,205,255,215,1,254,0,206,255,236,1,254,0,207,255,215,1,254,0,209,255,215,1,254,0,211,255,215,1,254,0,213,255,215,1,254,0,215,255,215,1,254,0,217,255,215,1,254,0,219,255,215,1,254,0,221,255,215,1,254,0,222,255,236,1,254,0,223,255,236,1,254,0,224,255,236,1,254,0,225,255,236,1,254,0,226,255,236,1,254,0,227,255,236,1,254,0,228,255,236,1,254,0,229,255,236,1,254,0,250,255,236,1,254,1,6,255,236,1,254,1,8,255,236,1,254,1,13,255,236,1,254,1,14,255,236,1,254,1,15,255,215,1,254,1,16,255,236,1,254,1,17,255,215,1,254,1,18,255,236,1,254,1,19,255,215,1,254,1,20,255,236,1,254,1,21,255,215,1,254,1,23,255,236,1,254,1,25,255,236,1,254,1,29,255,236,1,254,1,33,255,236,1,254,1,43,255,236,1,254,1,45,255,236,1,254,1,47,255,236,1,254,1,49,255,236,1,254,1,51,255,236,1,254,1,53,255,236,1,254,1,67,255,174,1,254,1,68,255,215,1,254,1,70,255,215,1,254,1,71,255,236,1,254,1,72,255,215,1,254,1,74,255,236,1,254,2,8,255,154,1,254,2,12,255,154,1,254,2,87,255,236,1,254,2,88,255,174,1,254,2,89,255,215,1,254,2,95,255,236,1,254,2,96,255,215,1,254,2,98,255,236,1,254,3,29,255,174,1,254,3,30,255,215,1,254,3,31,255,174,1,254,3,32,255,215,1,254,3,33,255,174,1,254,3,34,255,215,1,254,3,35,255,174,1,254,3,37,255,174,1,254,3,38,255,215,1,254,3,39,255,174,1,254,3,40,255,215,1,254,3,41,255,174,1,254,3,42,255,215,1,254,3,43,255,174,1,254,3,44,255,215,1,254,3,45,255,174,1,254,3,46,255,215,1,254,3,47,255,174,1,254,3,48,255,215,1,254,3,49,255,174,1,254,3,50,255,215,1,254,3,51,255,174,1,254,3,52,255,215,1,254,3,54,255,215,1,254,3,56,255,215,1,254,3,58,255,215,1,254,3,60,255,215,1,254,3,64,255,215,1,254,3,66,255,215,1,254,3,68,255,215,1,254,3,73,255,236,1,254,3,74,255,215,1,254,3,75,255,236,1,254,3,76,255,215,1,254,3,77,255,236,1,254,3,78,255,215,1,254,3,79,255,236,1,254,3,81,255,236,1,254,3,82,255,215,1,254,3,83,255,236,1,254,3,84,255,215,1,254,3,85,255,236,1,254,3,86,255,215,1,254,3,87,255,236,1,254,3,88,255,215,1,254,3,89,255,236,1,254,3,90,255,215,1,254,3,91,255,236,1,254,3,92,255,215,1,254,3,93,255,236,1,254,3,94,255,215,1,254,3,95,255,236,1,254,3,96,255,215,1,254,3,98,255,236,1,254,3,100,255,236,1,254,3,102,255,236,1,254,3,104,255,236,1,254,3,106,255,236,1,254,3,108,255,236,1,254,3,110,255,236,1,255,0,5,0,82,1,255,0,10,0,82,1,255,0,15,255,174,1,255,0,17,255,174,1,255,0,34,0,41,1,255,2,7,0,82,1,255,2,8,255,174,1,255,2,11,0,82,1,255,2,12,255,174,2,0,0,15,255,133,2,0,0,17,255,133,2,0,0,34,0,41,2,0,0,36,255,133,2,0,0,38,255,215,2,0,0,42,255,215,2,0,0,50,255,215,2,0,0,52,255,215,2,0,0,68,255,154,2,0,0,70,255,154,2,0,0,71,255,154,2,0,0,72,255,154,2,0,0,74,255,215,2,0,0,80,255,195,2,0,0,81,255,195,2,0,0,82,255,154,2,0,0,83,255,195,2,0,0,84,255,154,2,0,0,85,255,195,2,0,0,86,255,174,2,0,0,88,255,195,2,0,0,93,255,215,2,0,0,130,255,133,2,0,0,131,255,133,2,0,0,132,255,133,2,0,0,133,255,133,2,0,0,134,255,133,2,0,0,135,255,133,2,0,0,137,255,215,2,0,0,148,255,215,2,0,0,149,255,215,2,0,0,150,255,215,2,0,0,151,255,215,2,0,0,152,255,215,2,0,0,154,255,215,2,0,0,162,255,154,2,0,0,163,255,154,2,0,0,164,255,154,2,0,0,165,255,154,2,0,0,166,255,154,2,0,0,167,255,154,2,0,0,168,255,154,2,0,0,169,255,154,2,0,0,170,255,154,2,0,0,171,255,154,2,0,0,172,255,154,2,0,0,173,255,154,2,0,0,180,255,154,2,0,0,181,255,154,2,0,0,182,255,154,2,0,0,183,255,154,2,0,0,184,255,154,2,0,0,186,255,154,2,0,0,187,255,195,2,0,0,188,255,195,2,0,0,189,255,195,2,0,0,190,255,195,2,0,0,194,255,133,2,0,0,195,255,154,2,0,0,196,255,133,2,0,0,197,255,154,2,0,0,198,255,133,2,0,0,199,255,154,2,0,0,200,255,215,2,0,0,201,255,154,2,0,0,202,255,215,2,0,0,203,255,154,2,0,0,204,255,215,2,0,0,205,255,154,2,0,0,206,255,215,2,0,0,207,255,154,2,0,0,209,255,154,2,0,0,211,255,154,2,0,0,213,255,154,2,0,0,215,255,154,2,0,0,217,255,154,2,0,0,219,255,154,2,0,0,221,255,154,2,0,0,222,255,215,2,0,0,223,255,215,2,0,0,224,255,215,2,0,0,225,255,215,2,0,0,226,255,215,2,0,0,227,255,215,2,0,0,228,255,215,2,0,0,229,255,215,2,0,0,250,255,195,2,0,1,6,255,195,2,0,1,8,255,195,2,0,1,13,255,195,2,0,1,14,255,215,2,0,1,15,255,154,2,0,1,16,255,215,2,0,1,17,255,154,2,0,1,18,255,215,2,0,1,19,255,154,2,0,1,20,255,215,2,0,1,21,255,154,2,0,1,23,255,195,2,0,1,25,255,195,2,0,1,29,255,174,2,0,1,33,255,174,2,0,1,43,255,195,2,0,1,45,255,195,2,0,1,47,255,195,2,0,1,49,255,195,2,0,1,51,255,195,2,0,1,53,255,195,2,0,1,60,255,215,2,0,1,62,255,215,2,0,1,64,255,215,2,0,1,67,255,133,2,0,1,68,255,154,2,0,1,70,255,154,2,0,1,71,255,215,2,0,1,72,255,154,2,0,1,74,255,174,2,0,2,8,255,133,2,0,2,12,255,133,2,0,2,87,255,195,2,0,2,88,255,133,2,0,2,89,255,154,2,0,2,95,255,215,2,0,2,96,255,154,2,0,2,98,255,195,2,0,3,29,255,133,2,0,3,30,255,154,2,0,3,31,255,133,2,0,3,32,255,154,2,0,3,33,255,133,2,0,3,34,255,154,2,0,3,35,255,133,2,0,3,37,255,133,2,0,3,38,255,154,2,0,3,39,255,133,2,0,3,40,255,154,2,0,3,41,255,133,2,0,3,42,255,154,2,0,3,43,255,133,2,0,3,44,255,154,2,0,3,45,255,133,2,0,3,46,255,154,2,0,3,47,255,133,2,0,3,48,255,154,2,0,3,49,255,133,2,0,3,50,255,154,2,0,3,51,255,133,2,0,3,52,255,154,2,0,3,54,255,154,2,0,3,56,255,154,2,0,3,58,255,154,2,0,3,60,255,154,2,0,3,64,255,154,2,0,3,66,255,154,2,0,3,68,255,154,2,0,3,73,255,215,2,0,3,74,255,154,2,0,3,75,255,215,2,0,3,76,255,154,2,0,3,77,255,215,2,0,3,78,255,154,2,0,3,79,255,215,2,0,3,81,255,215,2,0,3,82,255,154,2,0,3,83,255,215,2,0,3,84,255,154,2,0,3,85,255,215,2,0,3,86,255,154,2,0,3,87,255,215,2,0,3,88,255,154,2,0,3,89,255,215,2,0,3,90,255,154,2,0,3,91,255,215,2,0,3,92,255,154,2,0,3,93,255,215,2,0,3,94,255,154,2,0,3,95,255,215,2,0,3,96,255,154,2,0,3,98,255,195,2,0,3,100,255,195,2,0,3,102,255,195,2,0,3,104,255,195,2,0,3,106,255,195,2,0,3,108,255,195,2,0,3,110,255,195,2,1,0,5,0,82,2,1,0,10,0,82,2,1,0,15,255,174,2,1,0,17,255,174,2,1,0,34,0,41,2,1,2,7,0,82,2,1,2,8,255,174,2,1,2,11,0,82,2,1,2,12,255,174,2,2,0,55,255,174,2,2,1,36,255,174,2,2,1,38,255,174,2,2,1,113,255,174,2,2,1,157,255,174,2,2,1,166,255,174,2,2,1,188,255,174,2,2,1,196,255,174,2,2,1,220,255,215,2,2,1,228,255,215,2,2,2,169,255,174,2,2,2,170,255,215,2,2,2,181,255,174,2,2,2,182,255,215,2,2,2,189,255,174,2,2,2,190,255,215,2,2,3,23,255,174,2,2,3,24,255,215,2,2,3,143,255,174,2,3,0,55,255,174,2,3,1,36,255,174,2,3,1,38,255,174,2,3,1,113,255,174,2,3,1,157,255,174,2,3,1,166,255,174,2,3,1,188,255,174,2,3,1,196,255,174,2,3,1,220,255,215,2,3,1,228,255,215,2,3,2,169,255,174,2,3,2,170,255,215,2,3,2,181,255,174,2,3,2,182,255,215,2,3,2,189,255,174,2,3,2,190,255,215,2,3,3,23,255,174,2,3,3,24,255,215,2,3,3,143,255,174,2,4,0,55,255,174,2,4,1,36,255,174,2,4,1,38,255,174,2,4,1,113,255,174,2,4,1,157,255,174,2,4,1,166,255,174,2,4,1,188,255,174,2,4,1,196,255,174,2,4,1,220,255,215,2,4,1,228,255,215,2,4,2,169,255,174,2,4,2,170,255,215,2,4,2,181,255,174,2,4,2,182,255,215,2,4,2,189,255,174,2,4,2,190,255,215,2,4,3,23,255,174,2,4,3,24,255,215,2,4,3,143,255,174,2,6,0,36,255,113,2,6,0,55,0,41,2,6,0,57,0,41,2,6,0,58,0,41,2,6,0,60,0,20,2,6,0,68,255,174,2,6,0,70,255,133,2,6,0,71,255,133,2,6,0,72,255,133,2,6,0,74,255,195,2,6,0,80,255,195,2,6,0,81,255,195,2,6,0,82,255,133,2,6,0,83,255,195,2,6,0,84,255,133,2,6,0,85,255,195,2,6,0,86,255,195,2,6,0,88,255,195,2,6,0,130,255,113,2,6,0,131,255,113,2,6,0,132,255,113,2,6,0,133,255,113,2,6,0,134,255,113,2,6,0,135,255,113,2,6,0,159,0,20,2,6,0,162,255,133,2,6,0,163,255,174,2,6,0,164,255,174,2,6,0,165,255,174,2,6,0,166,255,174,2,6,0,167,255,174,2,6,0,168,255,174,2,6,0,169,255,133,2,6,0,170,255,133,2,6,0,171,255,133,2,6,0,172,255,133,2,6,0,173,255,133,2,6,0,180,255,133,2,6,0,181,255,133,2,6,0,182,255,133,2,6,0,183,255,133,2,6,0,184,255,133,2,6,0,186,255,133,2,6,0,187,255,195,2,6,0,188,255,195,2,6,0,189,255,195,2,6,0,190,255,195,2,6,0,194,255,113,2,6,0,195,255,174,2,6,0,196,255,113,2,6,0,197,255,174,2,6,0,198,255,113,2,6,0,199,255,174,2,6,0,201,255,133,2,6,0,203,255,133,2,6,0,205,255,133,2,6,0,207,255,133,2,6,0,209,255,133,2,6,0,211,255,133,2,6,0,213,255,133,2,6,0,215,255,133,2,6,0,217,255,133,2,6,0,219,255,133,2,6,0,221,255,133,2,6,0,223,255,195,2,6,0,225,255,195,2,6,0,227,255,195,2,6,0,229,255,195,2,6,0,250,255,195,2,6,1,6,255,195,2,6,1,8,255,195,2,6,1,13,255,195,2,6,1,15,255,133,2,6,1,17,255,133,2,6,1,19,255,133,2,6,1,21,255,133,2,6,1,23,255,195,2,6,1,25,255,195,2,6,1,29,255,195,2,6,1,33,255,195,2,6,1,36,0,41,2,6,1,38,0,41,2,6,1,43,255,195,2,6,1,45,255,195,2,6,1,47,255,195,2,6,1,49,255,195,2,6,1,51,255,195,2,6,1,53,255,195,2,6,1,54,0,41,2,6,1,56,0,20,2,6,1,58,0,20,2,6,1,67,255,113,2,6,1,68,255,174,2,6,1,70,255,174,2,6,1,72,255,133,2,6,1,74,255,195,2,6,1,86,255,113,2,6,1,95,255,113,2,6,1,98,255,113,2,6,1,105,255,113,2,6,1,121,255,174,2,6,1,122,255,215,2,6,1,123,255,215,2,6,1,126,255,174,2,6,1,129,255,195,2,6,1,130,255,215,2,6,1,131,255,215,2,6,1,132,255,215,2,6,1,135,255,215,2,6,1,137,255,215,2,6,1,140,255,174,2,6,1,142,255,195,2,6,1,143,255,174,2,6,1,144,255,174,2,6,1,147,255,174,2,6,1,153,255,174,2,6,1,164,255,133,2,6,1,170,255,113,2,6,1,174,255,133,2,6,1,181,255,133,2,6,1,202,255,215,2,6,1,206,255,113,2,6,1,207,255,133,2,6,1,213,255,113,2,6,1,216,255,133,2,6,1,219,255,133,2,6,1,222,255,133,2,6,1,234,255,133,2,6,1,237,255,133,2,6,1,238,255,195,2,6,1,242,255,113,2,6,1,250,0,41,2,6,1,252,0,41,2,6,1,254,0,41,2,6,2,0,0,20,2,6,2,87,255,195,2,6,2,88,255,113,2,6,2,89,255,174,2,6,2,96,255,133,2,6,2,98,255,195,2,6,2,106,255,133,2,6,2,114,255,113,2,6,2,115,255,113,2,6,2,125,255,236,2,6,2,127,255,133,2,6,2,133,255,133,2,6,2,135,255,133,2,6,2,137,255,133,2,6,2,141,255,133,2,6,2,178,255,133,2,6,2,180,255,133,2,6,2,206,255,133,2,6,2,207,255,113,2,6,2,217,255,113,2,6,2,218,255,215,2,6,2,219,255,113,2,6,2,220,255,215,2,6,2,221,255,113,2,6,2,222,255,215,2,6,2,224,255,133,2,6,2,226,255,215,2,6,2,228,255,215,2,6,2,240,255,133,2,6,2,242,255,133,2,6,2,244,255,133,2,6,3,9,255,113,2,6,3,10,255,133,2,6,3,11,255,113,2,6,3,12,255,133,2,6,3,17,255,133,2,6,3,18,255,113,2,6,3,22,255,133,2,6,3,26,255,133,2,6,3,27,255,133,2,6,3,28,255,113,2,6,3,29,255,113,2,6,3,30,255,174,2,6,3,31,255,113,2,6,3,32,255,174,2,6,3,33,255,113,2,6,3,34,255,174,2,6,3,35,255,113,2,6,3,37,255,113,2,6,3,38,255,174,2,6,3,39,255,113,2,6,3,40,255,174,2,6,3,41,255,113,2,6,3,42,255,174,2,6,3,43,255,113,2,6,3,44,255,174,2,6,3,45,255,113,2,6,3,46,255,174,2,6,3,47,255,113,2,6,3,48,255,174,2,6,3,49,255,113,2,6,3,50,255,174,2,6,3,51,255,113,2,6,3,52,255,174,2,6,3,54,255,133,2,6,3,56,255,133,2,6,3,58,255,133,2,6,3,60,255,133,2,6,3,64,255,133,2,6,3,66,255,133,2,6,3,68,255,133,2,6,3,74,255,133,2,6,3,76,255,133,2,6,3,78,255,133,2,6,3,82,255,133,2,6,3,84,255,133,2,6,3,86,255,133,2,6,3,88,255,133,2,6,3,90,255,133,2,6,3,92,255,133,2,6,3,94,255,133,2,6,3,96,255,133,2,6,3,98,255,195,2,6,3,100,255,195,2,6,3,102,255,195,2,6,3,104,255,195,2,6,3,106,255,195,2,6,3,108,255,195,2,6,3,110,255,195,2,6,3,111,0,20,2,6,3,113,0,20,2,6,3,115,0,20,2,6,3,143,0,41,2,7,0,36,255,113,2,7,0,55,0,41,2,7,0,57,0,41,2,7,0,58,0,41,2,7,0,60,0,20,2,7,0,68,255,174,2,7,0,70,255,133,2,7,0,71,255,133,2,7,0,72,255,133,2,7,0,74,255,195,2,7,0,80,255,195,2,7,0,81,255,195,2,7,0,82,255,133,2,7,0,83,255,195,2,7,0,84,255,133,2,7,0,85,255,195,2,7,0,86,255,195,2,7,0,88,255,195,2,7,0,130,255,113,2,7,0,131,255,113,2,7,0,132,255,113,2,7,0,133,255,113,2,7,0,134,255,113,2,7,0,135,255,113,2,7,0,159,0,20,2,7,0,162,255,133,2,7,0,163,255,174,2,7,0,164,255,174,2,7,0,165,255,174,2,7,0,166,255,174,2,7,0,167,255,174,2,7,0,168,255,174,2,7,0,169,255,133,2,7,0,170,255,133,2,7,0,171,255,133,2,7,0,172,255,133,2,7,0,173,255,133,2,7,0,180,255,133,2,7,0,181,255,133,2,7,0,182,255,133,2,7,0,183,255,133,2,7,0,184,255,133,2,7,0,186,255,133,2,7,0,187,255,195,2,7,0,188,255,195,2,7,0,189,255,195,2,7,0,190,255,195,2,7,0,194,255,113,2,7,0,195,255,174,2,7,0,196,255,113,2,7,0,197,255,174,2,7,0,198,255,113,2,7,0,199,255,174,2,7,0,201,255,133,2,7,0,203,255,133,2,7,0,205,255,133,2,7,0,207,255,133,2,7,0,209,255,133,2,7,0,211,255,133,2,7,0,213,255,133,2,7,0,215,255,133,2,7,0,217,255,133,2,7,0,219,255,133,2,7,0,221,255,133,2,7,0,223,255,195,2,7,0,225,255,195,2,7,0,227,255,195,2,7,0,229,255,195,2,7,0,250,255,195,2,7,1,6,255,195,2,7,1,8,255,195,2,7,1,13,255,195,2,7,1,15,255,133,2,7,1,17,255,133,2,7,1,19,255,133,2,7,1,21,255,133,2,7,1,23,255,195,2,7,1,25,255,195,2,7,1,29,255,195,2,7,1,33,255,195,2,7,1,36,0,41,2,7,1,38,0,41,2,7,1,43,255,195,2,7,1,45,255,195,2,7,1,47,255,195,2,7,1,49,255,195,2,7,1,51,255,195,2,7,1,53,255,195,2,7,1,54,0,41,2,7,1,56,0,20,2,7,1,58,0,20,2,7,1,67,255,113,2,7,1,68,255,174,2,7,1,70,255,174,2,7,1,72,255,133,2,7,1,74,255,195,2,7,1,86,255,113,2,7,1,95,255,113,2,7,1,98,255,113,2,7,1,105,255,113,2,7,1,121,255,174,2,7,1,122,255,215,2,7,1,123,255,215,2,7,1,126,255,174,2,7,1,129,255,195,2,7,1,130,255,215,2,7,1,131,255,215,2,7,1,132,255,215,2,7,1,135,255,215,2,7,1,137,255,215,2,7,1,140,255,174,2,7,1,142,255,195,2,7,1,143,255,174,2,7,1,144,255,174,2,7,1,147,255,174,2,7,1,153,255,174,2,7,1,164,255,133,2,7,1,170,255,113,2,7,1,174,255,133,2,7,1,181,255,133,2,7,1,202,255,215,2,7,1,206,255,113,2,7,1,207,255,133,2,7,1,213,255,113,2,7,1,216,255,133,2,7,1,219,255,133,2,7,1,222,255,133,2,7,1,234,255,133,2,7,1,237,255,133,2,7,1,238,255,195,2,7,1,242,255,113,2,7,1,250,0,41,2,7,1,252,0,41,2,7,1,254,0,41,2,7,2,0,0,20,2,7,2,87,255,195,2,7,2,88,255,113,2,7,2,89,255,174,2,7,2,96,255,133,2,7,2,98,255,195,2,7,2,106,255,133,2,7,2,114,255,113,2,7,2,115,255,113,2,7,2,125,255,236,2,7,2,127,255,133,2,7,2,133,255,133,2,7,2,135,255,133,2,7,2,137,255,133,2,7,2,141,255,133,2,7,2,178,255,133,2,7,2,180,255,133,2,7,2,206,255,133,2,7,2,207,255,113,2,7,2,217,255,113,2,7,2,218,255,215,2,7,2,219,255,113,2,7,2,220,255,215,2,7,2,221,255,113,2,7,2,222,255,215,2,7,2,224,255,133,2,7,2,226,255,215,2,7,2,228,255,215,2,7,2,240,255,133,2,7,2,242,255,133,2,7,2,244,255,133,2,7,3,9,255,113,2,7,3,10,255,133,2,7,3,11,255,113,2,7,3,12,255,133,2,7,3,17,255,133,2,7,3,18,255,113,2,7,3,22,255,133,2,7,3,26,255,133,2,7,3,27,255,133,2,7,3,28,255,113,2,7,3,29,255,113,2,7,3,30,255,174,2,7,3,31,255,113,2,7,3,32,255,174,2,7,3,33,255,113,2,7,3,34,255,174,2,7,3,35,255,113,2,7,3,37,255,113,2,7,3,38,255,174,2,7,3,39,255,113,2,7,3,40,255,174,2,7,3,41,255,113,2,7,3,42,255,174,2,7,3,43,255,113,2,7,3,44,255,174,2,7,3,45,255,113,2,7,3,46,255,174,2,7,3,47,255,113,2,7,3,48,255,174,2,7,3,49,255,113,2,7,3,50,255,174,2,7,3,51,255,113,2,7,3,52,255,174,2,7,3,54,255,133,2,7,3,56,255,133,2,7,3,58,255,133,2,7,3,60,255,133,2,7,3,64,255,133,2,7,3,66,255,133,2,7,3,68,255,133,2,7,3,74,255,133,2,7,3,76,255,133,2,7,3,78,255,133,2,7,3,82,255,133,2,7,3,84,255,133,2,7,3,86,255,133,2,7,3,88,255,133,2,7,3,90,255,133,2,7,3,92,255,133,2,7,3,94,255,133,2,7,3,96,255,133,2,7,3,98,255,195,2,7,3,100,255,195,2,7,3,102,255,195,2,7,3,104,255,195,2,7,3,106,255,195,2,7,3,108,255,195,2,7,3,110,255,195,2,7,3,111,0,20,2,7,3,113,0,20,2,7,3,115,0,20,2,7,3,143,0,41,2,8,0,38,255,154,2,8,0,42,255,154,2,8,0,50,255,154,2,8,0,52,255,154,2,8,0,55,255,113,2,8,0,56,255,215,2,8,0,57,255,133,2,8,0,58,255,133,2,8,0,60,255,133,2,8,0,137,255,154,2,8,0,148,255,154,2,8,0,149,255,154,2,8,0,150,255,154,2,8,0,151,255,154,2,8,0,152,255,154,2,8,0,154,255,154,2,8,0,155,255,215,2,8,0,156,255,215,2,8,0,157,255,215,2,8,0,158,255,215,2,8,0,159,255,133,2,8,0,200,255,154,2,8,0,202,255,154,2,8,0,204,255,154,2,8,0,206,255,154,2,8,0,222,255,154,2,8,0,224,255,154,2,8,0,226,255,154,2,8,0,228,255,154,2,8,1,14,255,154,2,8,1,16,255,154,2,8,1,18,255,154,2,8,1,20,255,154,2,8,1,36,255,113,2,8,1,38,255,113,2,8,1,42,255,215,2,8,1,44,255,215,2,8,1,46,255,215,2,8,1,48,255,215,2,8,1,50,255,215,2,8,1,52,255,215,2,8,1,54,255,133,2,8,1,56,255,133,2,8,1,58,255,133,2,8,1,71,255,154,2,8,1,102,255,174,2,8,1,109,255,174,2,8,1,113,255,113,2,8,1,114,255,133,2,8,1,115,255,154,2,8,1,117,255,133,2,8,1,120,255,133,2,8,1,133,255,215,2,8,1,157,255,113,2,8,1,159,255,154,2,8,1,166,255,113,2,8,1,184,255,154,2,8,1,187,255,154,2,8,1,188,255,113,2,8,1,190,255,174,2,8,1,193,255,92,2,8,1,196,255,113,2,8,1,220,255,154,2,8,1,225,255,133,2,8,1,228,255,154,2,8,1,250,255,133,2,8,1,252,255,133,2,8,1,254,255,133,2,8,2,0,255,133,2,8,2,84,255,133,2,8,2,95,255,154,2,8,2,97,255,215,2,8,2,108,255,154,2,8,2,124,255,92,2,8,2,126,255,154,2,8,2,128,255,133,2,8,2,130,255,133,2,8,2,132,255,154,2,8,2,134,255,154,2,8,2,136,255,154,2,8,2,138,255,154,2,8,2,140,255,154,2,8,2,169,255,113,2,8,2,170,255,154,2,8,2,177,255,154,2,8,2,179,255,154,2,8,2,181,255,113,2,8,2,182,255,154,2,8,2,183,255,133,2,8,2,185,255,133,2,8,2,189,255,113,2,8,2,190,255,154,2,8,2,191,255,92,2,8,2,192,255,133,2,8,2,193,255,92,2,8,2,194,255,133,2,8,2,197,255,133,2,8,2,199,255,133,2,8,2,212,255,92,2,8,2,213,255,133,2,8,2,239,255,154,2,8,2,241,255,154,2,8,2,243,255,154,2,8,2,253,255,92,2,8,2,254,255,133,2,8,3,13,255,133,2,8,3,14,255,154,2,8,3,15,255,133,2,8,3,16,255,154,2,8,3,21,255,154,2,8,3,23,255,113,2,8,3,24,255,154,2,8,3,73,255,154,2,8,3,75,255,154,2,8,3,77,255,154,2,8,3,79,255,154,2,8,3,81,255,154,2,8,3,83,255,154,2,8,3,85,255,154,2,8,3,87,255,154,2,8,3,89,255,154,2,8,3,91,255,154,2,8,3,93,255,154,2,8,3,95,255,154,2,8,3,97,255,215,2,8,3,99,255,215,2,8,3,101,255,215,2,8,3,103,255,215,2,8,3,105,255,215,2,8,3,107,255,215,2,8,3,109,255,215,2,8,3,111,255,133,2,8,3,113,255,133,2,8,3,115,255,133,2,8,3,143,255,113,2,10,0,36,255,113,2,10,0,55,0,41,2,10,0,57,0,41,2,10,0,58,0,41,2,10,0,60,0,20,2,10,0,68,255,174,2,10,0,70,255,133,2,10,0,71,255,133,2,10,0,72,255,133,2,10,0,74,255,195,2,10,0,80,255,195,2,10,0,81,255,195,2,10,0,82,255,133,2,10,0,83,255,195,2,10,0,84,255,133,2,10,0,85,255,195,2,10,0,86,255,195,2,10,0,88,255,195,2,10,0,130,255,113,2,10,0,131,255,113,2,10,0,132,255,113,2,10,0,133,255,113,2,10,0,134,255,113,2,10,0,135,255,113,2,10,0,159,0,20,2,10,0,162,255,133,2,10,0,163,255,174,2,10,0,164,255,174,2,10,0,165,255,174,2,10,0,166,255,174,2,10,0,167,255,174,2,10,0,168,255,174,2,10,0,169,255,133,2,10,0,170,255,133,2,10,0,171,255,133,2,10,0,172,255,133,2,10,0,173,255,133,2,10,0,180,255,133,2,10,0,181,255,133,2,10,0,182,255,133,2,10,0,183,255,133,2,10,0,184,255,133,2,10,0,186,255,133,2,10,0,187,255,195,2,10,0,188,255,195,2,10,0,189,255,195,2,10,0,190,255,195,2,10,0,194,255,113,2,10,0,195,255,174,2,10,0,196,255,113,2,10,0,197,255,174,2,10,0,198,255,113,2,10,0,199,255,174,2,10,0,201,255,133,2,10,0,203,255,133,2,10,0,205,255,133,2,10,0,207,255,133,2,10,0,209,255,133,2,10,0,211,255,133,2,10,0,213,255,133,2,10,0,215,255,133,2,10,0,217,255,133,2,10,0,219,255,133,2,10,0,221,255,133,2,10,0,223,255,195,2,10,0,225,255,195,2,10,0,227,255,195,2,10,0,229,255,195,2,10,0,250,255,195,2,10,1,6,255,195,2,10,1,8,255,195,2,10,1,13,255,195,2,10,1,15,255,133,2,10,1,17,255,133,2,10,1,19,255,133,2,10,1,21,255,133,2,10,1,23,255,195,2,10,1,25,255,195,2,10,1,29,255,195,2,10,1,33,255,195,2,10,1,36,0,41,2,10,1,38,0,41,2,10,1,43,255,195,2,10,1,45,255,195,2,10,1,47,255,195,2,10,1,49,255,195,2,10,1,51,255,195,2,10,1,53,255,195,2,10,1,54,0,41,2,10,1,56,0,20,2,10,1,58,0,20,2,10,1,67,255,113,2,10,1,68,255,174,2,10,1,70,255,174,2,10,1,72,255,133,2,10,1,74,255,195,2,10,1,86,255,113,2,10,1,95,255,113,2,10,1,98,255,113,2,10,1,105,255,113,2,10,1,121,255,174,2,10,1,122,255,215,2,10,1,123,255,215,2,10,1,126,255,174,2,10,1,129,255,195,2,10,1,130,255,215,2,10,1,131,255,215,2,10,1,132,255,215,2,10,1,135,255,215,2,10,1,137,255,215,2,10,1,140,255,174,2,10,1,142,255,195,2,10,1,143,255,174,2,10,1,144,255,174,2,10,1,147,255,174,2,10,1,153,255,174,2,10,1,164,255,133,2,10,1,170,255,113,2,10,1,174,255,133,2,10,1,181,255,133,2,10,1,202,255,215,2,10,1,206,255,113,2,10,1,207,255,133,2,10,1,213,255,113,2,10,1,216,255,133,2,10,1,219,255,133,2,10,1,222,255,133,2,10,1,234,255,133,2,10,1,237,255,133,2,10,1,238,255,195,2,10,1,242,255,113,2,10,1,250,0,41,2,10,1,252,0,41,2,10,1,254,0,41,2,10,2,0,0,20,2,10,2,87,255,195,2,10,2,88,255,113,2,10,2,89,255,174,2,10,2,96,255,133,2,10,2,98,255,195,2,10,2,106,255,133,2,10,2,114,255,113,2,10,2,115,255,113,2,10,2,125,255,236,2,10,2,127,255,133,2,10,2,133,255,133,2,10,2,135,255,133,2,10,2,137,255,133,2,10,2,141,255,133,2,10,2,178,255,133,2,10,2,180,255,133,2,10,2,206,255,133,2,10,2,207,255,113,2,10,2,217,255,113,2,10,2,218,255,215,2,10,2,219,255,113,2,10,2,220,255,215,2,10,2,221,255,113,2,10,2,222,255,215,2,10,2,224,255,133,2,10,2,226,255,215,2,10,2,228,255,215,2,10,2,240,255,133,2,10,2,242,255,133,2,10,2,244,255,133,2,10,3,9,255,113,2,10,3,10,255,133,2,10,3,11,255,113,2,10,3,12,255,133,2,10,3,17,255,133,2,10,3,18,255,113,2,10,3,22,255,133,2,10,3,26,255,133,2,10,3,27,255,133,2,10,3,28,255,113,2,10,3,29,255,113,2,10,3,30,255,174,2,10,3,31,255,113,2,10,3,32,255,174,2,10,3,33,255,113,2,10,3,34,255,174,2,10,3,35,255,113,2,10,3,37,255,113,2,10,3,38,255,174,2,10,3,39,255,113,2,10,3,40,255,174,2,10,3,41,255,113,2,10,3,42,255,174,2,10,3,43,255,113,2,10,3,44,255,174,2,10,3,45,255,113,2,10,3,46,255,174,2,10,3,47,255,113,2,10,3,48,255,174,2,10,3,49,255,113,2,10,3,50,255,174,2,10,3,51,255,113,2,10,3,52,255,174,2,10,3,54,255,133,2,10,3,56,255,133,2,10,3,58,255,133,2,10,3,60,255,133,2,10,3,64,255,133,2,10,3,66,255,133,2,10,3,68,255,133,2,10,3,74,255,133,2,10,3,76,255,133,2,10,3,78,255,133,2,10,3,82,255,133,2,10,3,84,255,133,2,10,3,86,255,133,2,10,3,88,255,133,2,10,3,90,255,133,2,10,3,92,255,133,2,10,3,94,255,133,2,10,3,96,255,133,2,10,3,98,255,195,2,10,3,100,255,195,2,10,3,102,255,195,2,10,3,104,255,195,2,10,3,106,255,195,2,10,3,108,255,195,2,10,3,110,255,195,2,10,3,111,0,20,2,10,3,113,0,20,2,10,3,115,0,20,2,10,3,143,0,41,2,12,0,38,255,154,2,12,0,42,255,154,2,12,0,50,255,154,2,12,0,52,255,154,2,12,0,55,255,113,2,12,0,56,255,215,2,12,0,57,255,133,2,12,0,58,255,133,2,12,0,60,255,133,2,12,0,137,255,154,2,12,0,148,255,154,2,12,0,149,255,154,2,12,0,150,255,154,2,12,0,151,255,154,2,12,0,152,255,154,2,12,0,154,255,154,2,12,0,155,255,215,2,12,0,156,255,215,2,12,0,157,255,215,2,12,0,158,255,215,2,12,0,159,255,133,2,12,0,200,255,154,2,12,0,202,255,154,2,12,0,204,255,154,2,12,0,206,255,154,2,12,0,222,255,154,2,12,0,224,255,154,2,12,0,226,255,154,2,12,0,228,255,154,2,12,1,14,255,154,2,12,1,16,255,154,2,12,1,18,255,154,2,12,1,20,255,154,2,12,1,36,255,113,2,12,1,38,255,113,2,12,1,42,255,215,2,12,1,44,255,215,2,12,1,46,255,215,2,12,1,48,255,215,2,12,1,50,255,215,2,12,1,52,255,215,2,12,1,54,255,133,2,12,1,56,255,133,2,12,1,58,255,133,2,12,1,71,255,154,2,12,1,102,255,174,2,12,1,109,255,174,2,12,1,113,255,113,2,12,1,114,255,133,2,12,1,115,255,154,2,12,1,117,255,133,2,12,1,120,255,133,2,12,1,133,255,215,2,12,1,157,255,113,2,12,1,159,255,154,2,12,1,166,255,113,2,12,1,184,255,154,2,12,1,187,255,154,2,12,1,188,255,113,2,12,1,190,255,174,2,12,1,193,255,92,2,12,1,196,255,113,2,12,1,220,255,154,2,12,1,225,255,133,2,12,1,228,255,154,2,12,1,250,255,133,2,12,1,252,255,133,2,12,1,254,255,133,2,12,2,0,255,133,2,12,2,84,255,133,2,12,2,95,255,154,2,12,2,97,255,215,2,12,2,108,255,154,2,12,2,124,255,92,2,12,2,126,255,154,2,12,2,128,255,133,2,12,2,130,255,133,2,12,2,132,255,154,2,12,2,134,255,154,2,12,2,136,255,154,2,12,2,138,255,154,2,12,2,140,255,154,2,12,2,169,255,113,2,12,2,170,255,154,2,12,2,177,255,154,2,12,2,179,255,154,2,12,2,181,255,113,2,12,2,182,255,154,2,12,2,183,255,133,2,12,2,185,255,133,2,12,2,189,255,113,2,12,2,190,255,154,2,12,2,191,255,92,2,12,2,192,255,133,2,12,2,193,255,92,2,12,2,194,255,133,2,12,2,197,255,133,2,12,2,199,255,133,2,12,2,212,255,92,2,12,2,213,255,133,2,12,2,239,255,154,2,12,2,241,255,154,2,12,2,243,255,154,2,12,2,253,255,92,2,12,2,254,255,133,2,12,3,13,255,133,2,12,3,14,255,154,2,12,3,15,255,133,2,12,3,16,255,154,2,12,3,21,255,154,2,12,3,23,255,113,2,12,3,24,255,154,2,12,3,73,255,154,2,12,3,75,255,154,2,12,3,77,255,154,2,12,3,79,255,154,2,12,3,81,255,154,2,12,3,83,255,154,2,12,3,85,255,154,2,12,3,87,255,154,2,12,3,89,255,154,2,12,3,91,255,154,2,12,3,93,255,154,2,12,3,95,255,154,2,12,3,97,255,215,2,12,3,99,255,215,2,12,3,101,255,215,2,12,3,103,255,215,2,12,3,105,255,215,2,12,3,107,255,215,2,12,3,109,255,215,2,12,3,111,255,133,2,12,3,113,255,133,2,12,3,115,255,133,2,12,3,143,255,113,2,33,1,113,255,215,2,33,1,114,255,236,2,33,1,120,255,236,2,33,2,84,255,236,2,83,0,15,255,195,2,83,0,17,255,195,2,83,2,8,255,195,2,83,2,12,255,195,2,84,0,15,255,133,2,84,0,17,255,133,2,84,1,86,255,133,2,84,1,95,255,133,2,84,1,98,255,133,2,84,1,102,255,215,2,84,1,105,255,133,2,84,1,109,255,215,2,84,1,115,255,195,2,84,1,118,255,236,2,84,1,121,255,154,2,84,1,122,255,174,2,84,1,123,255,195,2,84,1,124,255,195,2,84,1,125,255,195,2,84,1,126,255,154,2,84,1,129,255,195,2,84,1,130,255,174,2,84,1,132,255,195,2,84,1,134,255,195,2,84,1,135,255,195,2,84,1,137,255,195,2,84,1,140,255,154,2,84,1,142,255,154,2,84,1,143,255,154,2,84,1,144,255,154,2,84,1,146,255,195,2,84,1,147,255,154,2,84,1,149,255,195,2,84,1,150,255,195,2,84,1,152,255,195,2,84,1,153,255,154,2,84,1,154,255,195,2,84,1,155,255,195,2,84,2,8,255,133,2,84,2,12,255,133,2,84,2,33,255,236,2,88,0,5,255,113,2,88,0,10,255,113,2,88,0,38,255,215,2,88,0,42,255,215,2,88,0,45,1,10,2,88,0,50,255,215,2,88,0,52,255,215,2,88,0,55,255,113,2,88,0,57,255,174,2,88,0,58,255,174,2,88,0,60,255,133,2,88,0,137,255,215,2,88,0,148,255,215,2,88,0,149,255,215,2,88,0,150,255,215,2,88,0,151,255,215,2,88,0,152,255,215,2,88,0,154,255,215,2,88,0,159,255,133,2,88,0,200,255,215,2,88,0,202,255,215,2,88,0,204,255,215,2,88,0,206,255,215,2,88,0,222,255,215,2,88,0,224,255,215,2,88,0,226,255,215,2,88,0,228,255,215,2,88,1,14,255,215,2,88,1,16,255,215,2,88,1,18,255,215,2,88,1,20,255,215,2,88,1,36,255,113,2,88,1,38,255,113,2,88,1,54,255,174,2,88,1,56,255,133,2,88,1,58,255,133,2,88,1,71,255,215,2,88,1,250,255,174,2,88,1,252,255,174,2,88,1,254,255,174,2,88,2,0,255,133,2,88,2,7,255,113,2,88,2,11,255,113,2,88,2,95,255,215,2,88,3,73,255,215,2,88,3,75,255,215,2,88,3,77,255,215,2,88,3,79,255,215,2,88,3,81,255,215,2,88,3,83,255,215,2,88,3,85,255,215,2,88,3,87,255,215,2,88,3,89,255,215,2,88,3,91,255,215,2,88,3,93,255,215,2,88,3,95,255,215,2,88,3,111,255,133,2,88,3,113,255,133,2,88,3,115,255,133,2,88,3,143,255,113,2,89,0,5,255,236,2,89,0,10,255,236,2,89,2,7,255,236,2,89,2,11,255,236,2,90,0,15,255,174,2,90,0,17,255,174,2,90,1,86,255,215,2,90,1,95,255,215,2,90,1,98,255,215,2,90,1,100,255,236,2,90,1,105,255,215,2,90,1,112,255,236,2,90,1,113,255,195,2,90,1,114,255,236,2,90,1,116,255,215,2,90,1,117,255,236,2,90,1,120,255,236,2,90,1,136,255,236,2,90,2,8,255,174,2,90,2,12,255,174,2,90,2,84,255,236,2,96,0,73,0,82,2,96,0,87,0,82,2,96,0,89,0,102,2,96,0,90,0,102,2,96,0,91,0,102,2,96,0,92,0,102,2,96,0,191,0,102,2,96,1,37,0,82,2,96,1,39,0,82,2,96,1,55,0,102,2,96,1,251,0,102,2,96,1,253,0,102,2,96,2,52,0,82,2,96,2,53,0,82,2,96,2,93,0,82,2,96,2,94,0,82,2,96,3,112,0,102,2,96,3,141,0,82,2,96,3,144,0,82,2,98,0,73,0,102,2,98,0,87,0,102,2,98,0,89,0,102,2,98,0,90,0,102,2,98,0,91,0,102,2,98,0,92,0,102,2,98,0,191,0,102,2,98,1,37,0,102,2,98,1,39,0,102,2,98,1,55,0,102,2,98,1,251,0,102,2,98,1,253,0,102,2,98,2,52,0,102,2,98,2,53,0,102,2,98,2,93,0,102,2,98,2,94,0,102,2,98,3,112,0,102,2,98,3,141,0,102,2,98,3,144,0,102,2,106,0,5,255,236,2,106,0,10,255,236,2,106,2,7,255,236,2,106,2,11,255,236,2,108,0,15,255,174,2,108,0,17,255,174,2,108,1,157,255,236,2,108,1,164,255,215,2,108,1,166,255,236,2,108,1,168,255,215,2,108,1,170,255,215,2,108,1,174,255,215,2,108,1,176,255,215,2,108,1,177,255,236,2,108,1,181,255,215,2,108,1,188,255,195,2,108,1,189,255,215,2,108,1,191,255,215,2,108,1,193,255,215,2,108,1,196,255,236,2,108,1,199,255,236,2,108,1,206,255,236,2,108,1,213,255,236,2,108,1,242,255,236,2,108,2,8,255,174,2,108,2,12,255,174,2,108,2,114,255,215,2,108,2,115,255,236,2,108,2,122,255,236,2,108,2,124,255,215,2,108,2,128,255,236,2,108,2,130,255,236,2,108,2,159,255,215,2,108,2,161,255,236,2,108,2,169,255,236,2,108,2,181,255,195,2,108,2,183,255,236,2,108,2,185,255,236,2,108,2,187,255,215,2,108,2,189,255,236,2,108,2,191,255,215,2,108,2,193,255,215,2,108,2,202,255,215,2,108,2,206,255,215,2,108,2,207,255,236,2,108,2,212,255,215,2,108,2,217,255,215,2,108,2,219,255,215,2,108,2,221,255,215,2,108,2,229,255,215,2,108,2,231,255,236,2,108,2,245,255,236,2,108,2,247,255,215,2,108,2,249,255,215,2,108,2,251,255,215,2,108,2,253,255,215,2,108,3,5,255,215,2,108,3,7,255,215,2,108,3,13,255,215,2,108,3,15,255,215,2,108,3,17,255,215,2,108,3,18,255,236,2,108,3,23,255,236,2,108,3,27,255,215,2,108,3,28,255,236,2,109,0,15,255,174,2,109,0,17,255,174,2,109,1,206,255,215,2,109,1,213,255,215,2,109,1,242,255,215,2,109,2,8,255,174,2,109,2,12,255,174,2,109,2,115,255,215,2,109,2,207,255,215,2,109,3,18,255,215,2,109,3,28,255,215,2,110,0,5,255,174,2,110,0,10,255,174,2,110,1,157,255,215,2,110,1,166,255,215,2,110,1,188,255,174,2,110,1,193,255,174,2,110,1,196,255,215,2,110,1,220,255,215,2,110,1,228,255,215,2,110,2,7,255,174,2,110,2,11,255,174,2,110,2,124,255,174,2,110,2,128,255,195,2,110,2,130,255,195,2,110,2,169,255,215,2,110,2,170,255,215,2,110,2,181,255,174,2,110,2,182,255,215,2,110,2,183,255,195,2,110,2,185,255,195,2,110,2,189,255,215,2,110,2,190,255,215,2,110,2,191,255,174,2,110,2,193,255,174,2,110,2,212,255,174,2,110,2,253,255,174,2,110,3,13,255,154,2,110,3,15,255,154,2,110,3,23,255,215,2,110,3,24,255,215,2,111,0,5,255,133,2,111,0,10,255,133,2,111,1,208,255,215,2,111,1,220,255,154,2,111,1,221,255,195,2,111,1,223,255,215,2,111,1,225,255,174,2,111,1,228,255,154,2,111,1,246,255,195,2,111,2,7,255,133,2,111,2,11,255,133,2,111,2,109,255,215,2,111,2,129,255,215,2,111,2,131,255,215,2,111,2,139,255,215,2,111,2,160,255,215,2,111,2,170,255,154,2,111,2,182,255,154,2,111,2,184,255,195,2,111,2,186,255,195,2,111,2,188,255,215,2,111,2,190,255,154,2,111,2,192,255,174,2,111,2,194,255,174,2,111,2,198,255,215,2,111,2,200,255,215,2,111,2,203,255,215,2,111,2,213,255,174,2,111,2,230,255,215,2,111,2,234,255,215,2,111,2,248,255,195,2,111,2,250,255,195,2,111,2,252,255,195,2,111,2,254,255,174,2,111,3,6,255,215,2,111,3,8,255,215,2,111,3,14,255,154,2,111,3,16,255,154,2,111,3,24,255,154,2,112,1,159,255,215,2,112,1,184,255,215,2,112,1,187,255,215,2,112,1,190,255,215,2,112,1,225,255,215,2,112,2,108,255,215,2,112,2,126,255,215,2,112,2,132,255,215,2,112,2,134,255,215,2,112,2,136,255,215,2,112,2,138,255,215,2,112,2,140,255,215,2,112,2,177,255,215,2,112,2,179,255,215,2,112,2,192,255,215,2,112,2,194,255,215,2,112,2,197,255,215,2,112,2,199,255,215,2,112,2,213,255,215,2,112,2,239,255,215,2,112,2,241,255,215,2,112,2,243,255,215,2,112,2,254,255,215,2,112,3,9,255,215,2,112,3,11,255,215,2,112,3,14,255,215,2,112,3,16,255,215,2,112,3,21,255,215,2,114,0,5,255,113,2,114,0,10,255,113,2,114,1,157,255,154,2,114,1,166,255,154,2,114,1,188,255,113,2,114,1,190,255,215,2,114,1,193,255,154,2,114,1,196,255,154,2,114,1,220,255,215,2,114,1,225,255,215,2,114,1,228,255,215,2,114,2,7,255,113,2,114,2,11,255,113,2,114,2,110,255,215,2,114,2,124,255,154,2,114,2,128,255,174,2,114,2,130,255,174,2,114,2,151,255,215,2,114,2,155,255,215,2,114,2,167,255,215,2,114,2,169,255,154,2,114,2,170,255,215,2,114,2,181,255,113,2,114,2,182,255,215,2,114,2,183,255,133,2,114,2,185,255,133,2,114,2,189,255,154,2,114,2,190,255,215,2,114,2,191,255,154,2,114,2,192,255,215,2,114,2,193,255,154,2,114,2,194,255,215,2,114,2,197,255,154,2,114,2,199,255,154,2,114,2,212,255,154,2,114,2,213,255,215,2,114,2,225,255,215,2,114,2,227,255,215,2,114,2,253,255,154,2,114,2,254,255,215,2,114,3,3,255,215,2,114,3,13,255,113,2,114,3,14,255,215,2,114,3,15,255,113,2,114,3,16,255,215,2,114,3,23,255,154,2,114,3,24,255,215,2,115,0,5,255,113,2,115,0,10,255,113,2,115,1,207,255,215,2,115,1,216,255,215,2,115,1,219,255,215,2,115,1,220,255,154,2,115,1,221,255,195,2,115,1,222,255,215,2,115,1,225,255,195,2,115,1,228,255,154,2,115,1,234,255,215,2,115,1,237,255,215,2,115,1,246,255,195,2,115,2,7,255,113,2,115,2,11,255,113,2,115,2,106,255,215,2,115,2,109,255,215,2,115,2,125,255,236,2,115,2,127,255,215,2,115,2,129,255,215,2,115,2,131,255,215,2,115,2,133,255,215,2,115,2,135,255,215,2,115,2,137,255,215,2,115,2,139,255,215,2,115,2,141,255,215,2,115,2,170,255,154,2,115,2,178,255,215,2,115,2,180,255,215,2,115,2,182,255,154,2,115,2,184,255,215,2,115,2,186,255,215,2,115,2,190,255,154,2,115,2,192,255,195,2,115,2,194,255,195,2,115,2,198,255,215,2,115,2,200,255,215,2,115,2,213,255,195,2,115,2,224,255,215,2,115,2,240,255,215,2,115,2,242,255,215,2,115,2,244,255,215,2,115,2,248,255,195,2,115,2,250,255,195,2,115,2,252,255,195,2,115,2,254,255,195,2,115,3,10,255,215,2,115,3,12,255,215,2,115,3,14,255,133,2,115,3,16,255,133,2,115,3,22,255,215,2,115,3,24,255,154,2,115,3,26,255,215,2,116,0,5,255,113,2,116,0,10,255,113,2,116,1,157,255,154,2,116,1,166,255,154,2,116,1,188,255,113,2,116,1,190,255,215,2,116,1,193,255,154,2,116,1,196,255,154,2,116,1,220,255,215,2,116,1,225,255,215,2,116,1,228,255,215,2,116,2,7,255,113,2,116,2,11,255,113,2,116,2,110,255,215,2,116,2,124,255,154,2,116,2,128,255,174,2,116,2,130,255,174,2,116,2,151,255,215,2,116,2,155,255,215,2,116,2,167,255,215,2,116,2,169,255,154,2,116,2,170,255,215,2,116,2,181,255,113,2,116,2,182,255,215,2,116,2,183,255,133,2,116,2,185,255,133,2,116,2,189,255,154,2,116,2,190,255,215,2,116,2,191,255,154,2,116,2,192,255,215,2,116,2,193,255,154,2,116,2,194,255,215,2,116,2,197,255,154,2,116,2,199,255,154,2,116,2,212,255,154,2,116,2,213,255,215,2,116,2,225,255,215,2,116,2,227,255,215,2,116,2,253,255,154,2,116,2,254,255,215,2,116,3,3,255,215,2,116,3,13,255,113,2,116,3,14,255,215,2,116,3,15,255,113,2,116,3,16,255,215,2,116,3,23,255,154,2,116,3,24,255,215,2,117,0,5,255,113,2,117,0,10,255,113,2,117,1,207,255,215,2,117,1,216,255,215,2,117,1,219,255,215,2,117,1,220,255,154,2,117,1,221,255,195,2,117,1,222,255,215,2,117,1,225,255,195,2,117,1,228,255,154,2,117,1,234,255,215,2,117,1,237,255,215,2,117,1,246,255,195,2,117,2,7,255,113,2,117,2,11,255,113,2,117,2,106,255,215,2,117,2,109,255,215,2,117,2,125,255,236,2,117,2,127,255,215,2,117,2,129,255,215,2,117,2,131,255,215,2,117,2,133,255,215,2,117,2,135,255,215,2,117,2,137,255,215,2,117,2,139,255,215,2,117,2,141,255,215,2,117,2,170,255,154,2,117,2,178,255,215,2,117,2,180,255,215,2,117,2,182,255,154,2,117,2,184,255,215,2,117,2,186,255,215,2,117,2,190,255,154,2,117,2,192,255,195,2,117,2,194,255,195,2,117,2,198,255,215,2,117,2,200,255,215,2,117,2,213,255,195,2,117,2,224,255,215,2,117,2,240,255,215,2,117,2,242,255,215,2,117,2,244,255,215,2,117,2,248,255,195,2,117,2,250,255,195,2,117,2,252,255,195,2,117,2,254,255,195,2,117,3,10,255,215,2,117,3,12,255,215,2,117,3,14,255,133,2,117,3,16,255,133,2,117,3,22,255,215,2,117,3,24,255,154,2,117,3,26,255,215,2,118,3,13,255,236,2,118,3,15,255,236,2,120,3,13,255,236,2,120,3,15,255,236,2,122,0,15,255,174,2,122,0,17,255,174,2,122,2,8,255,174,2,122,2,12,255,174,2,122,2,128,255,236,2,122,2,130,255,236,2,122,2,183,255,236,2,122,2,185,255,236,2,122,3,13,255,215,2,122,3,15,255,215,2,124,0,15,255,113,2,124,0,17,255,113,2,124,1,164,255,195,2,124,1,170,255,174,2,124,1,174,255,195,2,124,1,181,255,195,2,124,1,206,255,215,2,124,1,213,255,215,2,124,1,242,255,215,2,124,2,8,255,113,2,124,2,12,255,113,2,124,2,114,255,174,2,124,2,115,255,215,2,124,2,206,255,195,2,124,2,207,255,215,2,124,2,217,255,174,2,124,2,219,255,174,2,124,2,221,255,174,2,124,3,9,255,174,2,124,3,11,255,174,2,124,3,17,255,195,2,124,3,18,255,215,2,124,3,27,255,195,2,124,3,28,255,215,2,125,0,5,255,236,2,125,0,10,255,236,2,125,1,208,255,215,2,125,1,220,255,236,2,125,1,221,255,236,2,125,1,223,255,215,2,125,1,225,255,236,2,125,1,228,255,236,2,125,1,246,255,236,2,125,2,7,255,236,2,125,2,11,255,236,2,125,2,160,255,215,2,125,2,170,255,236,2,125,2,182,255,236,2,125,2,188,255,215,2,125,2,190,255,236,2,125,2,192,255,236,2,125,2,194,255,236,2,125,2,203,255,215,2,125,2,213,255,236,2,125,2,230,255,215,2,125,2,248,255,236,2,125,2,250,255,236,2,125,2,252,255,236,2,125,2,254,255,236,2,125,3,6,255,215,2,125,3,8,255,215,2,125,3,14,255,236,2,125,3,16,255,236,2,125,3,24,255,236,2,126,0,15,255,174,2,126,0,17,255,174,2,126,1,157,255,236,2,126,1,164,255,215,2,126,1,166,255,236,2,126,1,168,255,215,2,126,1,170,255,215,2,126,1,174,255,215,2,126,1,176,255,215,2,126,1,177,255,236,2,126,1,181,255,215,2,126,1,188,255,195,2,126,1,189,255,215,2,126,1,191,255,215,2,126,1,193,255,215,2,126,1,196,255,236,2,126,1,199,255,236,2,126,1,206,255,236,2,126,1,213,255,236,2,126,1,242,255,236,2,126,2,8,255,174,2,126,2,12,255,174,2,126,2,114,255,215,2,126,2,115,255,236,2,126,2,122,255,236,2,126,2,124,255,215,2,126,2,128,255,236,2,126,2,130,255,236,2,126,2,159,255,215,2,126,2,161,255,236,2,126,2,169,255,236,2,126,2,181,255,195,2,126,2,183,255,236,2,126,2,185,255,236,2,126,2,187,255,215,2,126,2,189,255,236,2,126,2,191,255,215,2,126,2,193,255,215,2,126,2,202,255,215,2,126,2,206,255,215,2,126,2,207,255,236,2,126,2,212,255,215,2,126,2,217,255,215,2,126,2,219,255,215,2,126,2,221,255,215,2,126,2,229,255,215,2,126,2,231,255,236,2,126,2,245,255,236,2,126,2,247,255,215,2,126,2,249,255,215,2,126,2,251,255,215,2,126,2,253,255,215,2,126,3,5,255,215,2,126,3,7,255,215,2,126,3,13,255,215,2,126,3,15,255,215,2,126,3,17,255,215,2,126,3,18,255,236,2,126,3,23,255,236,2,126,3,27,255,215,2,126,3,28,255,236,2,127,0,5,255,236,2,127,0,10,255,236,2,127,1,208,255,215,2,127,1,220,255,236,2,127,1,221,255,236,2,127,1,223,255,215,2,127,1,225,255,236,2,127,1,228,255,236,2,127,1,246,255,236,2,127,2,7,255,236,2,127,2,11,255,236,2,127,2,160,255,215,2,127,2,170,255,236,2,127,2,182,255,236,2,127,2,188,255,215,2,127,2,190,255,236,2,127,2,192,255,236,2,127,2,194,255,236,2,127,2,203,255,215,2,127,2,213,255,236,2,127,2,230,255,215,2,127,2,248,255,236,2,127,2,250,255,236,2,127,2,252,255,236,2,127,2,254,255,236,2,127,3,6,255,215,2,127,3,8,255,215,2,127,3,14,255,236,2,127,3,16,255,236,2,127,3,24,255,236,2,128,0,15,255,133,2,128,0,17,255,133,2,128,1,159,255,236,2,128,1,164,255,154,2,128,1,170,255,113,2,128,1,174,255,154,2,128,1,181,255,154,2,128,1,184,255,236,2,128,1,187,255,236,2,128,1,190,255,195,2,128,1,201,255,236,2,128,1,206,255,174,2,128,1,207,255,215,2,128,1,213,255,174,2,128,1,216,255,215,2,128,1,219,255,215,2,128,1,222,255,215,2,128,1,225,255,215,2,128,1,234,255,215,2,128,1,235,0,102,2,128,1,237,255,215,2,128,1,238,255,236,2,128,1,242,255,174,2,128,1,244,0,102,2,128,2,8,255,133,2,128,2,12,255,133,2,128,2,106,255,215,2,128,2,108,255,236,2,128,2,114,255,113,2,128,2,115,255,174,2,128,2,126,255,236,2,128,2,127,255,215,2,128,2,132,255,236,2,128,2,133,255,215,2,128,2,134,255,236,2,128,2,135,255,215,2,128,2,136,255,236,2,128,2,137,255,215,2,128,2,138,255,236,2,128,2,140,255,236,2,128,2,141,255,215,2,128,2,152,0,102,2,128,2,168,0,102,2,128,2,177,255,236,2,128,2,178,255,215,2,128,2,179,255,236,2,128,2,180,255,215,2,128,2,192,255,215,2,128,2,194,255,215,2,128,2,197,255,215,2,128,2,198,255,195,2,128,2,199,255,215,2,128,2,200,255,195,2,128,2,206,255,154,2,128,2,207,255,174,2,128,2,213,255,215,2,128,2,217,255,113,2,128,2,219,255,113,2,128,2,221,255,113,2,128,2,224,255,215,2,128,2,239,255,236,2,128,2,240,255,215,2,128,2,241,255,236,2,128,2,242,255,215,2,128,2,243,255,236,2,128,2,244,255,215,2,128,2,254,255,215,2,128,3,9,255,113,2,128,3,10,255,215,2,128,3,11,255,113,2,128,3,12,255,215,2,128,3,17,255,154,2,128,3,18,255,174,2,128,3,21,255,236,2,128,3,22,255,215,2,128,3,26,255,215,2,128,3,27,255,154,2,128,3,28,255,174,2,129,0,15,255,174,2,129,0,17,255,174,2,129,1,206,255,215,2,129,1,213,255,215,2,129,1,242,255,215,2,129,2,8,255,174,2,129,2,12,255,174,2,129,2,115,255,215,2,129,2,207,255,215,2,129,3,18,255,215,2,129,3,28,255,215,2,130,0,15,255,133,2,130,0,17,255,133,2,130,1,159,255,236,2,130,1,164,255,154,2,130,1,170,255,113,2,130,1,174,255,154,2,130,1,181,255,154,2,130,1,184,255,236,2,130,1,187,255,236,2,130,1,190,255,195,2,130,1,201,255,236,2,130,1,206,255,174,2,130,1,207,255,215,2,130,1,213,255,174,2,130,1,216,255,215,2,130,1,219,255,215,2,130,1,222,255,215,2,130,1,225,255,215,2,130,1,234,255,215,2,130,1,235,0,102,2,130,1,237,255,215,2,130,1,238,255,236,2,130,1,242,255,174,2,130,1,244,0,102,2,130,2,8,255,133,2,130,2,12,255,133,2,130,2,106,255,215,2,130,2,108,255,236,2,130,2,114,255,113,2,130,2,115,255,174,2,130,2,126,255,236,2,130,2,127,255,215,2,130,2,132,255,236,2,130,2,133,255,215,2,130,2,134,255,236,2,130,2,135,255,215,2,130,2,136,255,236,2,130,2,137,255,215,2,130,2,138,255,236,2,130,2,140,255,236,2,130,2,141,255,215,2,130,2,152,0,102,2,130,2,168,0,102,2,130,2,177,255,236,2,130,2,178,255,215,2,130,2,179,255,236,2,130,2,180,255,215,2,130,2,192,255,215,2,130,2,194,255,215,2,130,2,197,255,215,2,130,2,198,255,195,2,130,2,199,255,215,2,130,2,200,255,195,2,130,2,206,255,154,2,130,2,207,255,174,2,130,2,213,255,215,2,130,2,217,255,113,2,130,2,219,255,113,2,130,2,221,255,113,2,130,2,224,255,215,2,130,2,239,255,236,2,130,2,240,255,215,2,130,2,241,255,236,2,130,2,242,255,215,2,130,2,243,255,236,2,130,2,244,255,215,2,130,2,254,255,215,2,130,3,9,255,113,2,130,3,10,255,215,2,130,3,11,255,113,2,130,3,12,255,215,2,130,3,17,255,154,2,130,3,18,255,174,2,130,3,21,255,236,2,130,3,22,255,215,2,130,3,26,255,215,2,130,3,27,255,154,2,130,3,28,255,174,2,131,0,15,255,174,2,131,0,17,255,174,2,131,1,206,255,215,2,131,1,213,255,215,2,131,1,242,255,215,2,131,2,8,255,174,2,131,2,12,255,174,2,131,2,115,255,215,2,131,2,207,255,215,2,131,3,18,255,215,2,131,3,28,255,215,2,132,0,15,255,174,2,132,0,17,255,174,2,132,1,206,255,215,2,132,1,213,255,215,2,132,1,242,255,215,2,132,2,8,255,174,2,132,2,12,255,174,2,132,2,115,255,215,2,132,2,207,255,215,2,132,3,18,255,215,2,132,3,28,255,215,2,133,0,15,255,174,2,133,0,17,255,174,2,133,1,206,255,215,2,133,1,213,255,215,2,133,1,242,255,215,2,133,2,8,255,174,2,133,2,12,255,174,2,133,2,115,255,215,2,133,2,207,255,215,2,133,3,18,255,215,2,133,3,28,255,215,2,134,0,15,255,174,2,134,0,17,255,174,2,134,1,157,255,236,2,134,1,164,255,215,2,134,1,166,255,236,2,134,1,168,255,215,2,134,1,170,255,215,2,134,1,174,255,215,2,134,1,176,255,215,2,134,1,177,255,236,2,134,1,181,255,215,2,134,1,188,255,195,2,134,1,189,255,215,2,134,1,191,255,215,2,134,1,193,255,215,2,134,1,196,255,236,2,134,1,199,255,236,2,134,1,206,255,236,2,134,1,213,255,236,2,134,1,242,255,236,2,134,2,8,255,174,2,134,2,12,255,174,2,134,2,114,255,215,2,134,2,115,255,236,2,134,2,122,255,236,2,134,2,124,255,215,2,134,2,128,255,236,2,134,2,130,255,236,2,134,2,159,255,215,2,134,2,161,255,236,2,134,2,169,255,236,2,134,2,181,255,195,2,134,2,183,255,236,2,134,2,185,255,236,2,134,2,187,255,215,2,134,2,189,255,236,2,134,2,191,255,215,2,134,2,193,255,215,2,134,2,202,255,215,2,134,2,206,255,215,2,134,2,207,255,236,2,134,2,212,255,215,2,134,2,217,255,215,2,134,2,219,255,215,2,134,2,221,255,215,2,134,2,229,255,215,2,134,2,231,255,236,2,134,2,245,255,236,2,134,2,247,255,215,2,134,2,249,255,215,2,134,2,251,255,215,2,134,2,253,255,215,2,134,3,5,255,215,2,134,3,7,255,215,2,134,3,13,255,215,2,134,3,15,255,215,2,134,3,17,255,215,2,134,3,18,255,236,2,134,3,23,255,236,2,134,3,27,255,215,2,134,3,28,255,236,2,135,0,5,255,236,2,135,0,10,255,236,2,135,1,208,255,215,2,135,1,220,255,236,2,135,1,221,255,236,2,135,1,223,255,215,2,135,1,225,255,236,2,135,1,228,255,236,2,135,1,246,255,236,2,135,2,7,255,236,2,135,2,11,255,236,2,135,2,160,255,215,2,135,2,170,255,236,2,135,2,182,255,236,2,135,2,188,255,215,2,135,2,190,255,236,2,135,2,192,255,236,2,135,2,194,255,236,2,135,2,203,255,215,2,135,2,213,255,236,2,135,2,230,255,215,2,135,2,248,255,236,2,135,2,250,255,236,2,135,2,252,255,236,2,135,2,254,255,236,2,135,3,6,255,215,2,135,3,8,255,215,2,135,3,14,255,236,2,135,3,16,255,236,2,135,3,24,255,236,2,136,0,15,255,174,2,136,0,17,255,174,2,136,1,157,255,236,2,136,1,164,255,215,2,136,1,166,255,236,2,136,1,168,255,215,2,136,1,170,255,215,2,136,1,174,255,215,2,136,1,176,255,215,2,136,1,177,255,236,2,136,1,181,255,215,2,136,1,188,255,195,2,136,1,189,255,215,2,136,1,191,255,215,2,136,1,193,255,215,2,136,1,196,255,236,2,136,1,199,255,236,2,136,1,206,255,236,2,136,1,213,255,236,2,136,1,242,255,236,2,136,2,8,255,174,2,136,2,12,255,174,2,136,2,114,255,215,2,136,2,115,255,236,2,136,2,122,255,236,2,136,2,124,255,215,2,136,2,128,255,236,2,136,2,130,255,236,2,136,2,159,255,215,2,136,2,161,255,236,2,136,2,169,255,236,2,136,2,181,255,195,2,136,2,183,255,236,2,136,2,185,255,236,2,136,2,187,255,215,2,136,2,189,255,236,2,136,2,191,255,215,2,136,2,193,255,215,2,136,2,202,255,215,2,136,2,206,255,215,2,136,2,207,255,236,2,136,2,212,255,215,2,136,2,217,255,215,2,136,2,219,255,215,2,136,2,221,255,215,2,136,2,229,255,215,2,136,2,231,255,236,2,136,2,245,255,236,2,136,2,247,255,215,2,136,2,249,255,215,2,136,2,251,255,215,2,136,2,253,255,215,2,136,3,5,255,215,2,136,3,7,255,215,2,136,3,13,255,215,2,136,3,15,255,215,2,136,3,17,255,215,2,136,3,18,255,236,2,136,3,23,255,236,2,136,3,27,255,215,2,136,3,28,255,236,2,137,0,5,255,236,2,137,0,10,255,236,2,137,1,208,255,215,2,137,1,220,255,236,2,137,1,221,255,236,2,137,1,223,255,215,2,137,1,225,255,236,2,137,1,228,255,236,2,137,1,246,255,236,2,137,2,7,255,236,2,137,2,11,255,236,2,137,2,160,255,215,2,137,2,170,255,236,2,137,2,182,255,236,2,137,2,188,255,215,2,137,2,190,255,236,2,137,2,192,255,236,2,137,2,194,255,236,2,137,2,203,255,215,2,137,2,213,255,236,2,137,2,230,255,215,2,137,2,248,255,236,2,137,2,250,255,236,2,137,2,252,255,236,2,137,2,254,255,236,2,137,3,6,255,215,2,137,3,8,255,215,2,137,3,14,255,236,2,137,3,16,255,236,2,137,3,24,255,236,2,138,0,15,255,174,2,138,0,17,255,174,2,138,1,157,255,236,2,138,1,164,255,215,2,138,1,166,255,236,2,138,1,168,255,215,2,138,1,170,255,215,2,138,1,174,255,215,2,138,1,176,255,215,2,138,1,177,255,236,2,138,1,181,255,215,2,138,1,188,255,195,2,138,1,189,255,215,2,138,1,191,255,215,2,138,1,193,255,215,2,138,1,196,255,236,2,138,1,199,255,236,2,138,1,206,255,236,2,138,1,213,255,236,2,138,1,242,255,236,2,138,2,8,255,174,2,138,2,12,255,174,2,138,2,114,255,215,2,138,2,115,255,236,2,138,2,122,255,236,2,138,2,124,255,215,2,138,2,128,255,236,2,138,2,130,255,236,2,138,2,159,255,215,2,138,2,161,255,236,2,138,2,169,255,236,2,138,2,181,255,195,2,138,2,183,255,236,2,138,2,185,255,236,2,138,2,187,255,215,2,138,2,189,255,236,2,138,2,191,255,215,2,138,2,193,255,215,2,138,2,202,255,215,2,138,2,206,255,215,2,138,2,207,255,236,2,138,2,212,255,215,2,138,2,217,255,215,2,138,2,219,255,215,2,138,2,221,255,215,2,138,2,229,255,215,2,138,2,231,255,236,2,138,2,245,255,236,2,138,2,247,255,215,2,138,2,249,255,215,2,138,2,251,255,215,2,138,2,253,255,215,2,138,3,5,255,215,2,138,3,7,255,215,2,138,3,13,255,215,2,138,3,15,255,215,2,138,3,17,255,215,2,138,3,18,255,236,2,138,3,23,255,236,2,138,3,27,255,215,2,138,3,28,255,236,2,139,0,15,255,174,2,139,0,17,255,174,2,139,1,206,255,215,2,139,1,213,255,215,2,139,1,242,255,215,2,139,2,8,255,174,2,139,2,12,255,174,2,139,2,115,255,215,2,139,2,207,255,215,2,139,3,18,255,215,2,139,3,28,255,215,2,140,1,159,255,215,2,140,1,184,255,215,2,140,1,187,255,215,2,140,1,190,255,215,2,140,1,225,255,215,2,140,2,108,255,215,2,140,2,126,255,215,2,140,2,132,255,215,2,140,2,134,255,215,2,140,2,136,255,215,2,140,2,138,255,215,2,140,2,140,255,215,2,140,2,177,255,215,2,140,2,179,255,215,2,140,2,192,255,215,2,140,2,194,255,215,2,140,2,197,255,215,2,140,2,199,255,215,2,140,2,213,255,215,2,140,2,239,255,215,2,140,2,241,255,215,2,140,2,243,255,215,2,140,2,254,255,215,2,140,3,9,255,215,2,140,3,11,255,215,2,140,3,14,255,215,2,140,3,16,255,215,2,140,3,21,255,215,2,149,1,163,0,225,2,149,2,234,0,41,2,149,3,14,255,215,2,149,3,16,255,215,2,150,0,5,255,236,2,150,0,10,255,236,2,150,2,7,255,236,2,150,2,11,255,236,2,151,0,5,255,174,2,151,0,10,255,174,2,151,1,157,255,215,2,151,1,166,255,215,2,151,1,188,255,174,2,151,1,193,255,174,2,151,1,196,255,215,2,151,1,220,255,215,2,151,1,228,255,215,2,151,2,7,255,174,2,151,2,11,255,174,2,151,2,124,255,174,2,151,2,128,255,195,2,151,2,130,255,195,2,151,2,169,255,215,2,151,2,170,255,215,2,151,2,181,255,174,2,151,2,182,255,215,2,151,2,183,255,195,2,151,2,185,255,195,2,151,2,189,255,215,2,151,2,190,255,215,2,151,2,191,255,174,2,151,2,193,255,174,2,151,2,212,255,174,2,151,2,253,255,174,2,151,3,13,255,154,2,151,3,15,255,154,2,151,3,23,255,215,2,151,3,24,255,215,2,152,0,5,255,133,2,152,0,10,255,133,2,152,1,208,255,215,2,152,1,220,255,154,2,152,1,221,255,195,2,152,1,223,255,215,2,152,1,225,255,174,2,152,1,228,255,154,2,152,1,246,255,195,2,152,2,7,255,133,2,152,2,11,255,133,2,152,2,109,255,215,2,152,2,129,255,215,2,152,2,131,255,215,2,152,2,139,255,215,2,152,2,160,255,215,2,152,2,170,255,154,2,152,2,182,255,154,2,152,2,184,255,195,2,152,2,186,255,195,2,152,2,188,255,215,2,152,2,190,255,154,2,152,2,192,255,174,2,152,2,194,255,174,2,152,2,198,255,215,2,152,2,200,255,215,2,152,2,203,255,215,2,152,2,213,255,174,2,152,2,230,255,215,2,152,2,234,255,215,2,152,2,248,255,195,2,152,2,250,255,195,2,152,2,252,255,195,2,152,2,254,255,174,2,152,3,6,255,215,2,152,3,8,255,215,2,152,3,14,255,154,2,152,3,16,255,154,2,152,3,24,255,154,2,153,0,15,254,246,2,153,0,17,254,246,2,153,1,164,255,133,2,153,1,170,255,154,2,153,1,174,255,133,2,153,1,176,255,215,2,153,1,181,255,133,2,153,1,191,255,215,2,153,1,206,255,154,2,153,1,213,255,154,2,153,1,242,255,154,2,153,2,8,254,246,2,153,2,12,254,246,2,153,2,114,255,154,2,153,2,115,255,154,2,153,2,118,255,236,2,153,2,159,255,215,2,153,2,187,255,215,2,153,2,202,255,215,2,153,2,206,255,133,2,153,2,207,255,154,2,153,2,217,255,154,2,153,2,219,255,154,2,153,2,221,255,154,2,153,2,229,255,215,2,153,3,5,255,215,2,153,3,7,255,215,2,153,3,9,255,174,2,153,3,11,255,174,2,153,3,17,255,133,2,153,3,18,255,154,2,153,3,27,255,133,2,153,3,28,255,154,2,154,0,5,255,236,2,154,0,10,255,236,2,154,1,208,255,215,2,154,1,220,255,236,2,154,1,221,255,236,2,154,1,223,255,215,2,154,1,225,255,236,2,154,1,228,255,236,2,154,1,246,255,236,2,154,2,7,255,236,2,154,2,11,255,236,2,154,2,160,255,215,2,154,2,170,255,236,2,154,2,182,255,236,2,154,2,188,255,215,2,154,2,190,255,236,2,154,2,192,255,236,2,154,2,194,255,236,2,154,2,203,255,215,2,154,2,213,255,236,2,154,2,230,255,215,2,154,2,248,255,236,2,154,2,250,255,236,2,154,2,252,255,236,2,154,2,254,255,236,2,154,3,6,255,215,2,154,3,8,255,215,2,154,3,14,255,236,2,154,3,16,255,236,2,154,3,24,255,236,2,155,0,15,255,154,2,155,0,16,255,215,2,155,0,17,255,154,2,155,1,157,0,41,2,155,1,159,255,215,2,155,1,164,255,174,2,155,1,166,0,41,2,155,1,170,255,133,2,155,1,174,255,174,2,155,1,181,255,174,2,155,1,184,255,215,2,155,1,187,255,215,2,155,1,188,0,41,2,155,1,190,255,195,2,155,1,196,0,41,2,155,1,204,255,195,2,155,1,205,255,195,2,155,1,206,255,154,2,155,1,207,255,174,2,155,1,208,255,215,2,155,1,209,255,215,2,155,1,210,255,195,2,155,1,211,255,195,2,155,1,212,255,195,2,155,1,213,255,154,2,155,1,214,255,195,2,155,1,215,255,195,2,155,1,216,255,174,2,155,1,217,255,195,2,155,1,218,255,195,2,155,1,219,255,174,2,155,1,222,255,174,2,155,1,223,255,215,2,155,1,224,255,195,2,155,1,225,255,154,2,155,1,226,255,195,2,155,1,227,255,195,2,155,1,229,255,195,2,155,1,230,255,195,2,155,1,231,255,215,2,155,1,232,255,195,2,155,1,234,255,174,2,155,1,235,0,41,2,155,1,236,255,195,2,155,1,237,255,174,2,155,1,238,255,195,2,155,1,242,255,154,2,155,1,243,255,195,2,155,1,244,0,41,2,155,1,245,255,195,2,155,1,247,255,195,2,155,1,249,255,195,2,155,2,2,255,215,2,155,2,3,255,215,2,155,2,4,255,215,2,155,2,8,255,154,2,155,2,12,255,154,2,155,2,106,255,174,2,155,2,107,255,195,2,155,2,108,255,215,2,155,2,113,255,195,2,155,2,114,255,133,2,155,2,115,255,154,2,155,2,117,255,195,2,155,2,119,255,215,2,155,2,121,255,195,2,155,2,125,255,195,2,155,2,126,255,215,2,155,2,127,255,174,2,155,2,132,255,215,2,155,2,133,255,174,2,155,2,134,255,215,2,155,2,135,255,174,2,155,2,136,255,215,2,155,2,137,255,174,2,155,2,138,255,215,2,155,2,140,255,215,2,155,2,141,255,174,2,155,2,150,255,195,2,155,2,152,0,41,2,155,2,154,255,195,2,155,2,158,255,195,2,155,2,160,255,215,2,155,2,162,255,215,2,155,2,164,255,195,2,155,2,166,255,195,2,155,2,168,0,41,2,155,2,169,0,41,2,155,2,172,255,195,2,155,2,174,255,195,2,155,2,176,255,195,2,155,2,177,255,215,2,155,2,178,255,174,2,155,2,179,255,215,2,155,2,180,255,174,2,155,2,181,0,41,2,155,2,188,255,215,2,155,2,189,0,41,2,155,2,192,255,154,2,155,2,194,255,154,2,155,2,196,255,195,2,155,2,197,255,215,2,155,2,198,255,195,2,155,2,199,255,215,2,155,2,200,255,195,2,155,2,203,255,215,2,155,2,205,255,195,2,155,2,206,255,174,2,155,2,207,255,154,2,155,2,209,255,195,2,155,2,211,255,195,2,155,2,213,255,154,2,155,2,215,255,195,2,155,2,217,255,133,2,155,2,219,255,133,2,155,2,221,255,133,2,155,2,224,255,174,2,155,2,230,255,215,2,155,2,232,255,215,2,155,2,236,255,195,2,155,2,238,255,195,2,155,2,239,255,215,2,155,2,240,255,174,2,155,2,241,255,215,2,155,2,242,255,174,2,155,2,243,255,215,2,155,2,244,255,174,2,155,2,246,255,215,2,155,2,254,255,154,2,155,3,0,255,195,2,155,3,2,255,195,2,155,3,6,255,215,2,155,3,8,255,215,2,155,3,9,255,154,2,155,3,10,255,174,2,155,3,11,255,154,2,155,3,12,255,174,2,155,3,14,255,215,2,155,3,16,255,215,2,155,3,17,255,174,2,155,3,18,255,154,2,155,3,20,255,195,2,155,3,21,255,215,2,155,3,22,255,174,2,155,3,23,0,41,2,155,3,26,255,174,2,155,3,27,255,174,2,155,3,28,255,154,2,156,0,15,255,195,2,156,0,17,255,195,2,156,1,206,255,195,2,156,1,207,255,215,2,156,1,213,255,195,2,156,1,216,255,215,2,156,1,219,255,215,2,156,1,222,255,215,2,156,1,234,255,215,2,156,1,237,255,215,2,156,1,242,255,195,2,156,2,8,255,195,2,156,2,12,255,195,2,156,2,106,255,215,2,156,2,115,255,195,2,156,2,127,255,215,2,156,2,133,255,215,2,156,2,135,255,215,2,156,2,137,255,215,2,156,2,141,255,215,2,156,2,178,255,215,2,156,2,180,255,215,2,156,2,207,255,195,2,156,2,224,255,215,2,156,2,240,255,215,2,156,2,242,255,215,2,156,2,244,255,215,2,156,3,10,255,215,2,156,3,12,255,215,2,156,3,18,255,195,2,156,3,22,255,215,2,156,3,26,255,215,2,156,3,28,255,195,2,157,0,5,255,195,2,157,0,10,255,195,2,157,1,157,255,195,2,157,1,163,0,102,2,157,1,166,255,195,2,157,1,188,255,195,2,157,1,193,255,174,2,157,1,196,255,195,2,157,1,220,255,215,2,157,1,225,255,215,2,157,1,228,255,215,2,157,2,7,255,195,2,157,2,11,255,195,2,157,2,124,255,174,2,157,2,128,255,195,2,157,2,130,255,195,2,157,2,169,255,195,2,157,2,170,255,215,2,157,2,181,255,195,2,157,2,182,255,215,2,157,2,183,255,215,2,157,2,185,255,215,2,157,2,189,255,195,2,157,2,190,255,215,2,157,2,191,255,174,2,157,2,192,255,215,2,157,2,193,255,174,2,157,2,194,255,215,2,157,2,212,255,174,2,157,2,213,255,215,2,157,2,253,255,174,2,157,2,254,255,215,2,157,3,13,255,215,2,157,3,14,255,195,2,157,3,15,255,215,2,157,3,16,255,195,2,157,3,23,255,195,2,157,3,24,255,215,2,158,0,5,255,195,2,158,0,10,255,195,2,158,2,7,255,195,2,158,2,11,255,195,2,158,3,14,255,215,2,158,3,16,255,215,2,159,1,159,255,215,2,159,1,163,0,225,2,159,1,184,255,215,2,159,1,187,255,215,2,159,1,190,255,195,2,159,1,220,255,215,2,159,1,225,255,174,2,159,1,228,255,215,2,159,2,108,255,215,2,159,2,123,0,61,2,159,2,125,255,236,2,159,2,126,255,215,2,159,2,132,255,215,2,159,2,134,255,215,2,159,2,136,255,215,2,159,2,138,255,215,2,159,2,140,255,215,2,159,2,170,255,215,2,159,2,177,255,215,2,159,2,179,255,215,2,159,2,182,255,215,2,159,2,190,255,215,2,159,2,192,255,174,2,159,2,194,255,174,2,159,2,197,255,195,2,159,2,198,255,215,2,159,2,199,255,195,2,159,2,200,255,215,2,159,2,213,255,174,2,159,2,239,255,215,2,159,2,241,255,215,2,159,2,243,255,215,2,159,2,254,255,174,2,159,3,14,255,215,2,159,3,16,255,215,2,159,3,21,255,215,2,159,3,24,255,215,2,160,1,207,255,236,2,160,1,216,255,236,2,160,1,219,255,236,2,160,1,222,255,236,2,160,1,225,255,236,2,160,1,234,255,236,2,160,1,237,255,236,2,160,2,106,255,236,2,160,2,127,255,236,2,160,2,133,255,236,2,160,2,135,255,236,2,160,2,137,255,236,2,160,2,141,255,236,2,160,2,178,255,236,2,160,2,180,255,236,2,160,2,192,255,236,2,160,2,194,255,236,2,160,2,213,255,236,2,160,2,224,255,236,2,160,2,240,255,236,2,160,2,242,255,236,2,160,2,244,255,236,2,160,2,254,255,236,2,160,3,10,255,236,2,160,3,12,255,236,2,160,3,14,255,215,2,160,3,16,255,215,2,160,3,22,255,236,2,160,3,26,255,236,2,161,0,15,255,174,2,161,0,17,255,174,2,161,2,8,255,174,2,161,2,12,255,174,2,161,2,128,255,236,2,161,2,130,255,236,2,161,2,183,255,236,2,161,2,185,255,236,2,161,3,13,255,215,2,161,3,15,255,215,2,162,1,233,0,41,2,163,1,159,255,215,2,163,1,163,0,225,2,163,1,184,255,215,2,163,1,187,255,215,2,163,1,190,255,195,2,163,1,220,255,215,2,163,1,225,255,174,2,163,1,228,255,215,2,163,2,108,255,215,2,163,2,123,0,61,2,163,2,125,255,236,2,163,2,126,255,215,2,163,2,132,255,215,2,163,2,134,255,215,2,163,2,136,255,215,2,163,2,138,255,215,2,163,2,140,255,215,2,163,2,170,255,215,2,163,2,177,255,215,2,163,2,179,255,215,2,163,2,182,255,215,2,163,2,190,255,215,2,163,2,192,255,174,2,163,2,194,255,174,2,163,2,197,255,195,2,163,2,198,255,215,2,163,2,199,255,195,2,163,2,200,255,215,2,163,2,213,255,174,2,163,2,239,255,215,2,163,2,241,255,215,2,163,2,243,255,215,2,163,2,254,255,174,2,163,3,14,255,215,2,163,3,16,255,215,2,163,3,21,255,215,2,163,3,24,255,215,2,164,1,207,255,236,2,164,1,216,255,236,2,164,1,219,255,236,2,164,1,222,255,236,2,164,1,225,255,236,2,164,1,234,255,236,2,164,1,237,255,236,2,164,2,106,255,236,2,164,2,127,255,236,2,164,2,133,255,236,2,164,2,135,255,236,2,164,2,137,255,236,2,164,2,141,255,236,2,164,2,178,255,236,2,164,2,180,255,236,2,164,2,192,255,236,2,164,2,194,255,236,2,164,2,213,255,236,2,164,2,224,255,236,2,164,2,240,255,236,2,164,2,242,255,236,2,164,2,244,255,236,2,164,2,254,255,236,2,164,3,10,255,236,2,164,3,12,255,236,2,164,3,14,255,215,2,164,3,16,255,215,2,164,3,22,255,236,2,164,3,26,255,236,2,165,1,159,255,215,2,165,1,184,255,215,2,165,1,187,255,215,2,165,1,190,255,215,2,165,1,193,255,215,2,165,1,225,255,215,2,165,2,108,255,215,2,165,2,124,255,215,2,165,2,126,255,215,2,165,2,132,255,215,2,165,2,134,255,215,2,165,2,136,255,215,2,165,2,138,255,215,2,165,2,140,255,215,2,165,2,177,255,215,2,165,2,179,255,215,2,165,2,191,255,215,2,165,2,192,255,215,2,165,2,193,255,215,2,165,2,194,255,215,2,165,2,197,255,154,2,165,2,199,255,154,2,165,2,212,255,215,2,165,2,213,255,215,2,165,2,239,255,215,2,165,2,241,255,215,2,165,2,243,255,215,2,165,2,253,255,215,2,165,2,254,255,215,2,165,3,9,255,215,2,165,3,11,255,215,2,165,3,14,255,215,2,165,3,16,255,215,2,165,3,21,255,215,2,165,3,25,255,236,2,166,1,207,255,215,2,166,1,216,255,215,2,166,1,219,255,215,2,166,1,222,255,215,2,166,1,225,255,215,2,166,1,234,255,215,2,166,1,237,255,215,2,166,2,106,255,215,2,166,2,127,255,215,2,166,2,133,255,215,2,166,2,135,255,215,2,166,2,137,255,215,2,166,2,141,255,215,2,166,2,178,255,215,2,166,2,180,255,215,2,166,2,192,255,215,2,166,2,194,255,215,2,166,2,198,255,215,2,166,2,200,255,215,2,166,2,213,255,215,2,166,2,224,255,215,2,166,2,240,255,215,2,166,2,242,255,215,2,166,2,244,255,215,2,166,2,254,255,215,2,166,3,10,255,215,2,166,3,12,255,215,2,166,3,22,255,215,2,166,3,26,255,215,2,167,1,159,255,215,2,167,1,184,255,215,2,167,1,187,255,215,2,167,1,190,255,215,2,167,1,193,255,215,2,167,1,225,255,215,2,167,2,108,255,215,2,167,2,124,255,215,2,167,2,126,255,215,2,167,2,132,255,215,2,167,2,134,255,215,2,167,2,136,255,215,2,167,2,138,255,215,2,167,2,140,255,215,2,167,2,177,255,215,2,167,2,179,255,215,2,167,2,191,255,215,2,167,2,192,255,215,2,167,2,193,255,215,2,167,2,194,255,215,2,167,2,197,255,154,2,167,2,199,255,154,2,167,2,212,255,215,2,167,2,213,255,215,2,167,2,239,255,215,2,167,2,241,255,215,2,167,2,243,255,215,2,167,2,253,255,215,2,167,2,254,255,215,2,167,3,9,255,215,2,167,3,11,255,215,2,167,3,14,255,215,2,167,3,16,255,215,2,167,3,21,255,215,2,167,3,25,255,236,2,168,1,207,255,215,2,168,1,216,255,215,2,168,1,219,255,215,2,168,1,222,255,215,2,168,1,225,255,215,2,168,1,234,255,215,2,168,1,237,255,215,2,168,2,106,255,215,2,168,2,127,255,215,2,168,2,133,255,215,2,168,2,135,255,215,2,168,2,137,255,215,2,168,2,141,255,215,2,168,2,178,255,215,2,168,2,180,255,215,2,168,2,192,255,215,2,168,2,194,255,215,2,168,2,198,255,215,2,168,2,200,255,215,2,168,2,213,255,215,2,168,2,224,255,215,2,168,2,240,255,215,2,168,2,242,255,215,2,168,2,244,255,215,2,168,2,254,255,215,2,168,3,10,255,215,2,168,3,12,255,215,2,168,3,22,255,215,2,168,3,26,255,215,2,169,1,159,255,215,2,169,1,184,255,215,2,169,1,187,255,215,2,169,1,190,255,215,2,169,1,193,255,215,2,169,1,225,255,215,2,169,2,108,255,215,2,169,2,124,255,215,2,169,2,126,255,215,2,169,2,132,255,215,2,169,2,134,255,215,2,169,2,136,255,215,2,169,2,138,255,215,2,169,2,140,255,215,2,169,2,177,255,215,2,169,2,179,255,215,2,169,2,191,255,215,2,169,2,192,255,215,2,169,2,193,255,215,2,169,2,194,255,215,2,169,2,197,255,154,2,169,2,199,255,154,2,169,2,212,255,215,2,169,2,213,255,215,2,169,2,239,255,215,2,169,2,241,255,215,2,169,2,243,255,215,2,169,2,253,255,215,2,169,2,254,255,215,2,169,3,9,255,215,2,169,3,11,255,215,2,169,3,14,255,215,2,169,3,16,255,215,2,169,3,21,255,215,2,169,3,25,255,236,2,170,1,207,255,215,2,170,1,216,255,215,2,170,1,219,255,215,2,170,1,222,255,215,2,170,1,225,255,215,2,170,1,234,255,215,2,170,1,237,255,215,2,170,2,106,255,215,2,170,2,127,255,215,2,170,2,133,255,215,2,170,2,135,255,215,2,170,2,137,255,215,2,170,2,141,255,215,2,170,2,178,255,215,2,170,2,180,255,215,2,170,2,192,255,215,2,170,2,194,255,215,2,170,2,198,255,215,2,170,2,200,255,215,2,170,2,213,255,215,2,170,2,224,255,215,2,170,2,240,255,215,2,170,2,242,255,215,2,170,2,244,255,215,2,170,2,254,255,215,2,170,3,10,255,215,2,170,3,12,255,215,2,170,3,22,255,215,2,170,3,26,255,215,2,171,1,163,0,225,2,171,2,234,0,41,2,171,3,14,255,215,2,171,3,16,255,215,2,172,0,5,255,236,2,172,0,10,255,236,2,172,2,7,255,236,2,172,2,11,255,236,2,173,0,15,255,154,2,173,0,16,255,215,2,173,0,17,255,154,2,173,1,157,0,41,2,173,1,159,255,215,2,173,1,164,255,174,2,173,1,166,0,41,2,173,1,170,255,133,2,173,1,174,255,174,2,173,1,181,255,174,2,173,1,184,255,215,2,173,1,187,255,215,2,173,1,188,0,41,2,173,1,190,255,195,2,173,1,196,0,41,2,173,1,204,255,195,2,173,1,205,255,195,2,173,1,206,255,154,2,173,1,207,255,174,2,173,1,208,255,215,2,173,1,209,255,215,2,173,1,210,255,195,2,173,1,211,255,195,2,173,1,212,255,195,2,173,1,213,255,154,2,173,1,214,255,195,2,173,1,215,255,195,2,173,1,216,255,174,2,173,1,217,255,195,2,173,1,218,255,195,2,173,1,219,255,174,2,173,1,222,255,174,2,173,1,223,255,215,2,173,1,224,255,195,2,173,1,225,255,154,2,173,1,226,255,195,2,173,1,227,255,195,2,173,1,229,255,195,2,173,1,230,255,195,2,173,1,231,255,215,2,173,1,232,255,195,2,173,1,234,255,174,2,173,1,235,0,41,2,173,1,236,255,195,2,173,1,237,255,174,2,173,1,238,255,195,2,173,1,242,255,154,2,173,1,243,255,195,2,173,1,244,0,41,2,173,1,245,255,195,2,173,1,247,255,195,2,173,1,249,255,195,2,173,2,2,255,215,2,173,2,3,255,215,2,173,2,4,255,215,2,173,2,8,255,154,2,173,2,12,255,154,2,173,2,106,255,174,2,173,2,107,255,195,2,173,2,108,255,215,2,173,2,113,255,195,2,173,2,114,255,133,2,173,2,115,255,154,2,173,2,117,255,195,2,173,2,119,255,215,2,173,2,121,255,195,2,173,2,125,255,195,2,173,2,126,255,215,2,173,2,127,255,174,2,173,2,132,255,215,2,173,2,133,255,174,2,173,2,134,255,215,2,173,2,135,255,174,2,173,2,136,255,215,2,173,2,137,255,174,2,173,2,138,255,215,2,173,2,140,255,215,2,173,2,141,255,174,2,173,2,150,255,195,2,173,2,152,0,41,2,173,2,154,255,195,2,173,2,158,255,195,2,173,2,160,255,215,2,173,2,162,255,215,2,173,2,164,255,195,2,173,2,166,255,195,2,173,2,168,0,41,2,173,2,169,0,41,2,173,2,172,255,195,2,173,2,174,255,195,2,173,2,176,255,195,2,173,2,177,255,215,2,173,2,178,255,174,2,173,2,179,255,215,2,173,2,180,255,174,2,173,2,181,0,41,2,173,2,188,255,215,2,173,2,189,0,41,2,173,2,192,255,154,2,173,2,194,255,154,2,173,2,196,255,195,2,173,2,197,255,215,2,173,2,198,255,195,2,173,2,199,255,215,2,173,2,200,255,195,2,173,2,203,255,215,2,173,2,205,255,195,2,173,2,206,255,174,2,173,2,207,255,154,2,173,2,209,255,195,2,173,2,211,255,195,2,173,2,213,255,154,2,173,2,215,255,195,2,173,2,217,255,133,2,173,2,219,255,133,2,173,2,221,255,133,2,173,2,224,255,174,2,173,2,230,255,215,2,173,2,232,255,215,2,173,2,236,255,195,2,173,2,238,255,195,2,173,2,239,255,215,2,173,2,240,255,174,2,173,2,241,255,215,2,173,2,242,255,174,2,173,2,243,255,215,2,173,2,244,255,174,2,173,2,246,255,215,2,173,2,254,255,154,2,173,3,0,255,195,2,173,3,2,255,195,2,173,3,6,255,215,2,173,3,8,255,215,2,173,3,9,255,154,2,173,3,10,255,174,2,173,3,11,255,154,2,173,3,12,255,174,2,173,3,14,255,215,2,173,3,16,255,215,2,173,3,17,255,174,2,173,3,18,255,154,2,173,3,20,255,195,2,173,3,21,255,215,2,173,3,22,255,174,2,173,3,23,0,41,2,173,3,26,255,174,2,173,3,27,255,174,2,173,3,28,255,154,2,174,0,15,255,154,2,174,0,16,255,215,2,174,0,17,255,154,2,174,1,206,255,195,2,174,1,207,255,236,2,174,1,213,255,195,2,174,1,216,255,236,2,174,1,219,255,236,2,174,1,222,255,236,2,174,1,234,255,236,2,174,1,237,255,236,2,174,1,242,255,195,2,174,2,2,255,215,2,174,2,3,255,215,2,174,2,4,255,215,2,174,2,8,255,154,2,174,2,12,255,154,2,174,2,106,255,236,2,174,2,115,255,195,2,174,2,127,255,236,2,174,2,133,255,236,2,174,2,135,255,236,2,174,2,137,255,236,2,174,2,141,255,236,2,174,2,178,255,236,2,174,2,180,255,236,2,174,2,207,255,195,2,174,2,224,255,236,2,174,2,240,255,236,2,174,2,242,255,236,2,174,2,244,255,236,2,174,3,10,255,236,2,174,3,12,255,236,2,174,3,18,255,195,2,174,3,22,255,236,2,174,3,26,255,236,2,174,3,28,255,195,2,175,0,5,255,92,2,175,0,10,255,92,2,175,1,157,255,154,2,175,1,163,0,102,2,175,1,166,255,154,2,175,1,188,255,72,2,175,1,193,255,133,2,175,1,196,255,154,2,175,1,220,255,174,2,175,1,225,255,215,2,175,1,228,255,174,2,175,2,7,255,92,2,175,2,11,255,92,2,175,2,124,255,133,2,175,2,128,255,113,2,175,2,130,255,113,2,175,2,169,255,154,2,175,2,170,255,174,2,175,2,181,255,72,2,175,2,182,255,174,2,175,2,183,255,154,2,175,2,185,255,154,2,175,2,189,255,154,2,175,2,190,255,174,2,175,2,191,255,133,2,175,2,192,255,215,2,175,2,193,255,133,2,175,2,194,255,215,2,175,2,197,255,195,2,175,2,198,255,215,2,175,2,199,255,195,2,175,2,200,255,215,2,175,2,212,255,133,2,175,2,213,255,215,2,175,2,253,255,133,2,175,2,254,255,215,2,175,3,13,255,72,2,175,3,14,255,174,2,175,3,15,255,72,2,175,3,16,255,174,2,175,3,23,255,154,2,175,3,24,255,174,2,176,0,5,255,113,2,176,0,10,255,113,2,176,1,220,255,154,2,176,1,225,255,215,2,176,1,228,255,154,2,176,2,7,255,113,2,176,2,11,255,113,2,176,2,109,255,215,2,176,2,129,255,215,2,176,2,131,255,215,2,176,2,139,255,215,2,176,2,170,255,154,2,176,2,182,255,154,2,176,2,184,255,215,2,176,2,186,255,215,2,176,2,190,255,154,2,176,2,192,255,215,2,176,2,194,255,215,2,176,2,198,255,215,2,176,2,200,255,215,2,176,2,213,255,215,2,176,2,254,255,215,2,176,3,14,255,113,2,176,3,16,255,113,2,176,3,24,255,154,2,177,1,157,255,215,2,177,1,166,255,215,2,177,1,188,255,195,2,177,1,196,255,215,2,177,2,128,255,236,2,177,2,130,255,236,2,177,2,169,255,215,2,177,2,181,255,195,2,177,2,183,255,236,2,177,2,185,255,236,2,177,2,189,255,215,2,177,3,13,255,215,2,177,3,15,255,215,2,177,3,23,255,215,2,178,0,5,255,236,2,178,0,10,255,236,2,178,1,208,255,215,2,178,1,220,255,236,2,178,1,221,255,236,2,178,1,223,255,215,2,178,1,225,255,236,2,178,1,228,255,236,2,178,1,246,255,236,2,178,2,7,255,236,2,178,2,11,255,236,2,178,2,160,255,215,2,178,2,170,255,236,2,178,2,182,255,236,2,178,2,188,255,215,2,178,2,190,255,236,2,178,2,192,255,236,2,178,2,194,255,236,2,178,2,203,255,215,2,178,2,213,255,236,2,178,2,230,255,215,2,178,2,248,255,236,2,178,2,250,255,236,2,178,2,252,255,236,2,178,2,254,255,236,2,178,3,6,255,215,2,178,3,8,255,215,2,178,3,14,255,236,2,178,3,16,255,236,2,178,3,24,255,236,2,179,1,159,255,215,2,179,1,184,255,215,2,179,1,187,255,215,2,179,1,190,255,215,2,179,1,225,255,215,2,179,2,108,255,215,2,179,2,126,255,215,2,179,2,132,255,215,2,179,2,134,255,215,2,179,2,136,255,215,2,179,2,138,255,215,2,179,2,140,255,215,2,179,2,177,255,215,2,179,2,179,255,215,2,179,2,192,255,215,2,179,2,194,255,215,2,179,2,197,255,215,2,179,2,199,255,215,2,179,2,213,255,215,2,179,2,239,255,215,2,179,2,241,255,215,2,179,2,243,255,215,2,179,2,254,255,215,2,179,3,9,255,215,2,179,3,11,255,215,2,179,3,14,255,215,2,179,3,16,255,215,2,179,3,21,255,215,2,181,0,15,255,133,2,181,0,16,255,174,2,181,0,17,255,133,2,181,1,159,255,215,2,181,1,164,255,154,2,181,1,170,255,113,2,181,1,174,255,154,2,181,1,181,255,154,2,181,1,184,255,215,2,181,1,187,255,215,2,181,1,188,0,41,2,181,1,190,255,174,2,181,1,204,255,154,2,181,1,205,255,154,2,181,1,206,255,133,2,181,1,207,255,113,2,181,1,208,255,215,2,181,1,209,255,215,2,181,1,210,255,154,2,181,1,211,255,154,2,181,1,212,255,154,2,181,1,213,255,133,2,181,1,214,255,154,2,181,1,215,255,154,2,181,1,216,255,113,2,181,1,217,255,154,2,181,1,218,255,154,2,181,1,219,255,113,2,181,1,220,255,174,2,181,1,221,255,174,2,181,1,222,255,113,2,181,1,223,255,215,2,181,1,224,255,154,2,181,1,225,255,154,2,181,1,226,255,154,2,181,1,227,255,154,2,181,1,228,255,174,2,181,1,229,255,154,2,181,1,230,255,154,2,181,1,231,255,215,2,181,1,232,255,154,2,181,1,233,255,195,2,181,1,234,255,113,2,181,1,236,255,154,2,181,1,237,255,113,2,181,1,238,255,133,2,181,1,242,255,133,2,181,1,243,255,154,2,181,1,245,255,154,2,181,1,246,255,174,2,181,1,247,255,154,2,181,1,249,255,154,2,181,2,2,255,174,2,181,2,3,255,174,2,181,2,4,255,174,2,181,2,8,255,133,2,181,2,12,255,133,2,181,2,106,255,113,2,181,2,107,255,154,2,181,2,108,255,215,2,181,2,109,255,215,2,181,2,113,255,154,2,181,2,114,255,113,2,181,2,115,255,133,2,181,2,117,255,154,2,181,2,119,255,154,2,181,2,121,255,154,2,181,2,125,255,154,2,181,2,126,255,215,2,181,2,127,255,113,2,181,2,129,255,215,2,181,2,131,255,215,2,181,2,132,255,215,2,181,2,133,255,113,2,181,2,134,255,215,2,181,2,135,255,113,2,181,2,136,255,215,2,181,2,137,255,113,2,181,2,138,255,215,2,181,2,139,255,215,2,181,2,140,255,215,2,181,2,141,255,113,2,181,2,150,255,154,2,181,2,154,255,154,2,181,2,158,255,154,2,181,2,160,255,215,2,181,2,162,255,215,2,181,2,164,255,154,2,181,2,166,255,154,2,181,2,170,255,174,2,181,2,172,255,154,2,181,2,174,255,154,2,181,2,176,255,154,2,181,2,177,255,215,2,181,2,178,255,113,2,181,2,179,255,215,2,181,2,180,255,113,2,181,2,181,0,41,2,181,2,182,255,174,2,181,2,184,255,174,2,181,2,186,255,174,2,181,2,188,255,215,2,181,2,190,255,174,2,181,2,192,255,154,2,181,2,194,255,154,2,181,2,196,255,154,2,181,2,197,255,154,2,181,2,198,255,113,2,181,2,199,255,154,2,181,2,200,255,113,2,181,2,203,255,215,2,181,2,205,255,154,2,181,2,206,255,154,2,181,2,207,255,133,2,181,2,209,255,154,2,181,2,211,255,154,2,181,2,213,255,154,2,181,2,215,255,154,2,181,2,217,255,113,2,181,2,219,255,113,2,181,2,221,255,113,2,181,2,224,255,113,2,181,2,230,255,215,2,181,2,232,255,215,2,181,2,234,255,195,2,181,2,236,255,154,2,181,2,238,255,154,2,181,2,239,255,215,2,181,2,240,255,113,2,181,2,241,255,215,2,181,2,242,255,113,2,181,2,243,255,215,2,181,2,244,255,113,2,181,2,246,255,215,2,181,2,248,255,174,2,181,2,250,255,174,2,181,2,252,255,174,2,181,2,254,255,154,2,181,3,0,255,154,2,181,3,2,255,154,2,181,3,6,255,215,2,181,3,8,255,215,2,181,3,9,255,113,2,181,3,10,255,113,2,181,3,11,255,113,2,181,3,12,255,113,2,181,3,14,255,154,2,181,3,16,255,154,2,181,3,17,255,154,2,181,3,18,255,133,2,181,3,20,255,154,2,181,3,21,255,215,2,181,3,22,255,113,2,181,3,24,255,174,2,181,3,26,255,113,2,181,3,27,255,154,2,181,3,28,255,133,2,182,0,15,255,154,2,182,0,16,255,215,2,182,0,17,255,154,2,182,1,206,255,195,2,182,1,207,255,236,2,182,1,213,255,195,2,182,1,216,255,236,2,182,1,219,255,236,2,182,1,222,255,236,2,182,1,234,255,236,2,182,1,237,255,236,2,182,1,242,255,195,2,182,2,2,255,215,2,182,2,3,255,215,2,182,2,4,255,215,2,182,2,8,255,154,2,182,2,12,255,154,2,182,2,106,255,236,2,182,2,115,255,195,2,182,2,127,255,236,2,182,2,133,255,236,2,182,2,135,255,236,2,182,2,137,255,236,2,182,2,141,255,236,2,182,2,178,255,236,2,182,2,180,255,236,2,182,2,207,255,195,2,182,2,224,255,236,2,182,2,240,255,236,2,182,2,242,255,236,2,182,2,244,255,236,2,182,3,10,255,236,2,182,3,12,255,236,2,182,3,18,255,195,2,182,3,22,255,236,2,182,3,26,255,236,2,182,3,28,255,195,2,183,0,15,255,133,2,183,0,17,255,133,2,183,1,159,255,215,2,183,1,164,255,174,2,183,1,170,255,133,2,183,1,174,255,174,2,183,1,181,255,174,2,183,1,184,255,215,2,183,1,187,255,215,2,183,1,190,255,195,2,183,1,202,255,174,2,183,1,204,255,195,2,183,1,205,255,195,2,183,1,206,255,154,2,183,1,207,255,154,2,183,1,210,255,195,2,183,1,211,255,195,2,183,1,212,255,195,2,183,1,213,255,154,2,183,1,214,255,195,2,183,1,215,255,195,2,183,1,216,255,154,2,183,1,217,255,195,2,183,1,218,255,195,2,183,1,219,255,154,2,183,1,222,255,154,2,183,1,224,255,195,2,183,1,225,255,174,2,183,1,226,255,195,2,183,1,227,255,195,2,183,1,229,255,195,2,183,1,230,255,195,2,183,1,232,255,195,2,183,1,233,255,215,2,183,1,234,255,154,2,183,1,235,0,41,2,183,1,236,255,195,2,183,1,237,255,154,2,183,1,238,255,174,2,183,1,242,255,154,2,183,1,243,255,195,2,183,1,244,0,41,2,183,1,245,255,195,2,183,1,247,255,195,2,183,1,249,255,195,2,183,2,8,255,133,2,183,2,12,255,133,2,183,2,106,255,154,2,183,2,107,255,195,2,183,2,108,255,215,2,183,2,113,255,195,2,183,2,114,255,133,2,183,2,115,255,154,2,183,2,117,255,195,2,183,2,119,255,215,2,183,2,121,255,195,2,183,2,125,255,215,2,183,2,126,255,215,2,183,2,127,255,154,2,183,2,132,255,215,2,183,2,133,255,154,2,183,2,134,255,215,2,183,2,135,255,154,2,183,2,136,255,215,2,183,2,137,255,154,2,183,2,138,255,215,2,183,2,140,255,215,2,183,2,141,255,154,2,183,2,150,255,195,2,183,2,152,0,41,2,183,2,154,255,195,2,183,2,158,255,195,2,183,2,164,255,195,2,183,2,166,255,195,2,183,2,168,0,41,2,183,2,172,255,195,2,183,2,174,255,195,2,183,2,176,255,195,2,183,2,177,255,215,2,183,2,178,255,154,2,183,2,179,255,215,2,183,2,180,255,154,2,183,2,192,255,174,2,183,2,194,255,174,2,183,2,196,255,195,2,183,2,198,255,174,2,183,2,200,255,174,2,183,2,205,255,195,2,183,2,206,255,174,2,183,2,207,255,154,2,183,2,209,255,195,2,183,2,211,255,195,2,183,2,213,255,174,2,183,2,215,255,195,2,183,2,217,255,133,2,183,2,218,255,174,2,183,2,219,255,133,2,183,2,220,255,174,2,183,2,221,255,133,2,183,2,222,255,174,2,183,2,224,255,154,2,183,2,225,255,236,2,183,2,226,255,174,2,183,2,227,255,236,2,183,2,228,255,174,2,183,2,236,255,195,2,183,2,238,255,195,2,183,2,239,255,215,2,183,2,240,255,154,2,183,2,241,255,215,2,183,2,242,255,154,2,183,2,243,255,215,2,183,2,244,255,154,2,183,2,254,255,174,2,183,3,0,255,195,2,183,3,2,255,195,2,183,3,9,255,174,2,183,3,10,255,154,2,183,3,11,255,174,2,183,3,12,255,154,2,183,3,14,255,215,2,183,3,16,255,215,2,183,3,17,255,174,2,183,3,18,255,154,2,183,3,20,255,195,2,183,3,21,255,215,2,183,3,22,255,154,2,183,3,25,255,236,2,183,3,26,255,154,2,183,3,27,255,174,2,183,3,28,255,154,2,184,0,15,255,174,2,184,0,17,255,174,2,184,1,206,255,236,2,184,1,213,255,236,2,184,1,242,255,236,2,184,2,8,255,174,2,184,2,12,255,174,2,184,2,115,255,236,2,184,2,207,255,236,2,184,3,18,255,236,2,184,3,28,255,236,2,185,0,15,255,133,2,185,0,17,255,133,2,185,1,159,255,215,2,185,1,164,255,174,2,185,1,170,255,133,2,185,1,174,255,174,2,185,1,181,255,174,2,185,1,184,255,215,2,185,1,187,255,215,2,185,1,190,255,195,2,185,1,202,255,174,2,185,1,204,255,195,2,185,1,205,255,195,2,185,1,206,255,154,2,185,1,207,255,154,2,185,1,210,255,195,2,185,1,211,255,195,2,185,1,212,255,195,2,185,1,213,255,154,2,185,1,214,255,195,2,185,1,215,255,195,2,185,1,216,255,154,2,185,1,217,255,195,2,185,1,218,255,195,2,185,1,219,255,154,2,185,1,222,255,154,2,185,1,224,255,195,2,185,1,225,255,174,2,185,1,226,255,195,2,185,1,227,255,195,2,185,1,229,255,195,2,185,1,230,255,195,2,185,1,232,255,195,2,185,1,233,255,215,2,185,1,234,255,154,2,185,1,235,0,41,2,185,1,236,255,195,2,185,1,237,255,154,2,185,1,238,255,174,2,185,1,242,255,154,2,185,1,243,255,195,2,185,1,244,0,41,2,185,1,245,255,195,2,185,1,247,255,195,2,185,1,249,255,195,2,185,2,8,255,133,2,185,2,12,255,133,2,185,2,106,255,154,2,185,2,107,255,195,2,185,2,108,255,215,2,185,2,113,255,195,2,185,2,114,255,133,2,185,2,115,255,154,2,185,2,117,255,195,2,185,2,119,255,215,2,185,2,121,255,195,2,185,2,125,255,215,2,185,2,126,255,215,2,185,2,127,255,154,2,185,2,132,255,215,2,185,2,133,255,154,2,185,2,134,255,215,2,185,2,135,255,154,2,185,2,136,255,215,2,185,2,137,255,154,2,185,2,138,255,215,2,185,2,140,255,215,2,185,2,141,255,154,2,185,2,150,255,195,2,185,2,152,0,41,2,185,2,154,255,195,2,185,2,158,255,195,2,185,2,164,255,195,2,185,2,166,255,195,2,185,2,168,0,41,2,185,2,172,255,195,2,185,2,174,255,195,2,185,2,176,255,195,2,185,2,177,255,215,2,185,2,178,255,154,2,185,2,179,255,215,2,185,2,180,255,154,2,185,2,192,255,174,2,185,2,194,255,174,2,185,2,196,255,195,2,185,2,198,255,174,2,185,2,200,255,174,2,185,2,205,255,195,2,185,2,206,255,174,2,185,2,207,255,154,2,185,2,209,255,195,2,185,2,211,255,195,2,185,2,213,255,174,2,185,2,215,255,195,2,185,2,217,255,133,2,185,2,218,255,174,2,185,2,219,255,133,2,185,2,220,255,174,2,185,2,221,255,133,2,185,2,222,255,174,2,185,2,224,255,154,2,185,2,225,255,236,2,185,2,226,255,174,2,185,2,227,255,236,2,185,2,228,255,174,2,185,2,236,255,195,2,185,2,238,255,195,2,185,2,239,255,215,2,185,2,240,255,154,2,185,2,241,255,215,2,185,2,242,255,154,2,185,2,243,255,215,2,185,2,244,255,154,2,185,2,254,255,174,2,185,3,0,255,195,2,185,3,2,255,195,2,185,3,9,255,174,2,185,3,10,255,154,2,185,3,11,255,174,2,185,3,12,255,154,2,185,3,14,255,215,2,185,3,16,255,215,2,185,3,17,255,174,2,185,3,18,255,154,2,185,3,20,255,195,2,185,3,21,255,215,2,185,3,22,255,154,2,185,3,25,255,236,2,185,3,26,255,154,2,185,3,27,255,174,2,185,3,28,255,154,2,186,0,15,255,174,2,186,0,17,255,174,2,186,1,206,255,236,2,186,1,213,255,236,2,186,1,242,255,236,2,186,2,8,255,174,2,186,2,12,255,174,2,186,2,115,255,236,2,186,2,207,255,236,2,186,3,18,255,236,2,186,3,28,255,236,2,187,1,159,255,215,2,187,1,163,0,225,2,187,1,184,255,215,2,187,1,187,255,215,2,187,1,190,255,195,2,187,1,220,255,215,2,187,1,225,255,174,2,187,1,228,255,215,2,187,2,108,255,215,2,187,2,123,0,61,2,187,2,125,255,236,2,187,2,126,255,215,2,187,2,132,255,215,2,187,2,134,255,215,2,187,2,136,255,215,2,187,2,138,255,215,2,187,2,140,255,215,2,187,2,170,255,215,2,187,2,177,255,215,2,187,2,179,255,215,2,187,2,182,255,215,2,187,2,190,255,215,2,187,2,192,255,174,2,187,2,194,255,174,2,187,2,197,255,195,2,187,2,198,255,215,2,187,2,199,255,195,2,187,2,200,255,215,2,187,2,213,255,174,2,187,2,239,255,215,2,187,2,241,255,215,2,187,2,243,255,215,2,187,2,254,255,174,2,187,3,14,255,215,2,187,3,16,255,215,2,187,3,21,255,215,2,187,3,24,255,215,2,188,1,207,255,236,2,188,1,216,255,236,2,188,1,219,255,236,2,188,1,222,255,236,2,188,1,225,255,236,2,188,1,234,255,236,2,188,1,237,255,236,2,188,2,106,255,236,2,188,2,127,255,236,2,188,2,133,255,236,2,188,2,135,255,236,2,188,2,137,255,236,2,188,2,141,255,236,2,188,2,178,255,236,2,188,2,180,255,236,2,188,2,192,255,236,2,188,2,194,255,236,2,188,2,213,255,236,2,188,2,224,255,236,2,188,2,240,255,236,2,188,2,242,255,236,2,188,2,244,255,236,2,188,2,254,255,236,2,188,3,10,255,236,2,188,3,12,255,236,2,188,3,14,255,215,2,188,3,16,255,215,2,188,3,22,255,236,2,188,3,26,255,236,2,189,1,163,0,225,2,189,2,234,0,41,2,189,3,14,255,215,2,189,3,16,255,215,2,190,0,5,255,236,2,190,0,10,255,236,2,190,2,7,255,236,2,190,2,11,255,236,2,191,1,163,0,225,2,191,2,234,0,41,2,191,3,14,255,215,2,191,3,16,255,215,2,192,0,5,255,236,2,192,0,10,255,236,2,192,2,7,255,236,2,192,2,11,255,236,2,195,0,5,255,195,2,195,0,10,255,195,2,195,1,157,255,215,2,195,1,166,255,215,2,195,1,188,255,133,2,195,1,193,255,174,2,195,1,196,255,215,2,195,1,220,255,215,2,195,1,221,255,236,2,195,1,225,255,236,2,195,1,228,255,215,2,195,1,246,255,236,2,195,2,7,255,195,2,195,2,11,255,195,2,195,2,124,255,174,2,195,2,128,255,195,2,195,2,130,255,195,2,195,2,169,255,215,2,195,2,170,255,215,2,195,2,181,255,133,2,195,2,182,255,215,2,195,2,183,255,154,2,195,2,185,255,154,2,195,2,189,255,215,2,195,2,190,255,215,2,195,2,191,255,174,2,195,2,192,255,236,2,195,2,193,255,174,2,195,2,194,255,236,2,195,2,212,255,174,2,195,2,213,255,236,2,195,2,248,255,236,2,195,2,250,255,236,2,195,2,252,255,236,2,195,2,253,255,174,2,195,2,254,255,236,2,195,3,13,255,174,2,195,3,14,255,215,2,195,3,15,255,174,2,195,3,16,255,215,2,195,3,23,255,215,2,195,3,24,255,215,2,196,0,5,255,154,2,196,0,10,255,154,2,196,1,220,255,215,2,196,1,221,255,215,2,196,1,228,255,215,2,196,1,246,255,215,2,196,2,7,255,154,2,196,2,11,255,154,2,196,2,170,255,215,2,196,2,182,255,215,2,196,2,184,255,215,2,196,2,186,255,215,2,196,2,190,255,215,2,196,2,248,255,215,2,196,2,250,255,215,2,196,2,252,255,215,2,196,3,14,255,174,2,196,3,16,255,174,2,196,3,24,255,215,2,197,1,188,255,215,2,197,2,128,255,236,2,197,2,130,255,236,2,197,2,181,255,215,2,197,2,183,255,236,2,197,2,185,255,236,2,197,3,13,255,236,2,197,3,15,255,236,2,198,0,5,255,236,2,198,0,10,255,236,2,198,2,7,255,236,2,198,2,11,255,236,2,199,1,188,255,215,2,199,2,128,255,236,2,199,2,130,255,236,2,199,2,181,255,215,2,199,2,183,255,236,2,199,2,185,255,236,2,199,3,13,255,236,2,199,3,15,255,236,2,200,0,5,255,236,2,200,0,10,255,236,2,200,2,7,255,236,2,200,2,11,255,236,2,202,1,159,255,215,2,202,1,184,255,215,2,202,1,187,255,215,2,202,1,190,255,215,2,202,1,193,255,215,2,202,1,225,255,215,2,202,2,108,255,215,2,202,2,124,255,215,2,202,2,126,255,215,2,202,2,132,255,215,2,202,2,134,255,215,2,202,2,136,255,215,2,202,2,138,255,215,2,202,2,140,255,215,2,202,2,177,255,215,2,202,2,179,255,215,2,202,2,191,255,215,2,202,2,192,255,215,2,202,2,193,255,215,2,202,2,194,255,215,2,202,2,197,255,154,2,202,2,199,255,154,2,202,2,212,255,215,2,202,2,213,255,215,2,202,2,239,255,215,2,202,2,241,255,215,2,202,2,243,255,215,2,202,2,253,255,215,2,202,2,254,255,215,2,202,3,9,255,215,2,202,3,11,255,215,2,202,3,14,255,215,2,202,3,16,255,215,2,202,3,21,255,215,2,202,3,25,255,236,2,203,1,207,255,215,2,203,1,216,255,215,2,203,1,219,255,215,2,203,1,222,255,215,2,203,1,225,255,215,2,203,1,234,255,215,2,203,1,237,255,215,2,203,2,106,255,215,2,203,2,127,255,215,2,203,2,133,255,215,2,203,2,135,255,215,2,203,2,137,255,215,2,203,2,141,255,215,2,203,2,178,255,215,2,203,2,180,255,215,2,203,2,192,255,215,2,203,2,194,255,215,2,203,2,198,255,215,2,203,2,200,255,215,2,203,2,213,255,215,2,203,2,224,255,215,2,203,2,240,255,215,2,203,2,242,255,215,2,203,2,244,255,215,2,203,2,254,255,215,2,203,3,10,255,215,2,203,3,12,255,215,2,203,3,22,255,215,2,203,3,26,255,215,2,204,0,5,255,195,2,204,0,10,255,195,2,204,1,163,0,102,2,204,1,188,255,215,2,204,1,190,255,215,2,204,1,193,255,174,2,204,1,220,255,195,2,204,1,225,255,215,2,204,1,228,255,195,2,204,2,7,255,195,2,204,2,11,255,195,2,204,2,109,255,236,2,204,2,124,255,174,2,204,2,128,255,215,2,204,2,129,255,236,2,204,2,130,255,215,2,204,2,131,255,236,2,204,2,139,255,236,2,204,2,170,255,195,2,204,2,181,255,215,2,204,2,182,255,195,2,204,2,183,255,215,2,204,2,184,255,236,2,204,2,185,255,215,2,204,2,186,255,236,2,204,2,190,255,195,2,204,2,191,255,174,2,204,2,192,255,215,2,204,2,193,255,174,2,204,2,194,255,215,2,204,2,197,255,195,2,204,2,198,255,215,2,204,2,199,255,195,2,204,2,200,255,215,2,204,2,212,255,174,2,204,2,213,255,215,2,204,2,253,255,174,2,204,2,254,255,215,2,204,3,13,255,215,2,204,3,14,255,195,2,204,3,15,255,215,2,204,3,16,255,195,2,204,3,24,255,195,2,205,1,225,255,215,2,205,2,192,255,215,2,205,2,194,255,215,2,205,2,213,255,215,2,205,2,254,255,215,2,206,1,163,0,225,2,206,2,234,0,41,2,206,3,14,255,215,2,206,3,16,255,215,2,207,0,5,255,236,2,207,0,10,255,236,2,207,2,7,255,236,2,207,2,11,255,236,2,210,1,163,0,225,2,210,2,234,0,41,2,210,3,14,255,215,2,210,3,16,255,215,2,211,0,5,255,236,2,211,0,10,255,236,2,211,2,7,255,236,2,211,2,11,255,236,2,214,1,163,0,225,2,214,2,234,0,41,2,214,3,14,255,215,2,214,3,16,255,215,2,215,0,5,255,236,2,215,0,10,255,236,2,215,2,7,255,236,2,215,2,11,255,236,2,217,0,5,255,113,2,217,0,10,255,113,2,217,1,157,255,154,2,217,1,166,255,154,2,217,1,188,255,113,2,217,1,190,255,215,2,217,1,193,255,154,2,217,1,196,255,154,2,217,1,220,255,215,2,217,1,225,255,215,2,217,1,228,255,215,2,217,2,7,255,113,2,217,2,11,255,113,2,217,2,110,255,215,2,217,2,124,255,154,2,217,2,128,255,174,2,217,2,130,255,174,2,217,2,151,255,215,2,217,2,155,255,215,2,217,2,167,255,215,2,217,2,169,255,154,2,217,2,170,255,215,2,217,2,181,255,113,2,217,2,182,255,215,2,217,2,183,255,133,2,217,2,185,255,133,2,217,2,189,255,154,2,217,2,190,255,215,2,217,2,191,255,154,2,217,2,192,255,215,2,217,2,193,255,154,2,217,2,194,255,215,2,217,2,197,255,154,2,217,2,199,255,154,2,217,2,212,255,154,2,217,2,213,255,215,2,217,2,225,255,215,2,217,2,227,255,215,2,217,2,253,255,154,2,217,2,254,255,215,2,217,3,3,255,215,2,217,3,13,255,113,2,217,3,14,255,215,2,217,3,15,255,113,2,217,3,16,255,215,2,217,3,23,255,154,2,217,3,24,255,215,2,218,0,5,255,236,2,218,0,10,255,236,2,218,2,7,255,236,2,218,2,11,255,236,2,219,0,5,255,113,2,219,0,10,255,113,2,219,1,157,255,154,2,219,1,166,255,154,2,219,1,188,255,113,2,219,1,190,255,215,2,219,1,193,255,154,2,219,1,196,255,154,2,219,1,220,255,215,2,219,1,225,255,215,2,219,1,228,255,215,2,219,2,7,255,113,2,219,2,11,255,113,2,219,2,110,255,215,2,219,2,124,255,154,2,219,2,128,255,174,2,219,2,130,255,174,2,219,2,151,255,215,2,219,2,155,255,215,2,219,2,167,255,215,2,219,2,169,255,154,2,219,2,170,255,215,2,219,2,181,255,113,2,219,2,182,255,215,2,219,2,183,255,133,2,219,2,185,255,133,2,219,2,189,255,154,2,219,2,190,255,215,2,219,2,191,255,154,2,219,2,192,255,215,2,219,2,193,255,154,2,219,2,194,255,215,2,219,2,197,255,154,2,219,2,199,255,154,2,219,2,212,255,154,2,219,2,213,255,215,2,219,2,225,255,215,2,219,2,227,255,215,2,219,2,253,255,154,2,219,2,254,255,215,2,219,3,3,255,215,2,219,3,13,255,113,2,219,3,14,255,215,2,219,3,15,255,113,2,219,3,16,255,215,2,219,3,23,255,154,2,219,3,24,255,215,2,220,0,5,255,236,2,220,0,10,255,236,2,220,2,7,255,236,2,220,2,11,255,236,2,222,0,5,255,236,2,222,0,10,255,236,2,222,2,7,255,236,2,222,2,11,255,236,2,224,0,5,255,236,2,224,0,10,255,236,2,224,2,7,255,236,2,224,2,11,255,236,2,225,0,15,255,174,2,225,0,17,255,174,2,225,1,157,255,236,2,225,1,164,255,215,2,225,1,166,255,236,2,225,1,168,255,215,2,225,1,170,255,215,2,225,1,174,255,215,2,225,1,176,255,215,2,225,1,177,255,236,2,225,1,181,255,215,2,225,1,188,255,195,2,225,1,189,255,215,2,225,1,191,255,215,2,225,1,193,255,215,2,225,1,196,255,236,2,225,1,199,255,236,2,225,1,206,255,236,2,225,1,213,255,236,2,225,1,242,255,236,2,225,2,8,255,174,2,225,2,12,255,174,2,225,2,114,255,215,2,225,2,115,255,236,2,225,2,122,255,236,2,225,2,124,255,215,2,225,2,128,255,236,2,225,2,130,255,236,2,225,2,159,255,215,2,225,2,161,255,236,2,225,2,169,255,236,2,225,2,181,255,195,2,225,2,183,255,236,2,225,2,185,255,236,2,225,2,187,255,215,2,225,2,189,255,236,2,225,2,191,255,215,2,225,2,193,255,215,2,225,2,202,255,215,2,225,2,206,255,215,2,225,2,207,255,236,2,225,2,212,255,215,2,225,2,217,255,215,2,225,2,219,255,215,2,225,2,221,255,215,2,225,2,229,255,215,2,225,2,231,255,236,2,225,2,245,255,236,2,225,2,247,255,215,2,225,2,249,255,215,2,225,2,251,255,215,2,225,2,253,255,215,2,225,3,5,255,215,2,225,3,7,255,215,2,225,3,13,255,215,2,225,3,15,255,215,2,225,3,17,255,215,2,225,3,18,255,236,2,225,3,23,255,236,2,225,3,27,255,215,2,225,3,28,255,236,2,226,0,5,255,236,2,226,0,10,255,236,2,226,1,208,255,215,2,226,1,220,255,236,2,226,1,221,255,236,2,226,1,223,255,215,2,226,1,225,255,236,2,226,1,228,255,236,2,226,1,246,255,236,2,226,2,7,255,236,2,226,2,11,255,236,2,226,2,160,255,215,2,226,2,170,255,236,2,226,2,182,255,236,2,226,2,188,255,215,2,226,2,190,255,236,2,226,2,192,255,236,2,226,2,194,255,236,2,226,2,203,255,215,2,226,2,213,255,236,2,226,2,230,255,215,2,226,2,248,255,236,2,226,2,250,255,236,2,226,2,252,255,236,2,226,2,254,255,236,2,226,3,6,255,215,2,226,3,8,255,215,2,226,3,14,255,236,2,226,3,16,255,236,2,226,3,24,255,236,2,227,0,15,255,174,2,227,0,17,255,174,2,227,1,157,255,236,2,227,1,164,255,215,2,227,1,166,255,236,2,227,1,168,255,215,2,227,1,170,255,215,2,227,1,174,255,215,2,227,1,176,255,215,2,227,1,177,255,236,2,227,1,181,255,215,2,227,1,188,255,195,2,227,1,189,255,215,2,227,1,191,255,215,2,227,1,193,255,215,2,227,1,196,255,236,2,227,1,199,255,236,2,227,1,206,255,236,2,227,1,213,255,236,2,227,1,242,255,236,2,227,2,8,255,174,2,227,2,12,255,174,2,227,2,114,255,215,2,227,2,115,255,236,2,227,2,122,255,236,2,227,2,124,255,215,2,227,2,128,255,236,2,227,2,130,255,236,2,227,2,159,255,215,2,227,2,161,255,236,2,227,2,169,255,236,2,227,2,181,255,195,2,227,2,183,255,236,2,227,2,185,255,236,2,227,2,187,255,215,2,227,2,189,255,236,2,227,2,191,255,215,2,227,2,193,255,215,2,227,2,202,255,215,2,227,2,206,255,215,2,227,2,207,255,236,2,227,2,212,255,215,2,227,2,217,255,215,2,227,2,219,255,215,2,227,2,221,255,215,2,227,2,229,255,215,2,227,2,231,255,236,2,227,2,245,255,236,2,227,2,247,255,215,2,227,2,249,255,215,2,227,2,251,255,215,2,227,2,253,255,215,2,227,3,5,255,215,2,227,3,7,255,215,2,227,3,13,255,215,2,227,3,15,255,215,2,227,3,17,255,215,2,227,3,18,255,236,2,227,3,23,255,236,2,227,3,27,255,215,2,227,3,28,255,236,2,228,0,5,255,236,2,228,0,10,255,236,2,228,1,208,255,215,2,228,1,220,255,236,2,228,1,221,255,236,2,228,1,223,255,215,2,228,1,225,255,236,2,228,1,228,255,236,2,228,1,246,255,236,2,228,2,7,255,236,2,228,2,11,255,236,2,228,2,160,255,215,2,228,2,170,255,236,2,228,2,182,255,236,2,228,2,188,255,215,2,228,2,190,255,236,2,228,2,192,255,236,2,228,2,194,255,236,2,228,2,203,255,215,2,228,2,213,255,236,2,228,2,230,255,215,2,228,2,248,255,236,2,228,2,250,255,236,2,228,2,252,255,236,2,228,2,254,255,236,2,228,3,6,255,215,2,228,3,8,255,215,2,228,3,14,255,236,2,228,3,16,255,236,2,228,3,24,255,236,2,229,1,159,255,215,2,229,1,184,255,215,2,229,1,187,255,215,2,229,1,190,255,215,2,229,1,193,255,215,2,229,1,225,255,215,2,229,2,108,255,215,2,229,2,124,255,215,2,229,2,126,255,215,2,229,2,132,255,215,2,229,2,134,255,215,2,229,2,136,255,215,2,229,2,138,255,215,2,229,2,140,255,215,2,229,2,177,255,215,2,229,2,179,255,215,2,229,2,191,255,215,2,229,2,192,255,215,2,229,2,193,255,215,2,229,2,194,255,215,2,229,2,197,255,154,2,229,2,199,255,154,2,229,2,212,255,215,2,229,2,213,255,215,2,229,2,239,255,215,2,229,2,241,255,215,2,229,2,243,255,215,2,229,2,253,255,215,2,229,2,254,255,215,2,229,3,9,255,215,2,229,3,11,255,215,2,229,3,14,255,215,2,229,3,16,255,215,2,229,3,21,255,215,2,229,3,25,255,236,2,230,1,207,255,215,2,230,1,216,255,215,2,230,1,219,255,215,2,230,1,222,255,215,2,230,1,225,255,215,2,230,1,234,255,215,2,230,1,237,255,215,2,230,2,106,255,215,2,230,2,127,255,215,2,230,2,133,255,215,2,230,2,135,255,215,2,230,2,137,255,215,2,230,2,141,255,215,2,230,2,178,255,215,2,230,2,180,255,215,2,230,2,192,255,215,2,230,2,194,255,215,2,230,2,198,255,215,2,230,2,200,255,215,2,230,2,213,255,215,2,230,2,224,255,215,2,230,2,240,255,215,2,230,2,242,255,215,2,230,2,244,255,215,2,230,2,254,255,215,2,230,3,10,255,215,2,230,3,12,255,215,2,230,3,22,255,215,2,230,3,26,255,215,2,231,0,15,255,174,2,231,0,17,255,174,2,231,2,8,255,174,2,231,2,12,255,174,2,231,2,128,255,236,2,231,2,130,255,236,2,231,2,183,255,236,2,231,2,185,255,236,2,231,3,13,255,215,2,231,3,15,255,215,2,232,1,233,0,41,2,233,0,5,255,236,2,233,0,10,255,236,2,233,2,7,255,236,2,233,2,11,255,236,2,233,3,14,255,215,2,233,3,16,255,215,2,239,0,15,255,174,2,239,0,17,255,174,2,239,1,157,255,236,2,239,1,164,255,215,2,239,1,166,255,236,2,239,1,168,255,215,2,239,1,170,255,215,2,239,1,174,255,215,2,239,1,176,255,215,2,239,1,177,255,236,2,239,1,181,255,215,2,239,1,188,255,195,2,239,1,189,255,215,2,239,1,191,255,215,2,239,1,193,255,215,2,239,1,196,255,236,2,239,1,199,255,236,2,239,1,206,255,236,2,239,1,213,255,236,2,239,1,242,255,236,2,239,2,8,255,174,2,239,2,12,255,174,2,239,2,114,255,215,2,239,2,115,255,236,2,239,2,122,255,236,2,239,2,124,255,215,2,239,2,128,255,236,2,239,2,130,255,236,2,239,2,159,255,215,2,239,2,161,255,236,2,239,2,169,255,236,2,239,2,181,255,195,2,239,2,183,255,236,2,239,2,185,255,236,2,239,2,187,255,215,2,239,2,189,255,236,2,239,2,191,255,215,2,239,2,193,255,215,2,239,2,202,255,215,2,239,2,206,255,215,2,239,2,207,255,236,2,239,2,212,255,215,2,239,2,217,255,215,2,239,2,219,255,215,2,239,2,221,255,215,2,239,2,229,255,215,2,239,2,231,255,236,2,239,2,245,255,236,2,239,2,247,255,215,2,239,2,249,255,215,2,239,2,251,255,215,2,239,2,253,255,215,2,239,3,5,255,215,2,239,3,7,255,215,2,239,3,13,255,215,2,239,3,15,255,215,2,239,3,17,255,215,2,239,3,18,255,236,2,239,3,23,255,236,2,239,3,27,255,215,2,239,3,28,255,236,2,240,0,5,255,236,2,240,0,10,255,236,2,240,1,208,255,215,2,240,1,220,255,236,2,240,1,221,255,236,2,240,1,223,255,215,2,240,1,225,255,236,2,240,1,228,255,236,2,240,1,246,255,236,2,240,2,7,255,236,2,240,2,11,255,236,2,240,2,160,255,215,2,240,2,170,255,236,2,240,2,182,255,236,2,240,2,188,255,215,2,240,2,190,255,236,2,240,2,192,255,236,2,240,2,194,255,236,2,240,2,203,255,215,2,240,2,213,255,236,2,240,2,230,255,215,2,240,2,248,255,236,2,240,2,250,255,236,2,240,2,252,255,236,2,240,2,254,255,236,2,240,3,6,255,215,2,240,3,8,255,215,2,240,3,14,255,236,2,240,3,16,255,236,2,240,3,24,255,236,2,241,0,15,255,174,2,241,0,17,255,174,2,241,1,157,255,236,2,241,1,164,255,215,2,241,1,166,255,236,2,241,1,168,255,215,2,241,1,170,255,215,2,241,1,174,255,215,2,241,1,176,255,215,2,241,1,177,255,236,2,241,1,181,255,215,2,241,1,188,255,195,2,241,1,189,255,215,2,241,1,191,255,215,2,241,1,193,255,215,2,241,1,196,255,236,2,241,1,199,255,236,2,241,1,206,255,236,2,241,1,213,255,236,2,241,1,242,255,236,2,241,2,8,255,174,2,241,2,12,255,174,2,241,2,114,255,215,2,241,2,115,255,236,2,241,2,122,255,236,2,241,2,124,255,215,2,241,2,128,255,236,2,241,2,130,255,236,2,241,2,159,255,215,2,241,2,161,255,236,2,241,2,169,255,236,2,241,2,181,255,195,2,241,2,183,255,236,2,241,2,185,255,236,2,241,2,187,255,215,2,241,2,189,255,236,2,241,2,191,255,215,2,241,2,193,255,215,2,241,2,202,255,215,2,241,2,206,255,215,2,241,2,207,255,236,2,241,2,212,255,215,2,241,2,217,255,215,2,241,2,219,255,215,2,241,2,221,255,215,2,241,2,229,255,215,2,241,2,231,255,236,2,241,2,245,255,236,2,241,2,247,255,215,2,241,2,249,255,215,2,241,2,251,255,215,2,241,2,253,255,215,2,241,3,5,255,215,2,241,3,7,255,215,2,241,3,13,255,215,2,241,3,15,255,215,2,241,3,17,255,215,2,241,3,18,255,236,2,241,3,23,255,236,2,241,3,27,255,215,2,241,3,28,255,236,2,242,0,5,255,236,2,242,0,10,255,236,2,242,1,208,255,215,2,242,1,220,255,236,2,242,1,221,255,236,2,242,1,223,255,215,2,242,1,225,255,236,2,242,1,228,255,236,2,242,1,246,255,236,2,242,2,7,255,236,2,242,2,11,255,236,2,242,2,160,255,215,2,242,2,170,255,236,2,242,2,182,255,236,2,242,2,188,255,215,2,242,2,190,255,236,2,242,2,192,255,236,2,242,2,194,255,236,2,242,2,203,255,215,2,242,2,213,255,236,2,242,2,230,255,215,2,242,2,248,255,236,2,242,2,250,255,236,2,242,2,252,255,236,2,242,2,254,255,236,2,242,3,6,255,215,2,242,3,8,255,215,2,242,3,14,255,236,2,242,3,16,255,236,2,242,3,24,255,236,2,243,0,15,255,174,2,243,0,17,255,174,2,243,1,157,255,236,2,243,1,164,255,215,2,243,1,166,255,236,2,243,1,168,255,215,2,243,1,170,255,215,2,243,1,174,255,215,2,243,1,176,255,215,2,243,1,177,255,236,2,243,1,181,255,215,2,243,1,188,255,195,2,243,1,189,255,215,2,243,1,191,255,215,2,243,1,193,255,215,2,243,1,196,255,236,2,243,1,199,255,236,2,243,1,206,255,236,2,243,1,213,255,236,2,243,1,242,255,236,2,243,2,8,255,174,2,243,2,12,255,174,2,243,2,114,255,215,2,243,2,115,255,236,2,243,2,122,255,236,2,243,2,124,255,215,2,243,2,128,255,236,2,243,2,130,255,236,2,243,2,159,255,215,2,243,2,161,255,236,2,243,2,169,255,236,2,243,2,181,255,195,2,243,2,183,255,236,2,243,2,185,255,236,2,243,2,187,255,215,2,243,2,189,255,236,2,243,2,191,255,215,2,243,2,193,255,215,2,243,2,202,255,215,2,243,2,206,255,215,2,243,2,207,255,236,2,243,2,212,255,215,2,243,2,217,255,215,2,243,2,219,255,215,2,243,2,221,255,215,2,243,2,229,255,215,2,243,2,231,255,236,2,243,2,245,255,236,2,243,2,247,255,215,2,243,2,249,255,215,2,243,2,251,255,215,2,243,2,253,255,215,2,243,3,5,255,215,2,243,3,7,255,215,2,243,3,13,255,215,2,243,3,15,255,215,2,243,3,17,255,215,2,243,3,18,255,236,2,243,3,23,255,236,2,243,3,27,255,215,2,243,3,28,255,236,2,244,0,5,255,236,2,244,0,10,255,236,2,244,1,208,255,215,2,244,1,220,255,236,2,244,1,221,255,236,2,244,1,223,255,215,2,244,1,225,255,236,2,244,1,228,255,236,2,244,1,246,255,236,2,244,2,7,255,236,2,244,2,11,255,236,2,244,2,160,255,215,2,244,2,170,255,236,2,244,2,182,255,236,2,244,2,188,255,215,2,244,2,190,255,236,2,244,2,192,255,236,2,244,2,194,255,236,2,244,2,203,255,215,2,244,2,213,255,236,2,244,2,230,255,215,2,244,2,248,255,236,2,244,2,250,255,236,2,244,2,252,255,236,2,244,2,254,255,236,2,244,3,6,255,215,2,244,3,8,255,215,2,244,3,14,255,236,2,244,3,16,255,236,2,244,3,24,255,236,2,245,0,15,255,174,2,245,0,17,255,174,2,245,1,157,255,236,2,245,1,164,255,215,2,245,1,166,255,236,2,245,1,168,255,215,2,245,1,170,255,215,2,245,1,174,255,215,2,245,1,176,255,215,2,245,1,177,255,236,2,245,1,181,255,215,2,245,1,188,255,195,2,245,1,189,255,215,2,245,1,191,255,215,2,245,1,193,255,215,2,245,1,196,255,236,2,245,1,199,255,236,2,245,1,206,255,236,2,245,1,213,255,236,2,245,1,242,255,236,2,245,2,8,255,174,2,245,2,12,255,174,2,245,2,114,255,215,2,245,2,115,255,236,2,245,2,122,255,236,2,245,2,124,255,215,2,245,2,128,255,236,2,245,2,130,255,236,2,245,2,159,255,215,2,245,2,161,255,236,2,245,2,169,255,236,2,245,2,181,255,195,2,245,2,183,255,236,2,245,2,185,255,236,2,245,2,187,255,215,2,245,2,189,255,236,2,245,2,191,255,215,2,245,2,193,255,215,2,245,2,202,255,215,2,245,2,206,255,215,2,245,2,207,255,236,2,245,2,212,255,215,2,245,2,217,255,215,2,245,2,219,255,215,2,245,2,221,255,215,2,245,2,229,255,215,2,245,2,231,255,236,2,245,2,245,255,236,2,245,2,247,255,215,2,245,2,249,255,215,2,245,2,251,255,215,2,245,2,253,255,215,2,245,3,5,255,215,2,245,3,7,255,215,2,245,3,13,255,215,2,245,3,15,255,215,2,245,3,17,255,215,2,245,3,18,255,236,2,245,3,23,255,236,2,245,3,27,255,215,2,245,3,28,255,236,2,246,0,5,255,236,2,246,0,10,255,236,2,246,1,208,255,215,2,246,1,220,255,236,2,246,1,221,255,236,2,246,1,223,255,215,2,246,1,225,255,236,2,246,1,228,255,236,2,246,1,246,255,236,2,246,2,7,255,236,2,246,2,11,255,236,2,246,2,160,255,215,2,246,2,170,255,236,2,246,2,182,255,236,2,246,2,188,255,215,2,246,2,190,255,236,2,246,2,192,255,236,2,246,2,194,255,236,2,246,2,203,255,215,2,246,2,213,255,236,2,246,2,230,255,215,2,246,2,248,255,236,2,246,2,250,255,236,2,246,2,252,255,236,2,246,2,254,255,236,2,246,3,6,255,215,2,246,3,8,255,215,2,246,3,14,255,236,2,246,3,16,255,236,2,246,3,24,255,236,2,247,0,15,255,133,2,247,0,17,255,133,2,247,1,159,255,236,2,247,1,164,255,154,2,247,1,170,255,113,2,247,1,174,255,154,2,247,1,181,255,154,2,247,1,184,255,236,2,247,1,187,255,236,2,247,1,190,255,195,2,247,1,201,255,236,2,247,1,206,255,174,2,247,1,207,255,215,2,247,1,213,255,174,2,247,1,216,255,215,2,247,1,219,255,215,2,247,1,222,255,215,2,247,1,225,255,215,2,247,1,234,255,215,2,247,1,235,0,102,2,247,1,237,255,215,2,247,1,238,255,236,2,247,1,242,255,174,2,247,1,244,0,102,2,247,2,8,255,133,2,247,2,12,255,133,2,247,2,106,255,215,2,247,2,108,255,236,2,247,2,114,255,113,2,247,2,115,255,174,2,247,2,126,255,236,2,247,2,127,255,215,2,247,2,132,255,236,2,247,2,133,255,215,2,247,2,134,255,236,2,247,2,135,255,215,2,247,2,136,255,236,2,247,2,137,255,215,2,247,2,138,255,236,2,247,2,140,255,236,2,247,2,141,255,215,2,247,2,152,0,102,2,247,2,168,0,102,2,247,2,177,255,236,2,247,2,178,255,215,2,247,2,179,255,236,2,247,2,180,255,215,2,247,2,192,255,215,2,247,2,194,255,215,2,247,2,197,255,215,2,247,2,198,255,195,2,247,2,199,255,215,2,247,2,200,255,195,2,247,2,206,255,154,2,247,2,207,255,174,2,247,2,213,255,215,2,247,2,217,255,113,2,247,2,219,255,113,2,247,2,221,255,113,2,247,2,224,255,215,2,247,2,239,255,236,2,247,2,240,255,215,2,247,2,241,255,236,2,247,2,242,255,215,2,247,2,243,255,236,2,247,2,244,255,215,2,247,2,254,255,215,2,247,3,9,255,113,2,247,3,10,255,215,2,247,3,11,255,113,2,247,3,12,255,215,2,247,3,17,255,154,2,247,3,18,255,174,2,247,3,21,255,236,2,247,3,22,255,215,2,247,3,26,255,215,2,247,3,27,255,154,2,247,3,28,255,174,2,248,0,15,255,174,2,248,0,17,255,174,2,248,1,206,255,215,2,248,1,213,255,215,2,248,1,242,255,215,2,248,2,8,255,174,2,248,2,12,255,174,2,248,2,115,255,215,2,248,2,207,255,215,2,248,3,18,255,215,2,248,3,28,255,215,2,249,0,15,255,133,2,249,0,17,255,133,2,249,1,159,255,236,2,249,1,164,255,154,2,249,1,170,255,113,2,249,1,174,255,154,2,249,1,181,255,154,2,249,1,184,255,236,2,249,1,187,255,236,2,249,1,190,255,195,2,249,1,201,255,236,2,249,1,206,255,174,2,249,1,207,255,215,2,249,1,213,255,174,2,249,1,216,255,215,2,249,1,219,255,215,2,249,1,222,255,215,2,249,1,225,255,215,2,249,1,234,255,215,2,249,1,235,0,102,2,249,1,237,255,215,2,249,1,238,255,236,2,249,1,242,255,174,2,249,1,244,0,102,2,249,2,8,255,133,2,249,2,12,255,133,2,249,2,106,255,215,2,249,2,108,255,236,2,249,2,114,255,113,2,249,2,115,255,174,2,249,2,126,255,236,2,249,2,127,255,215,2,249,2,132,255,236,2,249,2,133,255,215,2,249,2,134,255,236,2,249,2,135,255,215,2,249,2,136,255,236,2,249,2,137,255,215,2,249,2,138,255,236,2,249,2,140,255,236,2,249,2,141,255,215,2,249,2,152,0,102,2,249,2,168,0,102,2,249,2,177,255,236,2,249,2,178,255,215,2,249,2,179,255,236,2,249,2,180,255,215,2,249,2,192,255,215,2,249,2,194,255,215,2,249,2,197,255,215,2,249,2,198,255,195,2,249,2,199,255,215,2,249,2,200,255,195,2,249,2,206,255,154,2,249,2,207,255,174,2,249,2,213,255,215,2,249,2,217,255,113,2,249,2,219,255,113,2,249,2,221,255,113,2,249,2,224,255,215,2,249,2,239,255,236,2,249,2,240,255,215,2,249,2,241,255,236,2,249,2,242,255,215,2,249,2,243,255,236,2,249,2,244,255,215,2,249,2,254,255,215,2,249,3,9,255,113,2,249,3,10,255,215,2,249,3,11,255,113,2,249,3,12,255,215,2,249,3,17,255,154,2,249,3,18,255,174,2,249,3,21,255,236,2,249,3,22,255,215,2,249,3,26,255,215,2,249,3,27,255,154,2,249,3,28,255,174,2,250,0,15,255,174,2,250,0,17,255,174,2,250,1,206,255,215,2,250,1,213,255,215,2,250,1,242,255,215,2,250,2,8,255,174,2,250,2,12,255,174,2,250,2,115,255,215,2,250,2,207,255,215,2,250,3,18,255,215,2,250,3,28,255,215,2,251,0,15,255,133,2,251,0,17,255,133,2,251,1,159,255,236,2,251,1,164,255,154,2,251,1,170,255,113,2,251,1,174,255,154,2,251,1,181,255,154,2,251,1,184,255,236,2,251,1,187,255,236,2,251,1,190,255,195,2,251,1,201,255,236,2,251,1,206,255,174,2,251,1,207,255,215,2,251,1,213,255,174,2,251,1,216,255,215,2,251,1,219,255,215,2,251,1,222,255,215,2,251,1,225,255,215,2,251,1,234,255,215,2,251,1,235,0,102,2,251,1,237,255,215,2,251,1,238,255,236,2,251,1,242,255,174,2,251,1,244,0,102,2,251,2,8,255,133,2,251,2,12,255,133,2,251,2,106,255,215,2,251,2,108,255,236,2,251,2,114,255,113,2,251,2,115,255,174,2,251,2,126,255,236,2,251,2,127,255,215,2,251,2,132,255,236,2,251,2,133,255,215,2,251,2,134,255,236,2,251,2,135,255,215,2,251,2,136,255,236,2,251,2,137,255,215,2,251,2,138,255,236,2,251,2,140,255,236,2,251,2,141,255,215,2,251,2,152,0,102,2,251,2,168,0,102,2,251,2,177,255,236,2,251,2,178,255,215,2,251,2,179,255,236,2,251,2,180,255,215,2,251,2,192,255,215,2,251,2,194,255,215,2,251,2,197,255,215,2,251,2,198,255,195,2,251,2,199,255,215,2,251,2,200,255,195,2,251,2,206,255,154,2,251,2,207,255,174,2,251,2,213,255,215,2,251,2,217,255,113,2,251,2,219,255,113,2,251,2,221,255,113,2,251,2,224,255,215,2,251,2,239,255,236,2,251,2,240,255,215,2,251,2,241,255,236,2,251,2,242,255,215,2,251,2,243,255,236,2,251,2,244,255,215,2,251,2,254,255,215,2,251,3,9,255,113,2,251,3,10,255,215,2,251,3,11,255,113,2,251,3,12,255,215,2,251,3,17,255,154,2,251,3,18,255,174,2,251,3,21,255,236,2,251,3,22,255,215,2,251,3,26,255,215,2,251,3,27,255,154,2,251,3,28,255,174,2,252,0,15,255,174,2,252,0,17,255,174,2,252,1,206,255,215,2,252,1,213,255,215,2,252,1,242,255,215,2,252,2,8,255,174,2,252,2,12,255,174,2,252,2,115,255,215,2,252,2,207,255,215,2,252,3,18,255,215,2,252,3,28,255,215,2,255,0,15,255,133,2,255,0,16,255,174,2,255,0,17,255,133,2,255,1,159,255,215,2,255,1,164,255,154,2,255,1,170,255,113,2,255,1,174,255,154,2,255,1,181,255,154,2,255,1,184,255,215,2,255,1,187,255,215,2,255,1,188,0,41,2,255,1,190,255,174,2,255,1,204,255,154,2,255,1,205,255,154,2,255,1,206,255,133,2,255,1,207,255,113,2,255,1,208,255,215,2,255,1,209,255,215,2,255,1,210,255,154,2,255,1,211,255,154,2,255,1,212,255,154,2,255,1,213,255,133,2,255,1,214,255,154,2,255,1,215,255,154,2,255,1,216,255,113,2,255,1,217,255,154,2,255,1,218,255,154,2,255,1,219,255,113,2,255,1,220,255,174,2,255,1,221,255,174,2,255,1,222,255,113,2,255,1,223,255,215,2,255,1,224,255,154,2,255,1,225,255,154,2,255,1,226,255,154,2,255,1,227,255,154,2,255,1,228,255,174,2,255,1,229,255,154,2,255,1,230,255,154,2,255,1,231,255,215,2,255,1,232,255,154,2,255,1,233,255,195,2,255,1,234,255,113,2,255,1,236,255,154,2,255,1,237,255,113,2,255,1,238,255,133,2,255,1,242,255,133,2,255,1,243,255,154,2,255,1,245,255,154,2,255,1,246,255,174,2,255,1,247,255,154,2,255,1,249,255,154,2,255,2,2,255,174,2,255,2,3,255,174,2,255,2,4,255,174,2,255,2,8,255,133,2,255,2,12,255,133,2,255,2,106,255,113,2,255,2,107,255,154,2,255,2,108,255,215,2,255,2,109,255,215,2,255,2,113,255,154,2,255,2,114,255,113,2,255,2,115,255,133,2,255,2,117,255,154,2,255,2,119,255,154,2,255,2,121,255,154,2,255,2,125,255,154,2,255,2,126,255,215,2,255,2,127,255,113,2,255,2,129,255,215,2,255,2,131,255,215,2,255,2,132,255,215,2,255,2,133,255,113,2,255,2,134,255,215,2,255,2,135,255,113,2,255,2,136,255,215,2,255,2,137,255,113,2,255,2,138,255,215,2,255,2,139,255,215,2,255,2,140,255,215,2,255,2,141,255,113,2,255,2,150,255,154,2,255,2,154,255,154,2,255,2,158,255,154,2,255,2,160,255,215,2,255,2,162,255,215,2,255,2,164,255,154,2,255,2,166,255,154,2,255,2,170,255,174,2,255,2,172,255,154,2,255,2,174,255,154,2,255,2,176,255,154,2,255,2,177,255,215,2,255,2,178,255,113,2,255,2,179,255,215,2,255,2,180,255,113,2,255,2,181,0,41,2,255,2,182,255,174,2,255,2,184,255,174,2,255,2,186,255,174,2,255,2,188,255,215,2,255,2,190,255,174,2,255,2,192,255,154,2,255,2,194,255,154,2,255,2,196,255,154,2,255,2,197,255,154,2,255,2,198,255,113,2,255,2,199,255,154,2,255,2,200,255,113,2,255,2,203,255,215,2,255,2,205,255,154,2,255,2,206,255,154,2,255,2,207,255,133,2,255,2,209,255,154,2,255,2,211,255,154,2,255,2,213,255,154,2,255,2,215,255,154,2,255,2,217,255,113,2,255,2,219,255,113,2,255,2,221,255,113,2,255,2,224,255,113,2,255,2,230,255,215,2,255,2,232,255,215,2,255,2,234,255,195,2,255,2,236,255,154,2,255,2,238,255,154,2,255,2,239,255,215,2,255,2,240,255,113,2,255,2,241,255,215,2,255,2,242,255,113,2,255,2,243,255,215,2,255,2,244,255,113,2,255,2,246,255,215,2,255,2,248,255,174,2,255,2,250,255,174,2,255,2,252,255,174,2,255,2,254,255,154,2,255,3,0,255,154,2,255,3,2,255,154,2,255,3,6,255,215,2,255,3,8,255,215,2,255,3,9,255,113,2,255,3,10,255,113,2,255,3,11,255,113,2,255,3,12,255,113,2,255,3,14,255,154,2,255,3,16,255,154,2,255,3,17,255,154,2,255,3,18,255,133,2,255,3,20,255,154,2,255,3,21,255,215,2,255,3,22,255,113,2,255,3,24,255,174,2,255,3,26,255,113,2,255,3,27,255,154,2,255,3,28,255,133,3,0,0,15,255,154,3,0,0,16,255,215,3,0,0,17,255,154,3,0,1,206,255,195,3,0,1,207,255,236,3,0,1,213,255,195,3,0,1,216,255,236,3,0,1,219,255,236,3,0,1,222,255,236,3,0,1,234,255,236,3,0,1,237,255,236,3,0,1,242,255,195,3,0,2,2,255,215,3,0,2,3,255,215,3,0,2,4,255,215,3,0,2,8,255,154,3,0,2,12,255,154,3,0,2,106,255,236,3,0,2,115,255,195,3,0,2,127,255,236,3,0,2,133,255,236,3,0,2,135,255,236,3,0,2,137,255,236,3,0,2,141,255,236,3,0,2,178,255,236,3,0,2,180,255,236,3,0,2,207,255,195,3,0,2,224,255,236,3,0,2,240,255,236,3,0,2,242,255,236,3,0,2,244,255,236,3,0,3,10,255,236,3,0,3,12,255,236,3,0,3,18,255,195,3,0,3,22,255,236,3,0,3,26,255,236,3,0,3,28,255,195,3,3,0,15,255,154,3,3,0,16,255,215,3,3,0,17,255,154,3,3,1,157,0,41,3,3,1,159,255,215,3,3,1,164,255,174,3,3,1,166,0,41,3,3,1,170,255,133,3,3,1,174,255,174,3,3,1,181,255,174,3,3,1,184,255,215,3,3,1,187,255,215,3,3,1,188,0,41,3,3,1,190,255,195,3,3,1,196,0,41,3,3,1,204,255,195,3,3,1,205,255,195,3,3,1,206,255,154,3,3,1,207,255,174,3,3,1,208,255,215,3,3,1,209,255,215,3,3,1,210,255,195,3,3,1,211,255,195,3,3,1,212,255,195,3,3,1,213,255,154,3,3,1,214,255,195,3,3,1,215,255,195,3,3,1,216,255,174,3,3,1,217,255,195,3,3,1,218,255,195,3,3,1,219,255,174,3,3,1,222,255,174,3,3,1,223,255,215,3,3,1,224,255,195,3,3,1,225,255,154,3,3,1,226,255,195,3,3,1,227,255,195,3,3,1,229,255,195,3,3,1,230,255,195,3,3,1,231,255,215,3,3,1,232,255,195,3,3,1,234,255,174,3,3,1,235,0,41,3,3,1,236,255,195,3,3,1,237,255,174,3,3,1,238,255,195,3,3,1,242,255,154,3,3,1,243,255,195,3,3,1,244,0,41,3,3,1,245,255,195,3,3,1,247,255,195,3,3,1,249,255,195,3,3,2,2,255,215,3,3,2,3,255,215,3,3,2,4,255,215,3,3,2,8,255,154,3,3,2,12,255,154,3,3,2,106,255,174,3,3,2,107,255,195,3,3,2,108,255,215,3,3,2,113,255,195,3,3,2,114,255,133,3,3,2,115,255,154,3,3,2,117,255,195,3,3,2,119,255,215,3,3,2,121,255,195,3,3,2,125,255,195,3,3,2,126,255,215,3,3,2,127,255,174,3,3,2,132,255,215,3,3,2,133,255,174,3,3,2,134,255,215,3,3,2,135,255,174,3,3,2,136,255,215,3,3,2,137,255,174,3,3,2,138,255,215,3,3,2,140,255,215,3,3,2,141,255,174,3,3,2,150,255,195,3,3,2,152,0,41,3,3,2,154,255,195,3,3,2,158,255,195,3,3,2,160,255,215,3,3,2,162,255,215,3,3,2,164,255,195,3,3,2,166,255,195,3,3,2,168,0,41,3,3,2,169,0,41,3,3,2,172,255,195,3,3,2,174,255,195,3,3,2,176,255,195,3,3,2,177,255,215,3,3,2,178,255,174,3,3,2,179,255,215,3,3,2,180,255,174,3,3,2,181,0,41,3,3,2,188,255,215,3,3,2,189,0,41,3,3,2,192,255,154,3,3,2,194,255,154,3,3,2,196,255,195,3,3,2,197,255,215,3,3,2,198,255,195,3,3,2,199,255,215,3,3,2,200,255,195,3,3,2,203,255,215,3,3,2,205,255,195,3,3,2,206,255,174,3,3,2,207,255,154,3,3,2,209,255,195,3,3,2,211,255,195,3,3,2,213,255,154,3,3,2,215,255,195,3,3,2,217,255,133,3,3,2,219,255,133,3,3,2,221,255,133,3,3,2,224,255,174,3,3,2,230,255,215,3,3,2,232,255,215,3,3,2,236,255,195,3,3,2,238,255,195,3,3,2,239,255,215,3,3,2,240,255,174,3,3,2,241,255,215,3,3,2,242,255,174,3,3,2,243,255,215,3,3,2,244,255,174,3,3,2,246,255,215,3,3,2,254,255,154,3,3,3,0,255,195,3,3,3,2,255,195,3,3,3,6,255,215,3,3,3,8,255,215,3,3,3,9,255,154,3,3,3,10,255,174,3,3,3,11,255,154,3,3,3,12,255,174,3,3,3,14,255,215,3,3,3,16,255,215,3,3,3,17,255,174,3,3,3,18,255,154,3,3,3,20,255,195,3,3,3,21,255,215,3,3,3,22,255,174,3,3,3,23,0,41,3,3,3,26,255,174,3,3,3,27,255,174,3,3,3,28,255,154,3,4,0,15,255,195,3,4,0,17,255,195,3,4,1,206,255,195,3,4,1,207,255,215,3,4,1,213,255,195,3,4,1,216,255,215,3,4,1,219,255,215,3,4,1,222,255,215,3,4,1,234,255,215,3,4,1,237,255,215,3,4,1,242,255,195,3,4,2,8,255,195,3,4,2,12,255,195,3,4,2,106,255,215,3,4,2,115,255,195,3,4,2,127,255,215,3,4,2,133,255,215,3,4,2,135,255,215,3,4,2,137,255,215,3,4,2,141,255,215,3,4,2,178,255,215,3,4,2,180,255,215,3,4,2,207,255,195,3,4,2,224,255,215,3,4,2,240,255,215,3,4,2,242,255,215,3,4,2,244,255,215,3,4,3,10,255,215,3,4,3,12,255,215,3,4,3,18,255,195,3,4,3,22,255,215,3,4,3,26,255,215,3,4,3,28,255,195,3,5,1,159,255,215,3,5,1,163,0,225,3,5,1,184,255,215,3,5,1,187,255,215,3,5,1,190,255,195,3,5,1,220,255,215,3,5,1,225,255,174,3,5,1,228,255,215,3,5,2,108,255,215,3,5,2,123,0,61,3,5,2,125,255,236,3,5,2,126,255,215,3,5,2,132,255,215,3,5,2,134,255,215,3,5,2,136,255,215,3,5,2,138,255,215,3,5,2,140,255,215,3,5,2,170,255,215,3,5,2,177,255,215,3,5,2,179,255,215,3,5,2,182,255,215,3,5,2,190,255,215,3,5,2,192,255,174,3,5,2,194,255,174,3,5,2,197,255,195,3,5,2,198,255,215,3,5,2,199,255,195,3,5,2,200,255,215,3,5,2,213,255,174,3,5,2,239,255,215,3,5,2,241,255,215,3,5,2,243,255,215,3,5,2,254,255,174,3,5,3,14,255,215,3,5,3,16,255,215,3,5,3,21,255,215,3,5,3,24,255,215,3,6,1,207,255,236,3,6,1,216,255,236,3,6,1,219,255,236,3,6,1,222,255,236,3,6,1,225,255,236,3,6,1,234,255,236,3,6,1,237,255,236,3,6,2,106,255,236,3,6,2,127,255,236,3,6,2,133,255,236,3,6,2,135,255,236,3,6,2,137,255,236,3,6,2,141,255,236,3,6,2,178,255,236,3,6,2,180,255,236,3,6,2,192,255,236,3,6,2,194,255,236,3,6,2,213,255,236,3,6,2,224,255,236,3,6,2,240,255,236,3,6,2,242,255,236,3,6,2,244,255,236,3,6,2,254,255,236,3,6,3,10,255,236,3,6,3,12,255,236,3,6,3,14,255,215,3,6,3,16,255,215,3,6,3,22,255,236,3,6,3,26,255,236,3,7,1,159,255,215,3,7,1,184,255,215,3,7,1,187,255,215,3,7,1,190,255,215,3,7,1,193,255,215,3,7,1,225,255,215,3,7,2,108,255,215,3,7,2,124,255,215,3,7,2,126,255,215,3,7,2,132,255,215,3,7,2,134,255,215,3,7,2,136,255,215,3,7,2,138,255,215,3,7,2,140,255,215,3,7,2,177,255,215,3,7,2,179,255,215,3,7,2,191,255,215,3,7,2,192,255,215,3,7,2,193,255,215,3,7,2,194,255,215,3,7,2,197,255,154,3,7,2,199,255,154,3,7,2,212,255,215,3,7,2,213,255,215,3,7,2,239,255,215,3,7,2,241,255,215,3,7,2,243,255,215,3,7,2,253,255,215,3,7,2,254,255,215,3,7,3,9,255,215,3,7,3,11,255,215,3,7,3,14,255,215,3,7,3,16,255,215,3,7,3,21,255,215,3,7,3,25,255,236,3,8,1,207,255,236,3,8,1,216,255,236,3,8,1,219,255,236,3,8,1,222,255,236,3,8,1,225,255,236,3,8,1,234,255,236,3,8,1,237,255,236,3,8,2,106,255,236,3,8,2,127,255,236,3,8,2,133,255,236,3,8,2,135,255,236,3,8,2,137,255,236,3,8,2,141,255,236,3,8,2,178,255,236,3,8,2,180,255,236,3,8,2,192,255,236,3,8,2,194,255,236,3,8,2,213,255,236,3,8,2,224,255,236,3,8,2,240,255,236,3,8,2,242,255,236,3,8,2,244,255,236,3,8,2,254,255,236,3,8,3,10,255,236,3,8,3,12,255,236,3,8,3,14,255,215,3,8,3,16,255,215,3,8,3,22,255,236,3,8,3,26,255,236,3,11,0,5,255,154,3,11,0,10,255,154,3,11,1,157,255,174,3,11,1,166,255,174,3,11,1,168,255,195,3,11,1,170,255,195,3,11,1,176,255,195,3,11,1,188,255,113,3,11,1,189,255,195,3,11,1,191,255,195,3,11,1,193,255,195,3,11,1,196,255,174,3,11,1,208,255,215,3,11,1,220,255,195,3,11,1,223,255,215,3,11,1,225,255,215,3,11,1,228,255,195,3,11,2,7,255,154,3,11,2,11,255,154,3,11,2,114,255,195,3,11,2,118,255,215,3,11,2,124,255,195,3,11,2,128,255,195,3,11,2,130,255,195,3,11,2,159,255,195,3,11,2,160,255,215,3,11,2,169,255,174,3,11,2,170,255,195,3,11,2,181,255,113,3,11,2,182,255,195,3,11,2,183,255,195,3,11,2,185,255,195,3,11,2,187,255,195,3,11,2,188,255,215,3,11,2,189,255,174,3,11,2,190,255,195,3,11,2,191,255,195,3,11,2,192,255,215,3,11,2,193,255,195,3,11,2,194,255,215,3,11,2,202,255,195,3,11,2,203,255,215,3,11,2,212,255,195,3,11,2,213,255,215,3,11,2,217,255,195,3,11,2,219,255,195,3,11,2,221,255,195,3,11,2,229,255,195,3,11,2,230,255,215,3,11,2,247,255,195,3,11,2,249,255,195,3,11,2,251,255,195,3,11,2,253,255,195,3,11,2,254,255,215,3,11,3,5,255,195,3,11,3,6,255,215,3,11,3,7,255,195,3,11,3,8,255,215,3,11,3,13,255,215,3,11,3,14,255,215,3,11,3,15,255,215,3,11,3,16,255,215,3,11,3,23,255,174,3,11,3,24,255,195,3,12,0,5,255,154,3,12,0,10,255,154,3,12,1,208,255,215,3,12,1,220,255,195,3,12,1,221,255,215,3,12,1,223,255,215,3,12,1,225,255,215,3,12,1,228,255,195,3,12,1,246,255,215,3,12,2,7,255,154,3,12,2,11,255,154,3,12,2,160,255,215,3,12,2,170,255,195,3,12,2,182,255,195,3,12,2,188,255,215,3,12,2,190,255,195,3,12,2,192,255,215,3,12,2,194,255,215,3,12,2,203,255,215,3,12,2,213,255,215,3,12,2,230,255,215,3,12,2,248,255,215,3,12,2,250,255,215,3,12,2,252,255,215,3,12,2,254,255,215,3,12,3,6,255,215,3,12,3,8,255,215,3,12,3,14,255,154,3,12,3,16,255,154,3,12,3,24,255,195,3,13,0,5,255,154,3,13,0,10,255,154,3,13,1,157,255,174,3,13,1,166,255,174,3,13,1,168,255,195,3,13,1,170,255,195,3,13,1,176,255,195,3,13,1,188,255,113,3,13,1,189,255,195,3,13,1,191,255,195,3,13,1,193,255,195,3,13,1,196,255,174,3,13,1,208,255,215,3,13,1,220,255,195,3,13,1,223,255,215,3,13,1,225,255,215,3,13,1,228,255,195,3,13,2,7,255,154,3,13,2,11,255,154,3,13,2,114,255,195,3,13,2,118,255,215,3,13,2,124,255,195,3,13,2,128,255,195,3,13,2,130,255,195,3,13,2,159,255,195,3,13,2,160,255,215,3,13,2,169,255,174,3,13,2,170,255,195,3,13,2,181,255,113,3,13,2,182,255,195,3,13,2,183,255,195,3,13,2,185,255,195,3,13,2,187,255,195,3,13,2,188,255,215,3,13,2,189,255,174,3,13,2,190,255,195,3,13,2,191,255,195,3,13,2,192,255,215,3,13,2,193,255,195,3,13,2,194,255,215,3,13,2,202,255,195,3,13,2,203,255,215,3,13,2,212,255,195,3,13,2,213,255,215,3,13,2,217,255,195,3,13,2,219,255,195,3,13,2,221,255,195,3,13,2,229,255,195,3,13,2,230,255,215,3,13,2,247,255,195,3,13,2,249,255,195,3,13,2,251,255,195,3,13,2,253,255,195,3,13,2,254,255,215,3,13,3,5,255,195,3,13,3,6,255,215,3,13,3,7,255,195,3,13,3,8,255,215,3,13,3,13,255,215,3,13,3,14,255,215,3,13,3,15,255,215,3,13,3,16,255,215,3,13,3,23,255,174,3,13,3,24,255,195,3,14,0,5,255,154,3,14,0,10,255,154,3,14,1,208,255,215,3,14,1,220,255,195,3,14,1,221,255,215,3,14,1,223,255,215,3,14,1,225,255,215,3,14,1,228,255,195,3,14,1,246,255,215,3,14,2,7,255,154,3,14,2,11,255,154,3,14,2,160,255,215,3,14,2,170,255,195,3,14,2,182,255,195,3,14,2,188,255,215,3,14,2,190,255,195,3,14,2,192,255,215,3,14,2,194,255,215,3,14,2,203,255,215,3,14,2,213,255,215,3,14,2,230,255,215,3,14,2,248,255,215,3,14,2,250,255,215,3,14,2,252,255,215,3,14,2,254,255,215,3,14,3,6,255,215,3,14,3,8,255,215,3,14,3,14,255,154,3,14,3,16,255,154,3,14,3,24,255,195,3,15,1,163,0,225,3,15,2,234,0,41,3,15,3,14,255,215,3,15,3,16,255,215,3,16,0,5,255,236,3,16,0,10,255,236,3,16,2,7,255,236,3,16,2,11,255,236,3,17,0,5,255,154,3,17,0,10,255,154,3,17,1,157,255,174,3,17,1,166,255,174,3,17,1,168,255,195,3,17,1,170,255,195,3,17,1,176,255,195,3,17,1,188,255,113,3,17,1,189,255,195,3,17,1,191,255,195,3,17,1,193,255,195,3,17,1,196,255,174,3,17,1,208,255,215,3,17,1,220,255,195,3,17,1,223,255,215,3,17,1,225,255,215,3,17,1,228,255,195,3,17,2,7,255,154,3,17,2,11,255,154,3,17,2,114,255,195,3,17,2,118,255,215,3,17,2,124,255,195,3,17,2,128,255,195,3,17,2,130,255,195,3,17,2,159,255,195,3,17,2,160,255,215,3,17,2,169,255,174,3,17,2,170,255,195,3,17,2,181,255,113,3,17,2,182,255,195,3,17,2,183,255,195,3,17,2,185,255,195,3,17,2,187,255,195,3,17,2,188,255,215,3,17,2,189,255,174,3,17,2,190,255,195,3,17,2,191,255,195,3,17,2,192,255,215,3,17,2,193,255,195,3,17,2,194,255,215,3,17,2,202,255,195,3,17,2,203,255,215,3,17,2,212,255,195,3,17,2,213,255,215,3,17,2,217,255,195,3,17,2,219,255,195,3,17,2,221,255,195,3,17,2,229,255,195,3,17,2,230,255,215,3,17,2,247,255,195,3,17,2,249,255,195,3,17,2,251,255,195,3,17,2,253,255,195,3,17,2,254,255,215,3,17,3,5,255,195,3,17,3,6,255,215,3,17,3,7,255,195,3,17,3,8,255,215,3,17,3,13,255,215,3,17,3,14,255,215,3,17,3,15,255,215,3,17,3,16,255,215,3,17,3,23,255,174,3,17,3,24,255,195,3,18,0,5,255,154,3,18,0,10,255,154,3,18,1,208,255,215,3,18,1,220,255,195,3,18,1,221,255,215,3,18,1,223,255,215,3,18,1,225,255,215,3,18,1,228,255,195,3,18,1,246,255,215,3,18,2,7,255,154,3,18,2,11,255,154,3,18,2,160,255,215,3,18,2,170,255,195,3,18,2,182,255,195,3,18,2,188,255,215,3,18,2,190,255,195,3,18,2,192,255,215,3,18,2,194,255,215,3,18,2,203,255,215,3,18,2,213,255,215,3,18,2,230,255,215,3,18,2,248,255,215,3,18,2,250,255,215,3,18,2,252,255,215,3,18,2,254,255,215,3,18,3,6,255,215,3,18,3,8,255,215,3,18,3,14,255,154,3,18,3,16,255,154,3,18,3,24,255,195,3,19,0,5,255,154,3,19,0,10,255,154,3,19,1,157,255,174,3,19,1,166,255,174,3,19,1,168,255,195,3,19,1,170,255,195,3,19,1,176,255,195,3,19,1,188,255,113,3,19,1,189,255,195,3,19,1,191,255,195,3,19,1,193,255,195,3,19,1,196,255,174,3,19,1,208,255,215,3,19,1,220,255,195,3,19,1,223,255,215,3,19,1,225,255,215,3,19,1,228,255,195,3,19,2,7,255,154,3,19,2,11,255,154,3,19,2,114,255,195,3,19,2,118,255,215,3,19,2,124,255,195,3,19,2,128,255,195,3,19,2,130,255,195,3,19,2,159,255,195,3,19,2,160,255,215,3,19,2,169,255,174,3,19,2,170,255,195,3,19,2,181,255,113,3,19,2,182,255,195,3,19,2,183,255,195,3,19,2,185,255,195,3,19,2,187,255,195,3,19,2,188,255,215,3,19,2,189,255,174,3,19,2,190,255,195,3,19,2,191,255,195,3,19,2,192,255,215,3,19,2,193,255,195,3,19,2,194,255,215,3,19,2,202,255,195,3,19,2,203,255,215,3,19,2,212,255,195,3,19,2,213,255,215,3,19,2,217,255,195,3,19,2,219,255,195,3,19,2,221,255,195,3,19,2,229,255,195,3,19,2,230,255,215,3,19,2,247,255,195,3,19,2,249,255,195,3,19,2,251,255,195,3,19,2,253,255,195,3,19,2,254,255,215,3,19,3,5,255,195,3,19,3,6,255,215,3,19,3,7,255,195,3,19,3,8,255,215,3,19,3,13,255,215,3,19,3,14,255,215,3,19,3,15,255,215,3,19,3,16,255,215,3,19,3,23,255,174,3,19,3,24,255,195,3,20,0,5,255,154,3,20,0,10,255,154,3,20,1,208,255,215,3,20,1,220,255,195,3,20,1,221,255,215,3,20,1,223,255,215,3,20,1,225,255,215,3,20,1,228,255,195,3,20,1,246,255,215,3,20,2,7,255,154,3,20,2,11,255,154,3,20,2,160,255,215,3,20,2,170,255,195,3,20,2,182,255,195,3,20,2,188,255,215,3,20,2,190,255,195,3,20,2,192,255,215,3,20,2,194,255,215,3,20,2,203,255,215,3,20,2,213,255,215,3,20,2,230,255,215,3,20,2,248,255,215,3,20,2,250,255,215,3,20,2,252,255,215,3,20,2,254,255,215,3,20,3,6,255,215,3,20,3,8,255,215,3,20,3,14,255,154,3,20,3,16,255,154,3,20,3,24,255,195,3,21,0,15,255,174,3,21,0,17,255,174,3,21,1,170,255,236,3,21,1,176,255,215,3,21,1,188,255,215,3,21,1,191,255,215,3,21,2,8,255,174,3,21,2,12,255,174,3,21,2,114,255,236,3,21,2,128,255,236,3,21,2,130,255,236,3,21,2,159,255,215,3,21,2,181,255,215,3,21,2,183,255,236,3,21,2,185,255,236,3,21,2,187,255,215,3,21,2,202,255,215,3,21,2,217,255,236,3,21,2,219,255,236,3,21,2,221,255,236,3,21,2,229,255,215,3,21,3,5,255,215,3,21,3,7,255,215,3,22,0,5,255,215,3,22,0,10,255,215,3,22,1,208,255,236,3,22,1,221,255,236,3,22,1,223,255,236,3,22,1,246,255,236,3,22,2,7,255,215,3,22,2,11,255,215,3,22,2,160,255,236,3,22,2,188,255,236,3,22,2,203,255,236,3,22,2,230,255,236,3,22,2,248,255,236,3,22,2,250,255,236,3,22,2,252,255,236,3,22,3,6,255,236,3,22,3,8,255,236,3,22,3,14,255,215,3,22,3,16,255,215,3,23,0,5,255,174,3,23,0,10,255,174,3,23,1,157,255,195,3,23,1,166,255,195,3,23,1,170,255,215,3,23,1,176,255,215,3,23,1,188,255,195,3,23,1,191,255,215,3,23,1,193,255,215,3,23,1,196,255,195,3,23,1,220,255,215,3,23,1,228,255,215,3,23,2,7,255,174,3,23,2,11,255,174,3,23,2,114,255,215,3,23,2,124,255,215,3,23,2,128,255,215,3,23,2,130,255,215,3,23,2,159,255,215,3,23,2,169,255,195,3,23,2,170,255,215,3,23,2,181,255,195,3,23,2,182,255,215,3,23,2,183,255,215,3,23,2,185,255,215,3,23,2,187,255,215,3,23,2,189,255,195,3,23,2,190,255,215,3,23,2,191,255,215,3,23,2,193,255,215,3,23,2,202,255,215,3,23,2,212,255,215,3,23,2,217,255,215,3,23,2,219,255,215,3,23,2,221,255,215,3,23,2,229,255,215,3,23,2,253,255,215,3,23,3,5,255,215,3,23,3,7,255,215,3,23,3,13,255,215,3,23,3,15,255,215,3,23,3,23,255,195,3,23,3,24,255,215,3,24,0,5,255,154,3,24,0,10,255,154,3,24,1,208,255,215,3,24,1,220,255,195,3,24,1,221,255,215,3,24,1,223,255,215,3,24,1,225,255,215,3,24,1,228,255,195,3,24,1,246,255,215,3,24,2,7,255,154,3,24,2,11,255,154,3,24,2,160,255,215,3,24,2,170,255,195,3,24,2,182,255,195,3,24,2,188,255,215,3,24,2,190,255,195,3,24,2,192,255,215,3,24,2,194,255,215,3,24,2,203,255,215,3,24,2,213,255,215,3,24,2,230,255,215,3,24,2,248,255,215,3,24,2,250,255,215,3,24,2,252,255,215,3,24,2,254,255,215,3,24,3,6,255,215,3,24,3,8,255,215,3,24,3,14,255,154,3,24,3,16,255,154,3,24,3,24,255,195,3,25,1,225,255,215,3,25,2,192,255,215,3,25,2,194,255,215,3,25,2,213,255,215,3,25,2,254,255,215,3,27,1,163,0,225,3,27,2,234,0,41,3,27,3,14,255,215,3,27,3,16,255,215,3,28,0,5,255,236,3,28,0,10,255,236,3,28,2,7,255,236,3,28,2,11,255,236,3,29,0,5,255,113,3,29,0,10,255,113,3,29,0,38,255,215,3,29,0,42,255,215,3,29,0,45,1,10,3,29,0,50,255,215,3,29,0,52,255,215,3,29,0,55,255,113,3,29,0,57,255,174,3,29,0,58,255,174,3,29,0,60,255,133,3,29,0,137,255,215,3,29,0,148,255,215,3,29,0,149,255,215,3,29,0,150,255,215,3,29,0,151,255,215,3,29,0,152,255,215,3,29,0,154,255,215,3,29,0,159,255,133,3,29,0,200,255,215,3,29,0,202,255,215,3,29,0,204,255,215,3,29,0,206,255,215,3,29,0,222,255,215,3,29,0,224,255,215,3,29,0,226,255,215,3,29,0,228,255,215,3,29,1,14,255,215,3,29,1,16,255,215,3,29,1,18,255,215,3,29,1,20,255,215,3,29,1,36,255,113,3,29,1,38,255,113,3,29,1,54,255,174,3,29,1,56,255,133,3,29,1,58,255,133,3,29,1,71,255,215,3,29,1,250,255,174,3,29,1,252,255,174,3,29,1,254,255,174,3,29,2,0,255,133,3,29,2,7,255,113,3,29,2,11,255,113,3,29,2,95,255,215,3,29,3,73,255,215,3,29,3,75,255,215,3,29,3,77,255,215,3,29,3,79,255,215,3,29,3,81,255,215,3,29,3,83,255,215,3,29,3,85,255,215,3,29,3,87,255,215,3,29,3,89,255,215,3,29,3,91,255,215,3,29,3,93,255,215,3,29,3,95,255,215,3,29,3,111,255,133,3,29,3,113,255,133,3,29,3,115,255,133,3,29,3,143,255,113,3,30,0,5,255,236,3,30,0,10,255,236,3,30,2,7,255,236,3,30,2,11,255,236,3,31,0,5,255,113,3,31,0,10,255,113,3,31,0,38,255,215,3,31,0,42,255,215,3,31,0,45,1,10,3,31,0,50,255,215,3,31,0,52,255,215,3,31,0,55,255,113,3,31,0,57,255,174,3,31,0,58,255,174,3,31,0,60,255,133,3,31,0,137,255,215,3,31,0,148,255,215,3,31,0,149,255,215,3,31,0,150,255,215,3,31,0,151,255,215,3,31,0,152,255,215,3,31,0,154,255,215,3,31,0,159,255,133,3,31,0,200,255,215,3,31,0,202,255,215,3,31,0,204,255,215,3,31,0,206,255,215,3,31,0,222,255,215,3,31,0,224,255,215,3,31,0,226,255,215,3,31,0,228,255,215,3,31,1,14,255,215,3,31,1,16,255,215,3,31,1,18,255,215,3,31,1,20,255,215,3,31,1,36,255,113,3,31,1,38,255,113,3,31,1,54,255,174,3,31,1,56,255,133,3,31,1,58,255,133,3,31,1,71,255,215,3,31,1,250,255,174,3,31,1,252,255,174,3,31,1,254,255,174,3,31,2,0,255,133,3,31,2,7,255,113,3,31,2,11,255,113,3,31,2,95,255,215,3,31,3,73,255,215,3,31,3,75,255,215,3,31,3,77,255,215,3,31,3,79,255,215,3,31,3,81,255,215,3,31,3,83,255,215,3,31,3,85,255,215,3,31,3,87,255,215,3,31,3,89,255,215,3,31,3,91,255,215,3,31,3,93,255,215,3,31,3,95,255,215,3,31,3,111,255,133,3,31,3,113,255,133,3,31,3,115,255,133,3,31,3,143,255,113,3,32,0,5,255,236,3,32,0,10,255,236,3,32,2,7,255,236,3,32,2,11,255,236,3,33,0,5,255,113,3,33,0,10,255,113,3,33,0,38,255,215,3,33,0,42,255,215,3,33,0,45,1,10,3,33,0,50,255,215,3,33,0,52,255,215,3,33,0,55,255,113,3,33,0,57,255,174,3,33,0,58,255,174,3,33,0,60,255,133,3,33,0,137,255,215,3,33,0,148,255,215,3,33,0,149,255,215,3,33,0,150,255,215,3,33,0,151,255,215,3,33,0,152,255,215,3,33,0,154,255,215,3,33,0,159,255,133,3,33,0,200,255,215,3,33,0,202,255,215,3,33,0,204,255,215,3,33,0,206,255,215,3,33,0,222,255,215,3,33,0,224,255,215,3,33,0,226,255,215,3,33,0,228,255,215,3,33,1,14,255,215,3,33,1,16,255,215,3,33,1,18,255,215,3,33,1,20,255,215,3,33,1,36,255,113,3,33,1,38,255,113,3,33,1,54,255,174,3,33,1,56,255,133,3,33,1,58,255,133,3,33,1,71,255,215,3,33,1,250,255,174,3,33,1,252,255,174,3,33,1,254,255,174,3,33,2,0,255,133,3,33,2,7,255,113,3,33,2,11,255,113,3,33,2,95,255,215,3,33,3,73,255,215,3,33,3,75,255,215,3,33,3,77,255,215,3,33,3,79,255,215,3,33,3,81,255,215,3,33,3,83,255,215,3,33,3,85,255,215,3,33,3,87,255,215,3,33,3,89,255,215,3,33,3,91,255,215,3,33,3,93,255,215,3,33,3,95,255,215,3,33,3,111,255,133,3,33,3,113,255,133,3,33,3,115,255,133,3,33,3,143,255,113,3,34,0,5,255,236,3,34,0,10,255,236,3,34,2,7,255,236,3,34,2,11,255,236,3,35,0,5,255,113,3,35,0,10,255,113,3,35,0,38,255,215,3,35,0,42,255,215,3,35,0,45,1,10,3,35,0,50,255,215,3,35,0,52,255,215,3,35,0,55,255,113,3,35,0,57,255,174,3,35,0,58,255,174,3,35,0,60,255,133,3,35,0,137,255,215,3,35,0,148,255,215,3,35,0,149,255,215,3,35,0,150,255,215,3,35,0,151,255,215,3,35,0,152,255,215,3,35,0,154,255,215,3,35,0,159,255,133,3,35,0,200,255,215,3,35,0,202,255,215,3,35,0,204,255,215,3,35,0,206,255,215,3,35,0,222,255,215,3,35,0,224,255,215,3,35,0,226,255,215,3,35,0,228,255,215,3,35,1,14,255,215,3,35,1,16,255,215,3,35,1,18,255,215,3,35,1,20,255,215,3,35,1,36,255,113,3,35,1,38,255,113,3,35,1,54,255,174,3,35,1,56,255,133,3,35,1,58,255,133,3,35,1,71,255,215,3,35,1,250,255,174,3,35,1,252,255,174,3,35,1,254,255,174,3,35,2,0,255,133,3,35,2,7,255,113,3,35,2,11,255,113,3,35,2,95,255,215,3,35,3,73,255,215,3,35,3,75,255,215,3,35,3,77,255,215,3,35,3,79,255,215,3,35,3,81,255,215,3,35,3,83,255,215,3,35,3,85,255,215,3,35,3,87,255,215,3,35,3,89,255,215,3,35,3,91,255,215,3,35,3,93,255,215,3,35,3,95,255,215,3,35,3,111,255,133,3,35,3,113,255,133,3,35,3,115,255,133,3,35,3,143,255,113,3,36,0,5,255,236,3,36,0,10,255,236,3,36,2,7,255,236,3,36,2,11,255,236,3,37,0,5,255,113,3,37,0,10,255,113,3,37,0,38,255,215,3,37,0,42,255,215,3,37,0,45,1,10,3,37,0,50,255,215,3,37,0,52,255,215,3,37,0,55,255,113,3,37,0,57,255,174,3,37,0,58,255,174,3,37,0,60,255,133,3,37,0,137,255,215,3,37,0,148,255,215,3,37,0,149,255,215,3,37,0,150,255,215,3,37,0,151,255,215,3,37,0,152,255,215,3,37,0,154,255,215,3,37,0,159,255,133,3,37,0,200,255,215,3,37,0,202,255,215,3,37,0,204,255,215,3,37,0,206,255,215,3,37,0,222,255,215,3,37,0,224,255,215,3,37,0,226,255,215,3,37,0,228,255,215,3,37,1,14,255,215,3,37,1,16,255,215,3,37,1,18,255,215,3,37,1,20,255,215,3,37,1,36,255,113,3,37,1,38,255,113,3,37,1,54,255,174,3,37,1,56,255,133,3,37,1,58,255,133,3,37,1,71,255,215,3,37,1,250,255,174,3,37,1,252,255,174,3,37,1,254,255,174,3,37,2,0,255,133,3,37,2,7,255,113,3,37,2,11,255,113,3,37,2,95,255,215,3,37,3,73,255,215,3,37,3,75,255,215,3,37,3,77,255,215,3,37,3,79,255,215,3,37,3,81,255,215,3,37,3,83,255,215,3,37,3,85,255,215,3,37,3,87,255,215,3,37,3,89,255,215,3,37,3,91,255,215,3,37,3,93,255,215,3,37,3,95,255,215,3,37,3,111,255,133,3,37,3,113,255,133,3,37,3,115,255,133,3,37,3,143,255,113,3,38,0,5,255,236,3,38,0,10,255,236,3,38,2,7,255,236,3,38,2,11,255,236,3,39,0,5,255,113,3,39,0,10,255,113,3,39,0,38,255,215,3,39,0,42,255,215,3,39,0,45,1,10,3,39,0,50,255,215,3,39,0,52,255,215,3,39,0,55,255,113,3,39,0,57,255,174,3,39,0,58,255,174,3,39,0,60,255,133,3,39,0,137,255,215,3,39,0,148,255,215,3,39,0,149,255,215,3,39,0,150,255,215,3,39,0,151,255,215,3,39,0,152,255,215,3,39,0,154,255,215,3,39,0,159,255,133,3,39,0,200,255,215,3,39,0,202,255,215,3,39,0,204,255,215,3,39,0,206,255,215,3,39,0,222,255,215,3,39,0,224,255,215,3,39,0,226,255,215,3,39,0,228,255,215,3,39,1,14,255,215,3,39,1,16,255,215,3,39,1,18,255,215,3,39,1,20,255,215,3,39,1,36,255,113,3,39,1,38,255,113,3,39,1,54,255,174,3,39,1,56,255,133,3,39,1,58,255,133,3,39,1,71,255,215,3,39,1,250,255,174,3,39,1,252,255,174,3,39,1,254,255,174,3,39,2,0,255,133,3,39,2,7,255,113,3,39,2,11,255,113,3,39,2,95,255,215,3,39,3,73,255,215,3,39,3,75,255,215,3,39,3,77,255,215,3,39,3,79,255,215,3,39,3,81,255,215,3,39,3,83,255,215,3,39,3,85,255,215,3,39,3,87,255,215,3,39,3,89,255,215,3,39,3,91,255,215,3,39,3,93,255,215,3,39,3,95,255,215,3,39,3,111,255,133,3,39,3,113,255,133,3,39,3,115,255,133,3,39,3,143,255,113,3,40,0,5,255,236,3,40,0,10,255,236,3,40,2,7,255,236,3,40,2,11,255,236,3,41,0,5,255,113,3,41,0,10,255,113,3,41,0,38,255,215,3,41,0,42,255,215,3,41,0,45,1,10,3,41,0,50,255,215,3,41,0,52,255,215,3,41,0,55,255,113,3,41,0,57,255,174,3,41,0,58,255,174,3,41,0,60,255,133,3,41,0,137,255,215,3,41,0,148,255,215,3,41,0,149,255,215,3,41,0,150,255,215,3,41,0,151,255,215,3,41,0,152,255,215,3,41,0,154,255,215,3,41,0,159,255,133,3,41,0,200,255,215,3,41,0,202,255,215,3,41,0,204,255,215,3,41,0,206,255,215,3,41,0,222,255,215,3,41,0,224,255,215,3,41,0,226,255,215,3,41,0,228,255,215,3,41,1,14,255,215,3,41,1,16,255,215,3,41,1,18,255,215,3,41,1,20,255,215,3,41,1,36,255,113,3,41,1,38,255,113,3,41,1,54,255,174,3,41,1,56,255,133,3,41,1,58,255,133,3,41,1,71,255,215,3,41,1,250,255,174,3,41,1,252,255,174,3,41,1,254,255,174,3,41,2,0,255,133,3,41,2,7,255,113,3,41,2,11,255,113,3,41,2,95,255,215,3,41,3,73,255,215,3,41,3,75,255,215,3,41,3,77,255,215,3,41,3,79,255,215,3,41,3,81,255,215,3,41,3,83,255,215,3,41,3,85,255,215,3,41,3,87,255,215,3,41,3,89,255,215,3,41,3,91,255,215,3,41,3,93,255,215,3,41,3,95,255,215,3,41,3,111,255,133,3,41,3,113,255,133,3,41,3,115,255,133,3,41,3,143,255,113,3,42,0,5,255,236,3,42,0,10,255,236,3,42,2,7,255,236,3,42,2,11,255,236,3,43,0,5,255,113,3,43,0,10,255,113,3,43,0,38,255,215,3,43,0,42,255,215,3,43,0,45,1,10,3,43,0,50,255,215,3,43,0,52,255,215,3,43,0,55,255,113,3,43,0,57,255,174,3,43,0,58,255,174,3,43,0,60,255,133,3,43,0,137,255,215,3,43,0,148,255,215,3,43,0,149,255,215,3,43,0,150,255,215,3,43,0,151,255,215,3,43,0,152,255,215,3,43,0,154,255,215,3,43,0,159,255,133,3,43,0,200,255,215,3,43,0,202,255,215,3,43,0,204,255,215,3,43,0,206,255,215,3,43,0,222,255,215,3,43,0,224,255,215,3,43,0,226,255,215,3,43,0,228,255,215,3,43,1,14,255,215,3,43,1,16,255,215,3,43,1,18,255,215,3,43,1,20,255,215,3,43,1,36,255,113,3,43,1,38,255,113,3,43,1,54,255,174,3,43,1,56,255,133,3,43,1,58,255,133,3,43,1,71,255,215,3,43,1,250,255,174,3,43,1,252,255,174,3,43,1,254,255,174,3,43,2,0,255,133,3,43,2,7,255,113,3,43,2,11,255,113,3,43,2,95,255,215,3,43,3,73,255,215,3,43,3,75,255,215,3,43,3,77,255,215,3,43,3,79,255,215,3,43,3,81,255,215,3,43,3,83,255,215,3,43,3,85,255,215,3,43,3,87,255,215,3,43,3,89,255,215,3,43,3,91,255,215,3,43,3,93,255,215,3,43,3,95,255,215,3,43,3,111,255,133,3,43,3,113,255,133,3,43,3,115,255,133,3,43,3,143,255,113,3,44,0,5,255,236,3,44,0,10,255,236,3,44,2,7,255,236,3,44,2,11,255,236,3,45,0,5,255,113,3,45,0,10,255,113,3,45,0,38,255,215,3,45,0,42,255,215,3,45,0,45,1,10,3,45,0,50,255,215,3,45,0,52,255,215,3,45,0,55,255,113,3,45,0,57,255,174,3,45,0,58,255,174,3,45,0,60,255,133,3,45,0,137,255,215,3,45,0,148,255,215,3,45,0,149,255,215,3,45,0,150,255,215,3,45,0,151,255,215,3,45,0,152,255,215,3,45,0,154,255,215,3,45,0,159,255,133,3,45,0,200,255,215,3,45,0,202,255,215,3,45,0,204,255,215,3,45,0,206,255,215,3,45,0,222,255,215,3,45,0,224,255,215,3,45,0,226,255,215,3,45,0,228,255,215,3,45,1,14,255,215,3,45,1,16,255,215,3,45,1,18,255,215,3,45,1,20,255,215,3,45,1,36,255,113,3,45,1,38,255,113,3,45,1,54,255,174,3,45,1,56,255,133,3,45,1,58,255,133,3,45,1,71,255,215,3,45,1,250,255,174,3,45,1,252,255,174,3,45,1,254,255,174,3,45,2,0,255,133,3,45,2,7,255,113,3,45,2,11,255,113,3,45,2,95,255,215,3,45,3,73,255,215,3,45,3,75,255,215,3,45,3,77,255,215,3,45,3,79,255,215,3,45,3,81,255,215,3,45,3,83,255,215,3,45,3,85,255,215,3,45,3,87,255,215,3,45,3,89,255,215,3,45,3,91,255,215,3,45,3,93,255,215,3,45,3,95,255,215,3,45,3,111,255,133,3,45,3,113,255,133,3,45,3,115,255,133,3,45,3,143,255,113,3,46,0,5,255,236,3,46,0,10,255,236,3,46,2,7,255,236,3,46,2,11,255,236,3,47,0,5,255,113,3,47,0,10,255,113,3,47,0,38,255,215,3,47,0,42,255,215,3,47,0,45,1,10,3,47,0,50,255,215,3,47,0,52,255,215,3,47,0,55,255,113,3,47,0,57,255,174,3,47,0,58,255,174,3,47,0,60,255,133,3,47,0,137,255,215,3,47,0,148,255,215,3,47,0,149,255,215,3,47,0,150,255,215,3,47,0,151,255,215,3,47,0,152,255,215,3,47,0,154,255,215,3,47,0,159,255,133,3,47,0,200,255,215,3,47,0,202,255,215,3,47,0,204,255,215,3,47,0,206,255,215,3,47,0,222,255,215,3,47,0,224,255,215,3,47,0,226,255,215,3,47,0,228,255,215,3,47,1,14,255,215,3,47,1,16,255,215,3,47,1,18,255,215,3,47,1,20,255,215,3,47,1,36,255,113,3,47,1,38,255,113,3,47,1,54,255,174,3,47,1,56,255,133,3,47,1,58,255,133,3,47,1,71,255,215,3,47,1,250,255,174,3,47,1,252,255,174,3,47,1,254,255,174,3,47,2,0,255,133,3,47,2,7,255,113,3,47,2,11,255,113,3,47,2,95,255,215,3,47,3,73,255,215,3,47,3,75,255,215,3,47,3,77,255,215,3,47,3,79,255,215,3,47,3,81,255,215,3,47,3,83,255,215,3,47,3,85,255,215,3,47,3,87,255,215,3,47,3,89,255,215,3,47,3,91,255,215,3,47,3,93,255,215,3,47,3,95,255,215,3,47,3,111,255,133,3,47,3,113,255,133,3,47,3,115,255,133,3,47,3,143,255,113,3,48,0,5,255,236,3,48,0,10,255,236,3,48,2,7,255,236,3,48,2,11,255,236,3,49,0,5,255,113,3,49,0,10,255,113,3,49,0,38,255,215,3,49,0,42,255,215,3,49,0,45,1,10,3,49,0,50,255,215,3,49,0,52,255,215,3,49,0,55,255,113,3,49,0,57,255,174,3,49,0,58,255,174,3,49,0,60,255,133,3,49,0,137,255,215,3,49,0,148,255,215,3,49,0,149,255,215,3,49,0,150,255,215,3,49,0,151,255,215,3,49,0,152,255,215,3,49,0,154,255,215,3,49,0,159,255,133,3,49,0,200,255,215,3,49,0,202,255,215,3,49,0,204,255,215,3,49,0,206,255,215,3,49,0,222,255,215,3,49,0,224,255,215,3,49,0,226,255,215,3,49,0,228,255,215,3,49,1,14,255,215,3,49,1,16,255,215,3,49,1,18,255,215,3,49,1,20,255,215,3,49,1,36,255,113,3,49,1,38,255,113,3,49,1,54,255,174,3,49,1,56,255,133,3,49,1,58,255,133,3,49,1,71,255,215,3,49,1,250,255,174,3,49,1,252,255,174,3,49,1,254,255,174,3,49,2,0,255,133,3,49,2,7,255,113,3,49,2,11,255,113,3,49,2,95,255,215,3,49,3,73,255,215,3,49,3,75,255,215,3,49,3,77,255,215,3,49,3,79,255,215,3,49,3,81,255,215,3,49,3,83,255,215,3,49,3,85,255,215,3,49,3,87,255,215,3,49,3,89,255,215,3,49,3,91,255,215,3,49,3,93,255,215,3,49,3,95,255,215,3,49,3,111,255,133,3,49,3,113,255,133,3,49,3,115,255,133,3,49,3,143,255,113,3,50,0,5,255,236,3,50,0,10,255,236,3,50,2,7,255,236,3,50,2,11,255,236,3,51,0,5,255,113,3,51,0,10,255,113,3,51,0,38,255,215,3,51,0,42,255,215,3,51,0,45,1,10,3,51,0,50,255,215,3,51,0,52,255,215,3,51,0,55,255,113,3,51,0,57,255,174,3,51,0,58,255,174,3,51,0,60,255,133,3,51,0,137,255,215,3,51,0,148,255,215,3,51,0,149,255,215,3,51,0,150,255,215,3,51,0,151,255,215,3,51,0,152,255,215,3,51,0,154,255,215,3,51,0,159,255,133,3,51,0,200,255,215,3,51,0,202,255,215,3,51,0,204,255,215,3,51,0,206,255,215,3,51,0,222,255,215,3,51,0,224,255,215,3,51,0,226,255,215,3,51,0,228,255,215,3,51,1,14,255,215,3,51,1,16,255,215,3,51,1,18,255,215,3,51,1,20,255,215,3,51,1,36,255,113,3,51,1,38,255,113,3,51,1,54,255,174,3,51,1,56,255,133,3,51,1,58,255,133,3,51,1,71,255,215,3,51,1,250,255,174,3,51,1,252,255,174,3,51,1,254,255,174,3,51,2,0,255,133,3,51,2,7,255,113,3,51,2,11,255,113,3,51,2,95,255,215,3,51,3,73,255,215,3,51,3,75,255,215,3,51,3,77,255,215,3,51,3,79,255,215,3,51,3,81,255,215,3,51,3,83,255,215,3,51,3,85,255,215,3,51,3,87,255,215,3,51,3,89,255,215,3,51,3,91,255,215,3,51,3,93,255,215,3,51,3,95,255,215,3,51,3,111,255,133,3,51,3,113,255,133,3,51,3,115,255,133,3,51,3,143,255,113,3,52,0,5,255,236,3,52,0,10,255,236,3,52,2,7,255,236,3,52,2,11,255,236,3,53,0,45,0,123,3,54,0,5,255,236,3,54,0,10,255,236,3,54,0,89,255,215,3,54,0,90,255,215,3,54,0,91,255,215,3,54,0,92,255,215,3,54,0,93,255,236,3,54,0,191,255,215,3,54,1,55,255,215,3,54,1,60,255,236,3,54,1,62,255,236,3,54,1,64,255,236,3,54,1,251,255,215,3,54,1,253,255,215,3,54,2,7,255,236,3,54,2,11,255,236,3,54,3,112,255,215,3,55,0,45,0,123,3,56,0,5,255,236,3,56,0,10,255,236,3,56,0,89,255,215,3,56,0,90,255,215,3,56,0,91,255,215,3,56,0,92,255,215,3,56,0,93,255,236,3,56,0,191,255,215,3,56,1,55,255,215,3,56,1,60,255,236,3,56,1,62,255,236,3,56,1,64,255,236,3,56,1,251,255,215,3,56,1,253,255,215,3,56,2,7,255,236,3,56,2,11,255,236,3,56,3,112,255,215,3,57,0,45,0,123,3,58,0,5,255,236,3,58,0,10,255,236,3,58,0,89,255,215,3,58,0,90,255,215,3,58,0,91,255,215,3,58,0,92,255,215,3,58,0,93,255,236,3,58,0,191,255,215,3,58,1,55,255,215,3,58,1,60,255,236,3,58,1,62,255,236,3,58,1,64,255,236,3,58,1,251,255,215,3,58,1,253,255,215,3,58,2,7,255,236,3,58,2,11,255,236,3,58,3,112,255,215,3,59,0,45,0,123,3,60,0,5,255,236,3,60,0,10,255,236,3,60,0,89,255,215,3,60,0,90,255,215,3,60,0,91,255,215,3,60,0,92,255,215,3,60,0,93,255,236,3,60,0,191,255,215,3,60,1,55,255,215,3,60,1,60,255,236,3,60,1,62,255,236,3,60,1,64,255,236,3,60,1,251,255,215,3,60,1,253,255,215,3,60,2,7,255,236,3,60,2,11,255,236,3,60,3,112,255,215,3,61,0,45,0,123,3,62,0,5,255,236,3,62,0,10,255,236,3,62,0,89,255,215,3,62,0,90,255,215,3,62,0,91,255,215,3,62,0,92,255,215,3,62,0,93,255,236,3,62,0,191,255,215,3,62,1,55,255,215,3,62,1,60,255,236,3,62,1,62,255,236,3,62,1,64,255,236,3,62,1,251,255,215,3,62,1,253,255,215,3,62,2,7,255,236,3,62,2,11,255,236,3,62,3,112,255,215,3,63,0,45,0,123,3,64,0,5,255,236,3,64,0,10,255,236,3,64,0,89,255,215,3,64,0,90,255,215,3,64,0,91,255,215,3,64,0,92,255,215,3,64,0,93,255,236,3,64,0,191,255,215,3,64,1,55,255,215,3,64,1,60,255,236,3,64,1,62,255,236,3,64,1,64,255,236,3,64,1,251,255,215,3,64,1,253,255,215,3,64,2,7,255,236,3,64,2,11,255,236,3,64,3,112,255,215,3,65,0,45,0,123,3,66,0,5,255,236,3,66,0,10,255,236,3,66,0,89,255,215,3,66,0,90,255,215,3,66,0,91,255,215,3,66,0,92,255,215,3,66,0,93,255,236,3,66,0,191,255,215,3,66,1,55,255,215,3,66,1,60,255,236,3,66,1,62,255,236,3,66,1,64,255,236,3,66,1,251,255,215,3,66,1,253,255,215,3,66,2,7,255,236,3,66,2,11,255,236,3,66,3,112,255,215,3,67,0,45,0,123,3,68,0,5,255,236,3,68,0,10,255,236,3,68,0,89,255,215,3,68,0,90,255,215,3,68,0,91,255,215,3,68,0,92,255,215,3,68,0,93,255,236,3,68,0,191,255,215,3,68,1,55,255,215,3,68,1,60,255,236,3,68,1,62,255,236,3,68,1,64,255,236,3,68,1,251,255,215,3,68,1,253,255,215,3,68,2,7,255,236,3,68,2,11,255,236,3,68,3,112,255,215,3,73,0,15,255,174,3,73,0,17,255,174,3,73,0,36,255,215,3,73,0,55,255,195,3,73,0,57,255,236,3,73,0,58,255,236,3,73,0,59,255,215,3,73,0,60,255,236,3,73,0,61,255,236,3,73,0,130,255,215,3,73,0,131,255,215,3,73,0,132,255,215,3,73,0,133,255,215,3,73,0,134,255,215,3,73,0,135,255,215,3,73,0,159,255,236,3,73,0,194,255,215,3,73,0,196,255,215,3,73,0,198,255,215,3,73,1,36,255,195,3,73,1,38,255,195,3,73,1,54,255,236,3,73,1,56,255,236,3,73,1,58,255,236,3,73,1,59,255,236,3,73,1,61,255,236,3,73,1,63,255,236,3,73,1,67,255,215,3,73,1,160,255,236,3,73,1,250,255,236,3,73,1,252,255,236,3,73,1,254,255,236,3,73,2,0,255,236,3,73,2,8,255,174,3,73,2,12,255,174,3,73,2,88,255,215,3,73,3,29,255,215,3,73,3,31,255,215,3,73,3,33,255,215,3,73,3,35,255,215,3,73,3,37,255,215,3,73,3,39,255,215,3,73,3,41,255,215,3,73,3,43,255,215,3,73,3,45,255,215,3,73,3,47,255,215,3,73,3,49,255,215,3,73,3,51,255,215,3,73,3,111,255,236,3,73,3,113,255,236,3,73,3,115,255,236,3,73,3,143,255,195,3,74,0,5,255,236,3,74,0,10,255,236,3,74,0,89,255,215,3,74,0,90,255,215,3,74,0,91,255,215,3,74,0,92,255,215,3,74,0,93,255,236,3,74,0,191,255,215,3,74,1,55,255,215,3,74,1,60,255,236,3,74,1,62,255,236,3,74,1,64,255,236,3,74,1,251,255,215,3,74,1,253,255,215,3,74,2,7,255,236,3,74,2,11,255,236,3,74,3,112,255,215,3,75,0,15,255,174,3,75,0,17,255,174,3,75,0,36,255,215,3,75,0,55,255,195,3,75,0,57,255,236,3,75,0,58,255,236,3,75,0,59,255,215,3,75,0,60,255,236,3,75,0,61,255,236,3,75,0,130,255,215,3,75,0,131,255,215,3,75,0,132,255,215,3,75,0,133,255,215,3,75,0,134,255,215,3,75,0,135,255,215,3,75,0,159,255,236,3,75,0,194,255,215,3,75,0,196,255,215,3,75,0,198,255,215,3,75,1,36,255,195,3,75,1,38,255,195,3,75,1,54,255,236,3,75,1,56,255,236,3,75,1,58,255,236,3,75,1,59,255,236,3,75,1,61,255,236,3,75,1,63,255,236,3,75,1,67,255,215,3,75,1,160,255,236,3,75,1,250,255,236,3,75,1,252,255,236,3,75,1,254,255,236,3,75,2,0,255,236,3,75,2,8,255,174,3,75,2,12,255,174,3,75,2,88,255,215,3,75,3,29,255,215,3,75,3,31,255,215,3,75,3,33,255,215,3,75,3,35,255,215,3,75,3,37,255,215,3,75,3,39,255,215,3,75,3,41,255,215,3,75,3,43,255,215,3,75,3,45,255,215,3,75,3,47,255,215,3,75,3,49,255,215,3,75,3,51,255,215,3,75,3,111,255,236,3,75,3,113,255,236,3,75,3,115,255,236,3,75,3,143,255,195,3,76,0,5,255,236,3,76,0,10,255,236,3,76,0,89,255,215,3,76,0,90,255,215,3,76,0,91,255,215,3,76,0,92,255,215,3,76,0,93,255,236,3,76,0,191,255,215,3,76,1,55,255,215,3,76,1,60,255,236,3,76,1,62,255,236,3,76,1,64,255,236,3,76,1,251,255,215,3,76,1,253,255,215,3,76,2,7,255,236,3,76,2,11,255,236,3,76,3,112,255,215,3,77,0,15,255,174,3,77,0,17,255,174,3,77,0,36,255,215,3,77,0,55,255,195,3,77,0,57,255,236,3,77,0,58,255,236,3,77,0,59,255,215,3,77,0,60,255,236,3,77,0,61,255,236,3,77,0,130,255,215,3,77,0,131,255,215,3,77,0,132,255,215,3,77,0,133,255,215,3,77,0,134,255,215,3,77,0,135,255,215,3,77,0,159,255,236,3,77,0,194,255,215,3,77,0,196,255,215,3,77,0,198,255,215,3,77,1,36,255,195,3,77,1,38,255,195,3,77,1,54,255,236,3,77,1,56,255,236,3,77,1,58,255,236,3,77,1,59,255,236,3,77,1,61,255,236,3,77,1,63,255,236,3,77,1,67,255,215,3,77,1,160,255,236,3,77,1,250,255,236,3,77,1,252,255,236,3,77,1,254,255,236,3,77,2,0,255,236,3,77,2,8,255,174,3,77,2,12,255,174,3,77,2,88,255,215,3,77,3,29,255,215,3,77,3,31,255,215,3,77,3,33,255,215,3,77,3,35,255,215,3,77,3,37,255,215,3,77,3,39,255,215,3,77,3,41,255,215,3,77,3,43,255,215,3,77,3,45,255,215,3,77,3,47,255,215,3,77,3,49,255,215,3,77,3,51,255,215,3,77,3,111,255,236,3,77,3,113,255,236,3,77,3,115,255,236,3,77,3,143,255,195,3,79,0,15,255,174,3,79,0,17,255,174,3,79,0,36,255,215,3,79,0,55,255,195,3,79,0,57,255,236,3,79,0,58,255,236,3,79,0,59,255,215,3,79,0,60,255,236,3,79,0,61,255,236,3,79,0,130,255,215,3,79,0,131,255,215,3,79,0,132,255,215,3,79,0,133,255,215,3,79,0,134,255,215,3,79,0,135,255,215,3,79,0,159,255,236,3,79,0,194,255,215,3,79,0,196,255,215,3,79,0,198,255,215,3,79,1,36,255,195,3,79,1,38,255,195,3,79,1,54,255,236,3,79,1,56,255,236,3,79,1,58,255,236,3,79,1,59,255,236,3,79,1,61,255,236,3,79,1,63,255,236,3,79,1,67,255,215,3,79,1,160,255,236,3,79,1,250,255,236,3,79,1,252,255,236,3,79,1,254,255,236,3,79,2,0,255,236,3,79,2,8,255,174,3,79,2,12,255,174,3,79,2,88,255,215,3,79,3,29,255,215,3,79,3,31,255,215,3,79,3,33,255,215,3,79,3,35,255,215,3,79,3,37,255,215,3,79,3,39,255,215,3,79,3,41,255,215,3,79,3,43,255,215,3,79,3,45,255,215,3,79,3,47,255,215,3,79,3,49,255,215,3,79,3,51,255,215,3,79,3,111,255,236,3,79,3,113,255,236,3,79,3,115,255,236,3,79,3,143,255,195,3,81,0,15,255,174,3,81,0,17,255,174,3,81,0,36,255,215,3,81,0,55,255,195,3,81,0,57,255,236,3,81,0,58,255,236,3,81,0,59,255,215,3,81,0,60,255,236,3,81,0,61,255,236,3,81,0,130,255,215,3,81,0,131,255,215,3,81,0,132,255,215,3,81,0,133,255,215,3,81,0,134,255,215,3,81,0,135,255,215,3,81,0,159,255,236,3,81,0,194,255,215,3,81,0,196,255,215,3,81,0,198,255,215,3,81,1,36,255,195,3,81,1,38,255,195,3,81,1,54,255,236,3,81,1,56,255,236,3,81,1,58,255,236,3,81,1,59,255,236,3,81,1,61,255,236,3,81,1,63,255,236,3,81,1,67,255,215,3,81,1,160,255,236,3,81,1,250,255,236,3,81,1,252,255,236,3,81,1,254,255,236,3,81,2,0,255,236,3,81,2,8,255,174,3,81,2,12,255,174,3,81,2,88,255,215,3,81,3,29,255,215,3,81,3,31,255,215,3,81,3,33,255,215,3,81,3,35,255,215,3,81,3,37,255,215,3,81,3,39,255,215,3,81,3,41,255,215,3,81,3,43,255,215,3,81,3,45,255,215,3,81,3,47,255,215,3,81,3,49,255,215,3,81,3,51,255,215,3,81,3,111,255,236,3,81,3,113,255,236,3,81,3,115,255,236,3,81,3,143,255,195,3,83,0,15,255,174,3,83,0,17,255,174,3,83,0,36,255,215,3,83,0,55,255,195,3,83,0,57,255,236,3,83,0,58,255,236,3,83,0,59,255,215,3,83,0,60,255,236,3,83,0,61,255,236,3,83,0,130,255,215,3,83,0,131,255,215,3,83,0,132,255,215,3,83,0,133,255,215,3,83,0,134,255,215,3,83,0,135,255,215,3,83,0,159,255,236,3,83,0,194,255,215,3,83,0,196,255,215,3,83,0,198,255,215,3,83,1,36,255,195,3,83,1,38,255,195,3,83,1,54,255,236,3,83,1,56,255,236,3,83,1,58,255,236,3,83,1,59,255,236,3,83,1,61,255,236,3,83,1,63,255,236,3,83,1,67,255,215,3,83,1,160,255,236,3,83,1,250,255,236,3,83,1,252,255,236,3,83,1,254,255,236,3,83,2,0,255,236,3,83,2,8,255,174,3,83,2,12,255,174,3,83,2,88,255,215,3,83,3,29,255,215,3,83,3,31,255,215,3,83,3,33,255,215,3,83,3,35,255,215,3,83,3,37,255,215,3,83,3,39,255,215,3,83,3,41,255,215,3,83,3,43,255,215,3,83,3,45,255,215,3,83,3,47,255,215,3,83,3,49,255,215,3,83,3,51,255,215,3,83,3,111,255,236,3,83,3,113,255,236,3,83,3,115,255,236,3,83,3,143,255,195,3,85,0,15,255,174,3,85,0,17,255,174,3,85,0,36,255,215,3,85,0,55,255,195,3,85,0,57,255,236,3,85,0,58,255,236,3,85,0,59,255,215,3,85,0,60,255,236,3,85,0,61,255,236,3,85,0,130,255,215,3,85,0,131,255,215,3,85,0,132,255,215,3,85,0,133,255,215,3,85,0,134,255,215,3,85,0,135,255,215,3,85,0,159,255,236,3,85,0,194,255,215,3,85,0,196,255,215,3,85,0,198,255,215,3,85,1,36,255,195,3,85,1,38,255,195,3,85,1,54,255,236,3,85,1,56,255,236,3,85,1,58,255,236,3,85,1,59,255,236,3,85,1,61,255,236,3,85,1,63,255,236,3,85,1,67,255,215,3,85,1,160,255,236,3,85,1,250,255,236,3,85,1,252,255,236,3,85,1,254,255,236,3,85,2,0,255,236,3,85,2,8,255,174,3,85,2,12,255,174,3,85,2,88,255,215,3,85,3,29,255,215,3,85,3,31,255,215,3,85,3,33,255,215,3,85,3,35,255,215,3,85,3,37,255,215,3,85,3,39,255,215,3,85,3,41,255,215,3,85,3,43,255,215,3,85,3,45,255,215,3,85,3,47,255,215,3,85,3,49,255,215,3,85,3,51,255,215,3,85,3,111,255,236,3,85,3,113,255,236,3,85,3,115,255,236,3,85,3,143,255,195,3,88,0,73,0,82,3,88,0,87,0,82,3,88,0,89,0,102,3,88,0,90,0,102,3,88,0,91,0,102,3,88,0,92,0,102,3,88,0,191,0,102,3,88,1,37,0,82,3,88,1,39,0,82,3,88,1,55,0,102,3,88,1,251,0,102,3,88,1,253,0,102,3,88,2,52,0,82,3,88,2,53,0,82,3,88,2,93,0,82,3,88,2,94,0,82,3,88,3,112,0,102,3,88,3,141,0,82,3,88,3,144,0,82,3,90,0,73,0,82,3,90,0,87,0,82,3,90,0,89,0,102,3,90,0,90,0,102,3,90,0,91,0,102,3,90,0,92,0,102,3,90,0,191,0,102,3,90,1,37,0,82,3,90,1,39,0,82,3,90,1,55,0,102,3,90,1,251,0,102,3,90,1,253,0,102,3,90,2,52,0,82,3,90,2,53,0,82,3,90,2,93,0,82,3,90,2,94,0,82,3,90,3,112,0,102,3,90,3,141,0,82,3,90,3,144,0,82,3,92,0,73,0,82,3,92,0,87,0,82,3,92,0,89,0,102,3,92,0,90,0,102,3,92,0,91,0,102,3,92,0,92,0,102,3,92,0,191,0,102,3,92,1,37,0,82,3,92,1,39,0,82,3,92,1,55,0,102,3,92,1,251,0,102,3,92,1,253,0,102,3,92,2,52,0,82,3,92,2,53,0,82,3,92,2,93,0,82,3,92,2,94,0,82,3,92,3,112,0,102,3,92,3,141,0,82,3,92,3,144,0,82,3,94,0,73,0,82,3,94,0,87,0,82,3,94,0,89,0,102,3,94,0,90,0,102,3,94,0,91,0,102,3,94,0,92,0,102,3,94,0,191,0,102,3,94,1,37,0,82,3,94,1,39,0,82,3,94,1,55,0,102,3,94,1,251,0,102,3,94,1,253,0,102,3,94,2,52,0,82,3,94,2,53,0,82,3,94,2,93,0,82,3,94,2,94,0,82,3,94,3,112,0,102,3,94,3,141,0,82,3,94,3,144,0,82,3,96,0,73,0,82,3,96,0,87,0,82,3,96,0,89,0,102,3,96,0,90,0,102,3,96,0,91,0,102,3,96,0,92,0,102,3,96,0,191,0,102,3,96,1,37,0,82,3,96,1,39,0,82,3,96,1,55,0,102,3,96,1,251,0,102,3,96,1,253,0,102,3,96,2,52,0,82,3,96,2,53,0,82,3,96,2,93,0,82,3,96,2,94,0,82,3,96,3,112,0,102,3,96,3,141,0,82,3,96,3,144,0,82,3,97,0,15,255,215,3,97,0,17,255,215,3,97,0,36,255,236,3,97,0,130,255,236,3,97,0,131,255,236,3,97,0,132,255,236,3,97,0,133,255,236,3,97,0,134,255,236,3,97,0,135,255,236,3,97,0,194,255,236,3,97,0,196,255,236,3,97,0,198,255,236,3,97,1,67,255,236,3,97,2,8,255,215,3,97,2,12,255,215,3,97,2,88,255,236,3,97,3,29,255,236,3,97,3,31,255,236,3,97,3,33,255,236,3,97,3,35,255,236,3,97,3,37,255,236,3,97,3,39,255,236,3,97,3,41,255,236,3,97,3,43,255,236,3,97,3,45,255,236,3,97,3,47,255,236,3,97,3,49,255,236,3,97,3,51,255,236,3,102,0,73,0,102,3,102,0,87,0,102,3,102,0,89,0,102,3,102,0,90,0,102,3,102,0,91,0,102,3,102,0,92,0,102,3,102,0,191,0,102,3,102,1,37,0,102,3,102,1,39,0,102,3,102,1,55,0,102,3,102,1,251,0,102,3,102,1,253,0,102,3,102,2,52,0,102,3,102,2,53,0,102,3,102,2,93,0,102,3,102,2,94,0,102,3,102,3,112,0,102,3,102,3,141,0,102,3,102,3,144,0,102,3,104,0,73,0,102,3,104,0,87,0,102,3,104,0,89,0,102,3,104,0,90,0,102,3,104,0,91,0,102,3,104,0,92,0,102,3,104,0,191,0,102,3,104,1,37,0,102,3,104,1,39,0,102,3,104,1,55,0,102,3,104,1,251,0,102,3,104,1,253,0,102,3,104,2,52,0,102,3,104,2,53,0,102,3,104,2,93,0,102,3,104,2,94,0,102,3,104,3,112,0,102,3,104,3,141,0,102,3,104,3,144,0,102,3,106,0,73,0,102,3,106,0,87,0,102,3,106,0,89,0,102,3,106,0,90,0,102,3,106,0,91,0,102,3,106,0,92,0,102,3,106,0,191,0,102,3,106,1,37,0,102,3,106,1,39,0,102,3,106,1,55,0,102,3,106,1,251,0,102,3,106,1,253,0,102,3,106,2,52,0,102,3,106,2,53,0,102,3,106,2,93,0,102,3,106,2,94,0,102,3,106,3,112,0,102,3,106,3,141,0,102,3,106,3,144,0,102,3,108,0,73,0,102,3,108,0,87,0,102,3,108,0,89,0,102,3,108,0,90,0,102,3,108,0,91,0,102,3,108,0,92,0,102,3,108,0,191,0,102,3,108,1,37,0,102,3,108,1,39,0,102,3,108,1,55,0,102,3,108,1,251,0,102,3,108,1,253,0,102,3,108,2,52,0,102,3,108,2,53,0,102,3,108,2,93,0,102,3,108,2,94,0,102,3,108,3,112,0,102,3,108,3,141,0,102,3,108,3,144,0,102,3,110,0,73,0,102,3,110,0,87,0,102,3,110,0,89,0,102,3,110,0,90,0,102,3,110,0,91,0,102,3,110,0,92,0,102,3,110,0,191,0,102,3,110,1,37,0,102,3,110,1,39,0,102,3,110,1,55,0,102,3,110,1,251,0,102,3,110,1,253,0,102,3,110,2,52,0,102,3,110,2,53,0,102,3,110,2,93,0,102,3,110,2,94,0,102,3,110,3,112,0,102,3,110,3,141,0,102,3,110,3,144,0,102,3,111,0,15,255,133,3,111,0,17,255,133,3,111,0,34,0,41,3,111,0,36,255,133,3,111,0,38,255,215,3,111,0,42,255,215,3,111,0,50,255,215,3,111,0,52,255,215,3,111,0,68,255,154,3,111,0,70,255,154,3,111,0,71,255,154,3,111,0,72,255,154,3,111,0,74,255,215,3,111,0,80,255,195,3,111,0,81,255,195,3,111,0,82,255,154,3,111,0,83,255,195,3,111,0,84,255,154,3,111,0,85,255,195,3,111,0,86,255,174,3,111,0,88,255,195,3,111,0,93,255,215,3,111,0,130,255,133,3,111,0,131,255,133,3,111,0,132,255,133,3,111,0,133,255,133,3,111,0,134,255,133,3,111,0,135,255,133,3,111,0,137,255,215,3,111,0,148,255,215,3,111,0,149,255,215,3,111,0,150,255,215,3,111,0,151,255,215,3,111,0,152,255,215,3,111,0,154,255,215,3,111,0,162,255,154,3,111,0,163,255,154,3,111,0,164,255,154,3,111,0,165,255,154,3,111,0,166,255,154,3,111,0,167,255,154,3,111,0,168,255,154,3,111,0,169,255,154,3,111,0,170,255,154,3,111,0,171,255,154,3,111,0,172,255,154,3,111,0,173,255,154,3,111,0,180,255,154,3,111,0,181,255,154,3,111,0,182,255,154,3,111,0,183,255,154,3,111,0,184,255,154,3,111,0,186,255,154,3,111,0,187,255,195,3,111,0,188,255,195,3,111,0,189,255,195,3,111,0,190,255,195,3,111,0,194,255,133,3,111,0,195,255,154,3,111,0,196,255,133,3,111,0,197,255,154,3,111,0,198,255,133,3,111,0,199,255,154,3,111,0,200,255,215,3,111,0,201,255,154,3,111,0,202,255,215,3,111,0,203,255,154,3,111,0,204,255,215,3,111,0,205,255,154,3,111,0,206,255,215,3,111,0,207,255,154,3,111,0,209,255,154,3,111,0,211,255,154,3,111,0,213,255,154,3,111,0,215,255,154,3,111,0,217,255,154,3,111,0,219,255,154,3,111,0,221,255,154,3,111,0,222,255,215,3,111,0,223,255,215,3,111,0,224,255,215,3,111,0,225,255,215,3,111,0,226,255,215,3,111,0,227,255,215,3,111,0,228,255,215,3,111,0,229,255,215,3,111,0,250,255,195,3,111,1,6,255,195,3,111,1,8,255,195,3,111,1,13,255,195,3,111,1,14,255,215,3,111,1,15,255,154,3,111,1,16,255,215,3,111,1,17,255,154,3,111,1,18,255,215,3,111,1,19,255,154,3,111,1,20,255,215,3,111,1,21,255,154,3,111,1,23,255,195,3,111,1,25,255,195,3,111,1,29,255,174,3,111,1,33,255,174,3,111,1,43,255,195,3,111,1,45,255,195,3,111,1,47,255,195,3,111,1,49,255,195,3,111,1,51,255,195,3,111,1,53,255,195,3,111,1,60,255,215,3,111,1,62,255,215,3,111,1,64,255,215,3,111,1,67,255,133,3,111,1,68,255,154,3,111,1,70,255,154,3,111,1,71,255,215,3,111,1,72,255,154,3,111,1,74,255,174,3,111,2,8,255,133,3,111,2,12,255,133,3,111,2,87,255,195,3,111,2,88,255,133,3,111,2,89,255,154,3,111,2,95,255,215,3,111,2,96,255,154,3,111,2,98,255,195,3,111,3,29,255,133,3,111,3,30,255,154,3,111,3,31,255,133,3,111,3,32,255,154,3,111,3,33,255,133,3,111,3,34,255,154,3,111,3,35,255,133,3,111,3,37,255,133,3,111,3,38,255,154,3,111,3,39,255,133,3,111,3,40,255,154,3,111,3,41,255,133,3,111,3,42,255,154,3,111,3,43,255,133,3,111,3,44,255,154,3,111,3,45,255,133,3,111,3,46,255,154,3,111,3,47,255,133,3,111,3,48,255,154,3,111,3,49,255,133,3,111,3,50,255,154,3,111,3,51,255,133,3,111,3,52,255,154,3,111,3,54,255,154,3,111,3,56,255,154,3,111,3,58,255,154,3,111,3,60,255,154,3,111,3,64,255,154,3,111,3,66,255,154,3,111,3,68,255,154,3,111,3,73,255,215,3,111,3,74,255,154,3,111,3,75,255,215,3,111,3,76,255,154,3,111,3,77,255,215,3,111,3,78,255,154,3,111,3,79,255,215,3,111,3,81,255,215,3,111,3,82,255,154,3,111,3,83,255,215,3,111,3,84,255,154,3,111,3,85,255,215,3,111,3,86,255,154,3,111,3,87,255,215,3,111,3,88,255,154,3,111,3,89,255,215,3,111,3,90,255,154,3,111,3,91,255,215,3,111,3,92,255,154,3,111,3,93,255,215,3,111,3,94,255,154,3,111,3,95,255,215,3,111,3,96,255,154,3,111,3,98,255,195,3,111,3,100,255,195,3,111,3,102,255,195,3,111,3,104,255,195,3,111,3,106,255,195,3,111,3,108,255,195,3,111,3,110,255,195,3,112,0,5,0,82,3,112,0,10,0,82,3,112,0,15,255,174,3,112,0,17,255,174,3,112,0,34,0,41,3,112,2,7,0,82,3,112,2,8,255,174,3,112,2,11,0,82,3,112,2,12,255,174,3,113,0,15,255,133,3,113,0,17,255,133,3,113,0,34,0,41,3,113,0,36,255,133,3,113,0,38,255,215,3,113,0,42,255,215,3,113,0,50,255,215,3,113,0,52,255,215,3,113,0,68,255,154,3,113,0,70,255,154,3,113,0,71,255,154,3,113,0,72,255,154,3,113,0,74,255,215,3,113,0,80,255,195,3,113,0,81,255,195,3,113,0,82,255,154,3,113,0,83,255,195,3,113,0,84,255,154,3,113,0,85,255,195,3,113,0,86,255,174,3,113,0,88,255,195,3,113,0,93,255,215,3,113,0,130,255,133,3,113,0,131,255,133,3,113,0,132,255,133,3,113,0,133,255,133,3,113,0,134,255,133,3,113,0,135,255,133,3,113,0,137,255,215,3,113,0,148,255,215,3,113,0,149,255,215,3,113,0,150,255,215,3,113,0,151,255,215,3,113,0,152,255,215,3,113,0,154,255,215,3,113,0,162,255,154,3,113,0,163,255,154,3,113,0,164,255,154,3,113,0,165,255,154,3,113,0,166,255,154,3,113,0,167,255,154,3,113,0,168,255,154,3,113,0,169,255,154,3,113,0,170,255,154,3,113,0,171,255,154,3,113,0,172,255,154,3,113,0,173,255,154,3,113,0,180,255,154,3,113,0,181,255,154,3,113,0,182,255,154,3,113,0,183,255,154,3,113,0,184,255,154,3,113,0,186,255,154,3,113,0,187,255,195,3,113,0,188,255,195,3,113,0,189,255,195,3,113,0,190,255,195,3,113,0,194,255,133,3,113,0,195,255,154,3,113,0,196,255,133,3,113,0,197,255,154,3,113,0,198,255,133,3,113,0,199,255,154,3,113,0,200,255,215,3,113,0,201,255,154,3,113,0,202,255,215,3,113,0,203,255,154,3,113,0,204,255,215,3,113,0,205,255,154,3,113,0,206,255,215,3,113,0,207,255,154,3,113,0,209,255,154,3,113,0,211,255,154,3,113,0,213,255,154,3,113,0,215,255,154,3,113,0,217,255,154,3,113,0,219,255,154,3,113,0,221,255,154,3,113,0,222,255,215,3,113,0,223,255,215,3,113,0,224,255,215,3,113,0,225,255,215,3,113,0,226,255,215,3,113,0,227,255,215,3,113,0,228,255,215,3,113,0,229,255,215,3,113,0,250,255,195,3,113,1,6,255,195,3,113,1,8,255,195,3,113,1,13,255,195,3,113,1,14,255,215,3,113,1,15,255,154,3,113,1,16,255,215,3,113,1,17,255,154,3,113,1,18,255,215,3,113,1,19,255,154,3,113,1,20,255,215,3,113,1,21,255,154,3,113,1,23,255,195,3,113,1,25,255,195,3,113,1,29,255,174,3,113,1,33,255,174,3,113,1,43,255,195,3,113,1,45,255,195,3,113,1,47,255,195,3,113,1,49,255,195,3,113,1,51,255,195,3,113,1,53,255,195,3,113,1,60,255,215,3,113,1,62,255,215,3,113,1,64,255,215,3,113,1,67,255,133,3,113,1,68,255,154,3,113,1,70,255,154,3,113,1,71,255,215,3,113,1,72,255,154,3,113,1,74,255,174,3,113,2,8,255,133,3,113,2,12,255,133,3,113,2,87,255,195,3,113,2,88,255,133,3,113,2,89,255,154,3,113,2,95,255,215,3,113,2,96,255,154,3,113,2,98,255,195,3,113,3,29,255,133,3,113,3,30,255,154,3,113,3,31,255,133,3,113,3,32,255,154,3,113,3,33,255,133,3,113,3,34,255,154,3,113,3,35,255,133,3,113,3,37,255,133,3,113,3,38,255,154,3,113,3,39,255,133,3,113,3,40,255,154,3,113,3,41,255,133,3,113,3,42,255,154,3,113,3,43,255,133,3,113,3,44,255,154,3,113,3,45,255,133,3,113,3,46,255,154,3,113,3,47,255,133,3,113,3,48,255,154,3,113,3,49,255,133,3,113,3,50,255,154,3,113,3,51,255,133,3,113,3,52,255,154,3,113,3,54,255,154,3,113,3,56,255,154,3,113,3,58,255,154,3,113,3,60,255,154,3,113,3,64,255,154,3,113,3,66,255,154,3,113,3,68,255,154,3,113,3,73,255,215,3,113,3,74,255,154,3,113,3,75,255,215,3,113,3,76,255,154,3,113,3,77,255,215,3,113,3,78,255,154,3,113,3,79,255,215,3,113,3,81,255,215,3,113,3,82,255,154,3,113,3,83,255,215,3,113,3,84,255,154,3,113,3,85,255,215,3,113,3,86,255,154,3,113,3,87,255,215,3,113,3,88,255,154,3,113,3,89,255,215,3,113,3,90,255,154,3,113,3,91,255,215,3,113,3,92,255,154,3,113,3,93,255,215,3,113,3,94,255,154,3,113,3,95,255,215,3,113,3,96,255,154,3,113,3,98,255,195,3,113,3,100,255,195,3,113,3,102,255,195,3,113,3,104,255,195,3,113,3,106,255,195,3,113,3,108,255,195,3,113,3,110,255,195,3,114,0,5,0,82,3,114,0,10,0,82,3,114,0,15,255,174,3,114,0,17,255,174,3,114,0,34,0,41,3,114,2,7,0,82,3,114,2,8,255,174,3,114,2,11,0,82,3,114,2,12,255,174,3,115,0,15,255,133,3,115,0,17,255,133,3,115,0,34,0,41,3,115,0,36,255,133,3,115,0,38,255,215,3,115,0,42,255,215,3,115,0,50,255,215,3,115,0,52,255,215,3,115,0,68,255,154,3,115,0,70,255,154,3,115,0,71,255,154,3,115,0,72,255,154,3,115,0,74,255,215,3,115,0,80,255,195,3,115,0,81,255,195,3,115,0,82,255,154,3,115,0,83,255,195,3,115,0,84,255,154,3,115,0,85,255,195,3,115,0,86,255,174,3,115,0,88,255,195,3,115,0,93,255,215,3,115,0,130,255,133,3,115,0,131,255,133,3,115,0,132,255,133,3,115,0,133,255,133,3,115,0,134,255,133,3,115,0,135,255,133,3,115,0,137,255,215,3,115,0,148,255,215,3,115,0,149,255,215,3,115,0,150,255,215,3,115,0,151,255,215,3,115,0,152,255,215,3,115,0,154,255,215,3,115,0,162,255,154,3,115,0,163,255,154,3,115,0,164,255,154,3,115,0,165,255,154,3,115,0,166,255,154,3,115,0,167,255,154,3,115,0,168,255,154,3,115,0,169,255,154,3,115,0,170,255,154,3,115,0,171,255,154,3,115,0,172,255,154,3,115,0,173,255,154,3,115,0,180,255,154,3,115,0,181,255,154,3,115,0,182,255,154,3,115,0,183,255,154,3,115,0,184,255,154,3,115,0,186,255,154,3,115,0,187,255,195,3,115,0,188,255,195,3,115,0,189,255,195,3,115,0,190,255,195,3,115,0,194,255,133,3,115,0,195,255,154,3,115,0,196,255,133,3,115,0,197,255,154,3,115,0,198,255,133,3,115,0,199,255,154,3,115,0,200,255,215,3,115,0,201,255,154,3,115,0,202,255,215,3,115,0,203,255,154,3,115,0,204,255,215,3,115,0,205,255,154,3,115,0,206,255,215,3,115,0,207,255,154,3,115,0,209,255,154,3,115,0,211,255,154,3,115,0,213,255,154,3,115,0,215,255,154,3,115,0,217,255,154,3,115,0,219,255,154,3,115,0,221,255,154,3,115,0,222,255,215,3,115,0,223,255,215,3,115,0,224,255,215,3,115,0,225,255,215,3,115,0,226,255,215,3,115,0,227,255,215,3,115,0,228,255,215,3,115,0,229,255,215,3,115,0,250,255,195,3,115,1,6,255,195,3,115,1,8,255,195,3,115,1,13,255,195,3,115,1,14,255,215,3,115,1,15,255,154,3,115,1,16,255,215,3,115,1,17,255,154,3,115,1,18,255,215,3,115,1,19,255,154,3,115,1,20,255,215,3,115,1,21,255,154,3,115,1,23,255,195,3,115,1,25,255,195,3,115,1,29,255,174,3,115,1,33,255,174,3,115,1,43,255,195,3,115,1,45,255,195,3,115,1,47,255,195,3,115,1,49,255,195,3,115,1,51,255,195,3,115,1,53,255,195,3,115,1,60,255,215,3,115,1,62,255,215,3,115,1,64,255,215,3,115,1,67,255,133,3,115,1,68,255,154,3,115,1,70,255,154,3,115,1,71,255,215,3,115,1,72,255,154,3,115,1,74,255,174,3,115,2,8,255,133,3,115,2,12,255,133,3,115,2,87,255,195,3,115,2,88,255,133,3,115,2,89,255,154,3,115,2,95,255,215,3,115,2,96,255,154,3,115,2,98,255,195,3,115,3,29,255,133,3,115,3,30,255,154,3,115,3,31,255,133,3,115,3,32,255,154,3,115,3,33,255,133,3,115,3,34,255,154,3,115,3,35,255,133,3,115,3,37,255,133,3,115,3,38,255,154,3,115,3,39,255,133,3,115,3,40,255,154,3,115,3,41,255,133,3,115,3,42,255,154,3,115,3,43,255,133,3,115,3,44,255,154,3,115,3,45,255,133,3,115,3,46,255,154,3,115,3,47,255,133,3,115,3,48,255,154,3,115,3,49,255,133,3,115,3,50,255,154,3,115,3,51,255,133,3,115,3,52,255,154,3,115,3,54,255,154,3,115,3,56,255,154,3,115,3,58,255,154,3,115,3,60,255,154,3,115,3,64,255,154,3,115,3,66,255,154,3,115,3,68,255,154,3,115,3,73,255,215,3,115,3,74,255,154,3,115,3,75,255,215,3,115,3,76,255,154,3,115,3,77,255,215,3,115,3,78,255,154,3,115,3,79,255,215,3,115,3,81,255,215,3,115,3,82,255,154,3,115,3,83,255,215,3,115,3,84,255,154,3,115,3,85,255,215,3,115,3,86,255,154,3,115,3,87,255,215,3,115,3,88,255,154,3,115,3,89,255,215,3,115,3,90,255,154,3,115,3,91,255,215,3,115,3,92,255,154,3,115,3,93,255,215,3,115,3,94,255,154,3,115,3,95,255,215,3,115,3,96,255,154,3,115,3,98,255,195,3,115,3,100,255,195,3,115,3,102,255,195,3,115,3,104,255,195,3,115,3,106,255,195,3,115,3,108,255,195,3,115,3,110,255,195,3,116,0,5,0,82,3,116,0,10,0,82,3,116,0,15,255,174,3,116,0,17,255,174,3,116,0,34,0,41,3,116,2,7,0,82,3,116,2,8,255,174,3,116,2,11,0,82,3,116,2,12,255,174,3,141,0,5,0,123,3,141,0,10,0,123,3,141,2,7,0,123,3,141,2,11,0,123,3,143,0,15,255,133,3,143,0,16,255,174,3,143,0,17,255,133,3,143,0,34,0,41,3,143,0,36,255,113,3,143,0,38,255,215,3,143,0,42,255,215,3,143,0,50,255,215,3,143,0,52,255,215,3,143,0,55,0,41,3,143,0,68,255,92,3,143,0,70,255,113,3,143,0,71,255,113,3,143,0,72,255,113,3,143,0,74,255,113,3,143,0,80,255,154,3,143,0,81,255,154,3,143,0,82,255,113,3,143,0,83,255,154,3,143,0,84,255,113,3,143,0,85,255,154,3,143,0,86,255,133,3,143,0,88,255,154,3,143,0,89,255,215,3,143,0,90,255,215,3,143,0,91,255,215,3,143,0,92,255,215,3,143,0,93,255,174,3,143,0,130,255,113,3,143,0,131,255,113,3,143,0,132,255,113,3,143,0,133,255,113,3,143,0,134,255,113,3,143,0,135,255,113,3,143,0,137,255,215,3,143,0,148,255,215,3,143,0,149,255,215,3,143,0,150,255,215,3,143,0,151,255,215,3,143,0,152,255,215,3,143,0,154,255,215,3,143,0,162,255,113,3,143,0,163,255,92,3,143,0,164,255,92,3,143,0,165,255,92,3,143,0,166,255,92,3,143,0,167,255,92,3,143,0,168,255,92,3,143,0,169,255,113,3,143,0,170,255,113,3,143,0,171,255,113,3,143,0,172,255,113,3,143,0,173,255,113,3,143,0,180,255,113,3,143,0,181,255,113,3,143,0,182,255,113,3,143,0,183,255,113,3,143,0,184,255,113,3,143,0,186,255,113,3,143,0,187,255,154,3,143,0,188,255,154,3,143,0,189,255,154,3,143,0,190,255,154,3,143,0,191,255,215,3,143,0,194,255,113,3,143,0,195,255,92,3,143,0,196,255,113,3,143,0,197,255,92,3,143,0,198,255,113,3,143,0,199,255,92,3,143,0,200,255,215,3,143,0,201,255,113,3,143,0,202,255,215,3,143,0,203,255,113,3,143,0,204,255,215,3,143,0,205,255,113,3,143,0,206,255,215,3,143,0,207,255,113,3,143,0,209,255,113,3,143,0,211,255,113,3,143,0,213,255,113,3,143,0,215,255,113,3,143,0,217,255,113,3,143,0,219,255,113,3,143,0,221,255,113,3,143,0,222,255,215,3,143,0,223,255,113,3,143,0,224,255,215,3,143,0,225,255,113,3,143,0,226,255,215,3,143,0,227,255,113,3,143,0,228,255,215,3,143,0,229,255,113,3,143,0,250,255,154,3,143,1,6,255,154,3,143,1,8,255,154,3,143,1,13,255,154,3,143,1,14,255,215,3,143,1,15,255,113,3,143,1,16,255,215,3,143,1,17,255,113,3,143,1,18,255,215,3,143,1,19,255,113,3,143,1,20,255,215,3,143,1,21,255,113,3,143,1,23,255,154,3,143,1,25,255,154,3,143,1,29,255,133,3,143,1,33,255,133,3,143,1,36,0,41,3,143,1,38,0,41,3,143,1,43,255,154,3,143,1,45,255,154,3,143,1,47,255,154,3,143,1,49,255,154,3,143,1,51,255,154,3,143,1,53,255,154,3,143,1,55,255,215,3,143,1,60,255,174,3,143,1,62,255,174,3,143,1,64,255,174,3,143,1,67,255,113,3,143,1,68,255,92,3,143,1,70,255,92,3,143,1,71,255,215,3,143,1,72,255,113,3,143,1,74,255,133,3,143,1,251,255,215,3,143,1,253,255,215,3,143,2,2,255,174,3,143,2,3,255,174,3,143,2,4,255,174,3,143,2,8,255,133,3,143,2,12,255,133,3,143,2,87,255,154,3,143,2,88,255,113,3,143,2,89,255,92,3,143,2,95,255,215,3,143,2,96,255,113,3,143,2,98,255,154,3,143,3,29,255,113,3,143,3,30,255,92,3,143,3,31,255,113,3,143,3,32,255,92,3,143,3,33,255,113,3,143,3,34,255,92,3,143,3,35,255,113,3,143,3,37,255,113,3,143,3,38,255,92,3,143,3,39,255,113,3,143,3,40,255,92,3,143,3,41,255,113,3,143,3,42,255,92,3,143,3,43,255,113,3,143,3,44,255,92,3,143,3,45,255,113,3,143,3,46,255,92,3,143,3,47,255,113,3,143,3,48,255,92,3,143,3,49,255,113,3,143,3,50,255,92,3,143,3,51,255,113,3,143,3,52,255,92,3,143,3,54,255,113,3,143,3,56,255,113,3,143,3,58,255,113,3,143,3,60,255,113,3,143,3,64,255,113,3,143,3,66,255,113,3,143,3,68,255,113,3,143,3,73,255,215,3,143,3,74,255,113,3,143,3,75,255,215,3,143,3,76,255,113,3,143,3,77,255,215,3,143,3,78,255,113,3,143,3,79,255,215,3,143,3,81,255,215,3,143,3,82,255,113,3,143,3,83,255,215,3,143,3,84,255,113,3,143,3,85,255,215,3,143,3,86,255,113,3,143,3,87,255,215,3,143,3,88,255,113,3,143,3,89,255,215,3,143,3,90,255,113,3,143,3,91,255,215,3,143,3,92,255,113,3,143,3,93,255,215,3,143,3,94,255,113,3,143,3,95,255,215,3,143,3,96,255,113,3,143,3,98,255,154,3,143,3,100,255,154,3,143,3,102,255,154,3,143,3,104,255,154,3,143,3,106,255,154,3,143,3,108,255,154,3,143,3,110,255,154,3,143,3,112,255,215,3,143,3,143,0,41,3,144,0,5,0,41,3,144,0,10,0,41,3,144,2,7,0,41,3,144,2,11,0,41,0,0,0,0,0,26,1,62,0,1,0,0,0,0,0,0,0,57,0,0,0,1,0,0,0,0,0,1,0,9,0,57,0,1,0,0,0,0,0,2,0,7,0,66,0,1,0,0,0,0,0,3,0,30,0,73,0,1,0,0,0,0,0,4,0,9,0,57,0,1,0,0,0,0,0,5,0,12,0,103,0,1,0,0,0,0,0,6,0,8,0,115,0,1,0,0,0,0,0,7,0,82,0,123,0,1,0,0,0,0,0,8,0,20,0,205,0,1,0,0,0,0,0,11,0,28,0,225,0,1,0,0,0,0,0,12,0,46,0,253,0,1,0,0,0,0,0,13,0,46,1,43,0,1,0,0,0,0,0,14,0,42,1,89,0,3,0,1,4,9,0,0,0,114,1,131,0,3,0,1,4,9,0,1,0,18,1,245,0,3,0,1,4,9,0,2,0,14,2,7,0,3,0,1,4,9,0,3,0,60,2,21,0,3,0,1,4,9,0,4,0,18,1,245,0,3,0,1,4,9,0,5,0,24,2,81,0,3,0,1,4,9,0,6,0,16,2,105,0,3,0,1,4,9,0,7,0,164,2,121,0,3,0,1,4,9,0,8,0,40,3,29,0,3,0,1,4,9,0,11,0,56,3,69,0,3,0,1,4,9,0,12,0,92,3,125,0,3,0,1,4,9,0,13,0,92,3,217,0,3,0,1,4,9,0,14,0,84,4,53,68,105,103,105,116,105,122,101,100,32,100,97,116,97,32,99,111,112,121,114,105,103,104,116,32,169,32,50,48,49,48,45,50,48,49,49,44,32,71,111,111,103,108,101,32,67,111,114,112,111,114,97,116,105,111,110,46,79,112,101,110,32,83,97,110,115,82,101,103,117,108,97,114,65,115,99,101,110,100,101,114,32,45,32,79,112,101,110,32,83,97,110,115,32,66,117,105,108,100,32,49,48,48,86,101,114,115,105,111,110,32,49,46,49,48,79,112,101,110,83,97,110,115,79,112,101,110,32,83,97,110,115,32,105,115,32,97,32,116,114,97,100,101,109,97,114,107,32,111,102,32,71,111,111,103,108,101,32,97,110,100,32,109,97,121,32,98,101,32,114,101,103,105,115,116,101,114,101,100,32,105,110,32,99,101,114,116,97,105,110,32,106,117,114,105,115,100,105,99,116,105,111,110,115,46,65,115,99,101,110,100,101,114,32,67,111,114,112,111,114,97,116,105,111,110,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,110,100,101,114,99,111,114,112,46,99,111,109,47,104,116,116,112,58,47,47,119,119,119,46,97,115,99,101,110,100,101,114,99,111,114,112,46,99,111,109,47,116,121,112,101,100,101,115,105,103,110,101,114,115,46,104,116,109,108,76,105,99,101,110,115,101,100,32,117,110,100,101,114,32,116,104,101,32,65,112,97,99,104,101,32,76,105,99,101,110,115,101,44,32,86,101,114,115,105,111,110,32,50,46,48,104,116,116,112,58,47,47,119,119,119,46,97,112,97,99,104,101,46,111,114,103,47,108,105,99,101,110,115,101,115,47,76,73,67,69,78,83,69,45,50,46,48,0,68,0,105,0,103,0,105,0,116,0,105,0,122,0,101,0,100,0,32,0,100,0,97,0,116,0,97,0,32,0,99,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,169,0,32,0,50,0,48,0,49,0,48,0,45,0,50,0,48,0,49,0,49,0,44,0,32,0,71,0,111,0,111,0,103,0,108,0,101,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110,0,46,0,79,0,112,0,101,0,110,0,32,0,83,0,97,0,110,0,115,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,65,0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,32,0,45,0,32,0,79,0,112,0,101,0,110,0,32,0,83,0,97,0,110,0,115,0,32,0,66,0,117,0,105,0,108,0,100,0,32,0,49,0,48,0,48,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,49,0,48,0,79,0,112,0,101,0,110,0,83,0,97,0,110,0,115,0,79,0,112,0,101,0,110,0,32,0,83,0,97,0,110,0,115,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,32,0,71,0,111,0,111,0,103,0,108,0,101,0,32,0,97,0,110,0,100,0,32,0,109,0,97,0,121,0,32,0,98,0,101,0,32,0,114,0,101,0,103,0,105,0,115,0,116,0,101,0,114,0,101,0,100,0,32,0,105,0,110,0,32,0,99,0,101,0,114,0,116,0,97,0,105,0,110,0,32,0,106,0,117,0,114,0,105,0,115,0,100,0,105,0,99,0,116,0,105,0,111,0,110,0,115,0,46,0,65,0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,115,0,99,0,101,0,110,0,100,0,101,0,114,0,99,0,111,0,114,0,112,0,46,0,99,0,111,0,109,0,47,0,116,0,121,0,112,0,101,0,100,0,101,0,115,0,105,0,103,0,110,0,101,0,114,0,115,0,46,0,104,0,116,0,109,0,108,0,76,0,105,0,99,0,101,0,110,0,115,0,101,0,100,0,32,0,117,0,110,0,100,0,101,0,114,0,32,0,116,0,104,0,101,0,32,0,65,0,112,0,97,0,99,0,104,0,101,0,32,0,76,0,105,0,99,0,101,0,110,0,115,0,101,0,44,0,32,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,50,0,46,0,48,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46,0,97,0,112,0,97,0,99,0,104,0,101,0,46,0,111,0,114,0,103,0,47,0,108,0,105,0,99,0,101,0,110,0,115,0,101,0,115,0,47,0,76,0,73,0,67,0,69,0,78,0,83,0,69,0,45,0,50,0,46,0,48,0,0,2,0,0,0,0,0,0,255,102,0,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,170,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,1,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,1,113,1,114,1,115,1,116,1,117,1,118,1,119,1,120,1,121,1,122,1,123,1,124,1,125,1,126,1,127,1,128,1,129,1,130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,1,138,1,139,1,140,1,141,1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151,1,152,1,153,1,154,1,155,1,156,1,157,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,1,176,1,177,1,178,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213,1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1,226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238,1,239,1,240,1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1,251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25,2,26,2,27,2,28,2,29,2,30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,2,39,2,40,2,41,2,42,2,43,2,44,2,45,2,46,2,47,2,48,2,49,2,50,2,51,2,52,2,53,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2,64,2,65,2,66,2,67,2,68,2,69,2,70,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80,2,81,2,82,2,83,2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95,2,96,2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108,2,109,2,110,2,111,2,112,2,113,2,114,2,115,2,116,2,117,2,118,2,119,2,120,2,121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,2,132,2,133,2,134,2,135,2,136,2,137,2,138,2,139,2,140,2,141,2,142,2,143,2,144,2,145,2,146,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,2,155,2,156,2,157,2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,2,168,2,169,2,170,2,171,2,172,2,173,2,174,2,175,2,176,2,177,2,178,2,179,2,180,2,181,2,182,2,183,2,184,2,185,2,186,2,187,2,188,2,189,2,190,2,191,2,192,2,193,2,194,2,195,2,196,2,197,2,198,2,199,2,200,2,201,2,202,2,203,2,204,2,205,2,206,2,207,2,208,2,209,2,210,2,211,2,212,2,213,2,214,2,215,2,216,2,217,2,218,2,219,2,220,2,221,2,222,2,223,2,224,2,225,2,226,2,227,2,228,2,229,2,230,2,231,2,232,2,233,2,234,2,235,2,236,2,237,2,238,2,239,2,240,2,241,2,242,2,243,2,244,2,245,2,246,2,247,2,248,2,249,2,250,2,251,2,252,2,253,2,254,2,255,3,0,3,1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,3,10,3,11,3,12,3,13,3,14,3,15,3,16,3,17,3,18,3,19,3,20,3,21,3,22,3,23,3,24,3,25,3,26,3,27,3,28,3,29,3,30,3,31,3,32,3,33,3,34,3,35,3,36,3,37,3,38,3,39,3,40,3,41,3,42,3,43,3,44,3,45,3,46,3,47,3,48,3,49,3,50,3,51,3,52,3,53,3,54,3,55,3,56,3,57,3,58,3,59,3,60,3,61,3,62,3,63,3,64,3,65,3,66,3,67,3,68,3,69,3,70,3,71,3,72,3,73,3,74,3,75,3,76,3,77,3,78,3,79,3,80,3,81,3,82,3,83,3,84,3,85,3,86,3,87,3,88,3,89,3,90,3,91,3,92,3,93,3,94,3,95,3,96,3,97,3,98,3,99,3,100,3,101,3,102,3,103,3,104,3,105,3,106,3,107,3,108,3,109,3,110,3,111,3,112,3,113,3,114,3,115,3,116,3,117,3,118,3,119,3,120,3,121,3,122,3,123,3,124,3,125,3,126,3,127,3,128,3,129,3,130,3,131,3,132,3,133,3,134,3,135,3,136,3,137,3,138,3,139,3,140,3,141,3,142,3,143,3,144,3,145,3,146,3,147,3,148,3,149,3,150,3,151,3,152,3,153,3,154,3,155,3,156,3,157,3,158,3,159,3,160,3,161,3,162,3,163,3,164,3,165,3,166,3,167,3,168,3,169,3,170,3,171,3,172,3,173,3,174,3,175,3,176,3,177,3,178,3,179,3,180,3,181,3,182,3,183,3,184,3,185,3,186,3,187,3,188,3,189,3,190,3,191,3,192,3,193,3,194,3,195,3,196,3,197,3,198,3,199,3,200,3,201,3,202,3,203,3,204,3,205,3,206,3,207,3,208,3,209,3,210,3,211,3,212,3,213,3,214,3,215,3,216,3,217,3,218,3,219,3,220,3,221,3,222,3,223,3,224,3,225,3,226,3,227,3,228,3,229,3,230,3,231,3,232,3,233,3,234,3,235,3,236,3,237,3,238,3,239,3,240,3,241,3,242,3,243,3,244,3,245,3,246,3,247,3,248,3,249,3,250,3,251,3,252,3,253,3,254,3,255,4,0,4,1,4,2,4,3,4,4,4,5,4,6,4,7,4,8,4,9,4,10,4,11,4,12,4,13,4,14,4,15,4,16,4,17,4,18,4,19,4,20,4,21,4,22,4,23,4,24,4,25,4,26,4,27,4,28,4,29,4,30,4,31,4,32,4,33,4,34,4,35,4,36,4,37,4,38,4,39,4,40,4,41,4,42,4,43,4,44,4,45,4,46,4,47,4,48,4,49,4,50,4,51,4,52,4,53,4,54,4,55,4,56,4,57,4,58,4,59,4,60,4,61,4,62,4,63,4,64,4,65,4,66,4,67,4,68,4,69,4,70,4,71,4,72,4,73,4,74,4,75,4,76,4,77,4,78,4,79,4,80,4,81,4,82,4,83,4,84,4,85,4,86,4,87,4,88,4,89,4,90,4,91,4,92,4,93,4,94,4,95,4,96,4,97,4,98,4,99,4,100,4,101,4,102,4,103,4,104,4,105,4,106,4,107,4,108,4,109,4,110,4,111,4,112,4,113,4,114,4,115,4,116,4,117,4,118,4,119,4,120,4,121,4,122,4,123,4,124,4,125,4,126,4,127,4,128,4,129,4,130,4,131,4,132,4,133,4,134,4,135,4,136,4,137,4,138,4,139,4,140,4,141,4,142,4,143,4,144,4,145,4,146,4,147,4,148,4,149,4,150,4,151,4,152,4,153,4,154,4,155,4,156,4,157,4,158,4,159,4,160,4,161,4,162,4,163,4,164,4,165,4,166,4,167,4,168,4,169,4,170,4,171,7,46,110,111,116,100,101,102,4,110,117,108,108,16,110,111,110,109,97,114,107,105,110,103,114,101,116,117,114,110,5,115,112,97,99,101,6,101,120,99,108,97,109,8,113,117,111,116,101,100,98,108,10,110,117,109,98,101,114,115,105,103,110,6,100,111,108,108,97,114,7,112,101,114,99,101,110,116,9,97,109,112,101,114,115,97,110,100,11,113,117,111,116,101,115,105,110,103,108,101,9,112,97,114,101,110,108,101,102,116,10,112,97,114,101,110,114,105,103,104,116,8,97,115,116,101,114,105,115,107,4,112,108,117,115,5,99,111,109,109,97,6,104,121,112,104,101,110,6,112,101,114,105,111,100,5,115,108,97,115,104,4,122,101,114,111,3,111,110,101,3,116,119,111,5,116,104,114,101,101,4,102,111,117,114,4,102,105,118,101,3,115,105,120,5,115,101,118,101,110,5,101,105,103,104,116,4,110,105,110,101,5,99,111,108,111,110,9,115,101,109,105,99,111,108,111,110,4,108,101,115,115,5,101,113,117,97,108,7,103,114,101,97,116,101,114,8,113,117,101,115,116,105,111,110,2,97,116,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,5,73,46,97,108,116,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,11,98,114,97,99,107,101,116,108,101,102,116,9,98,97,99,107,115,108,97,115,104,12,98,114,97,99,107,101,116,114,105,103,104,116,11,97,115,99,105,105,99,105,114,99,117,109,10,117,110,100,101,114,115,99,111,114,101,5,103,114,97,118,101,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,1,113,1,114,1,115,1,116,1,117,1,118,1,119,1,120,1,121,1,122,9,98,114,97,99,101,108,101,102,116,3,98,97,114,10,98,114,97,99,101,114,105,103,104,116,10,97,115,99,105,105,116,105,108,100,101,16,110,111,110,98,114,101,97,107,105,110,103,115,112,97,99,101,10,101,120,99,108,97,109,100,111,119,110,4,99,101,110,116,8,115,116,101,114,108,105,110,103,8,99,117,114,114,101,110,99,121,3,121,101,110,9,98,114,111,107,101,110,98,97,114,7,115,101,99,116,105,111,110,8,100,105,101,114,101,115,105,115,9,99,111,112,121,114,105,103,104,116,11,111,114,100,102,101,109,105,110,105,110,101,13,103,117,105,108,108,101,109,111,116,108,101,102,116,10,108,111,103,105,99,97,108,110,111,116,7,117,110,105,48,48,65,68,10,114,101,103,105,115,116,101,114,101,100,9,111,118,101,114,115,99,111,114,101,6,100,101,103,114,101,101,9,112,108,117,115,109,105,110,117,115,11,116,119,111,115,117,112,101,114,105,111,114,13,116,104,114,101,101,115,117,112,101,114,105,111,114,5,97,99,117,116,101,2,109,117,9,112,97,114,97,103,114,97,112,104,14,112,101,114,105,111,100,99,101,110,116,101,114,101,100,7,99,101,100,105,108,108,97,11,111,110,101,115,117,112,101,114,105,111,114,12,111,114,100,109,97,115,99,117,108,105,110,101,14,103,117,105,108,108,101,109,111,116,114,105,103,104,116,10,111,110,101,113,117,97,114,116,101,114,7,111,110,101,104,97,108,102,13,116,104,114,101,101,113,117,97,114,116,101,114,115,12,113,117,101,115,116,105,111,110,100,111,119,110,6,65,103,114,97,118,101,6,65,97,99,117,116,101,11,65,99,105,114,99,117,109,102,108,101,120,6,65,116,105,108,100,101,9,65,100,105,101,114,101,115,105,115,5,65,114,105,110,103,2,65,69,8,67,99,101,100,105,108,108,97,6,69,103,114,97,118,101,6,69,97,99,117,116,101,11,69,99,105,114,99,117,109,102,108,101,120,9,69,100,105,101,114,101,115,105,115,10,73,103,114,97,118,101,46,97,108,116,10,73,97,99,117,116,101,46,97,108,116,15,73,99,105,114,99,117,109,102,108,101,120,46,97,108,116,13,73,100,105,101,114,101,115,105,115,46,97,108,116,3,69,116,104,6,78,116,105,108,100,101,6,79,103,114,97,118,101,6,79,97,99,117,116,101,11,79,99,105,114,99,117,109,102,108,101,120,6,79,116,105,108,100,101,9,79,100,105,101,114,101,115,105,115,8,109,117,108,116,105,112,108,121,6,79,115,108,97,115,104,6,85,103,114,97,118,101,6,85,97,99,117,116,101,11,85,99,105,114,99,117,109,102,108,101,120,9,85,100,105,101,114,101,115,105,115,6,89,97,99,117,116,101,5,84,104,111,114,110,10,103,101,114,109,97,110,100,98,108,115,6,97,103,114,97,118,101,6,97,97,99,117,116,101,11,97,99,105,114,99,117,109,102,108,101,120,6,97,116,105,108,100,101,9,97,100,105,101,114,101,115,105,115,5,97,114,105,110,103,2,97,101,8,99,99,101,100,105,108,108,97,6,101,103,114,97,118,101,6,101,97,99,117,116,101,11,101,99,105,114,99,117,109,102,108,101,120,9,101,100,105,101,114,101,115,105,115,6,105,103,114,97,118,101,6,105,97,99,117,116,101,11,105,99,105,114,99,117,109,102,108,101,120,9,105,100,105,101,114,101,115,105,115,3,101,116,104,6,110,116,105,108,100,101,6,111,103,114,97,118,101,6,111,97,99,117,116,101,11,111,99,105,114,99,117,109,102,108,101,120,6,111,116,105,108,100,101,9,111,100,105,101,114,101,115,105,115,6,100,105,118,105,100,101,6,111,115,108,97,115,104,6,117,103,114,97,118,101,6,117,97,99,117,116,101,11,117,99,105,114,99,117,109,102,108,101,120,9,117,100,105,101,114,101,115,105,115,6,121,97,99,117,116,101,5,116,104,111,114,110,9,121,100,105,101,114,101,115,105,115,7,65,109,97,99,114,111,110,7,97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97,98,114,101,118,101,7,65,111,103,111,110,101,107,7,97,111,103,111,110,101,107,6,67,97,99,117,116,101,6,99,97,99,117,116,101,11,67,99,105,114,99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,4,67,100,111,116,4,99,100,111,116,6,67,99,97,114,111,110,6,99,99,97,114,111,110,6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,68,99,114,111,97,116,6,100,99,114,111,97,116,7,69,109,97,99,114,111,110,7,101,109,97,99,114,111,110,6,69,98,114,101,118,101,6,101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110,116,10,101,100,111,116,97,99,99,101,110,116,7,69,111,103,111,110,101,107,7,101,111,103,111,110,101,107,6,69,99,97,114,111,110,6,101,99,97,114,111,110,11,71,99,105,114,99,117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108,101,120,6,71,98,114,101,118,101,6,103,98,114,101,118,101,4,71,100,111,116,4,103,100,111,116,12,71,99,111,109,109,97,97,99,99,101,110,116,12,103,99,111,109,109,97,97,99,99,101,110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104,99,105,114,99,117,109,102,108,101,120,4,72,98,97,114,4,104,98,97,114,10,73,116,105,108,100,101,46,97,108,116,6,105,116,105,108,100,101,11,73,109,97,99,114,111,110,46,97,108,116,7,105,109,97,99,114,111,110,10,73,98,114,101,118,101,46,97,108,116,6,105,98,114,101,118,101,11,73,111,103,111,110,101,107,46,97,108,116,7,105,111,103,111,110,101,107,14,73,100,111,116,97,99,99,101,110,116,46,97,108,116,8,100,111,116,108,101,115,115,105,6,73,74,46,97,108,116,2,105,106,11,74,99,105,114,99,117,109,102,108,101,120,11,106,99,105,114,99,117,109,102,108,101,120,12,75,99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109,109,97,97,99,99,101,110,116,12,107,103,114,101,101,110,108,97,110,100,105,99,6,76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97,99,99,101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97,114,111,110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,6,76,115,108,97,115,104,6,108,115,108,97,115,104,6,78,97,99,117,116,101,6,110,97,99,117,116,101,12,78,99,111,109,109,97,97,99,99,101,110,116,12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99,97,114,111,110,6,110,99,97,114,111,110,11,110,97,112,111,115,116,114,111,112,104,101,3,69,110,103,3,101,110,103,7,79,109,97,99,114,111,110,7,111,109,97,99,114,111,110,6,79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104,117,110,103,97,114,117,109,108,97,117,116,13,111,104,117,110,103,97,114,117,109,108,97,117,116,2,79,69,2,111,101,6,82,97,99,117,116,101,6,114,97,99,117,116,101,12,82,99,111,109,109,97,97,99,99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110,116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,83,97,99,117,116,101,6,115,97,99,117,116,101,11,83,99,105,114,99,117,109,102,108,101,120,11,115,99,105,114,99,117,109,102,108,101,120,8,83,99,101,100,105,108,108,97,8,115,99,101,100,105,108,108,97,6,83,99,97,114,111,110,6,115,99,97,114,111,110,12,84,99,111,109,109,97,97,99,99,101,110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,6,84,99,97,114,111,110,6,116,99,97,114,111,110,4,84,98,97,114,4,116,98,97,114,6,85,116,105,108,100,101,6,117,116,105,108,100,101,7,85,109,97,99,114,111,110,7,117,109,97,99,114,111,110,6,85,98,114,101,118,101,6,117,98,114,101,118,101,5,85,114,105,110,103,5,117,114,105,110,103,13,85,104,117,110,103,97,114,117,109,108,97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,85,111,103,111,110,101,107,7,117,111,103,111,110,101,107,11,87,99,105,114,99,117,109,102,108,101,120,11,119,99,105,114,99,117,109,102,108,101,120,11,89,99,105,114,99,117,109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101,120,9,89,100,105,101,114,101,115,105,115,6,90,97,99,117,116,101,6,122,97,99,117,116,101,10,90,100,111,116,97,99,99,101,110,116,10,122,100,111,116,97,99,99,101,110,116,6,90,99,97,114,111,110,6,122,99,97,114,111,110,5,108,111,110,103,115,6,102,108,111,114,105,110,10,65,114,105,110,103,97,99,117,116,101,10,97,114,105,110,103,97,99,117,116,101,7,65,69,97,99,117,116,101,7,97,101,97,99,117,116,101,11,79,115,108,97,115,104,97,99,117,116,101,11,111,115,108,97,115,104,97,99,117,116,101,12,83,99,111,109,109,97,97,99,99,101,110,116,12,115,99,111,109,109,97,97,99,99,101,110,116,10,99,105,114,99,117,109,102,108,101,120,5,99,97,114,111,110,6,109,97,99,114,111,110,5,98,114,101,118,101,9,100,111,116,97,99,99,101,110,116,4,114,105,110,103,6,111,103,111,110,101,107,5,116,105,108,100,101,12,104,117,110,103,97,114,117,109,108,97,117,116,5,116,111,110,111,115,13,100,105,101,114,101,115,105,115,116,111,110,111,115,10,65,108,112,104,97,116,111,110,111,115,9,97,110,111,116,101,108,101,105,97,12,69,112,115,105,108,111,110,116,111,110,111,115,8,69,116,97,116,111,110,111,115,13,73,111,116,97,116,111,110,111,115,46,97,108,116,12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111,110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,17,105,111,116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,5,65,108,112,104,97,4,66,101,116,97,5,71,97,109,109,97,7,117,110,105,48,51,57,52,7,69,112,115,105,108,111,110,4,90,101,116,97,3,69,116,97,5,84,104,101,116,97,8,73,111,116,97,46,97,108,116,5,75,97,112,112,97,6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111,110,2,80,105,3,82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112,115,105,108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,7,117,110,105,48,51,65,57,16,73,111,116,97,100,105,101,114,101,115,105,115,46,97,108,116,15,85,112,115,105,108,111,110,100,105,101,114,101,115,105,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108,111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,9,105,111,116,97,116,111,110,111,115,20,117,112,115,105,108,111,110,100,105,101,114,101,115,105,115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116,97,5,103,97,109,109,97,5,100,101,108,116,97,7,101,112,115,105,108,111,110,4,122,101,116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112,97,6,108,97,109,98,100,97,7,117,110,105,48,51,66,67,2,110,117,2,120,105,7,111,109,105,99,114,111,110,2,112,105,3,114,104,111,6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97,117,7,117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111,109,101,103,97,12,105,111,116,97,100,105,101,114,101,115,105,115,15,117,112,115,105,108,111,110,100,105,101,114,101,115,105,115,12,111,109,105,99,114,111,110,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111,115,10,111,109,101,103,97,116,111,110,111,115,9,97,102,105,105,49,48,48,50,51,9,97,102,105,105,49,48,48,53,49,9,97,102,105,105,49,48,48,53,50,9,97,102,105,105,49,48,48,53,51,9,97,102,105,105,49,48,48,53,52,13,97,102,105,105,49,48,48,53,53,46,97,108,116,13,97,102,105,105,49,48,48,53,54,46,97,108,116,9,97,102,105,105,49,48,48,53,55,9,97,102,105,105,49,48,48,53,56,9,97,102,105,105,49,48,48,53,57,9,97,102,105,105,49,48,48,54,48,9,97,102,105,105,49,48,48,54,49,9,97,102,105,105,49,48,48,54,50,9,97,102,105,105,49,48,49,52,53,9,97,102,105,105,49,48,48,49,55,9,97,102,105,105,49,48,48,49,56,9,97,102,105,105,49,48,48,49,57,9,97,102,105,105,49,48,48,50,48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105,49,48,48,50,50,9,97,102,105,105,49,48,48,50,52,9,97,102,105,105,49,48,48,50,53,9,97,102,105,105,49,48,48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102,105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50,57,9,97,102,105,105,49,48,48,51,48,9,97,102,105,105,49,48,48,51,49,9,97,102,105,105,49,48,48,51,50,9,97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48,48,51,52,9,97,102,105,105,49,48,48,51,53,9,97,102,105,105,49,48,48,51,54,9,97,102,105,105,49,48,48,51,55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105,49,48,48,51,57,9,97,102,105,105,49,48,48,52,48,9,97,102,105,105,49,48,48,52,49,9,97,102,105,105,49,48,48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102,105,105,49,48,48,52,52,9,97,102,105,105,49,48,48,52,53,9,97,102,105,105,49,48,48,52,54,9,97,102,105,105,49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9,97,102,105,105,49,48,48,52,57,9,97,102,105,105,49,48,48,54,53,9,97,102,105,105,49,48,48,54,54,9,97,102,105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54,56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105,49,48,48,55,48,9,97,102,105,105,49,48,48,55,50,9,97,102,105,105,49,48,48,55,51,9,97,102,105,105,49,48,48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102,105,105,49,48,48,55,54,9,97,102,105,105,49,48,48,55,55,9,97,102,105,105,49,48,48,55,56,9,97,102,105,105,49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9,97,102,105,105,49,48,48,56,49,9,97,102,105,105,49,48,48,56,50,9,97,102,105,105,49,48,48,56,51,9,97,102,105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56,53,9,97,102,105,105,49,48,48,56,54,9,97,102,105,105,49,48,48,56,55,9,97,102,105,105,49,48,48,56,56,9,97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48,48,57,48,9,97,102,105,105,49,48,48,57,49,9,97,102,105,105,49,48,48,57,50,9,97,102,105,105,49,48,48,57,51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105,49,48,48,57,53,9,97,102,105,105,49,48,48,57,54,9,97,102,105,105,49,48,48,57,55,9,97,102,105,105,49,48,48,55,49,9,97,102,105,105,49,48,48,57,57,9,97,102,105,105,49,48,49,48,48,9,97,102,105,105,49,48,49,48,49,9,97,102,105,105,49,48,49,48,50,9,97,102,105,105,49,48,49,48,51,9,97,102,105,105,49,48,49,48,52,9,97,102,105,105,49,48,49,48,53,9,97,102,105,105,49,48,49,48,54,9,97,102,105,105,49,48,49,48,55,9,97,102,105,105,49,48,49,48,56,9,97,102,105,105,49,48,49,48,57,9,97,102,105,105,49,48,49,49,48,9,97,102,105,105,49,48,49,57,51,9,97,102,105,105,49,48,48,53,48,9,97,102,105,105,49,48,48,57,56,6,87,103,114,97,118,101,6,119,103,114,97,118,101,6,87,97,99,117,116,101,6,119,97,99,117,116,101,9,87,100,105,101,114,101,115,105,115,9,119,100,105,101,114,101,115,105,115,6,89,103,114,97,118,101,6,121,103,114,97,118,101,6,101,110,100,97,115,104,6,101,109,100,97,115,104,9,97,102,105,105,48,48,50,48,56,13,117,110,100,101,114,115,99,111,114,101,100,98,108,9,113,117,111,116,101,108,101,102,116,10,113,117,111,116,101,114,105,103,104,116,14,113,117,111,116,101,115,105,110,103,108,98,97,115,101,13,113,117,111,116,101,114,101,118,101,114,115,101,100,12,113,117,111,116,101,100,98,108,108,101,102,116,13,113,117,111,116,101,100,98,108,114,105,103,104,116,12,113,117,111,116,101,100,98,108,98,97,115,101,6,100,97,103,103,101,114,9,100,97,103,103,101,114,100,98,108,6,98,117,108,108,101,116,8,101,108,108,105,112,115,105,115,11,112,101,114,116,104,111,117,115,97,110,100,6,109,105,110,117,116,101,6,115,101,99,111,110,100,13,103,117,105,108,115,105,110,103,108,108,101,102,116,14,103,117,105,108,115,105,110,103,108,114,105,103,104,116,9,101,120,99,108,97,109,100,98,108,8,102,114,97,99,116,105,111,110,9,110,115,117,112,101,114,105,111,114,5,102,114,97,110,99,9,97,102,105,105,48,56,57,52,49,6,112,101,115,101,116,97,4,69,117,114,111,9,97,102,105,105,54,49,50,52,56,9,97,102,105,105,54,49,50,56,57,9,97,102,105,105,54,49,51,53,50,9,116,114,97,100,101,109,97,114,107,5,79,109,101,103,97,9,101,115,116,105,109,97,116,101,100,9,111,110,101,101,105,103,104,116,104,12,116,104,114,101,101,101,105,103,104,116,104,115,11,102,105,118,101,101,105,103,104,116,104,115,12,115,101,118,101,110,101,105,103,104,116,104,115,11,112,97,114,116,105,97,108,100,105,102,102,5,68,101,108,116,97,7,112,114,111,100,117,99,116,9,115,117,109,109,97,116,105,111,110,5,109,105,110,117,115,7,114,97,100,105,99,97,108,8,105,110,102,105,110,105,116,121,8,105,110,116,101,103,114,97,108,11,97,112,112,114,111,120,101,113,117,97,108,8,110,111,116,101,113,117,97,108,9,108,101,115,115,101,113,117,97,108,12,103,114,101,97,116,101,114,101,113,117,97,108,7,108,111,122,101,110,103,101,7,117,110,105,70,66,48,49,7,117,110,105,70,66,48,50,13,99,121,114,105,108,108,105,99,98,114,101,118,101,8,100,111,116,108,101,115,115,106,16,99,97,114,111,110,99,111,109,109,97,97,99,99,101,110,116,11,99,111,109,109,97,97,99,99,101,110,116,17,99,111,109,109,97,97,99,99,101,110,116,114,111,116,97,116,101,12,122,101,114,111,115,117,112,101,114,105,111,114,12,102,111,117,114,115,117,112,101,114,105,111,114,12,102,105,118,101,115,117,112,101,114,105,111,114,11,115,105,120,115,117,112,101,114,105,111,114,13,115,101,118,101,110,115,117,112,101,114,105,111,114,13,101,105,103,104,116,115,117,112,101,114,105,111,114,12,110,105,110,101,115,117,112,101,114,105,111,114,7,117,110,105,50,48,48,48,7,117,110,105,50,48,48,49,7,117,110,105,50,48,48,50,7,117,110,105,50,48,48,51,7,117,110,105,50,48,48,52,7,117,110,105,50,48,48,53,7,117,110,105,50,48,48,54,7,117,110,105,50,48,48,55,7,117,110,105,50,48,48,56,7,117,110,105,50,48,48,57,7,117,110,105,50,48,48,65,7,117,110,105,50,48,48,66,7,117,110,105,70,69,70,70,7,117,110,105,70,70,70,67,7,117,110,105,70,70,70,68,7,117,110,105,48,49,70,48,7,117,110,105,48,50,66,67,7,117,110,105,48,51,68,49,7,117,110,105,48,51,68,50,7,117,110,105,48,51,68,54,7,117,110,105,49,69,51,69,7,117,110,105,49,69,51,70,7,117,110,105,49,69,48,48,7,117,110,105,49,69,48,49,7,117,110,105,49,70,52,68,7,117,110,105,48,50,70,51,9,100,97,115,105,97,111,120,105,97,7,117,110,105,70,66,48,51,7,117,110,105,70,66,48,52,5,79,104,111,114,110,5,111,104,111,114,110,5,85,104,111,114,110,5,117,104,111,114,110,7,117,110,105,48,51,48,48,7,117,110,105,48,51,48,49,7,117,110,105,48,51,48,51,4,104,111,111,107,8,100,111,116,98,101,108,111,119,7,117,110,105,48,52,48,48,7,117,110,105,48,52,48,68,7,117,110,105,48,52,53,48,7,117,110,105,48,52,53,68,7,117,110,105,48,52,54,48,7,117,110,105,48,52,54,49,7,117,110,105,48,52,54,50,7,117,110,105,48,52,54,51,7,117,110,105,48,52,54,52,7,117,110,105,48,52,54,53,7,117,110,105,48,52,54,54,7,117,110,105,48,52,54,55,7,117,110,105,48,52,54,56,7,117,110,105,48,52,54,57,7,117,110,105,48,52,54,65,7,117,110,105,48,52,54,66,7,117,110,105,48,52,54,67,7,117,110,105,48,52,54,68,7,117,110,105,48,52,54,69,7,117,110,105,48,52,54,70,7,117,110,105,48,52,55,48,7,117,110,105,48,52,55,49,7,117,110,105,48,52,55,50,7,117,110,105,48,52,55,51,7,117,110,105,48,52,55,52,7,117,110,105,48,52,55,53,7,117,110,105,48,52,55,54,7,117,110,105,48,52,55,55,7,117,110,105,48,52,55,56,7,117,110,105,48,52,55,57,7,117,110,105,48,52,55,65,7,117,110,105,48,52,55,66,7,117,110,105,48,52,55,67,7,117,110,105,48,52,55,68,7,117,110,105,48,52,55,69,7,117,110,105,48,52,55,70,7,117,110,105,48,52,56,48,7,117,110,105,48,52,56,49,7,117,110,105,48,52,56,50,7,117,110,105,48,52,56,51,7,117,110,105,48,52,56,52,7,117,110,105,48,52,56,53,7,117,110,105,48,52,56,54,7,117,110,105,48,52,56,56,7,117,110,105,48,52,56,57,7,117,110,105,48,52,56,65,7,117,110,105,48,52,56,66,7,117,110,105,48,52,56,67,7,117,110,105,48,52,56,68,7,117,110,105,48,52,56,69,7,117,110,105,48,52,56,70,7,117,110,105,48,52,57,50,7,117,110,105,48,52,57,51,7,117,110,105,48,52,57,52,7,117,110,105,48,52,57,53,7,117,110,105,48,52,57,54,7,117,110,105,48,52,57,55,7,117,110,105,48,52,57,56,7,117,110,105,48,52,57,57,7,117,110,105,48,52,57,65,7,117,110,105,48,52,57,66,7,117,110,105,48,52,57,67,7,117,110,105,48,52,57,68,7,117,110,105,48,52,57,69,7,117,110,105,48,52,57,70,7,117,110,105,48,52,65,48,7,117,110,105,48,52,65,49,7,117,110,105,48,52,65,50,7,117,110,105,48,52,65,51,7,117,110,105,48,52,65,52,7,117,110,105,48,52,65,53,7,117,110,105,48,52,65,54,7,117,110,105,48,52,65,55,7,117,110,105,48,52,65,56,7,117,110,105,48,52,65,57,7,117,110,105,48,52,65,65,7,117,110,105,48,52,65,66,7,117,110,105,48,52,65,67,7,117,110,105,48,52,65,68,7,117,110,105,48,52,65,69,7,117,110,105,48,52,65,70,7,117,110,105,48,52,66,48,7,117,110,105,48,52,66,49,7,117,110,105,48,52,66,50,7,117,110,105,48,52,66,51,7,117,110,105,48,52,66,52,7,117,110,105,48,52,66,53,7,117,110,105,48,52,66,54,7,117,110,105,48,52,66,55,7,117,110,105,48,52,66,56,7,117,110,105,48,52,66,57,7,117,110,105,48,52,66,65,7,117,110,105,48,52,66,66,7,117,110,105,48,52,66,67,7,117,110,105,48,52,66,68,7,117,110,105,48,52,66,69,7,117,110,105,48,52,66,70,11,117,110,105,48,52,67,48,46,97,108,116,7,117,110,105,48,52,67,49,7,117,110,105,48,52,67,50,7,117,110,105,48,52,67,51,7,117,110,105,48,52,67,52,7,117,110,105,48,52,67,53,7,117,110,105,48,52,67,54,7,117,110,105,48,52,67,55,7,117,110,105,48,52,67,56,7,117,110,105,48,52,67,57,7,117,110,105,48,52,67,65,7,117,110,105,48,52,67,66,7,117,110,105,48,52,67,67,7,117,110,105,48,52,67,68,7,117,110,105,48,52,67,69,11,117,110,105,48,52,67,70,46,97,108,116,7,117,110,105,48,52,68,48,7,117,110,105,48,52,68,49,7,117,110,105,48,52,68,50,7,117,110,105,48,52,68,51,7,117,110,105,48,52,68,52,7,117,110,105,48,52,68,53,7,117,110,105,48,52,68,54,7,117,110,105,48,52,68,55,7,117,110,105,48,52,68,56,7,117,110,105,48,52,68,57,7,117,110,105,48,52,68,65,7,117,110,105,48,52,68,66,7,117,110,105,48,52,68,67,7,117,110,105,48,52,68,68,7,117,110,105,48,52,68,69,7,117,110,105,48,52,68,70,7,117,110,105,48,52,69,48,7,117,110,105,48,52,69,49,7,117,110,105,48,52,69,50,7,117,110,105,48,52,69,51,7,117,110,105,48,52,69,52,7,117,110,105,48,52,69,53,7,117,110,105,48,52,69,54,7,117,110,105,48,52,69,55,7,117,110,105,48,52,69,56,7,117,110,105,48,52,69,57,7,117,110,105,48,52,69,65,7,117,110,105,48,52,69,66,7,117,110,105,48,52,69,67,7,117,110,105,48,52,69,68,7,117,110,105,48,52,69,69,7,117,110,105,48,52,69,70,7,117,110,105,48,52,70,48,7,117,110,105,48,52,70,49,7,117,110,105,48,52,70,50,7,117,110,105,48,52,70,51,7,117,110,105,48,52,70,52,7,117,110,105,48,52,70,53,7,117,110,105,48,52,70,54,7,117,110,105,48,52,70,55,7,117,110,105,48,52,70,56,7,117,110,105,48,52,70,57,7,117,110,105,48,52,70,65,7,117,110,105,48,52,70,66,7,117,110,105,48,52,70,67,7,117,110,105,48,52,70,68,7,117,110,105,48,52,70,69,7,117,110,105,48,52,70,70,7,117,110,105,48,53,48,48,7,117,110,105,48,53,48,49,7,117,110,105,48,53,48,50,7,117,110,105,48,53,48,51,7,117,110,105,48,53,48,52,7,117,110,105,48,53,48,53,7,117,110,105,48,53,48,54,7,117,110,105,48,53,48,55,7,117,110,105,48,53,48,56,7,117,110,105,48,53,48,57,7,117,110,105,48,53,48,65,7,117,110,105,48,53,48,66,7,117,110,105,48,53,48,67,7,117,110,105,48,53,48,68,7,117,110,105,48,53,48,69,7,117,110,105,48,53,48,70,7,117,110,105,48,53,49,48,7,117,110,105,48,53,49,49,7,117,110,105,48,53,49,50,7,117,110,105,48,53,49,51,7,117,110,105,49,69,65,48,7,117,110,105,49,69,65,49,7,117,110,105,49,69,65,50,7,117,110,105,49,69,65,51,7,117,110,105,49,69,65,52,7,117,110,105,49,69,65,53,7,117,110,105,49,69,65,54,7,117,110,105,49,69,65,55,7,117,110,105,49,69,65,56,7,117,110,105,49,69,65,57,7,117,110,105,49,69,65,65,7,117,110,105,49,69,65,66,7,117,110,105,49,69,65,67,7,117,110,105,49,69,65,68,7,117,110,105,49,69,65,69,7,117,110,105,49,69,65,70,7,117,110,105,49,69,66,48,7,117,110,105,49,69,66,49,7,117,110,105,49,69,66,50,7,117,110,105,49,69,66,51,7,117,110,105,49,69,66,52,7,117,110,105,49,69,66,53,7,117,110,105,49,69,66,54,7,117,110,105,49,69,66,55,7,117,110,105,49,69,66,56,7,117,110,105,49,69,66,57,7,117,110,105,49,69,66,65,7,117,110,105,49,69,66,66,7,117,110,105,49,69,66,67,7,117,110,105,49,69,66,68,7,117,110,105,49,69,66,69,7,117,110,105,49,69,66,70,7,117,110,105,49,69,67,48,7,117,110,105,49,69,67,49,7,117,110,105,49,69,67,50,7,117,110,105,49,69,67,51,7,117,110,105,49,69,67,52,7,117,110,105,49,69,67,53,7,117,110,105,49,69,67,54,7,117,110,105,49,69,67,55,11,117,110,105,49,69,67,56,46,97,108,116,7,117,110,105,49,69,67,57,11,117,110,105,49,69,67,65,46,97,108,116,7,117,110,105,49,69,67,66,7,117,110,105,49,69,67,67,7,117,110,105,49,69,67,68,7,117,110,105,49,69,67,69,7,117,110,105,49,69,67,70,7,117,110,105,49,69,68,48,7,117,110,105,49,69,68,49,7,117,110,105,49,69,68,50,7,117,110,105,49,69,68,51,7,117,110,105,49,69,68,52,7,117,110,105,49,69,68,53,7,117,110,105,49,69,68,54,7,117,110,105,49,69,68,55,7,117,110,105,49,69,68,56,7,117,110,105,49,69,68,57,7,117,110,105,49,69,68,65,7,117,110,105,49,69,68,66,7,117,110,105,49,69,68,67,7,117,110,105,49,69,68,68,7,117,110,105,49,69,68,69,7,117,110,105,49,69,68,70,7,117,110,105,49,69,69,48,7,117,110,105,49,69,69,49,7,117,110,105,49,69,69,50,7,117,110,105,49,69,69,51,7,117,110,105,49,69,69,52,7,117,110,105,49,69,69,53,7,117,110,105,49,69,69,54,7,117,110,105,49,69,69,55,7,117,110,105,49,69,69,56,7,117,110,105,49,69,69,57,7,117,110,105,49,69,69,65,7,117,110,105,49,69,69,66,7,117,110,105,49,69,69,67,7,117,110,105,49,69,69,68,7,117,110,105,49,69,69,69,7,117,110,105,49,69,69,70,7,117,110,105,49,69,70,48,7,117,110,105,49,69,70,49,7,117,110,105,49,69,70,52,7,117,110,105,49,69,70,53,7,117,110,105,49,69,70,54,7,117,110,105,49,69,70,55,7,117,110,105,49,69,70,56,7,117,110,105,49,69,70,57,7,117,110,105,50,48,65,66,7,117,110,105,48,51,48,70,19,99,105,114,99,117,109,102,108,101,120,97,99,117,116,101,99,111,109,98,19,99,105,114,99,117,109,102,108,101,120,103,114,97,118,101,99,111,109,98,18,99,105,114,99,117,109,102,108,101,120,104,111,111,107,99,111,109,98,19,99,105,114,99,117,109,102,108,101,120,116,105,108,100,101,99,111,109,98,14,98,114,101,118,101,97,99,117,116,101,99,111,109,98,14,98,114,101,118,101,103,114,97,118,101,99,111,109,98,13,98,114,101,118,101,104,111,111,107,99,111,109,98,14,98,114,101,118,101,116,105,108,100,101,99,111,109,98,16,99,121,114,105,108,108,105,99,104,111,111,107,108,101,102,116,17,99,121,114,105,108,108,105,99,98,105,103,104,111,111,107,85,67,17,99,121,114,105,108,108,105,99,98,105,103,104,111,111,107,76,67,8,111,110,101,46,112,110,117,109,7,122,101,114,111,46,111,115,6,111,110,101,46,111,115,6,116,119,111,46,111,115,8,116,104,114,101,101,46,111,115,7,102,111,117,114,46,111,115,7,102,105,118,101,46,111,115,6,115,105,120,46,111,115,8,115,101,118,101,110,46,111,115,8,101,105,103,104,116,46,111,115,7,110,105,110,101,46,111,115,2,102,102,7,117,110,105,50,49,50,48,8,84,99,101,100,105,108,108,97,8,116,99,101,100,105,108,108,97,5,103,46,97,108,116,15,103,99,105,114,99,117,109,102,108,101,120,46,97,108,116,10,103,98,114,101,118,101,46,97,108,116,8,103,100,111,116,46,97,108,116,16,103,99,111,109,109,97,97,99,99,101,110,116,46,97,108,116,1,73,6,73,103,114,97,118,101,6,73,97,99,117,116,101,11,73,99,105,114,99,117,109,102,108,101,120,9,73,100,105,101,114,101,115,105,115,6,73,116,105,108,100,101,7,73,109,97,99,114,111,110,6,73,98,114,101,118,101,7,73,111,103,111,110,101,107,10,73,100,111,116,97,99,99,101,110,116,2,73,74,9,73,111,116,97,116,111,110,111,115,4,73,111,116,97,12,73,111,116,97,100,105,101,114,101,115,105,115,9,97,102,105,105,49,48,48,53,53,9,97,102,105,105,49,48,48,53,54,7,117,110,105,48,52,67,48,7,117,110,105,48,52,67,70,7,117,110,105,49,69,67,56,7,117,110,105,49,69,67,65,0,0,1,0,3,0,8,0,10,0,13,0,7,255,255,0,15,0,1,0,0,0,12,0,0,0,22,0,0,0,2,0,1,0,0,3,169,0,1,0,4,0,0,0,1,0,0,0,0,0,1,0,0,0,10,0,52,0,54,0,1,108,97,116,110,0,8,0,16,0,2,77,79,76,32,0,22,82,79,77,32,0,28,0,0,255,255,0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0,0,0,0,1,0,0,0,10,0,110,1,228,0,1,108,97,116,110,0,8,0,16,0,2,77,79,76,32,0,40,82,79,77,32,0,66,0,0,255,255,0,9,0,3,0,8,0,11,0,0,0,14,0,17,0,20,0,23,0,26,0,0,255,255,0,10,0,4,0,6,0,9,0,12,0,1,0,15,0,18,0,21,0,24,0,27,0,0,255,255,0,10,0,5,0,7,0,10,0,13,0,2,0,16,0,19,0,22,0,25,0,28,0,29,108,105,103,97,0,176,108,105,103,97,0,182,108,105,103,97,0,188,108,110,117,109,0,194,108,110,117,109,0,200,108,110,117,109,0,206,108,111,99,108,0,212,108,111,99,108,0,218,111,110,117,109,0,224,111,110,117,109,0,232,111,110,117,109,0,240,112,110,117,109,0,248,112,110,117,109,0,254,112,110,117,109,1,4,115,97,108,116,1,10,115,97,108,116,1,18,115,97,108,116,1,26,115,115,48,49,1,34,115,115,48,49,1,42,115,115,48,49,1,50,115,115,48,50,1,58,115,115,48,50,1,64,115,115,48,50,1,70,115,115,48,51,1,76,115,115,48,51,1,82,115,115,48,51,1,88,116,110,117,109,1,94,116,110,117,109,1,102,116,110,117,109,1,110,0,0,0,1,0,9,0,0,0,1,0,9,0,0,0,1,0,9,0,0,0,1,0,7,0,0,0,1,0,7,0,0,0,1,0,7,0,0,0,1,0,8,0,0,0,1,0,8,0,0,0,2,0,2,0,3,0,0,0,2,0,2,0,3,0,0,0,2,0,2,0,3,0,0,0,1,0,4,0,0,0,1,0,4,0,0,0,1,0,4,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,2,0,5,0,6,0,0,0,2,0,5,0,6,0,0,0,2,0,5,0,6,0,10,0,22,0,30,0,38,0,46,0,54,0,62,0,70,0,78,0,86,0,94,0,1,0,0,0,1,0,80,0,1,0,0,0,1,0,122,0,1,0,0,0,1,0,170,0,1,0,0,0,1,0,198,0,1,0,0,0,1,0,238,0,1,0,0,0,1,0,244,0,1,0,0,0,1,1,16,0,1,0,0,0,1,1,22,0,1,0,0,0,1,1,50,0,4,0,0,0,1,1,72,0,2,0,16,0,5,3,145,3,146,3,147,3,148,3,149,0,2,0,5,0,74,0,74,0,0,0,223,0,223,0,1,0,225,0,225,0,2,0,227,0,227,0,3,0,229,0,229,0,4,0,2,0,46,0,20,0,44,0,142,0,143,0,144,0,145,0,234,0,236,0,238,0,240,0,242,0,244,1,90,1,103,1,119,1,161,1,162,2,201,2,216,3,69,3,71,0,2,0,1,3,150,3,169,0,0,0,2,0,26,0,10,3,131,3,132,3,133,3,134,3,135,3,136,3,137,3,138,3,139,3,140,0,2,0,1,0,19,0,28,0,0,0,2,0,26,0,10,3,131,3,133,3,134,3,135,3,136,3,137,3,138,3,139,3,140,3,132,0,2,0,3,0,19,0,19,0,0,0,21,0,28,0,1,3,130,3,130,0,9,0,2,0,8,0,1,3,130,0,1,0,1,0,20,0,2,0,26,0,10,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,2,0,1,3,131,3,140,0,0,0,2,0,8,0,1,0,20,0,1,0,1,3,130,0,2,0,26,0,10,0,19,3,130,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,2,0,1,3,131,3,140,0,0,0,2,0,14,0,4,3,143,3,144,1,32,1,33,0,2,0,2,1,36,1,37,0,0,1,73,1,74,0,2,0,1,0,54,0,1,0,8,0,5,0,12,0,20,0,28,0,34,0,40,2,94,0,3,0,73,0,79,2,93,0,3,0,73,0,76,3,141,0,2,0,73,2,53,0,2,0,79,2,52,0,2,0,76,0,1,0,1,0,73,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,0,21,94,0,0,0,20,0,0,0,0,0,0,21,86,48,130,21,82,6,9,42,134,72,134,247,13,1,7,2,160,130,21,67,48,130,21,63,2,1,1,49,11,48,9,6,5,43,14,3,2,26,5,0,48,97,6,10,43,6,1,4,1,130,55,2,1,4,160,83,48,81,48,44,6,10,43,6,1,4,1,130,55,2,1,28,162,30,128,28,0,60,0,60,0,60,0,79,0,98,0,115,0,111,0,108,0,101,0,116,0,101,0,62,0,62,0,62,48,33,48,9,6,5,43,14,3,2,26,5,0,4,20,130,184,185,128,143,217,245,64,166,109,110,179,21,84,65,54,153,222,211,125,160,130,17,93,48,130,3,122,48,130,2,98,160,3,2,1,2,2,16,56,37,215,250,248,97,175,158,244,144,231,38,181,214,90,213,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,48,83,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,43,48,41,6,3,85,4,3,19,34,86,101,114,105,83,105,103,110,32,84,105,109,101,32,83,116,97,109,112,105,110,103,32,83,101,114,118,105,99,101,115,32,67,65,48,30,23,13,48,55,48,54,49,53,48,48,48,48,48,48,90,23,13,49,50,48,54,49,52,50,51,53,57,53,57,90,48,92,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,52,48,50,6,3,85,4,3,19,43,86,101,114,105,83,105,103,110,32,84,105,109,101,32,83,116,97,109,112,105,110,103,32,83,101,114,118,105,99,101,115,32,83,105,103,110,101,114,32,45,32,71,50,48,129,159,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,129,141,0,48,129,137,2,129,129,0,196,181,242,82,21,188,136,134,96,41,22,74,91,47,75,145,107,135,145,243,53,84,88,53,234,209,54,94,98,77,82,81,52,113,194,123,102,29,137,200,221,42,196,106,10,246,55,217,152,116,145,246,146,174,176,181,118,150,241,169,74,99,69,71,46,107,11,146,78,75,43,140,238,88,74,139,212,7,228,26,44,248,130,170,88,217,205,66,243,45,192,117,222,141,171,199,142,29,154,108,76,8,149,30,222,219,239,103,225,114,194,73,194,158,96,60,225,226,190,22,163,99,120,105,20,123,173,45,2,3,1,0,1,163,129,196,48,129,193,48,52,6,8,43,6,1,5,5,7,1,1,4,40,48,38,48,36,6,8,43,6,1,5,5,7,48,1,134,24,104,116,116,112,58,47,47,111,99,115,112,46,118,101,114,105,115,105,103,110,46,99,111,109,48,12,6,3,85,29,19,1,1,255,4,2,48,0,48,51,6,3,85,29,31,4,44,48,42,48,40,160,38,160,36,134,34,104,116,116,112,58,47,47,99,114,108,46,118,101,114,105,115,105,103,110,46,99,111,109,47,116,115,115,45,99,97,46,99,114,108,48,22,6,3,85,29,37,1,1,255,4,12,48,10,6,8,43,6,1,5,5,7,3,8,48,14,6,3,85,29,15,1,1,255,4,4,3,2,6,192,48,30,6,3,85,29,17,4,23,48,21,164,19,48,17,49,15,48,13,6,3,85,4,3,19,6,84,83,65,49,45,50,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,3,130,1,1,0,80,197,75,200,36,128,223,228,13,36,194,222,26,177,161,2,161,166,130,45,12,131,21,129,55,10,130,14,44,176,90,23,97,181,216,5,254,136,219,241,145,145,179,86,26,64,166,235,146,190,56,57,176,117,54,116,58,152,79,228,55,186,153,137,202,149,66,29,176,185,199,160,141,87,224,250,213,100,4,66,53,78,1,209,51,162,23,200,77,170,39,199,242,225,134,76,2,56,77,131,120,198,252,83,224,235,224,6,135,221,164,150,158,94,12,152,226,165,190,191,130,133,195,96,225,223,173,40,216,199,165,75,100,218,199,27,91,189,172,57,8,213,56,34,161,51,139,47,138,154,235,188,7,33,63,68,65,9,7,181,101,28,36,188,72,211,68,128,235,161,207,201,2,180,20,207,84,199,22,163,128,92,249,121,62,93,114,125,136,23,158,44,67,162,202,83,206,125,61,246,42,58,184,79,148,0,165,109,10,131,93,249,94,83,244,24,179,87,15,112,195,251,245,173,149,160,14,23,222,196,22,128,96,201,15,43,110,134,4,241,235,244,120,39,209,5,197,238,52,91,94,185,73,50,242,51,48,130,3,196,48,130,3,45,160,3,2,1,2,2,16,71,191,25,149,223,141,82,70,67,247,219,109,72,13,49,164,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,48,129,139,49,11,48,9,6,3,85,4,6,19,2,90,65,49,21,48,19,6,3,85,4,8,19,12,87,101,115,116,101,114,110,32,67,97,112,101,49,20,48,18,6,3,85,4,7,19,11,68,117,114,98,97,110,118,105,108,108,101,49,15,48,13,6,3,85,4,10,19,6,84,104,97,119,116,101,49,29,48,27,6,3,85,4,11,19,20,84,104,97,119,116,101,32,67,101,114,116,105,102,105,99,97,116,105,111,110,49,31,48,29,6,3,85,4,3,19,22,84,104,97,119,116,101,32,84,105,109,101,115,116,97,109,112,105,110,103,32,67,65,48,30,23,13,48,51,49,50,48,52,48,48,48,48,48,48,90,23,13,49,51,49,50,48,51,50,51,53,57,53,57,90,48,83,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,43,48,41,6,3,85,4,3,19,34,86,101,114,105,83,105,103,110,32,84,105,109,101,32,83,116,97,109,112,105,110,103,32,83,101,114,118,105,99,101,115,32,67,65,48,130,1,34,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,130,1,15,0,48,130,1,10,2,130,1,1,0,169,202,178,164,204,205,32,175,10,125,137,172,135,117,240,180,78,241,223,193,15,191,103,97,189,163,100,28,218,187,249,202,51,171,132,48,137,88,126,140,219,107,221,54,158,15,191,209,236,120,242,119,166,126,111,60,191,147,175,13,186,104,244,108,148,202,189,82,45,171,72,61,245,182,213,93,95,27,2,159,250,47,107,30,164,247,163,154,166,26,200,2,225,127,76,82,227,14,96,236,64,28,126,185,13,222,63,199,180,223,135,189,95,122,106,49,46,3,153,129,19,168,71,32,206,49,115,13,87,45,205,120,52,51,149,18,153,18,185,222,104,47,170,230,227,194,138,140,42,195,139,33,135,102,189,131,88,87,111,117,191,60,170,38,135,93,202,16,21,60,159,132,234,84,193,10,110,196,254,197,74,221,185,7,17,151,34,124,219,62,39,209,30,120,236,159,49,201,241,230,34,25,219,196,179,71,67,154,26,95,160,30,144,228,94,245,238,124,241,125,171,98,1,143,245,77,11,222,208,34,86,168,149,205,174,136,118,174,238,186,13,243,228,77,217,160,251,104,160,174,20,59,179,135,193,187,2,3,1,0,1,163,129,219,48,129,216,48,52,6,8,43,6,1,5,5,7,1,1,4,40,48,38,48,36,6,8,43,6,1,5,5,7,48,1,134,24,104,116,116,112,58,47,47,111,99,115,112,46,118,101,114,105,115,105,103,110,46,99,111,109,48,18,6,3,85,29,19,1,1,255,4,8,48,6,1,1,255,2,1,0,48,65,6,3,85,29,31,4,58,48,56,48,54,160,52,160,50,134,48,104,116,116,112,58,47,47,99,114,108,46,118,101,114,105,115,105,103,110,46,99,111,109,47,84,104,97,119,116,101,84,105,109,101,115,116,97,109,112,105,110,103,67,65,46,99,114,108,48,19,6,3,85,29,37,4,12,48,10,6,8,43,6,1,5,5,7,3,8,48,14,6,3,85,29,15,1,1,255,4,4,3,2,1,6,48,36,6,3,85,29,17,4,29,48,27,164,25,48,23,49,21,48,19,6,3,85,4,3,19,12,84,83,65,50,48,52,56,45,49,45,53,51,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,3,129,129,0,74,107,249,234,88,194,68,28,49,137,121,153,43,150,191,130,172,1,214,28,76,205,176,138,88,110,223,8,41,163,94,200,202,147,19,231,4,82,13,239,71,39,47,0,56,176,228,201,147,78,154,212,34,98,21,247,63,55,33,79,112,49,128,241,139,56,135,179,232,232,151,0,254,207,85,150,78,36,210,169,39,78,122,174,183,97,65,243,42,206,231,201,217,94,221,187,43,133,62,181,157,181,217,225,87,255,190,180,197,126,245,207,12,158,240,151,254,43,211,59,82,27,27,56,39,247,63,74,48,130,4,252,48,130,4,101,160,3,2,1,2,2,16,101,82,38,225,178,46,24,225,89,15,41,133,172,34,231,92,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,48,95,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,55,48,53,6,3,85,4,11,19,46,67,108,97,115,115,32,51,32,80,117,98,108,105,99,32,80,114,105,109,97,114,121,32,67,101,114,116,105,102,105,99,97,116,105,111,110,32,65,117,116,104,111,114,105,116,121,48,30,23,13,48,57,48,53,50,49,48,48,48,48,48,48,90,23,13,49,57,48,53,50,48,50,51,53,57,53,57,90,48,129,182,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,31,48,29,6,3,85,4,11,19,22,86,101,114,105,83,105,103,110,32,84,114,117,115,116,32,78,101,116,119,111,114,107,49,59,48,57,6,3,85,4,11,19,50,84,101,114,109,115,32,111,102,32,117,115,101,32,97,116,32,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,114,112,97,32,40,99,41,48,57,49,48,48,46,6,3,85,4,3,19,39,86,101,114,105,83,105,103,110,32,67,108,97,115,115,32,51,32,67,111,100,101,32,83,105,103,110,105,110,103,32,50,48,48,57,45,50,32,67,65,48,130,1,34,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,130,1,15,0,48,130,1,10,2,130,1,1,0,190,103,29,180,96,170,16,73,111,86,23,124,102,201,94,134,13,213,241,172,167,113,131,142,139,137,248,136,4,137,21,6,186,45,132,33,149,228,209,156,80,76,251,210,34,189,218,242,178,53,59,30,143,195,9,251,252,19,46,90,191,137,124,61,59,37,30,246,243,88,123,156,244,1,181,198,10,184,128,206,190,39,116,97,103,39,77,106,229,236,129,97,88,121,163,224,23,16,18,21,39,176,225,77,52,127,43,71,32,68,185,222,102,36,102,138,205,79,186,31,197,56,200,84,144,225,114,246,25,102,117,106,185,73,104,207,56,121,13,170,48,168,219,44,96,72,158,215,170,20,1,169,131,215,56,145,48,57,19,150,3,58,124,64,84,182,173,224,47,27,131,220,168,17,82,62,2,179,215,43,253,33,182,167,92,163,15,11,169,166,16,80,14,52,46,77,167,206,201,94,37,212,140,188,243,110,124,41,188,1,93,252,49,135,90,213,140,133,103,88,136,25,160,191,53,240,234,43,163,33,231,144,246,131,229,168,237,96,120,94,123,96,131,253,87,11,93,65,13,99,84,96,214,67,33,239,2,3,1,0,1,163,130,1,219,48,130,1,215,48,18,6,3,85,29,19,1,1,255,4,8,48,6,1,1,255,2,1,0,48,112,6,3,85,29,32,4,105,48,103,48,101,6,11,96,134,72,1,134,248,69,1,7,23,3,48,86,48,40,6,8,43,6,1,5,5,7,2,1,22,28,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,99,112,115,48,42,6,8,43,6,1,5,5,7,2,2,48,30,26,28,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,114,112,97,48,14,6,3,85,29,15,1,1,255,4,4,3,2,1,6,48,109,6,8,43,6,1,5,5,7,1,12,4,97,48,95,161,93,160,91,48,89,48,87,48,85,22,9,105,109,97,103,101,47,103,105,102,48,33,48,31,48,7,6,5,43,14,3,2,26,4,20,143,229,211,26,134,172,141,142,107,195,207,128,106,212,72,24,44,123,25,46,48,37,22,35,104,116,116,112,58,47,47,108,111,103,111,46,118,101,114,105,115,105,103,110,46,99,111,109,47,118,115,108,111,103,111,46,103,105,102,48,29,6,3,85,29,37,4,22,48,20,6,8,43,6,1,5,5,7,3,2,6,8,43,6,1,5,5,7,3,3,48,52,6,8,43,6,1,5,5,7,1,1,4,40,48,38,48,36,6,8,43,6,1,5,5,7,48,1,134,24,104,116,116,112,58,47,47,111,99,115,112,46,118,101,114,105,115,105,103,110,46,99,111,109,48,49,6,3,85,29,31,4,42,48,40,48,38,160,36,160,34,134,32,104,116,116,112,58,47,47,99,114,108,46,118,101,114,105,115,105,103,110,46,99,111,109,47,112,99,97,51,46,99,114,108,48,41,6,3,85,29,17,4,34,48,32,164,30,48,28,49,26,48,24,6,3,85,4,3,19,17,67,108,97,115,115,51,67,65,50,48,52,56,45,49,45,53,53,48,29,6,3,85,29,14,4,22,4,20,151,208,107,168,38,112,200,161,63,148,31,8,45,196,53,155,164,161,30,242,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,3,129,129,0,139,3,192,221,148,216,65,162,97,105,176,21,168,120,199,48,198,144,60,126,66,247,36,182,228,131,115,23,4,127,4,16,156,161,226,250,129,47,235,192,202,68,231,114,224,80,182,85,16,32,131,110,150,146,228,154,81,106,180,55,49,220,165,45,235,140,0,199,29,79,231,77,50,186,133,248,78,190,250,103,85,101,240,106,190,122,202,100,56,26,16,16,120,69,118,49,243,134,122,3,15,96,194,179,93,157,246,139,102,118,130,27,89,225,131,229,189,73,165,56,86,229,222,65,119,14,88,15,48,130,5,19,48,130,3,251,160,3,2,1,2,2,16,102,227,240,103,121,202,21,22,109,80,83,111,136,25,26,131,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,48,129,182,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,31,48,29,6,3,85,4,11,19,22,86,101,114,105,83,105,103,110,32,84,114,117,115,116,32,78,101,116,119,111,114,107,49,59,48,57,6,3,85,4,11,19,50,84,101,114,109,115,32,111,102,32,117,115,101,32,97,116,32,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,114,112,97,32,40,99,41,48,57,49,48,48,46,6,3,85,4,3,19,39,86,101,114,105,83,105,103,110,32,67,108,97,115,115,32,51,32,67,111,100,101,32,83,105,103,110,105,110,103,32,50,48,48,57,45,50,32,67,65,48,30,23,13,49,48,48,55,50,57,48,48,48,48,48,48,90,23,13,49,50,48,56,48,56,50,51,53,57,53,57,90,48,129,208,49,11,48,9,6,3,85,4,6,19,2,85,83,49,22,48,20,6,3,85,4,8,19,13,77,97,115,115,97,99,104,117,115,101,116,116,115,49,15,48,13,6,3,85,4,7,19,6,87,111,98,117,114,110,49,30,48,28,6,3,85,4,10,20,21,77,111,110,111,116,121,112,101,32,73,109,97,103,105,110,103,32,73,110,99,46,49,62,48,60,6,3,85,4,11,19,53,68,105,103,105,116,97,108,32,73,68,32,67,108,97,115,115,32,51,32,45,32,77,105,99,114,111,115,111,102,116,32,83,111,102,116,119,97,114,101,32,86,97,108,105,100,97,116,105,111,110,32,118,50,49,24,48,22,6,3,85,4,11,20,15,84,121,112,101,32,79,112,101,114,97,116,105,111,110,115,49,30,48,28,6,3,85,4,3,20,21,77,111,110,111,116,121,112,101,32,73,109,97,103,105,110,103,32,73,110,99,46,48,129,159,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,129,141,0,48,129,137,2,129,129,0,148,68,160,149,105,124,85,13,208,219,22,141,50,53,138,76,51,171,94,32,161,76,215,42,135,56,215,152,165,64,240,25,73,11,34,30,83,79,194,67,166,202,139,169,86,239,110,72,6,168,5,21,57,30,99,59,36,18,144,185,152,207,202,8,53,125,114,227,71,87,253,121,203,138,74,231,64,112,45,53,99,127,174,128,207,196,175,216,251,247,201,252,137,216,215,164,160,219,9,242,162,242,123,239,205,117,193,247,101,80,100,34,157,189,125,188,173,184,75,204,88,69,14,77,209,89,76,77,2,3,1,0,1,163,130,1,131,48,130,1,127,48,9,6,3,85,29,19,4,2,48,0,48,14,6,3,85,29,15,1,1,255,4,4,3,2,7,128,48,68,6,3,85,29,31,4,61,48,59,48,57,160,55,160,53,134,51,104,116,116,112,58,47,47,99,115,99,51,45,50,48,48,57,45,50,45,99,114,108,46,118,101,114,105,115,105,103,110,46,99,111,109,47,67,83,67,51,45,50,48,48,57,45,50,46,99,114,108,48,68,6,3,85,29,32,4,61,48,59,48,57,6,11,96,134,72,1,134,248,69,1,7,23,3,48,42,48,40,6,8,43,6,1,5,5,7,2,1,22,28,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,114,112,97,48,19,6,3,85,29,37,4,12,48,10,6,8,43,6,1,5,5,7,3,3,48,117,6,8,43,6,1,5,5,7,1,1,4,105,48,103,48,36,6,8,43,6,1,5,5,7,48,1,134,24,104,116,116,112,58,47,47,111,99,115,112,46,118,101,114,105,115,105,103,110,46,99,111,109,48,63,6,8,43,6,1,5,5,7,48,2,134,51,104,116,116,112,58,47,47,99,115,99,51,45,50,48,48,57,45,50,45,97,105,97,46,118,101,114,105,115,105,103,110,46,99,111,109,47,67,83,67,51,45,50,48,48,57,45,50,46,99,101,114,48,31,6,3,85,29,35,4,24,48,22,128,20,151,208,107,168,38,112,200,161,63,148,31,8,45,196,53,155,164,161,30,242,48,17,6,9,96,134,72,1,134,248,66,1,1,4,4,3,2,4,16,48,22,6,10,43,6,1,4,1,130,55,2,1,27,4,8,48,6,1,1,0,1,1,255,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,3,130,1,1,0,78,230,34,135,223,103,65,21,23,226,210,238,126,14,206,194,153,214,99,189,240,181,147,229,106,114,98,225,245,210,60,56,238,168,61,8,95,186,71,129,130,95,91,75,73,244,29,32,250,15,147,9,208,29,25,86,68,23,162,136,243,251,141,157,174,247,13,53,222,60,12,172,68,148,96,69,42,155,254,155,111,76,59,177,52,103,112,16,134,255,90,57,92,90,227,108,130,171,53,124,101,75,253,152,109,181,21,148,73,156,136,112,16,190,61,177,98,149,180,219,180,212,218,232,157,65,144,126,254,125,185,164,146,235,110,242,34,138,198,119,54,77,138,90,11,83,5,49,211,43,40,175,82,225,141,122,107,181,119,68,189,12,173,244,93,37,44,227,205,138,48,62,75,3,156,121,202,166,78,174,11,194,204,36,7,11,193,148,130,246,16,241,186,144,182,155,154,216,92,60,19,241,234,2,6,24,39,77,60,137,111,51,138,211,134,222,233,88,51,117,61,235,147,105,226,68,111,78,0,108,207,213,133,218,86,166,154,166,63,203,76,33,104,144,242,96,186,225,232,6,93,57,33,19,50,237,49,130,3,103,48,130,3,99,2,1,1,48,129,203,48,129,182,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,31,48,29,6,3,85,4,11,19,22,86,101,114,105,83,105,103,110,32,84,114,117,115,116,32,78,101,116,119,111,114,107,49,59,48,57,6,3,85,4,11,19,50,84,101,114,109,115,32,111,102,32,117,115,101,32,97,116,32,104,116,116,112,115,58,47,47,119,119,119,46,118,101,114,105,115,105,103,110,46,99,111,109,47,114,112,97,32,40,99,41,48,57,49,48,48,46,6,3,85,4,3,19,39,86,101,114,105,83,105,103,110,32,67,108,97,115,115,32,51,32,67,111,100,101,32,83,105,103,110,105,110,103,32,50,48,48,57,45,50,32,67,65,2,16,102,227,240,103,121,202,21,22,109,80,83,111,136,25,26,131,48,9,6,5,43,14,3,2,26,5,0,160,112,48,16,6,10,43,6,1,4,1,130,55,2,1,12,49,2,48,0,48,25,6,9,42,134,72,134,247,13,1,9,3,49,12,6,10,43,6,1,4,1,130,55,2,1,4,48,28,6,10,43,6,1,4,1,130,55,2,1,11,49,14,48,12,6,10,43,6,1,4,1,130,55,2,1,21,48,35,6,9,42,134,72,134,247,13,1,9,4,49,22,4,20,72,227,234,219,23,99,143,198,177,21,87,39,32,183,101,244,25,83,149,24,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,4,129,128,69,59,188,212,186,239,218,27,191,98,59,222,18,236,74,6,132,69,113,65,201,2,254,46,14,149,243,137,177,82,244,65,235,109,50,44,72,191,41,145,188,178,47,93,100,36,52,46,186,150,180,182,74,115,151,224,246,159,65,247,247,104,182,245,128,6,120,65,190,83,144,192,126,120,82,91,28,170,14,33,66,220,190,9,156,51,211,70,80,144,59,5,153,16,43,89,105,236,133,216,99,209,45,195,6,150,52,237,20,163,156,242,241,84,64,213,71,23,160,11,0,31,140,102,239,222,62,27,161,130,1,127,48,130,1,123,6,9,42,134,72,134,247,13,1,9,6,49,130,1,108,48,130,1,104,2,1,1,48,103,48,83,49,11,48,9,6,3,85,4,6,19,2,85,83,49,23,48,21,6,3,85,4,10,19,14,86,101,114,105,83,105,103,110,44,32,73,110,99,46,49,43,48,41,6,3,85,4,3,19,34,86,101,114,105,83,105,103,110,32,84,105,109,101,32,83,116,97,109,112,105,110,103,32,83,101,114,118,105,99,101,115,32,67,65,2,16,56,37,215,250,248,97,175,158,244,144,231,38,181,214,90,213,48,9,6,5,43,14,3,2,26,5,0,160,93,48,24,6,9,42,134,72,134,247,13,1,9,3,49,11,6,9,42,134,72,134,247,13,1,7,1,48,28,6,9,42,134,72,134,247,13,1,9,5,49,15,23,13,49,49,48,53,48,53,49,54,53,53,49,48,90,48,35,6,9,42,134,72,134,247,13,1,9,4,49,22,4,20,84,23,8,43,11,189,238,26,39,14,31,141,252,83,147,244,56,86,16,15,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,4,129,128,29,193,119,137,174,155,111,34,227,107,229,69,218,78,145,64,240,159,239,59,31,39,74,86,172,58,253,168,148,106,124,247,156,193,127,123,147,96,78,27,196,43,87,149,148,203,22,225,154,103,51,209,43,41,19,200,236,190,188,89,177,3,164,41,153,236,29,136,153,36,135,119,15,155,202,20,251,212,212,73,76,116,14,200,61,46,111,32,201,3,205,232,229,15,208,33,57,179,86,25,213,251,172,189,172,169,56,189,176,213,12,163,217,99,173,176,149,180,104,88,195,226,215,41,255,145,164,199,0,0, \ No newline at end of file diff --git a/src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf b/src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf deleted file mode 100644 index 5f47d734d28db2cf779ab405fde13a61a01cf973..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78464 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 LQP|>Q=KlMCp5cvO diff --git a/src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf.h b/src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf.h deleted file mode 100644 index 9ac0ebed5..000000000 --- a/src/Nazara/Utility/Resources/Fonts/Sansation_Regular.ttf.h +++ /dev/null @@ -1 +0,0 @@ -0,1,0,0,0,16,1,0,0,4,0,0,71,68,69,70,0,38,2,26,0,0,168,52,0,0,0,30,71,80,79,83,156,208,239,42,0,0,168,84,0,0,0,44,71,83,85,66,199,228,249,144,0,0,168,128,0,0,1,244,79,83,47,50,61,246,88,68,0,0,1,136,0,0,0,78,84,83,73,86,10,196,107,5,0,0,170,116,0,0,136,12,99,109,97,112,59,59,140,99,0,0,10,44,0,0,4,80,103,97,115,112,255,255,0,3,0,0,168,44,0,0,0,8,103,108,121,102,69,37,49,26,0,0,18,168,0,0,108,128,104,101,97,100,232,175,205,231,0,0,1,12,0,0,0,54,104,104,101,97,16,120,9,27,0,0,1,68,0,0,0,36,104,109,116,120,141,12,209,143,0,0,1,216,0,0,8,84,107,101,114,110,81,124,80,67,0,0,127,40,0,0,25,200,108,111,99,97,138,105,166,242,0,0,14,124,0,0,4,44,109,97,120,112,2,35,0,157,0,0,1,104,0,0,0,32,110,97,109,101,105,24,128,141,0,0,152,240,0,0,1,122,112,111,115,116,134,214,81,71,0,0,154,108,0,0,13,191,0,1,0,0,0,1,0,0,164,67,118,21,95,15,60,245,0,11,8,0,0,0,0,0,179,239,122,0,0,0,0,0,204,183,9,93,255,96,254,78,9,138,7,62,0,0,0,9,0,2,0,0,0,0,0,0,0,1,0,0,7,62,254,78,0,67,9,227,255,106,254,212,9,138,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,21,0,1,0,0,2,21,0,107,0,7,0,48,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,3,136,1,144,0,5,0,8,5,154,5,51,0,0,1,27,5,154,5,51,0,0,3,209,0,102,2,18,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,76,32,32,0,64,0,32,251,2,5,211,254,81,1,51,7,62,1,178,0,0,4,100,0,50,0,0,0,0,1,134,0,0,1,244,0,0,1,229,0,150,2,243,0,100,7,101,0,100,4,26,0,100,5,142,0,100,4,251,0,100,1,129,0,100,2,73,0,100,2,73,0,100,3,42,0,100,3,182,0,100,1,129,0,25,2,188,0,100,1,129,0,100,3,212,0,25,5,165,0,110,2,133,0,100,4,121,0,60,4,126,0,100,4,196,0,60,4,151,0,125,4,236,0,100,4,66,0,65,4,216,0,100,4,236,0,100,1,179,0,150,2,23,0,100,4,76,0,100,3,182,0,100,4,76,0,100,4,91,0,100,8,102,0,150,5,192,0,25,5,50,0,170,5,105,0,100,5,220,0,170,4,206,0,170,4,131,0,170,5,105,0,100,6,19,0,170,2,73,0,200,2,178,0,25,5,120,0,170,4,129,0,170,7,48,0,170,6,39,0,170,6,129,0,120,4,239,0,170,6,129,0,120,5,25,0,170,5,10,0,100,4,161,0,50,5,230,0,160,5,192,0,25,7,108,0,50,5,130,0,25,5,20,0,25,5,50,0,125,2,138,0,150,3,212,0,25,2,138,0,50,4,26,0,50,4,26,0,25,2,91,0,100,4,111,0,100,4,164,0,150,4,1,0,100,4,166,0,100,4,106,0,100,2,149,0,150,4,163,0,100,4,181,0,150,2,13,0,170,2,13,0,45,4,157,0,150,1,249,0,160,7,13,0,150,4,181,0,150,4,176,0,100,4,163,0,150,4,163,0,100,2,163,0,150,4,26,0,100,2,163,0,150,4,181,0,150,3,232,0,0,6,3,0,35,4,26,0,25,4,26,0,25,4,16,0,100,2,163,0,100,1,229,0,150,2,163,0,50,3,182,0,100,5,192,0,25,5,192,0,25,5,105,0,100,4,206,0,170,6,39,0,170,6,129,0,120,5,230,0,160,4,111,0,100,4,111,0,100,4,111,0,100,4,111,0,100,4,111,0,100,4,111,0,100,4,1,0,100,4,106,0,100,4,106,0,100,4,106,0,100,4,106,0,100,2,13,0,128,2,13,255,250,2,13,0,13,2,13,255,241,4,181,0,150,4,176,0,100,4,176,0,100,4,176,0,100,4,176,0,100,4,176,0,100,4,181,0,150,4,181,0,150,4,181,0,150,4,181,0,150,4,21,0,50,2,240,0,100,4,26,0,100,4,193,0,100,4,26,0,100,2,118,0,100,3,185,0,0,4,167,0,150,4,139,0,150,6,249,0,150,6,70,0,150,2,91,0,100,2,243,0,100,7,133,0,25,6,89,0,100,3,182,0,100,4,226,0,50,4,181,0,150,2,130,0,100,2,188,0,100,7,41,0,100,4,176,0,100,4,91,0,100,1,229,0,150,4,61,0,100,4,23,0,50,3,241,0,100,3,241,0,50,4,161,0,100,1,242,0,0,5,192,0,25,5,192,0,25,6,129,0,120,8,167,0,100,7,157,0,100,4,176,0,100,6,164,0,100,3,12,0,50,3,12,0,50,1,154,0,50,1,179,0,50,3,217,0,100,4,26,0,25,5,20,0,25,4,115,0,100,2,98,0,100,2,98,0,50,4,21,0,50,1,194,0,100,1,154,0,25,3,12,0,25,8,59,0,100,5,192,0,25,4,206,0,170,5,192,0,25,4,206,0,170,4,206,0,170,2,73,0,158,2,73,0,43,2,73,0,15,2,73,0,24,6,129,0,120,6,129,0,120,6,129,0,120,5,230,0,160,5,230,0,160,5,230,0,160,2,188,0,100,2,188,0,100,2,188,0,100,1,201,0,0,1,129,0,25,5,10,0,100,4,26,0,100,1,229,0,150,5,220,255,226,4,166,0,100,5,20,0,25,4,26,0,25,4,219,0,150,4,163,0,150,3,182,0,100,3,182,0,100,1,72,0,50,2,78,0,50,2,66,0,50,5,162,0,100,5,169,0,100,5,210,0,100,4,109,0,0,1,249,0,10,5,50,0,125,4,16,0,100,3,182,0,100,5,240,0,100,3,182,0,100,3,182,0,100,4,193,0,149,5,70,0,100,6,114,0,150,5,185,0,25,2,77,0,0,6,74,0,120,5,70,0,75,4,26,0,100,5,192,0,25,4,61,0,50,4,246,0,100,4,107,0,150,4,160,0,150,6,188,0,100,2,13,0,170,2,218,0,100,1,149,0,100,2,140,0,100,3,211,0,100,2,68,0,100,2,188,0,100,5,105,0,100,5,50,0,125,4,16,0,100,5,50,0,125,4,16,0,100,5,192,0,25,4,111,0,100,5,105,0,100,4,1,0,100,6,39,0,170,4,181,0,150,5,10,0,100,4,26,0,100,4,206,0,170,4,106,0,100,5,105,0,100,4,1,0,100,5,220,0,170,4,166,0,100,4,206,0,170,4,106,0,100,6,39,0,170,4,181,0,150,5,25,0,170,2,163,0,145,4,161,0,50,2,163,0,150,5,230,0,160,4,181,0,150,5,192,0,25,4,111,0,100,5,192,0,25,4,111,0,100,5,105,0,100,4,1,0,100,5,105,0,100,4,1,0,100,5,220,255,206,4,166,0,100,4,206,0,170,4,106,0,100,4,206,0,170,4,106,0,100,4,206,0,170,4,106,0,100,5,105,0,100,4,163,0,100,5,105,0,100,4,163,0,100,5,105,0,100,4,163,0,100,5,105,0,100,4,163,0,100,6,19,0,170,4,181,0,3,6,19,0,170,4,181,0,150,2,73,0,43,2,13,0,13,2,73,0,43,2,13,0,13,2,73,0,28,2,13,255,254,2,73,0,35,2,13,0,5,2,73,0,190,4,221,0,200,4,26,0,170,2,178,0,25,2,13,0,10,5,120,0,170,4,157,0,150,4,58,0,150,4,129,0,170,1,249,0,51,4,129,0,170,1,249,0,5,4,129,0,170,1,249,0,160,4,129,0,170,1,249,0,160,6,39,0,170,4,181,0,150,5,25,255,106,6,39,0,170,4,181,0,150,6,129,0,120,4,176,0,100,6,129,0,120,4,176,0,100,6,129,0,120,4,176,0,100,5,25,0,170,2,163,0,150,5,25,0,170,2,163,255,254,5,10,0,100,4,26,0,100,5,10,0,100,4,26,0,100,5,10,0,100,4,26,0,100,4,161,0,50,2,163,0,125,4,161,0,50,2,163,0,0,5,230,0,160,4,181,0,150,5,230,0,160,4,181,0,150,5,230,0,160,4,181,0,150,5,230,0,160,4,181,0,150,5,230,0,160,4,181,0,150,7,108,0,50,6,3,0,35,5,20,0,25,4,26,0,25,1,250,0,150,4,206,0,170,5,192,0,25,5,31,0,170,5,50,0,170,4,79,0,170,6,163,0,0,4,206,0,170,8,61,0,25,4,91,0,100,5,245,0,170,5,245,0,170,5,37,0,170,5,244,0,0,7,48,0,170,5,245,0,170,6,129,0,120,5,245,0,170,4,239,0,170,5,105,0,100,4,161,0,50,5,27,0,50,6,188,0,100,5,120,0,25,6,31,0,170,5,128,0,125,7,83,0,170,7,198,0,170,6,174,0,0,6,219,0,170,5,18,0,170,5,95,0,125,7,230,0,170,5,25,0,25,4,111,0,100,4,253,0,125,4,142,0,150,3,80,0,150,5,148,0,0,4,106,0,100,6,184,0,25,3,197,0,100,4,201,0,150,4,201,0,150,4,80,0,150,4,163,0,0,5,180,0,150,4,201,0,150,4,216,0,100,4,201,0,150,4,193,0,150,4,1,0,100,3,157,0,0,4,26,0,25,6,108,0,100,4,76,0,25,5,106,0,150,4,194,0,125,6,99,0,150,6,234,0,150,5,72,0,0,5,230,0,150,4,144,0,150,4,26,0,100,6,166,0,150,4,121,0,25,4,106,0,100,2,23,0,100,2,91,0,100,4,21,0,100,5,192,0,25,1,129,0,100,5,203,255,206,7,16,255,206,3,70,255,206,6,232,255,206,6,117,255,206,6,177,255,206,2,13,255,96,5,192,0,25,5,50,0,170,4,79,0,170,4,206,0,170,5,50,0,125,6,19,0,170,6,129,0,120,2,73,0,200,5,120,0,170,5,192,0,25,7,48,0,170,6,39,0,170,4,172,0,100,6,129,0,120,5,245,0,170,4,239,0,170,4,156,0,100,4,161,0,50,5,20,0,25,6,188,0,100,5,130,0,25,6,154,0,120,2,73,0,15,5,20,0,25,5,89,0,100,3,157,0,100,4,181,0,150,2,13,0,128,4,186,0,150,5,89,0,100,4,172,0,150,4,56,0,35,4,176,0,100,3,157,0,100,3,235,0,100,4,181,0,150,4,221,0,120,2,13,0,170,4,58,0,150,4,97,0,40,4,56,0,40,3,250,0,125,4,176,0,100,4,188,0,135,3,225,0,100,4,253,0,100,3,81,0,0,4,186,0,150,5,225,0,100,4,106,0,40,6,74,0,150,6,139,0,120,2,13,255,241,4,186,0,150,4,176,0,100,4,186,0,150,6,139,0,120,6,242,0,150,7,29,0,150,4,244,0,150,4,107,0,150,6,242,0,150,7,85,0,150,9,210,0,150,7,102,0,150,9,227,0,150,7,78,0,150,9,203,0,150,4,251,0,115,3,86,0,115,4,76,0,115,4,86,0,100,4,141,0,60,4,121,0,155,4,241,0,120,4,36,0,40,4,226,0,115,4,241,0,115,4,106,0,90,4,106,0,90,4,106,0,90,4,106,0,90,4,106,0,90,4,58,0,150,4,58,0,150,6,5,0,170,0,0,0,2,0,1,0,0,0,0,0,20,0,3,0,1,0,0,0,202,0,4,0,182,0,0,0,16,0,16,0,3,0,0,0,126,0,172,0,198,0,214,0,223,0,239,0,255,255,255,0,0,0,32,0,128,0,173,0,199,0,215,0,224,0,240,255,255,255,227,255,226,0,0,255,213,0,0,255,209,0,0,0,1,0,0,0,0,0,12,0,0,0,60,0,0,0,74,0,0,0,223,0,143,0,144,0,224,0,145,0,225,0,226,0,146,0,147,0,227,0,228,0,229,0,230,0,231,0,148,0,149,0,232,0,150,0,151,0,152,0,153,0,154,0,233,0,155,0,234,0,235,0,236,0,172,0,173,0,237,0,248,0,175,0,176,0,207,0,209,0,119,0,193,0,194,0,195,0,196,0,241,0,197,0,198,0,199,0,242,0,243,0,244,0,200,0,245,0,246,0,247,0,4,3,134,0,0,0,118,0,64,0,5,0,54,0,126,1,27,1,48,1,49,1,64,1,72,1,81,1,127,1,146,2,27,2,199,2,201,2,221,3,38,3,126,3,138,3,140,3,147,3,148,3,161,3,168,3,169,3,187,3,192,3,206,4,1,4,79,4,81,32,16,32,20,32,26,32,30,32,34,32,38,32,48,32,58,32,68,32,172,33,34,33,38,34,2,34,6,34,15,34,18,34,26,34,30,34,43,34,72,34,96,34,101,34,242,37,202,224,3,224,9,224,25,224,41,240,0,251,2,255,255,0,0,0,32,0,160,1,28,1,49,1,50,1,65,1,73,1,82,1,146,2,24,2,198,2,201,2,216,3,38,3,126,3,132,3,140,3,142,3,148,3,149,3,163,3,169,3,170,3,188,3,193,4,1,4,16,4,81,32,16,32,19,32,24,32,28,32,32,32,38,32,48,32,57,32,68,32,172,33,34,33,38,34,2,34,6,34,15,34,17,34,25,34,30,34,43,34,72,34,96,34,100,34,242,37,202,224,0,224,5,224,16,224,32,240,0,251,1,255,255,255,227,0,0,0,9,0,0,0,8,0,0,0,2,0,0,255,9,255,68,0,0,253,254,0,0,253,163,254,53,254,48,254,47,254,46,0,0,254,45,254,44,0,0,254,43,0,0,254,41,253,112,253,98,253,97,224,0,224,146,0,0,0,0,0,0,224,120,224,133,224,118,224,169,224,76,223,106,223,194,222,225,222,229,222,214,0,0,0,0,222,194,222,188,222,162,222,127,222,125,221,248,219,34,33,248,33,247,33,241,33,235,16,240,5,237,0,1,0,0,0,116,0,0,1,104,0,0,1,102,0,0,1,114,0,0,0,0,1,200,0,0,1,200,0,0,0,0,0,0,0,0,0,0,1,200,0,0,0,0,1,196,0,0,1,194,0,0,0,0,0,0,0,0,0,0,0,0,1,190,1,194,1,198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,182,1,184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,0,153,0,132,0,133,0,174,0,146,0,204,0,134,0,142,0,139,0,148,0,156,0,154,0,211,0,138,0,199,0,131,0,145,0,214,0,215,0,141,0,147,0,136,0,178,0,200,0,213,0,149,0,157,0,217,0,216,0,218,0,152,0,160,0,184,0,182,0,161,0,98,0,99,0,143,0,100,0,186,0,101,0,183,0,185,0,190,0,187,0,188,0,189,0,205,0,102,0,193,0,191,0,192,0,162,0,103,0,212,0,144,0,196,0,194,0,195,0,104,0,207,0,209,0,137,0,106,0,105,0,107,0,109,0,108,0,110,0,150,0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118,0,119,0,206,0,120,0,122,0,121,0,123,0,125,0,124,0,171,0,151,0,127,0,126,0,128,0,129,0,208,0,210,0,172,1,21,1,22,1,23,1,24,0,253,0,254,0,255,1,0,1,25,1,26,1,27,1,28,1,7,1,8,1,9,1,10,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,5,1,6,1,11,1,12,0,241,0,219,0,220,1,1,1,2,1,73,1,74,1,13,1,14,0,163,0,164,1,84,1,85,1,86,1,87,1,15,1,16,1,3,1,4,1,88,1,89,1,90,1,91,0,202,0,203,1,94,1,95,1,17,1,18,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,19,1,20,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,0,173,0,251,0,252,0,249,0,250,0,221,0,222,1,112,0,197,0,247,0,242,0,243,0,244,0,246,0,198,0,245,0,235,0,232,0,147,1,231,1,232,1,233,0,230,0,169,0,170,0,179,0,167,0,168,0,180,0,130,0,177,0,135,0,228,0,211,0,178,0,233,0,0,0,20,0,20,0,20,0,20,0,40,0,62,0,126,0,176,0,236,1,34,1,50,1,76,1,102,1,132,1,156,1,170,1,184,1,196,1,210,1,244,2,4,2,36,2,82,2,112,2,150,2,194,2,214,3,14,3,58,3,78,3,100,3,120,3,140,3,160,3,198,4,16,4,42,4,84,4,116,4,146,4,172,4,194,4,230,4,254,5,12,5,32,5,62,5,80,5,108,5,130,5,164,5,192,5,232,6,10,6,56,6,76,6,104,6,126,6,158,6,190,6,214,6,238,7,2,7,16,7,36,7,56,7,68,7,82,7,130,7,168,7,200,7,238,8,22,8,50,8,98,8,126,8,146,8,172,8,210,8,224,9,10,9,38,9,72,9,108,9,146,9,166,9,208,9,234,10,8,10,28,10,60,10,92,10,120,10,144,10,180,10,194,10,228,11,2,11,14,11,60,11,112,11,124,11,136,11,148,11,160,11,172,11,184,11,196,11,208,11,220,11,232,12,28,12,40,12,52,12,64,12,76,12,88,12,100,12,112,12,124,12,136,12,148,12,160,12,172,12,184,12,196,12,208,12,220,12,232,12,244,13,14,13,44,13,84,13,146,13,210,13,226,13,254,14,48,14,104,14,164,14,204,14,218,14,236,15,20,15,76,15,108,15,150,15,182,15,226,15,254,16,74,16,128,16,166,16,186,16,202,16,250,17,26,17,58,17,82,17,82,17,94,17,106,17,118,17,164,17,230,17,244,18,2,18,24,18,46,18,62,18,78,18,104,18,116,18,128,18,184,18,204,18,222,19,2,19,18,19,32,19,54,19,138,19,150,19,162,19,174,19,186,19,198,19,210,19,222,19,234,19,246,20,2,20,14,20,26,20,38,20,50,20,62,20,80,20,110,20,124,20,152,20,166,20,178,20,190,20,212,20,252,21,54,21,66,21,78,21,108,21,148,21,162,21,188,21,204,21,234,22,20,22,68,22,126,22,196,22,224,22,248,23,4,23,16,23,52,23,104,23,130,23,154,23,206,23,234,23,254,24,36,24,72,24,118,24,142,24,196,24,218,24,246,25,4,25,36,25,68,25,240,25,254,26,18,26,32,26,58,26,78,26,102,26,120,26,162,26,174,26,186,26,198,26,210,26,250,27,56,27,68,27,80,27,92,27,104,27,116,27,128,27,168,27,224,27,236,27,248,28,4,28,50,28,62,28,74,28,86,28,98,28,110,28,122,28,134,28,168,28,180,28,192,28,204,28,216,28,228,28,240,28,252,29,8,29,20,29,32,29,40,29,82,29,94,29,106,29,118,29,130,29,142,29,154,29,166,29,178,29,190,29,202,29,214,29,226,29,238,30,38,30,50,30,62,30,90,30,124,30,136,30,148,30,160,30,172,30,184,30,196,30,222,31,0,31,12,31,24,31,36,31,48,31,80,31,92,31,104,31,134,31,146,31,158,31,170,31,182,31,206,31,228,31,240,31,252,32,8,32,20,32,56,32,86,32,122,32,134,32,146,32,158,32,170,32,182,32,194,32,206,32,218,32,230,32,242,32,254,33,10,33,76,33,138,33,150,33,162,33,174,33,186,33,216,33,250,34,6,34,18,34,30,34,42,34,54,34,66,34,78,34,90,34,134,34,176,34,188,34,200,34,212,34,224,34,246,35,2,35,10,35,42,35,50,35,66,35,102,35,110,35,178,35,224,35,248,36,30,36,70,36,94,36,102,36,126,36,134,36,152,36,160,36,168,36,176,36,210,37,2,37,32,37,56,37,86,37,110,37,138,37,170,37,208,37,238,38,20,38,64,38,98,38,106,38,156,38,196,38,212,38,248,39,0,39,64,39,108,39,132,39,144,39,182,39,206,39,234,40,2,40,36,40,54,40,90,40,98,40,118,40,146,40,196,40,226,40,250,41,24,41,48,41,76,41,108,41,144,41,174,41,212,42,0,42,34,42,46,42,54,42,62,42,86,42,98,42,112,42,144,42,176,42,196,42,236,43,10,43,64,43,76,43,84,43,92,43,108,43,116,43,124,43,132,43,172,43,180,43,188,43,208,43,216,43,224,43,250,44,2,44,20,44,28,44,56,44,64,44,72,44,120,44,128,44,166,44,178,44,190,44,202,44,214,44,226,44,238,44,250,45,38,45,86,45,110,45,152,45,196,45,238,46,10,46,50,46,64,46,94,46,122,46,142,46,192,46,226,47,8,47,50,47,86,47,114,47,142,47,190,47,222,48,4,48,50,48,62,48,74,48,86,48,98,48,110,48,162,48,214,49,6,49,44,49,102,49,158,49,234,50,26,50,94,50,150,50,226,51,4,51,26,51,58,51,102,51,132,51,170,51,214,51,234,52,32,52,76,52,144,52,224,53,50,53,126,53,204,53,234,54,14,54,64,0,2,0,50,0,0,4,50,5,0,0,3,0,7,0,0,51,17,33,17,37,33,17,33,50,4,0,252,32,3,192,252,64,5,0,251,0,32,4,192,0,2,0,150,0,0,1,79,5,150,0,3,0,7,0,0,1,17,35,17,19,21,35,53,1,79,185,185,185,5,150,251,220,4,36,251,35,185,185,0,0,2,0,100,3,227,2,143,5,150,0,3,0,7,0,0,1,3,35,3,35,3,35,3,2,143,30,125,30,185,30,125,30,5,150,254,77,1,179,254,77,1,179,0,0,2,0,100,255,251,7,1,5,150,0,3,0,31,0,0,1,3,33,19,1,19,33,55,33,19,33,55,33,19,51,3,33,19,51,3,33,7,33,3,33,7,33,3,35,19,33,3,3,35,90,1,121,90,252,247,89,254,120,30,1,146,89,254,111,30,1,156,100,180,100,1,122,102,180,101,1,136,30,254,110,89,1,145,30,254,100,90,180,90,254,134,90,3,108,254,134,1,122,252,143,1,93,154,1,122,154,1,139,254,117,1,144,254,112,154,254,134,154,254,163,1,93,254,163,0,0,0,0,1,0,100,0,0,3,182,5,150,0,33,0,0,1,53,51,21,22,23,21,38,35,32,21,20,59,1,32,17,20,5,21,35,53,38,39,53,22,51,50,53,52,43,1,32,17,16,1,213,175,134,132,185,188,254,250,165,150,1,104,254,206,175,166,163,185,189,251,175,150,254,172,4,214,192,194,10,36,160,60,150,140,254,202,251,41,198,191,5,44,160,60,150,140,1,54,1,20,0,0,5,0,100,255,246,5,42,5,160,0,3,0,11,0,19,0,27,0,35,0,0,33,35,1,51,0,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,0,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,1,49,205,3,249,205,251,188,148,144,144,148,130,1,22,1,18,254,238,254,234,3,32,148,144,144,148,130,1,22,1,18,254,238,254,234,5,150,254,117,147,144,144,2,1,4,254,252,254,253,252,207,147,144,144,2,1,4,254,252,254,253,0,2,0,100,255,253,4,251,5,150,0,26,0,34,0,0,19,16,33,50,23,21,38,35,32,21,20,51,33,53,51,23,51,21,35,21,16,33,32,17,52,55,38,5,32,21,20,33,32,17,53,100,1,254,185,175,175,172,254,174,255,1,132,63,102,182,162,253,250,254,17,193,193,1,186,254,255,1,45,1,86,4,21,1,129,50,150,50,230,250,142,142,150,160,254,19,1,141,247,86,85,162,251,249,1,86,158,0,0,1,0,100,3,227,1,29,5,150,0,3,0,0,1,3,35,3,1,29,30,125,30,5,150,254,77,1,179,0,0,0,0,1,0,100,254,132,1,229,5,150,0,9,0,0,1,2,17,16,19,35,2,17,16,19,1,229,200,200,185,200,200,5,150,254,60,254,59,254,59,254,60,1,196,1,197,1,197,1,196,0,0,0,0,1,0,100,254,132,1,229,5,150,0,9,0,0,1,18,17,16,3,35,18,17,16,3,1,29,200,200,185,200,200,5,150,254,60,254,59,254,59,254,60,1,196,1,197,1,197,1,196,0,0,0,0,1,0,100,3,79,2,199,5,150,0,14,0,0,1,51,7,55,23,7,23,7,39,7,39,55,39,55,23,1,72,156,30,209,48,228,159,123,113,113,124,161,230,48,211,5,150,232,101,147,43,170,92,205,204,89,171,42,150,103,0,1,0,100,0,150,3,82,3,132,0,11,0,0,1,17,51,17,33,21,33,17,35,17,33,53,1,144,150,1,44,254,212,150,254,212,2,88,1,44,254,212,150,254,212,1,44,150,0,1,0,25,255,6,1,104,0,185,0,3,0,0,37,3,35,19,1,104,150,185,150,185,254,77,1,179,0,1,0,100,1,194,2,88,2,88,0,3,0,0,1,21,33,53,2,88,254,12,2,88,150,150,0,0,0,1,0,100,0,0,1,29,0,185,0,3,0,0,37,21,35,53,1,29,185,185,185,185,0,1,0,25,0,0,3,187,5,150,0,3,0,0,51,35,1,51,230,205,2,213,205,5,150,0,0,0,0,2,0,110,255,246,5,55,5,160,0,7,0,15,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,49,1,167,1,156,254,100,254,89,195,2,106,2,95,253,161,253,150,140,2,67,2,59,253,197,6,2,215,253,41,253,45,0,0,0,0,1,0,100,0,0,1,179,5,160,0,5,0,0,51,17,35,53,37,17,250,150,1,79,4,227,89,100,250,96,0,0,0,1,0,60,0,0,4,16,5,160,0,16,0,0,51,53,0,17,16,33,34,7,53,54,51,32,17,16,1,33,21,60,3,27,254,172,220,195,195,220,2,13,253,53,2,203,150,2,35,1,67,1,14,110,160,100,254,92,254,142,254,12,150,0,0,1,0,100,255,246,3,247,5,160,0,28,0,0,19,54,51,32,17,20,7,22,21,16,33,34,39,53,22,51,32,17,52,35,33,53,33,50,53,52,33,34,7,100,200,200,2,3,188,188,253,253,200,200,200,200,1,74,252,254,184,1,69,255,254,182,200,200,5,100,60,254,122,236,89,85,240,254,102,60,160,70,1,4,250,150,250,240,70,0,0,0,0,1,0,60,0,0,4,121,5,150,0,14,0,0,33,35,17,33,53,1,51,1,33,17,51,17,23,21,35,3,229,185,253,16,2,63,194,253,192,2,47,185,148,148,1,84,150,3,172,252,84,1,252,254,4,76,74,0,0,0,0,1,0,125,255,246,4,51,5,150,0,21,0,0,19,33,21,33,3,54,51,32,17,16,33,34,39,53,22,51,32,17,16,33,34,7,155,3,96,253,62,24,117,129,2,28,253,208,190,200,200,200,1,109,254,157,225,185,5,150,150,254,70,22,254,102,254,52,60,160,70,1,54,1,4,40,0,2,0,100,255,246,4,146,5,193,0,12,0,22,0,0,19,16,1,23,4,3,54,51,32,17,16,33,32,54,33,32,17,16,33,34,7,6,21,100,2,146,96,254,150,152,131,185,2,2,253,225,253,241,175,1,105,1,97,254,170,214,130,28,2,38,2,44,1,111,127,176,254,209,53,254,62,254,32,150,1,74,1,44,48,60,106,0,0,1,0,65,0,0,3,247,5,150,0,6,0,0,19,33,21,1,35,1,33,65,3,182,253,166,201,2,110,252,255,5,150,150,251,0,5,0,0,0,0,3,0,100,255,246,4,116,5,164,0,15,0,23,0,31,0,0,19,52,55,38,53,16,33,32,17,20,7,22,21,16,33,32,0,53,52,33,32,21,20,33,0,17,52,33,32,21,16,33,100,212,172,1,224,1,224,177,217,253,248,253,248,3,47,254,209,254,225,1,44,1,74,254,169,254,185,1,84,1,168,223,98,105,228,1,110,254,146,228,105,98,223,254,78,3,62,238,232,232,238,253,88,1,22,252,252,254,234,0,0,0,0,2,0,100,255,206,4,146,5,153,0,12,0,22,0,0,1,16,1,39,36,19,6,35,32,17,16,33,32,6,33,32,17,16,33,50,55,54,53,4,146,253,110,96,1,106,152,131,185,253,254,2,31,2,15,175,254,151,254,159,1,86,214,130,28,3,105,253,212,254,145,127,176,1,47,63,1,204,1,224,150,254,182,254,212,48,60,106,0,2,0,150,0,0,1,79,4,26,0,3,0,7,0,0,1,21,35,53,19,21,35,53,1,79,185,185,185,4,26,185,185,252,159,185,185,0,0,0,0,2,0,100,255,6,1,179,4,26,0,3,0,7,0,0,1,21,35,53,19,3,35,19,1,179,185,185,150,185,150,4,26,185,185,252,159,254,77,1,179,0,0,0,0,1,0,100,0,50,3,232,3,232,0,6,0,0,19,53,1,21,9,1,21,100,3,132,253,25,2,231,1,194,150,1,144,150,254,183,254,191,150,0,0,2,0,100,1,44,3,82,2,238,0,3,0,7,0,0,1,21,33,53,1,21,33,53,3,82,253,18,2,238,253,18,1,194,150,150,1,44,150,150,0,1,0,100,0,50,3,232,3,232,0,6,0,0,55,53,9,1,53,1,21,100,2,231,253,25,3,132,50,150,1,65,1,73,150,254,112,150,0,0,0,2,0,100,0,0,3,247,5,150,0,3,0,21,0,0,37,21,35,53,3,54,51,32,17,16,33,35,17,35,17,33,32,53,52,33,34,7,1,179,185,150,210,190,2,3,254,15,83,185,1,9,1,59,254,182,190,210,185,185,185,4,171,50,254,122,254,122,254,232,1,174,240,240,50,0,0,2,0,150,254,132,7,208,5,160,0,39,0,48,0,0,1,16,33,50,23,53,52,33,34,7,53,54,51,32,25,1,20,51,50,17,16,33,32,17,16,33,21,32,17,16,33,32,17,16,33,34,53,6,35,32,0,35,34,21,20,51,50,55,53,2,113,1,170,157,117,254,229,162,170,170,162,1,212,100,205,253,42,253,14,2,173,252,154,3,156,3,158,254,85,241,147,185,254,137,2,78,164,241,190,192,133,1,61,1,67,20,109,171,50,150,50,254,176,253,142,88,2,28,2,238,253,18,252,254,150,3,152,3,132,252,124,253,78,244,94,1,234,170,170,102,218,0,0,1,0,25,0,0,5,167,5,150,0,10,0,0,51,35,1,51,1,35,3,33,55,33,1,217,192,2,95,205,2,98,205,185,254,39,51,1,104,254,245,5,150,250,106,1,194,150,2,136,0,0,0,2,0,170,0,0,4,182,5,150,0,10,0,23,0,0,51,17,33,32,17,20,5,4,17,16,33,39,32,17,52,33,35,53,36,53,52,35,33,17,170,2,98,1,152,254,246,1,28,254,65,11,1,0,254,169,80,1,154,228,254,104,5,150,254,179,244,105,53,254,240,254,89,150,1,4,253,121,55,241,200,251,150,0,0,1,0,100,255,246,4,226,5,160,0,17,0,0,37,6,35,32,17,16,33,50,23,21,38,35,32,17,16,33,50,55,4,226,185,215,253,18,2,238,215,185,185,195,253,183,2,73,195,185,50,60,2,233,2,193,60,160,70,253,213,253,173,70,0,2,0,170,0,0,5,120,5,150,0,6,0,13,0,0,37,32,17,16,41,1,17,7,17,33,32,17,16,33,2,178,2,13,253,243,254,177,185,2,8,2,198,253,58,150,2,92,2,14,251,150,150,5,150,253,92,253,14,0,0,1,0,170,0,0,4,96,5,150,0,11,0,0,1,21,33,17,33,21,33,17,33,21,33,17,4,81,253,18,2,203,253,53,2,253,252,74,5,150,150,254,32,150,254,12,150,5,150,0,0,0,0,1,0,170,0,0,4,81,5,150,0,9,0,0,1,21,33,17,33,21,33,17,35,17,4,81,253,18,2,203,253,53,185,5,150,150,254,32,150,253,118,5,150,0,0,1,0,100,255,246,4,226,5,160,0,19,0,0,37,6,35,32,17,16,33,50,23,21,38,35,32,17,16,33,50,55,17,51,4,226,173,200,252,247,2,238,215,185,185,195,253,183,2,64,92,112,185,56,66,2,233,2,193,60,160,70,253,213,253,173,24,1,230,0,0,0,0,1,0,170,0,0,5,105,5,150,0,11,0,0,51,17,51,17,33,17,51,17,35,17,33,17,170,185,3,77,185,185,252,179,5,150,253,138,2,118,250,106,2,138,253,118,0,0,0,1,0,200,0,0,1,129,5,150,0,3,0,0,1,17,35,17,1,129,185,5,150,250,106,5,150,0,0,1,0,25,0,0,1,254,5,150,0,7,0,0,1,17,16,33,53,32,25,1,1,254,254,27,1,44,5,150,252,6,254,100,150,1,6,3,250,0,0,2,0,170,0,0,5,95,5,150,0,3,0,10,0,0,1,17,35,17,33,9,1,33,1,53,1,1,99,185,4,167,253,124,2,146,254,255,253,185,2,80,5,150,250,106,5,150,253,93,253,13,2,176,112,2,118,0,0,0,0,1,0,170,0,0,4,79,5,150,0,5,0,0,1,17,33,21,33,17,1,99,2,236,252,91,5,150,251,0,150,5,150,0,0,0,0,1,0,170,0,0,6,134,5,150,0,12,0,0,51,17,51,9,1,51,17,35,17,1,35,1,17,170,235,2,13,2,3,225,165,254,4,146,253,252,5,150,251,87,4,169,250,106,4,149,251,107,4,149,251,107,0,1,0,170,0,0,5,125,5,150,0,9,0,0,51,17,51,1,17,51,17,35,1,17,170,185,3,107,175,185,252,149,5,150,251,128,4,128,250,106,4,138,251,118,0,2,0,120,255,246,6,9,5,160,0,7,0,15,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,59,2,11,2,0,254,0,253,245,195,2,206,2,195,253,61,253,50,140,2,67,2,59,253,197,6,2,215,253,41,253,45,0,0,0,0,1,0,170,0,0,4,164,5,150,0,13,0,0,51,17,33,32,17,16,5,39,36,17,52,41,1,17,170,2,68,1,182,253,169,38,1,184,254,254,254,134,5,150,254,129,254,95,92,156,65,1,24,238,251,3,0,2,0,120,254,141,6,9,5,160,0,7,0,18,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,5,19,7,1,32,1,59,2,11,2,0,254,0,253,245,195,2,206,2,195,254,27,232,144,254,202,253,50,140,2,67,2,59,253,197,6,2,215,253,41,253,170,108,254,242,108,1,105,0,0,0,1,0,170,0,0,5,0,5,150,0,16,0,0,51,17,33,32,17,16,5,1,35,1,53,36,53,52,35,33,17,170,2,98,1,152,254,113,1,235,244,254,57,1,154,228,254,104,5,150,254,169,254,233,134,253,94,2,131,121,65,250,198,251,3,0,0,0,0,1,0,100,255,246,4,166,5,160,0,27,0,0,55,53,22,33,32,17,52,33,35,32,17,16,33,50,23,21,38,35,32,17,20,33,51,32,17,16,33,32,150,225,1,5,1,113,254,240,184,254,63,2,63,250,215,215,250,254,122,1,8,184,1,201,253,214,254,251,50,170,80,1,14,230,1,134,1,154,60,170,80,254,252,230,254,122,254,92,0,0,0,1,0,50,0,0,4,111,5,150,0,7,0,0,1,21,33,17,35,17,33,53,4,111,254,62,185,254,62,5,150,150,251,0,5,0,150,0,0,0,0,1,0,160,255,246,5,70,5,150,0,13,0,0,19,17,51,17,16,33,32,25,1,51,17,16,33,32,160,185,1,154,1,154,185,253,173,253,173,2,40,3,110,252,146,254,100,1,156,3,110,252,146,253,206,0,0,1,0,25,0,0,5,167,5,150,0,6,0,0,9,1,35,1,51,9,1,5,167,253,161,205,253,158,195,2,12,1,255,5,150,250,106,5,150,251,42,4,214,0,0,1,0,50,0,0,7,58,5,150,0,12,0,0,19,51,19,1,51,1,19,51,1,35,9,1,35,50,179,201,1,148,185,1,177,227,171,254,243,252,254,108,254,121,249,5,150,251,36,4,220,251,36,4,220,250,106,4,174,251,82,0,0,0,0,1,0,25,0,0,5,95,5,150,0,11,0,0,9,1,51,9,1,51,9,1,35,9,1,35,2,76,253,205,225,1,194,1,194,225,253,206,2,50,225,254,62,254,62,225,2,203,2,203,253,196,2,60,253,53,253,53,2,60,253,196,0,0,0,1,0,25,0,0,4,251,5,150,0,8,0,0,19,51,9,1,51,1,17,35,17,25,205,1,156,1,162,215,253,222,185,5,150,253,21,2,235,252,94,254,12,1,244,0,0,0,0,1,0,125,0,0,4,181,5,150,0,9,0,0,1,21,1,33,21,33,53,1,33,53,4,181,252,167,3,69,251,220,3,116,252,160,5,150,150,251,150,150,150,4,106,150,0,0,0,1,0,150,254,132,2,88,5,150,0,7,0,0,1,21,33,17,33,21,33,17,2,88,254,247,1,9,254,62,5,150,150,250,26,150,7,18,0,0,0,1,0,25,0,0,3,187,5,150,0,3,0,0,19,51,1,35,25,205,2,213,205,5,150,250,106,0,0,1,0,50,254,132,1,244,5,150,0,7,0,0,1,17,33,53,33,17,33,53,1,244,254,62,1,9,254,247,5,150,248,238,150,5,230,150,0,0,0,1,0,50,2,188,3,232,5,150,0,6,0,0,1,51,1,35,9,1,35,1,194,150,1,144,150,254,183,254,191,150,5,150,253,38,2,91,253,165,0,1,0,25,255,106,4,1,0,0,0,3,0,0,33,21,33,53,4,1,252,24,150,150,0,1,0,100,4,167,1,247,5,150,0,3,0,0,1,35,39,51,1,247,164,239,239,4,167,239,0,0,0,2,0,100,0,0,3,217,4,26,0,20,0,29,0,0,19,16,33,50,23,53,52,33,34,7,53,54,51,32,25,1,35,39,6,35,32,1,34,21,20,51,50,55,53,38,100,1,170,137,137,254,229,162,170,170,162,1,212,104,64,157,185,254,137,1,170,241,190,192,133,137,1,61,1,67,20,99,181,50,150,50,254,186,253,44,104,104,1,234,170,170,102,218,20,0,0,2,0,150,0,0,4,64,5,150,0,8,0,19,0,0,37,22,51,32,17,16,33,34,7,3,51,17,54,51,32,17,16,33,34,39,1,79,91,130,1,94,254,195,144,110,185,185,119,136,1,242,253,245,226,189,183,29,1,143,1,81,54,2,82,254,82,50,254,8,253,222,43,0,0,0,0,1,0,100,0,0,3,172,4,26,0,17,0,0,37,6,35,32,17,16,33,50,23,21,38,35,32,17,16,33,50,55,3,172,130,150,253,208,2,48,150,130,130,160,254,147,1,109,160,130,30,30,2,33,1,249,30,150,30,254,157,254,117,30,0,2,0,100,0,0,4,16,5,150,0,8,0,19,0,0,1,38,35,32,17,16,33,50,55,23,6,33,32,17,16,33,50,23,17,51,3,87,112,144,254,195,1,61,144,112,185,191,254,232,254,43,1,242,136,121,185,3,68,54,254,175,254,113,39,130,63,2,34,1,248,50,1,174,0,0,0,2,0,100,0,0,4,7,4,26,0,15,0,20,0,0,1,32,17,20,7,33,16,33,50,55,21,6,35,32,17,16,19,33,2,33,32,2,71,1,192,9,253,31,1,120,179,139,139,199,253,227,185,2,56,6,254,248,254,232,4,26,254,69,63,72,254,190,40,150,40,2,25,2,1,254,88,1,20,0,0,1,0,150,0,0,3,38,5,202,0,15,0,0,51,17,16,33,50,23,21,38,35,34,29,1,33,21,33,17,150,1,176,119,105,99,126,246,1,69,254,187,4,77,1,125,40,150,40,223,59,150,252,124,0,0,0,2,0,100,254,132,4,13,4,26,0,8,0,27,0,0,1,38,35,32,17,16,33,50,55,23,16,33,34,39,53,22,51,32,61,1,6,35,32,17,16,33,50,23,3,84,95,140,254,177,1,61,144,109,185,254,29,194,150,153,193,1,40,118,136,254,14,2,13,213,199,3,104,24,254,149,254,139,54,214,254,132,50,150,50,230,50,50,2,19,2,7,43,0,0,0,0,1,0,150,0,0,4,31,5,150,0,15,0,0,51,17,51,17,54,51,32,25,1,35,17,52,35,34,7,17,150,185,134,193,1,137,185,233,159,143,5,150,254,18,114,254,121,253,109,2,150,234,133,253,5,0,0,2,0,170,0,0,1,99,5,150,0,3,0,7,0,0,1,17,35,17,19,21,35,53,1,99,185,185,185,4,26,251,230,4,26,1,124,175,175,0,0,2,0,45,254,114,1,99,5,150,0,7,0,11,0,0,1,17,16,7,39,54,53,17,19,21,35,53,1,99,155,155,125,185,185,4,26,252,54,254,194,160,105,135,238,3,202,1,124,175,175,0,0,1,0,150,0,0,4,92,5,150,0,20,0,0,51,17,51,17,54,51,32,17,20,5,1,35,1,53,36,53,52,35,34,7,17,150,185,153,200,1,136,254,212,1,80,234,254,178,1,91,220,173,167,5,150,254,50,82,254,209,220,84,254,69,1,189,83,31,189,152,94,252,218,0,0,0,0,1,0,160,0,0,1,89,5,150,0,3,0,0,1,17,35,17,1,89,185,5,150,250,106,5,150,0,0,1,0,150,0,0,6,119,4,26,0,26,0,0,51,17,51,23,54,51,50,23,54,51,32,25,1,35,17,52,35,34,7,17,35,17,52,35,34,7,17,150,125,31,151,178,228,83,171,176,1,106,185,198,148,129,185,196,156,123,4,26,132,132,144,144,254,113,253,117,2,149,235,136,253,8,2,146,238,136,253,8,0,0,0,1,0,150,0,0,4,31,4,26,0,15,0,0,51,17,51,23,54,51,32,25,1,35,17,52,35,34,7,17,150,125,33,161,193,1,137,185,233,159,143,4,26,134,134,254,121,253,109,2,150,234,133,253,5,0,0,2,0,100,0,1,4,76,4,26,0,7,0,15,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,29,1,59,1,59,254,197,254,197,185,1,244,1,244,254,12,254,14,150,1,123,1,115,254,141,4,2,13,253,243,253,244,0,0,0,0,2,0,150,254,132,4,63,4,26,0,8,0,19,0,0,37,22,51,32,17,16,33,34,7,39,54,51,32,17,16,33,34,39,17,35,1,79,109,134,1,71,254,187,140,105,185,209,223,1,249,254,4,126,118,185,214,54,1,137,1,87,24,135,43,254,13,253,217,50,254,82,0,2,0,100,254,132,4,13,4,26,0,8,0,19,0,0,1,38,35,32,17,16,33,50,55,19,35,17,6,35,32,17,16,33,50,23,3,84,95,140,254,177,1,61,144,109,185,185,118,136,254,14,2,13,213,199,3,104,24,254,149,254,139,54,253,174,1,174,50,2,19,2,7,43,0,0,0,1,0,150,0,0,2,128,4,26,0,9,0,0,51,17,51,23,54,51,21,34,7,17,150,125,33,138,194,188,117,4,26,134,134,154,133,253,5,0,0,1,0,100,0,0,3,182,4,26,0,27,0,0,55,53,22,51,50,53,52,43,1,32,17,16,33,50,23,21,38,35,32,21,20,59,1,32,17,16,33,34,140,185,189,251,175,150,254,172,1,181,188,185,185,188,254,250,165,150,1,104,254,76,189,50,160,60,150,140,1,54,1,44,50,160,60,150,140,254,202,254,212,0,0,1,0,150,0,0,2,78,4,196,0,13,0,0,19,51,23,33,21,35,17,20,59,1,21,35,32,17,150,116,40,1,28,255,127,128,176,254,248,4,196,170,150,253,165,147,150,1,27,0,0,0,0,1,0,150,0,0,4,31,4,26,0,15,0,0,1,17,35,39,6,35,32,25,1,51,17,20,51,50,55,17,4,31,127,32,191,193,254,150,185,232,159,144,4,26,251,230,134,134,1,135,2,147,253,106,234,133,2,251,0,0,0,1,0,0,0,0,3,232,4,26,0,6,0,0,17,51,9,1,51,1,35,200,1,45,1,43,200,254,85,172,4,26,252,201,3,55,251,230,0,0,0,1,0,35,0,0,5,224,4,26,0,12,0,0,19,51,19,1,51,1,19,51,1,35,9,1,35,35,187,186,1,17,167,1,36,168,196,254,238,169,254,211,254,226,173,4,26,252,201,3,55,252,201,3,55,251,230,3,17,252,239,0,0,0,0,1,0,25,0,0,4,1,4,26,0,11,0,0,9,1,51,9,1,51,9,1,35,9,1,35,1,162,254,119,215,1,29,1,29,215,254,120,1,136,215,254,227,254,227,215,2,13,2,13,254,131,1,125,253,243,253,243,1,125,254,131,0,0,0,1,0,25,254,124,4,2,4,26,0,10,0,0,19,51,9,1,51,1,2,7,39,54,55,25,201,1,41,1,51,196,254,76,116,232,71,176,80,4,26,252,204,3,52,251,199,254,226,71,131,77,174,0,0,0,0,1,0,100,0,0,3,172,4,26,0,9,0,0,19,33,21,1,33,21,33,53,1,33,120,3,52,253,141,2,95,252,204,2,123,253,153,4,26,150,253,8,140,140,2,248,0,0,0,1,0,100,254,132,2,113,5,150,0,18,0,0,1,6,17,16,7,22,17,16,23,35,38,17,16,35,53,50,17,16,55,2,113,130,210,210,130,185,130,210,210,130,5,150,176,254,210,254,160,75,75,254,160,254,210,176,176,1,46,1,96,150,1,96,1,46,176,0,0,0,0,1,0,150,254,132,1,79,5,150,0,3,0,0,1,17,35,17,1,79,185,5,150,248,238,7,18,0,0,1,0,50,254,132,2,63,5,150,0,18,0,0,19,22,17,16,51,21,34,17,16,7,35,54,17,16,55,38,17,16,39,235,130,210,210,130,185,130,210,210,130,5,150,176,254,210,254,160,150,254,160,254,210,176,176,1,46,1,96,75,75,1,96,1,46,176,0,1,0,100,1,154,3,82,2,129,0,17,0,0,19,54,51,50,23,22,51,50,55,21,6,35,34,39,38,35,34,7,100,58,104,86,117,117,90,109,69,58,104,86,117,117,90,109,69,2,68,61,41,40,60,150,60,40,41,61,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,142,1,103,1,124,0,2,0,25,0,0,5,167,7,43,0,7,0,26,0,0,1,50,53,52,35,34,21,20,1,35,1,51,38,53,52,51,50,21,20,7,1,35,3,33,55,33,1,2,226,134,134,138,254,129,192,2,95,3,125,228,224,125,2,98,205,185,254,39,51,1,104,254,245,5,210,137,134,134,137,250,46,5,150,40,155,210,210,156,40,250,107,1,194,150,2,136,0,1,0,100,254,90,4,226,5,160,0,34,0,0,5,36,17,16,33,50,23,21,38,35,32,17,16,33,50,55,21,6,43,1,7,50,21,20,35,34,39,53,22,51,50,53,52,43,1,2,193,253,163,2,238,215,185,185,195,253,183,2,73,195,185,185,215,16,36,214,241,108,108,108,108,108,83,183,2,68,2,157,2,193,60,160,70,253,213,253,173,70,160,60,67,172,173,50,108,50,65,64,0,0,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,141,1,155,1,124,255,255,0,170,0,0,5,125,7,18,2,34,0,49,0,0,0,3,0,198,1,182,1,124,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,142,1,199,1,124,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,142,1,122,1,124,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,141,1,52,0,0,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,67,0,194,0,0,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,197,0,223,0,0,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,142,0,185,0,0,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,198,0,193,0,0,255,255,0,100,0,0,3,217,6,35,2,34,0,68,0,0,0,3,0,244,0,237,0,0,0,1,0,100,254,90,3,182,4,26,0,34,0,0,37,36,17,16,33,50,23,21,38,35,32,17,16,33,50,55,21,6,43,1,7,50,21,20,35,34,39,53,22,51,50,53,52,43,1,2,18,254,82,2,58,150,130,130,130,254,107,1,149,130,130,130,150,12,41,214,241,108,108,108,108,108,83,183,9,63,1,217,1,249,30,150,30,254,157,254,117,30,150,30,77,172,173,50,108,50,65,64,0,0,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,141,1,75,0,0,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,67,0,197,0,0,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,197,0,225,0,0,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,142,0,198,0,0,255,255,0,128,0,0,2,19,5,150,2,34,0,241,0,0,0,2,0,141,28,0,0,0,255,255,255,250,0,0,1,141,5,150,2,34,0,241,0,0,0,2,0,67,150,0,0,0,255,255,0,13,0,0,2,1,5,150,2,34,0,241,1,0,0,2,0,197,169,0,0,0,255,255,255,241,0,0,2,28,5,150,2,34,0,241,0,0,0,2,0,142,141,0,0,0,255,255,0,150,0,0,4,31,5,150,2,34,0,81,0,0,0,3,0,198,0,253,0,0,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,141,1,110,0,0,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,67,0,231,0,0,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,197,0,250,0,0,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,142,0,223,0,0,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,198,0,250,0,0,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,141,1,112,0,0,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,67,0,234,0,0,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,197,0,253,0,0,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,142,0,225,0,0,0,1,0,50,254,132,3,227,5,150,0,11,0,0,1,17,33,21,33,17,35,17,33,53,33,17,2,103,1,124,254,132,185,254,132,1,124,5,150,254,132,150,251,0,5,0,150,1,124,0,0,0,0,2,0,100,3,143,2,140,5,150,0,7,0,15,0,0,18,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,230,148,144,144,148,130,1,22,1,18,254,238,254,234,4,1,147,144,144,2,1,4,254,252,254,253,0,0,0,1,0,100,0,0,3,182,5,150,0,23,0,0,1,53,51,21,22,23,21,38,35,32,17,16,33,50,55,21,6,7,21,35,53,36,17,16,2,58,175,108,97,130,130,254,107,1,149,130,130,97,108,175,254,42,4,212,194,192,6,22,150,30,254,157,254,117,30,150,22,6,192,195,45,1,239,1,203,0,0,1,0,100,255,222,4,93,5,160,0,40,0,0,55,54,53,52,2,53,16,33,32,23,21,38,33,32,17,20,23,33,21,33,22,21,20,7,54,51,50,23,22,51,50,55,21,6,35,34,39,38,35,34,7,100,186,154,2,46,1,14,157,158,254,236,254,158,45,1,120,254,188,49,64,22,29,91,160,61,60,145,138,120,164,94,107,129,117,153,133,122,75,216,117,1,92,149,1,157,100,180,130,254,251,144,85,150,134,100,137,101,4,43,17,98,170,84,28,32,56,0,0,0,0,2,0,100,255,246,3,182,5,160,0,35,0,45,0,0,55,53,22,51,50,53,52,43,1,32,17,52,55,38,53,16,33,50,23,21,38,35,32,21,20,59,1,32,17,20,7,22,21,16,33,34,2,59,1,50,53,52,43,1,34,21,150,175,189,251,195,110,254,152,122,122,1,201,168,175,175,168,254,220,195,110,1,124,120,120,254,76,189,50,195,110,195,195,110,195,40,160,60,150,130,1,44,138,58,80,144,1,44,50,160,60,150,130,254,215,130,72,64,157,254,212,2,66,136,157,144,0,0,1,0,100,1,254,2,18,3,172,0,7,0,0,19,52,51,50,21,20,35,34,100,215,215,215,215,2,213,215,215,215,0,1,0,0,254,78,3,185,5,150,0,13,0,0,1,17,32,17,16,41,1,21,35,17,35,17,35,17,1,187,254,69,1,187,1,254,150,100,160,254,78,3,204,1,192,1,188,90,249,18,6,238,249,18,0,0,0,1,0,150,0,0,4,87,5,147,0,32,0,0,51,17,16,33,32,17,21,4,21,20,31,1,22,21,16,33,35,53,51,50,53,52,47,1,38,53,52,37,52,35,32,25,1,150,1,208,1,174,254,208,93,93,185,254,118,182,184,197,88,98,165,1,32,246,254,240,3,191,1,212,254,135,85,93,145,91,36,35,72,191,254,210,150,152,91,38,43,72,168,218,118,227,254,191,252,68,0,3,0,150,2,96,3,245,5,170,0,16,0,24,0,32,0,0,1,17,51,50,21,20,7,23,35,39,53,54,53,52,43,1,17,6,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,148,229,153,150,184,91,171,154,86,153,250,1,101,1,104,254,152,254,155,73,1,174,1,177,254,79,254,94,2,244,2,24,128,105,50,253,241,45,25,94,74,254,33,92,1,105,1,113,254,143,2,1,171,254,85,254,97,0,0,0,0,3,0,150,255,246,6,99,5,160,0,7,0,15,0,33,0,0,54,33,32,17,16,33,32,17,39,16,33,32,17,16,33,32,1,6,35,32,17,16,33,50,23,21,38,35,32,17,16,33,50,55,255,2,111,2,140,253,136,253,125,105,2,236,2,225,253,31,253,20,4,9,125,165,254,96,1,160,165,125,125,151,254,187,1,69,151,125,80,2,127,2,119,253,137,4,2,205,253,51,253,35,1,90,51,1,187,1,160,51,98,58,254,187,254,160,58,0,0,0,0,2,0,150,2,245,5,176,5,150,0,7,0,20,0,0,1,21,35,17,35,17,35,53,1,17,51,27,1,51,17,35,17,3,35,3,17,2,149,212,87,212,2,88,110,248,242,106,78,239,69,243,5,150,71,253,166,2,90,71,253,95,2,161,253,207,2,49,253,95,2,31,253,225,2,31,253,225,0,0,0,1,0,100,4,167,1,247,5,150,0,3,0,0,1,51,7,35,1,8,239,239,164,5,150,239,0,0,0,2,0,100,4,236,2,143,5,150,0,3,0,7,0,0,1,21,35,53,35,21,35,53,2,143,185,185,185,5,150,170,170,170,170,0,0,1,0,25,0,0,7,8,5,150,0,18,0,0,1,23,33,3,35,1,33,21,33,19,33,21,33,19,33,21,33,9,1,3,44,58,254,53,194,192,2,95,4,124,252,136,210,2,131,253,194,226,1,147,253,220,253,244,254,246,2,88,150,254,62,5,150,150,254,32,150,254,12,150,4,214,253,130,0,0,0,3,0,100,255,246,5,245,5,160,0,6,0,13,0,31,0,0,1,38,35,32,17,16,31,1,22,51,32,17,16,39,55,22,17,16,33,34,39,7,35,55,38,17,16,33,50,23,55,51,4,75,113,168,253,245,109,118,118,178,2,0,111,112,194,253,61,240,159,54,197,122,190,2,206,228,155,50,198,4,205,61,253,197,254,248,144,104,67,2,67,1,10,142,148,182,254,132,253,45,81,71,161,180,1,116,2,215,76,66,0,0,0,2,0,100,0,0,3,82,4,26,0,11,0,15,0,0,1,17,51,17,33,21,33,17,35,17,33,53,1,21,33,53,1,144,150,1,44,254,212,150,254,212,2,238,253,18,2,238,1,44,254,212,150,254,212,1,44,150,253,168,150,150,0,0,0,1,0,50,0,0,4,176,5,150,0,22,0,0,19,51,9,1,51,1,33,21,33,21,33,21,33,17,35,17,33,53,33,53,33,53,33,50,205,1,106,1,112,215,254,79,1,57,254,136,1,120,254,136,185,254,163,1,93,254,163,1,31,5,150,253,141,2,115,253,68,150,111,150,254,193,1,63,150,111,150,0,0,0,0,1,0,150,254,132,4,31,4,26,0,17,0,0,1,17,35,39,6,35,34,39,17,35,17,51,17,16,51,50,55,17,4,31,127,32,191,173,130,67,185,185,232,159,144,4,26,251,230,134,134,80,254,52,5,150,253,156,254,228,133,2,251,0,0,2,0,100,3,138,2,30,5,150,0,20,0,29,0,0,19,52,51,50,23,53,52,35,34,7,53,54,51,50,21,17,35,39,6,35,34,36,35,34,21,20,51,50,55,53,100,213,79,58,142,80,86,86,80,234,46,38,68,92,198,1,39,82,121,106,96,56,4,45,161,10,50,86,26,76,24,168,254,156,36,36,250,86,90,42,124,0,0,2,0,100,3,138,2,88,5,150,0,7,0,15,0,0,18,51,50,53,52,35,34,21,7,16,51,50,17,16,35,34,193,157,158,158,157,93,250,250,250,248,3,212,190,186,186,2,1,6,254,250,254,250,0,0,0,3,0,100,0,0,6,198,4,26,0,8,0,13,0,47,0,0,1,34,21,20,51,50,55,53,38,37,33,2,33,32,3,6,35,32,17,16,33,50,23,53,52,33,34,7,53,54,51,32,23,54,51,32,17,20,7,33,16,33,50,55,21,6,35,32,2,14,241,190,192,133,137,1,69,2,56,6,254,248,254,232,83,223,225,254,137,1,170,137,137,254,229,162,170,170,162,1,40,109,121,243,1,192,9,253,31,1,120,169,149,139,199,254,232,1,234,170,170,102,218,20,136,1,20,253,14,148,1,61,1,67,20,99,181,50,150,50,130,130,254,69,63,72,254,190,40,150,40,0,0,0,0,3,0,100,0,0,4,89,4,26,0,6,0,13,0,31,0,0,1,38,35,32,17,20,31,1,22,51,32,17,52,39,55,22,21,16,33,34,39,7,35,55,38,3,16,33,50,23,55,51,3,3,69,102,254,197,49,115,63,88,1,59,38,118,105,254,12,148,104,36,197,105,119,1,1,244,163,110,42,198,3,93,39,254,141,150,91,109,29,1,123,128,84,155,131,240,253,244,46,47,138,131,1,0,2,13,56,56,0,2,0,100,254,132,3,247,4,26,0,3,0,21,0,0,1,53,51,21,19,6,35,32,17,16,33,51,17,51,17,33,32,21,20,33,50,55,2,168,185,150,210,190,253,253,1,241,83,185,254,247,254,197,1,74,190,210,3,97,185,185,251,85,50,1,134,1,134,1,24,254,82,240,240,50,0,2,0,150,254,132,1,79,4,26,0,3,0,7,0,0,19,17,51,17,3,53,51,21,150,185,185,185,254,132,4,36,251,220,4,221,185,185,0,0,0,1,0,100,2,138,3,217,4,26,0,5,0,0,19,33,17,35,53,33,100,3,117,150,253,33,4,26,254,112,250,0,0,1,0,50,254,128,3,229,5,154,0,27,0,0,1,38,35,34,15,1,51,7,35,3,2,33,34,39,53,22,51,50,55,19,35,55,51,55,18,33,50,23,3,229,31,27,171,43,24,210,30,210,164,73,254,194,32,34,31,27,171,43,164,190,30,190,24,73,1,62,32,34,5,0,6,216,120,150,252,204,254,148,4,150,6,216,3,52,150,120,1,108,4,0,0,0,0,2,0,100,0,150,3,191,3,132,0,5,0,11,0,0,9,1,51,9,1,35,9,1,51,9,1,35,1,243,1,2,202,254,254,1,2,202,253,111,1,2,202,254,254,1,2,202,2,13,1,119,254,137,254,137,1,119,1,119,254,137,254,137,0,2,0,50,0,150,3,141,3,132,0,5,0,11,0,0,55,35,9,1,51,1,19,35,9,1,51,1,252,202,1,2,254,254,202,1,2,141,202,1,2,254,254,202,1,2,150,1,119,1,119,254,137,254,137,1,119,1,119,254,137,0,0,0,0,3,0,100,0,0,4,61,0,185,0,3,0,7,0,11,0,0,37,21,35,53,33,21,35,53,33,21,35,53,1,29,185,2,73,185,2,73,185,185,185,185,185,185,185,185,0,0,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,67,1,111,1,124,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,198,1,130,1,124,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,198,1,227,1,124,0,2,0,100,0,0,8,42,5,150,0,7,0,24,0,0,36,33,32,17,16,33,32,17,7,16,41,1,21,33,22,19,33,21,33,2,7,33,21,33,32,1,39,2,11,2,0,254,0,253,245,195,2,206,4,233,252,249,195,30,2,3,253,253,30,195,3,22,251,8,253,50,150,2,57,2,49,253,207,6,2,205,150,148,254,180,150,254,155,143,150,0,0,3,0,100,0,0,7,58,4,26,0,7,0,12,0,36,0,0,37,32,17,16,33,32,17,16,1,33,2,33,32,3,6,33,32,3,16,33,32,23,54,33,32,17,20,7,33,16,33,50,55,21,6,35,32,2,88,1,59,254,197,254,197,3,51,2,56,6,254,248,254,232,109,121,254,220,254,14,2,1,244,1,28,123,118,1,21,1,192,9,253,31,1,120,179,139,139,199,254,195,150,1,123,1,115,254,141,254,133,1,220,1,20,253,76,209,2,12,2,13,199,199,254,69,63,72,254,190,40,150,40,0,0,1,0,100,1,194,4,76,2,88,0,3,0,0,1,21,33,53,4,76,252,24,2,88,150,150,0,0,0,1,0,100,1,194,6,64,2,88,0,3,0,0,1,21,33,53,6,64,250,36,2,88,150,150,0,0,0,2,0,50,3,227,2,243,5,150,0,3,0,7,0,0,1,3,35,19,35,3,35,19,2,243,150,185,150,185,150,185,150,5,150,254,77,1,179,254,77,1,179,0,0,2,0,50,3,227,2,243,5,150,0,3,0,7,0,0,1,3,35,19,35,3,35,19,2,243,150,185,150,185,150,185,150,5,150,254,77,1,179,254,77,1,179,0,0,1,0,50,3,227,1,129,5,150,0,3,0,0,1,3,35,19,1,129,150,185,150,5,150,254,77,1,179,0,0,0,0,1,0,50,3,227,1,129,5,150,0,3,0,0,1,3,35,19,1,129,150,185,150,5,150,254,77,1,179,0,0,0,0,3,0,100,0,150,3,117,3,132,0,3,0,7,0,11,0,0,1,21,33,53,1,21,35,53,19,21,35,53,3,117,252,239,1,229,185,185,185,2,88,150,150,254,212,150,150,2,88,150,150,0,255,255,0,25,254,124,4,2,5,150,2,34,0,92,0,0,0,3,0,142,0,148,0,0,255,255,0,25,0,0,4,251,7,18,2,34,0,60,0,0,0,3,0,142,1,17,1,124,0,2,0,100,0,61,4,15,3,220,0,27,0,35,0,0,19,39,55,23,54,51,50,23,55,23,7,22,21,20,7,23,7,39,6,35,34,39,7,39,55,38,53,52,23,20,51,50,53,52,35,34,216,116,109,125,108,134,124,101,128,110,118,58,68,128,110,128,108,125,124,119,116,109,116,57,163,245,245,245,245,2,244,120,112,121,68,68,121,112,120,83,148,139,93,120,112,123,60,60,123,112,120,103,129,137,133,246,246,244,0,0,0,1,0,100,0,150,2,48,3,132,0,5,0,0,19,1,51,9,1,35,100,1,2,202,254,254,1,2,202,2,13,1,119,254,137,254,137,0,0,0,0,1,0,50,0,150,1,254,3,132,0,5,0,0,55,35,9,1,51,1,252,202,1,2,254,254,202,1,2,150,1,119,1,119,254,137,0,1,0,50,254,132,3,227,5,150,0,19,0,0,1,17,33,21,33,17,33,21,33,17,35,17,33,53,33,17,33,53,33,17,2,103,1,124,254,132,1,124,254,132,185,254,132,1,124,254,132,1,124,5,150,254,132,150,253,18,150,254,132,1,124,150,2,238,150,1,124,0,0,1,0,100,1,144,1,94,2,138,0,7,0,0,19,52,51,50,21,20,35,34,100,125,125,125,125,2,13,125,125,125,0,1,0,25,255,6,1,104,0,185,0,3,0,0,37,3,35,19,1,104,150,185,150,185,254,77,1,179,0,2,0,25,255,6,2,218,0,185,0,3,0,7,0,0,37,3,35,19,35,3,35,19,2,218,150,185,150,185,150,185,150,185,254,77,1,179,254,77,1,179,0,0,0,7,0,100,255,246,7,215,5,160,0,3,0,11,0,19,0,27,0,35,0,43,0,51,0,0,33,35,1,51,0,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,0,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,36,51,50,53,52,35,34,21,7,16,33,32,17,16,33,32,1,49,205,3,249,205,251,188,148,144,144,148,130,1,22,1,18,254,238,254,234,5,205,148,144,144,148,130,1,22,1,18,254,238,254,234,253,213,148,144,144,148,130,1,22,1,18,254,238,254,234,5,150,254,117,147,144,144,2,1,4,254,252,254,253,252,207,147,144,144,2,1,4,254,252,254,253,114,147,144,144,2,1,4,254,252,254,253,0,0,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,197,1,130,1,124,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,197,1,39,1,124,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,141,1,246,1,124,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,142,1,12,1,124,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,67,1,20,1,124,255,255,0,158,0,0,2,49,7,18,2,34,0,44,0,0,0,3,0,141,0,58,1,124,255,255,0,43,0,0,2,31,7,18,2,34,0,44,1,0,0,3,0,197,255,199,1,124,255,255,0,15,0,0,2,58,7,18,2,34,0,44,0,0,0,3,0,142,255,171,1,124,255,255,0,24,0,0,1,171,7,18,2,34,0,44,0,0,0,3,0,67,255,180,1,124,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,141,2,86,1,124,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,197,1,227,1,124,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,67,1,208,1,124,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,141,2,9,1,124,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,197,1,149,1,124,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,67,1,130,1,124,0,1,0,100,4,146,2,88,5,150,0,6,0,0,1,51,19,35,39,7,35,1,19,150,175,150,100,100,150,5,150,254,252,160,160,0,0,1,0,100,4,204,2,88,5,150,0,17,0,0,19,54,51,50,23,22,51,50,55,21,6,35,34,39,38,35,34,7,100,60,70,52,58,58,56,75,71,60,70,52,58,58,56,75,71,5,104,46,26,26,46,150,46,26,26,46,0,1,0,100,5,0,2,88,5,150,0,3,0,0,1,21,33,53,2,88,254,12,5,150,150,150,0,0,0,1,0,0,254,90,1,201,0,75,0,16,0,0,17,22,51,50,53,52,43,1,19,51,7,50,21,20,35,34,39,108,108,108,83,183,131,135,81,214,241,108,108,254,248,50,65,64,1,4,152,172,173,50,0,0,0,1,0,25,254,132,1,104,255,156,0,3,0,0,5,3,35,19,1,104,150,185,150,100,254,232,1,24,255,255,0,100,255,246,4,166,7,18,2,34,0,54,0,0,0,3,0,247,1,39,1,124,255,255,0,100,0,0,3,182,5,150,2,34,0,86,0,0,0,3,0,247,0,175,0,0,0,2,0,150,254,132,1,79,5,150,0,3,0,7,0,0,1,17,35,17,19,17,35,17,1,79,185,184,184,1,94,253,38,2,218,4,56,253,38,2,218,0,0,0,0,2,255,226,0,0,5,120,5,150,0,10,0,21,0,0,19,17,33,32,17,16,41,1,17,35,53,41,1,21,33,17,33,32,17,16,41,1,170,2,8,2,198,253,58,253,248,200,1,129,1,109,254,147,1,79,2,13,253,243,254,177,3,32,2,118,253,92,253,14,2,138,150,150,254,12,2,92,2,14,0,2,0,100,255,246,4,66,5,150,0,9,0,34,0,0,1,52,39,38,35,32,17,16,33,32,3,22,17,16,33,32,17,16,33,50,23,38,39,5,53,55,38,43,1,53,51,50,23,55,21,3,137,18,80,214,254,200,1,57,1,55,21,206,254,15,254,19,1,208,177,119,49,98,254,229,161,90,115,206,208,241,158,240,2,64,126,118,90,254,142,254,112,4,87,211,254,52,253,178,2,38,1,254,90,141,79,119,119,68,32,150,100,100,119,0,255,255,0,25,0,0,4,251,7,18,2,34,0,60,0,0,0,3,0,141,1,160,1,124,255,255,0,25,254,124,4,2,5,150,2,34,0,92,0,0,0,3,0,141,1,35,0,0,0,1,0,150,0,0,4,144,5,150,0,15,0,0,51,17,51,17,33,32,17,16,5,39,36,53,52,35,33,17,150,185,1,169,1,152,253,199,38,1,154,228,254,104,5,150,254,204,254,169,254,125,92,156,65,250,198,252,55,0,0,2,0,150,254,132,4,63,5,150,0,8,0,21,0,0,37,22,51,32,17,16,33,34,7,3,51,17,54,51,32,17,16,33,34,39,17,35,1,79,109,134,1,71,254,187,140,105,185,185,96,151,1,249,254,4,126,118,185,214,54,1,137,1,87,24,2,46,254,113,19,254,13,253,217,50,254,82,0,0,0,1,0,100,1,194,3,82,2,88,0,3,0,0,1,21,33,53,3,82,253,18,2,88,150,150,0,0,0,1,0,100,0,207,2,224,3,75,0,11,0,0,1,39,55,23,55,23,7,23,7,39,7,39,1,56,212,106,212,212,106,212,212,106,212,212,106,2,13,212,106,212,212,106,212,212,106,212,212,106,0,1,0,50,2,198,1,22,5,146,0,5,0,0,19,17,35,53,55,17,126,76,228,2,198,2,39,75,90,253,52,0,0,1,0,50,2,198,2,28,5,150,0,16,0,0,19,53,36,53,52,35,34,7,53,54,51,32,21,20,5,33,21,50,1,81,110,110,97,97,110,1,7,254,225,1,31,2,198,135,213,152,85,55,140,50,220,175,190,135,0,0,0,1,0,50,2,194,2,16,5,150,0,28,0,0,19,54,51,32,21,20,7,22,21,20,33,34,39,53,22,51,50,53,52,43,1,53,51,50,53,52,35,34,7,50,100,100,1,22,94,94,254,234,100,100,100,100,126,86,164,162,88,126,100,100,5,120,30,214,98,45,43,100,224,30,140,36,90,76,134,76,80,36,0,0,0,3,0,100,0,0,5,62,5,150,0,3,0,9,0,26,0,0,33,35,1,51,1,17,35,53,55,17,1,53,36,53,52,35,34,7,53,54,51,32,21,20,5,33,21,1,29,185,3,117,185,252,52,74,227,1,245,1,82,110,110,98,98,110,1,6,254,224,1,32,5,150,253,48,2,39,75,90,253,52,253,58,135,213,152,85,55,140,50,220,175,190,135,0,0,0,0,3,0,100,255,252,5,69,5,150,0,3,0,9,0,38,0,0,33,35,1,51,1,17,35,53,55,17,5,54,51,32,21,20,7,22,21,20,33,34,39,53,22,51,50,53,52,43,1,53,51,50,53,52,35,34,7,1,29,185,3,117,185,252,52,74,227,2,9,100,100,1,21,94,94,254,235,100,100,100,100,124,86,164,163,87,124,100,100,5,150,253,48,2,39,75,90,253,52,20,30,214,98,45,43,100,224,30,140,36,90,76,134,76,80,36,0,3,0,100,0,0,5,110,5,150,0,3,0,18,0,47,0,0,33,35,1,51,19,35,53,33,53,19,51,3,51,17,51,17,23,21,35,1,54,51,32,21,20,7,22,21,20,33,34,39,53,22,51,50,53,52,43,1,53,51,50,53,52,35,34,7,1,120,185,3,117,185,55,152,254,170,218,162,213,175,152,74,74,251,64,100,100,1,21,94,94,254,235,100,100,100,100,124,86,164,163,87,124,100,100,5,150,250,106,150,134,1,174,254,82,1,8,254,248,38,96,4,226,30,214,98,45,43,100,224,30,140,36,90,76,134,76,80,36,0,0,1,0,0,0,0,4,59,5,150,0,13,0,0,19,17,51,17,37,21,5,17,33,21,33,17,7,53,150,185,1,67,254,189,2,236,252,91,150,2,200,2,206,253,186,238,180,238,253,250,150,2,20,110,180,0,0,1,0,10,0,0,1,239,5,150,0,11,0,0,19,17,51,17,55,21,7,17,35,17,7,53,160,185,150,150,185,150,2,201,2,205,253,189,111,180,111,253,97,2,21,111,180,0,255,255,0,125,0,0,4,181,7,18,2,34,0,61,0,0,0,3,0,247,1,59,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,93,0,0,0,3,0,247,0,170,0,0,0,1,0,100,0,0,3,82,4,26,0,19,0,0,1,35,53,33,55,33,53,33,19,51,3,51,21,33,7,33,21,33,3,35,1,15,171,1,1,86,254,169,1,173,171,150,171,171,254,255,86,1,87,254,83,171,150,1,44,150,150,150,1,44,254,212,150,150,150,254,212,0,0,3,0,100,0,230,5,140,3,52,0,15,0,23,0,31,0,0,19,16,33,50,23,54,51,32,17,16,33,34,39,6,35,32,1,52,35,34,7,22,51,50,32,51,50,55,38,35,34,21,100,1,64,200,140,140,200,1,64,254,192,200,140,140,200,254,192,4,131,155,130,120,120,130,155,252,34,155,130,120,120,130,155,2,13,1,39,170,170,254,217,254,217,170,170,1,39,145,145,145,145,145,145,0,0,2,0,100,0,0,3,82,4,46,0,3,0,10,0,0,37,21,33,53,17,53,1,21,13,1,21,3,82,253,18,2,238,253,185,2,71,150,150,150,1,194,150,1,64,160,239,231,160,0,0,0,0,2,0,100,0,0,3,82,4,46,0,3,0,10,0,0,37,21,33,61,2,45,1,53,1,21,3,82,253,18,2,71,253,185,2,238,150,150,150,130,160,231,239,160,254,192,150,0,0,2,0,149,255,246,4,191,5,160,0,21,0,30,0,0,0,7,53,54,51,32,17,20,7,2,33,32,17,52,55,18,33,51,54,53,16,35,19,35,32,3,6,21,20,51,32,2,25,184,218,244,1,144,33,142,254,12,254,121,14,87,2,34,234,15,251,203,233,254,150,54,10,236,1,45,5,10,140,170,120,254,66,129,165,253,58,1,55,59,70,1,181,82,66,1,19,253,178,254,242,49,41,200,0,1,0,100,254,132,4,226,5,150,0,11,0,0,19,33,21,33,9,1,33,21,33,53,9,1,100,4,126,252,74,2,28,253,228,3,182,251,130,2,23,253,233,5,150,150,253,48,252,234,150,150,3,22,2,208,0,1,0,150,254,132,5,220,5,150,0,7,0,0,1,17,35,17,33,17,35,17,5,220,175,252,34,185,5,150,248,238,6,124,249,132,7,18,0,0,0,1,0,25,255,251,5,85,4,26,0,22,0,0,19,54,51,33,21,35,17,20,51,50,55,21,6,35,32,25,1,33,17,35,17,34,7,25,140,150,4,26,245,175,15,15,41,37,254,200,254,77,185,150,140,3,222,60,150,253,188,171,1,150,5,1,69,2,68,252,123,3,133,60,0,0,0,1,0,0,255,106,2,77,6,124,0,19,0,0,1,34,17,20,23,19,22,21,16,33,53,50,17,52,39,3,38,53,16,33,2,77,222,1,38,1,254,105,222,1,38,1,1,151,5,230,254,186,26,28,253,18,30,29,254,41,150,1,70,26,28,2,238,30,29,1,215,0,0,1,0,120,0,0,5,210,5,170,0,23,0,0,51,53,33,0,17,16,33,32,17,16,1,33,21,33,53,0,17,16,33,32,17,16,1,21,135,1,49,254,192,2,173,2,173,254,192,1,49,253,218,1,124,254,12,254,12,1,124,150,1,14,1,124,2,138,253,118,254,132,254,242,150,150,1,14,1,124,1,244,254,12,254,132,254,242,150,0,0,0,0,1,0,75,255,249,5,70,7,62,0,8,0,0,19,33,19,1,51,1,35,1,35,75,1,109,242,1,232,180,253,168,165,254,232,230,4,26,252,218,6,74,248,187,3,139,0,0,0,2,0,100,0,250,3,182,3,32,0,17,0,35,0,0,1,21,6,35,34,39,38,35,34,7,53,54,51,50,23,22,51,50,19,21,6,35,34,39,38,35,34,7,53,54,51,50,23,22,51,50,3,182,111,109,109,106,106,104,103,102,112,108,109,106,106,104,104,101,111,109,109,106,106,104,103,102,112,108,109,106,106,104,104,1,194,150,50,50,50,50,150,50,50,50,1,94,150,50,50,50,50,150,50,50,50,0,0,2,0,25,0,0,5,167,5,150,0,3,0,6,0,0,51,1,51,1,37,9,1,25,2,95,206,2,97,254,246,254,59,254,63,5,150,250,106,150,4,64,251,192,0,2,0,50,0,0,4,11,5,150,0,5,0,9,0,0,1,51,9,1,35,1,51,9,2,1,194,185,1,144,254,112,185,254,112,185,1,52,1,51,254,205,5,150,253,53,253,53,2,203,253,203,2,53,2,53,0,1,0,100,0,0,4,146,5,150,0,3,0,0,33,35,1,51,1,29,185,3,117,185,5,150,0,0,0,1,0,150,0,0,3,193,5,222,0,17,0,0,1,17,35,17,16,33,50,23,21,38,35,32,29,1,33,17,35,17,1,79,185,1,186,139,155,149,146,255,0,2,114,185,3,142,252,114,4,77,1,145,60,150,60,233,69,251,230,3,142,0,0,1,0,150,0,0,4,0,5,222,0,17,0,0,1,38,35,32,29,1,33,21,33,17,35,17,16,33,50,23,17,35,3,71,110,88,254,206,1,59,254,197,185,1,236,179,203,185,5,53,19,243,59,150,252,124,4,77,1,145,72,250,106,0,0,4,0,100,255,210,6,88,5,196,0,18,0,82,0,94,0,106,0,0,1,53,39,17,51,19,51,3,35,7,39,35,3,51,19,51,17,7,21,3,55,23,55,23,55,23,55,23,55,23,55,23,51,21,23,7,23,7,23,7,23,7,23,7,23,7,23,7,21,35,7,39,7,39,7,39,7,39,7,39,7,39,7,39,35,53,39,55,39,55,39,55,39,55,39,55,39,55,39,55,53,51,55,5,32,0,17,16,0,33,32,0,17,16,0,6,0,21,20,0,35,34,0,53,52,0,51,4,157,253,135,51,115,38,249,80,79,250,38,114,51,136,253,9,37,89,53,81,68,68,81,53,89,37,94,20,97,94,19,89,36,81,54,68,69,55,82,37,89,19,94,97,20,94,37,89,53,81,68,68,81,53,89,37,95,19,97,95,19,90,37,80,55,69,69,55,82,37,89,19,94,97,19,1,167,254,250,254,142,1,114,1,6,1,6,1,114,254,142,23,1,82,254,174,239,239,254,174,1,82,239,1,76,102,13,2,28,254,112,1,255,43,43,254,1,1,144,253,228,13,102,3,230,89,37,80,53,67,67,53,80,37,89,19,96,96,19,94,37,90,52,82,67,69,82,52,90,37,94,19,96,96,19,89,37,80,53,67,67,53,80,37,89,19,96,96,19,94,39,88,53,81,69,67,82,54,88,37,94,19,96,96,2,254,142,254,251,254,249,254,142,1,114,1,7,1,5,1,114,54,254,173,238,240,254,173,1,83,240,238,1,83,0,0,0,1,0,170,0,0,1,99,4,26,0,3,0,0,1,17,35,17,1,99,185,4,26,251,230,4,26,0,0,1,0,100,4,146,2,118,5,150,0,9,0,0,19,51,20,51,50,53,51,16,33,32,100,135,130,130,135,254,247,254,247,5,150,150,150,254,252,0,0,1,0,100,4,216,1,49,5,150,0,3,0,0,1,21,35,53,1,49,205,5,150,190,190,0,0,0,0,2,0,100,4,128,2,40,6,35,0,7,0,15,0,0,18,51,50,53,52,35,34,21,7,52,51,50,21,20,35,34,190,138,134,134,138,90,228,224,224,228,4,202,137,134,134,2,210,210,209,0,0,2,0,100,4,167,3,111,5,150,0,3,0,7,0,0,1,51,7,35,37,51,7,35,1,8,239,239,164,2,28,239,239,164,5,150,239,239,239,0,0,1,0,100,254,86,1,224,0,0,0,13,0,0,33,6,21,20,51,50,55,21,6,35,34,53,52,55,1,204,202,85,85,52,61,88,231,165,126,102,68,20,130,20,173,131,122,0,0,1,0,100,4,146,2,88,5,150,0,6,0,0,19,51,23,55,51,3,35,100,150,100,100,150,175,150,5,150,160,160,254,252,0,0,0,1,0,100,255,246,4,226,5,160,0,24,0,0,37,6,35,32,17,16,33,50,23,21,38,35,32,3,33,21,33,21,33,21,33,18,33,50,55,4,226,185,215,253,18,2,238,215,185,185,195,254,14,87,3,5,252,231,3,25,252,251,77,1,252,195,185,50,60,2,233,2,193,60,160,70,254,164,150,110,150,254,120,70,255,255,0,125,0,0,4,181,7,18,2,34,0,61,0,0,0,3,0,243,1,207,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,93,0,0,0,3,0,243,1,62,0,0,255,255,0,125,0,0,4,181,7,18,2,34,0,61,0,0,0,3,0,141,1,175,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,93,0,0,0,3,0,141,1,30,0,0,0,1,0,25,254,86,5,187,5,150,0,22,0,0,51,35,1,51,1,6,21,20,51,50,55,21,6,35,34,53,52,55,3,33,55,33,1,217,192,2,95,205,2,98,202,85,85,52,61,88,231,155,185,254,39,51,1,104,254,245,5,150,250,106,126,102,68,20,130,20,173,131,122,1,194,150,2,136,0,0,0,2,0,100,254,86,3,237,4,26,0,8,0,41,0,0,1,34,21,20,51,50,55,53,38,19,53,6,35,32,17,16,33,50,23,53,52,33,34,7,53,54,51,32,25,1,6,21,20,51,50,55,21,6,35,34,53,52,2,14,241,190,192,133,137,154,157,185,254,137,1,170,137,137,254,229,162,170,170,162,1,212,202,85,85,52,61,88,231,1,234,170,170,102,218,20,254,22,104,104,1,61,1,67,20,99,181,50,150,50,254,186,253,44,126,102,68,20,130,20,173,131,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,38,0,0,0,3,0,141,1,185,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,70,0,0,0,3,0,141,1,35,0,0,255,255,0,170,0,0,5,125,7,18,2,34,0,49,0,0,0,3,0,141,2,41,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,81,0,0,0,3,0,141,1,112,0,0,255,255,0,100,255,246,4,166,7,18,2,34,0,54,0,0,0,3,0,141,1,155,1,124,255,255,0,100,0,0,3,182,5,150,2,34,0,86,0,0,0,3,0,141,1,35,0,0,0,1,0,170,254,86,4,116,5,150,0,24,0,0,41,1,17,33,21,33,17,33,21,33,17,33,21,6,21,20,51,50,55,21,6,35,34,53,52,3,157,253,13,3,167,253,18,2,203,253,53,2,253,202,85,85,52,61,88,231,5,150,150,254,32,150,254,12,150,126,102,68,20,130,20,173,131,0,0,0,0,2,0,100,254,86,4,7,4,26,0,4,0,33,0,0,1,33,2,33,32,1,6,35,32,17,16,33,32,17,20,7,33,16,33,50,55,21,6,21,20,51,50,55,21,6,35,34,53,52,1,29,2,56,6,254,238,254,242,1,215,63,70,253,227,1,217,1,202,9,253,31,1,120,179,139,202,85,85,52,61,88,231,2,114,1,20,252,136,14,2,25,2,1,254,67,62,71,254,190,40,150,166,102,68,20,130,20,173,123,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,38,0,0,0,3,0,247,1,160,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,70,0,0,0,3,0,247,0,238,0,0,255,255,0,170,0,0,5,120,7,18,2,34,0,39,0,0,0,3,0,247,1,119,1,124,0,3,0,100,0,0,5,195,5,150,0,8,0,19,0,23,0,0,1,38,35,32,17,16,33,50,55,23,6,33,32,17,16,33,50,23,17,51,33,3,35,19,3,87,112,144,254,195,1,61,144,112,185,191,254,232,254,43,1,242,136,121,185,1,179,150,185,150,3,68,54,254,175,254,113,39,130,63,2,34,1,248,50,1,174,254,77,1,179,0,0,0,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,247,1,39,1,124,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,247,0,235,0,0,255,255,0,170,0,0,5,125,7,18,2,34,0,49,0,0,0,3,0,247,1,182,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,81,0,0,0,3,0,247,0,253,0,0,255,255,0,170,0,0,5,0,7,18,2,34,0,53,0,0,0,3,0,247,1,9,1,124,255,255,0,145,0,0,2,133,5,150,2,34,0,85,0,0,0,2,0,247,45,0,0,0,255,255,0,50,0,0,4,111,7,18,2,34,0,55,0,0,0,3,0,247,0,243,1,124,0,2,0,150,0,0,3,207,5,150,0,13,0,17,0,0,19,51,23,33,21,35,17,20,59,1,21,35,32,17,1,3,35,19,150,116,40,1,28,255,127,128,176,254,248,3,57,150,185,150,4,196,170,150,253,165,147,150,1,27,4,123,254,77,1,179,0,0,255,255,0,160,255,246,5,70,7,57,2,34,0,56,0,0,0,3,0,244,1,173,1,22,255,255,0,150,0,0,4,31,6,35,2,34,0,88,0,0,0,3,0,244,1,21,0,0,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,199,1,130,1,124,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,199,0,193,0,0,255,255,0,25,0,0,5,167,7,18,2,34,0,36,0,0,0,3,0,242,1,115,1,124,255,255,0,100,0,0,3,217,5,150,2,34,0,68,0,0,0,3,0,242,0,198,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,38,0,0,0,3,0,197,1,199,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,70,0,0,0,3,0,197,1,9,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,38,0,0,0,3,0,243,2,121,1,124,255,255,0,100,0,0,3,172,5,150,2,34,0,70,0,0,0,3,0,243,1,187,0,0,255,255,255,206,0,0,5,100,5,150,2,2,0,205,236,0,0,2,0,100,0,0,4,16,5,150,0,8,0,23,0,0,1,38,35,32,17,16,33,50,55,23,6,33,32,17,16,33,50,23,53,33,53,33,53,51,3,87,112,144,254,195,1,61,144,112,185,191,254,232,254,43,1,242,136,121,253,33,2,223,185,3,68,54,254,175,254,113,39,130,63,2,34,1,248,50,140,150,140,0,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,199,1,39,1,124,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,199,0,216,0,0,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,242,1,24,1,124,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,242,0,201,0,0,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,243,1,187,1,124,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,243,1,127,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,42,0,0,0,3,0,197,1,179,1,124,255,255,0,100,254,132,4,13,5,150,2,34,0,74,0,0,0,3,0,197,1,13,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,42,0,0,0,3,0,242,1,164,1,124,255,255,0,100,254,132,4,13,5,150,2,34,0,74,0,0,0,3,0,242,0,244,0,0,255,255,0,100,255,246,4,226,7,18,2,34,0,42,0,0,0,3,0,243,2,121,1,124,255,255,0,100,254,132,4,13,5,150,2,34,0,74,0,0,0,3,0,243,1,170,0,0,255,255,0,100,254,132,4,226,5,160,2,34,0,42,0,0,0,3,0,201,1,227,0,0,0,3,0,100,254,132,4,13,5,150,0,8,0,27,0,31,0,0,1,38,35,32,17,16,33,50,55,23,16,33,34,39,53,22,51,32,61,1,6,35,32,17,16,33,50,23,11,1,35,19,3,84,95,140,254,177,1,61,144,109,185,254,29,194,150,153,193,1,40,118,136,254,14,2,13,213,199,230,150,185,150,3,104,24,254,149,254,139,54,214,254,132,50,150,50,230,50,50,2,19,2,7,43,1,167,254,232,1,24,0,0,0,255,255,0,170,0,0,5,105,7,18,2,34,0,43,0,0,0,3,0,197,1,172,1,124,255,255,0,3,0,0,4,31,7,43,2,34,0,75,0,0,0,3,0,197,255,159,1,149,0,2,0,170,0,0,5,105,5,150,0,11,0,15,0,0,1,53,51,17,35,17,33,17,35,17,51,29,2,33,53,4,176,185,185,252,179,185,185,3,77,4,176,230,250,106,2,138,253,118,5,150,230,150,250,250,0,1,0,150,0,0,4,31,5,150,0,19,0,0,1,21,54,51,32,25,1,35,17,52,35,34,7,17,35,17,51,21,33,21,1,79,134,193,1,137,185,233,159,143,185,185,2,208,4,116,204,114,254,121,253,109,2,150,234,133,253,5,5,150,140,150,0,0,255,255,0,43,0,0,2,31,7,18,2,34,0,44,1,0,0,3,0,198,255,199,1,124,255,255,0,13,0,0,2,1,5,150,2,34,0,241,1,0,0,2,0,198,169,0,0,0,255,255,0,43,0,0,2,31,7,18,2,34,0,44,1,0,0,3,0,199,255,199,1,124,255,255,0,13,0,0,2,1,5,150,2,34,0,241,1,0,0,2,0,199,169,0,0,0,255,255,0,28,0,0,2,46,7,18,2,34,0,44,1,0,0,3,0,242,255,184,1,124,255,255,255,254,0,0,2,16,5,150,2,34,0,241,1,0,0,2,0,242,154,0,0,0,0,1,0,35,254,86,1,159,5,150,0,15,0,0,51,17,51,17,6,21,20,51,50,55,21,6,35,34,53,52,200,185,192,85,85,52,61,88,231,5,150,250,106,126,102,68,20,130,20,173,131,0,0,2,0,5,254,86,1,129,5,150,0,3,0,19,0,0,1,21,35,53,25,1,51,17,6,21,20,51,50,55,21,6,35,34,53,52,1,99,185,185,192,85,85,52,61,88,231,5,150,175,175,250,106,4,26,251,230,126,102,68,20,130,20,173,131,0,0,0,255,255,0,190,0,0,1,139,7,18,2,34,0,44,0,0,0,3,0,243,0,90,1,124,255,255,0,200,0,0,4,71,5,150,0,34,0,44,0,0,0,3,0,45,2,73,0,0,255,255,0,170,254,114,3,112,5,150,0,34,0,76,0,0,0,3,0,77,2,13,0,0,255,255,0,25,0,0,2,156,7,18,2,34,0,45,0,0,0,3,0,197,0,68,1,124,0,2,0,10,254,114,1,254,5,150,0,7,0,14,0,0,1,17,16,7,39,54,53,17,19,51,19,35,39,7,35,1,99,155,155,125,15,150,175,150,100,100,150,4,26,252,54,254,194,160,105,135,238,3,202,1,124,254,252,160,160,0,0,0,255,255,0,170,254,132,5,95,5,150,2,34,0,46,0,0,0,3,0,201,1,224,0,0,255,255,0,150,254,132,4,92,5,150,2,34,0,78,0,0,0,3,0,201,1,85,0,0,0,2,0,150,0,0,4,58,4,26,0,6,0,10,0,0,9,2,35,1,53,9,1,17,51,17,4,52,254,56,1,206,237,254,118,1,141,253,70,185,4,26,254,23,253,207,1,249,103,1,186,251,230,4,26,251,230,0,0,0,255,255,0,170,0,0,4,79,7,18,2,34,0,47,0,0,0,3,0,141,0,72,1,124,255,255,0,51,0,0,1,198,7,43,2,34,0,79,0,0,0,3,0,141,255,207,1,149,255,255,0,170,254,132,4,79,5,150,2,34,0,47,0,0,0,3,0,201,1,138,0,0,255,255,0,5,254,132,1,89,5,150,2,34,0,79,0,0,0,2,0,201,236,0,0,0,0,2,0,170,0,0,4,79,5,150,0,5,0,9,0,0,1,17,33,21,33,17,33,3,35,19,1,99,2,236,252,91,2,198,150,185,150,5,150,251,0,150,5,150,254,77,1,179,0,2,0,160,0,0,3,12,5,150,0,3,0,7,0,0,1,17,35,17,33,3,35,19,1,89,185,2,108,150,185,150,5,150,250,106,5,150,254,77,1,179,0,0,255,255,0,170,0,0,4,79,5,150,2,34,0,47,0,0,0,3,0,178,1,222,0,190,255,255,0,160,0,0,2,223,5,150,0,34,0,79,0,0,0,3,0,178,1,129,0,60,255,255,0,170,254,132,5,125,5,150,2,34,0,49,0,0,0,3,0,201,2,33,0,0,255,255,0,150,254,132,4,31,4,26,2,34,0,81,0,0,0,3,0,201,1,104,0,0,0,2,255,106,0,0,4,131,5,150,0,15,0,19,0,0,51,17,51,23,54,51,32,25,1,35,17,52,35,34,7,17,11,1,35,19,250,125,33,161,193,1,137,185,233,159,143,250,150,185,150,4,26,134,134,254,121,253,109,2,150,234,133,253,5,5,150,254,77,1,179,0,0,1,0,170,254,114,5,125,5,150,0,13,0,0,37,1,17,35,17,51,1,17,51,17,16,7,39,54,4,193,252,152,175,185,3,107,175,155,155,104,4,4,134,251,118,5,150,251,128,4,128,250,186,254,194,160,105,113,0,0,0,1,0,150,254,114,4,31,4,26,0,19,0,0,1,52,35,34,7,17,35,17,51,23,54,51,32,25,1,16,7,39,54,53,3,102,233,159,143,185,125,33,161,193,1,137,155,155,125,2,150,234,133,253,5,4,26,134,134,254,121,253,189,254,194,160,105,135,238,0,0,0,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,199,1,227,1,124,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,199,0,250,0,0,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,242,1,212,1,124,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,242,0,235,0,0,255,255,0,120,255,246,6,9,7,18,2,34,0,50,0,0,0,3,0,245,1,147,1,124,255,255,0,100,0,1,4,76,5,150,2,34,0,82,0,0,0,3,0,245,0,171,0,0,255,255,0,170,0,0,5,0,7,18,2,34,0,53,0,0,0,3,0,141,1,135,1,124,255,255,0,150,0,0,2,152,5,150,2,34,0,85,0,0,0,3,0,141,0,161,0,0,255,255,0,170,254,132,5,0,5,150,2,34,0,53,0,0,0,3,0,201,1,187,0,0,255,255,255,254,254,132,2,128,4,26,2,34,0,85,0,0,0,2,0,201,229,0,0,0,255,255,0,100,255,246,4,166,7,18,2,34,0,54,0,0,0,3,0,197,1,39,1,124,255,255,0,100,0,0,3,182,5,150,2,34,0,86,0,0,0,3,0,197,0,175,0,0,0,1,0,100,254,90,4,166,5,160,0,44,0,0,5,38,39,53,22,33,32,17,52,33,35,32,17,16,33,50,23,21,38,35,32,17,20,33,51,32,17,16,33,35,7,50,21,20,35,34,39,53,22,51,50,53,52,43,1,1,239,182,163,225,1,5,1,113,254,240,184,254,63,2,63,250,215,215,250,254,122,1,8,184,1,201,253,214,10,36,214,241,108,108,108,108,108,83,183,5,11,44,170,80,1,14,230,1,134,1,154,60,170,80,254,252,230,254,122,254,92,67,172,173,50,108,50,65,64,0,0,0,0,1,0,100,254,90,3,182,4,26,0,43,0,0,37,38,39,53,22,51,50,53,52,43,1,32,17,16,33,50,23,21,38,35,32,21,20,59,1,32,17,16,5,7,50,21,20,35,34,39,53,22,51,50,53,52,43,1,1,164,141,139,185,189,251,175,150,254,172,1,181,188,185,185,188,254,250,165,150,1,104,254,113,41,214,241,108,108,108,108,108,83,183,3,9,38,160,60,150,140,1,54,1,44,50,160,60,150,140,254,202,254,225,12,78,172,173,50,108,50,65,64,0,0,255,255,0,100,254,132,4,166,5,160,2,34,0,54,0,0,0,3,0,201,1,147,0,0,255,255,0,100,254,132,3,182,4,26,2,34,0,86,0,0,0,3,0,201,1,27,0,0,255,255,0,50,254,132,4,111,5,150,0,34,0,55,0,0,0,3,0,201,1,62,0,0,255,255,0,125,254,132,2,78,4,196,0,34,0,87,0,0,0,2,0,201,100,0,0,0,0,1,0,50,0,0,4,111,5,150,0,15,0,0,1,17,33,53,33,21,33,17,33,21,33,17,35,17,33,53,1,244,254,62,4,61,254,62,1,194,254,62,185,254,62,3,22,1,234,150,150,254,22,150,253,128,2,128,150,0,0,1,0,0,0,0,2,78,4,196,0,21,0,0,19,17,51,23,33,21,35,17,51,21,35,21,20,59,1,21,35,32,17,53,35,53,150,116,40,1,28,255,255,255,127,128,176,254,248,150,2,121,2,75,170,150,254,245,150,186,147,150,1,27,200,150,0,0,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,198,1,149,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,198,0,253,0,0,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,199,1,149,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,199,0,253,0,0,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,242,1,134,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,242,0,238,0,0,255,255,0,160,255,246,5,70,7,18,2,34,0,56,0,0,0,3,0,245,1,60,1,124,255,255,0,150,0,0,4,31,5,150,2,34,0,88,0,0,0,3,0,245,0,163,0,0,0,1,0,160,254,86,5,70,5,150,0,26,0,0,5,36,25,1,51,17,16,33,32,25,1,51,17,16,5,6,21,20,51,50,55,21,6,35,34,53,52,2,193,253,223,185,1,154,1,154,185,254,65,193,85,85,52,61,88,231,9,23,2,26,3,110,252,146,254,100,1,156,3,110,252,146,254,25,65,126,102,68,20,130,20,173,126,0,0,1,0,150,254,86,4,51,4,26,0,27,0,0,33,53,6,35,32,25,1,51,17,20,51,50,55,17,51,17,6,21,20,51,50,55,21,6,35,34,53,52,3,102,165,193,254,150,185,232,159,144,185,202,85,85,52,61,88,231,134,134,1,135,2,147,253,106,234,133,2,251,251,230,126,102,68,20,130,20,173,131,0,0,255,255,0,50,0,0,7,58,7,18,2,34,0,58,0,0,0,3,0,197,2,88,1,124,255,255,0,35,0,0,5,224,5,150,2,34,0,90,0,0,0,3,0,197,1,164,0,0,255,255,0,25,0,0,4,251,7,18,2,34,0,60,0,0,0,3,0,197,1,44,1,124,255,255,0,25,254,124,4,2,5,150,2,34,0,92,0,0,0,3,0,197,0,176,0,0,0,1,0,150,0,0,3,38,5,202,0,11,0,0,51,17,16,33,50,23,21,38,35,34,21,17,150,1,156,129,115,109,136,226,4,77,1,125,40,150,40,223,251,171,255,255,0,170,0,0,4,96,7,18,2,34,0,40,0,0,0,3,0,142,1,12,1,124,255,255,0,25,0,0,5,167,5,150,2,2,0,36,0,0,0,1,0,170,0,0,4,162,5,150,0,17,0,0,1,21,33,17,33,50,53,16,33,35,53,51,32,17,16,41,1,17,4,147,252,209,1,151,238,254,220,188,197,1,212,254,106,253,158,5,150,150,251,153,249,1,12,150,254,105,254,99,5,150,255,255,0,170,0,0,4,182,5,150,2,2,0,37,0,0,0,1,0,170,0,0,4,79,5,150,0,5,0,0,51,17,33,21,33,17,170,3,165,253,20,5,150,150,251,0,0,0,0,2,0,0,254,132,6,88,5,150,0,4,0,18,0,0,37,33,17,33,16,1,17,51,32,17,53,33,17,51,17,35,17,33,17,1,242,2,244,254,42,252,240,184,1,159,3,72,185,185,251,25,150,4,106,252,85,253,47,2,18,4,106,150,251,0,253,238,1,124,254,132,255,255,0,170,0,0,4,96,5,150,2,2,0,40,0,0,0,3,0,25,0,0,8,36,5,150,0,16,0,20,0,37,0,0,33,0,38,35,53,50,0,59,1,21,35,34,0,7,30,1,9,1,17,35,17,1,0,54,55,38,0,43,1,53,51,50,0,51,21,34,6,1,7,68,254,173,176,78,160,1,71,188,107,79,108,254,244,115,75,180,1,94,252,87,185,252,87,1,94,180,75,115,254,244,108,79,107,188,1,71,160,78,176,254,173,2,28,153,133,2,92,160,254,39,39,13,199,253,222,5,150,250,106,5,150,250,106,2,34,199,13,39,1,217,160,253,164,133,153,253,228,0,0,1,0,100,255,246,3,247,5,160,0,28,0,0,19,54,51,32,17,20,7,22,21,16,33,34,39,53,22,51,32,17,52,35,33,53,33,50,53,52,33,34,7,100,200,200,2,3,188,188,253,253,200,200,200,200,1,74,252,254,184,1,69,255,254,182,200,200,5,100,60,254,122,236,89,85,240,254,102,60,160,70,1,4,250,150,250,240,70,0,0,0,0,1,0,170,0,0,5,75,5,150,0,9,0,0,33,17,1,35,17,51,17,1,51,17,4,156,252,199,185,175,3,57,185,4,158,251,98,5,150,251,98,4,158,250,106,0,0,0,0,2,0,170,0,0,5,75,6,248,0,9,0,19,0,0,33,17,1,35,17,51,17,1,51,17,1,51,20,51,50,53,51,16,33,32,4,156,252,199,185,175,3,57,185,252,159,135,140,140,135,254,237,254,237,4,158,251,98,5,150,251,98,4,158,250,106,6,248,160,160,254,242,0,0,0,0,2,0,170,0,0,5,12,5,150,0,16,0,20,0,0,33,0,38,35,53,50,0,59,1,21,35,34,0,7,30,1,9,1,17,35,17,4,44,254,173,176,78,160,1,71,188,107,79,108,254,244,115,75,180,1,94,252,87,185,2,28,153,133,2,92,160,254,39,39,13,199,253,222,5,150,250,106,5,150,0,1,0,0,0,0,5,74,5,150,0,11,0,0,53,32,25,1,33,17,35,17,33,17,16,33,1,158,3,172,185,253,198,253,169,150,2,138,2,118,250,106,5,0,254,32,252,224,255,255,0,170,0,0,6,134,5,150,2,2,0,48,0,0,0,1,0,170,0,0,5,75,5,150,0,11,0,0,51,17,51,17,33,17,51,17,35,17,33,17,170,185,3,47,185,185,252,209,5,150,253,148,2,108,250,106,2,148,253,108,0,0,255,255,0,120,255,246,6,9,5,160,2,2,0,50,0,0,0,1,0,170,0,0,5,75,5,150,0,7,0,0,51,17,33,17,35,17,33,17,170,4,161,185,252,209,5,150,250,106,5,0,251,0,255,255,0,170,0,0,4,164,5,150,2,2,0,51,0,0,255,255,0,100,255,246,4,226,5,160,2,2,0,38,0,0,255,255,0,50,0,0,4,111,5,150,2,2,0,55,0,0,0,1,0,50,0,0,5,2,5,150,0,14,0,0,9,1,2,33,34,39,53,22,51,50,55,1,51,9,1,5,2,254,19,114,254,237,128,108,106,127,154,63,253,204,195,1,207,1,126,5,150,251,118,254,244,70,150,70,121,4,135,252,43,3,213,0,0,0,0,3,0,100,0,0,6,88,5,150,0,13,0,18,0,23,0,0,37,36,17,16,37,53,51,21,4,17,16,5,21,35,25,1,4,17,16,1,17,36,17,16,3,2,253,98,2,158,184,2,158,253,98,184,254,36,2,148,1,220,113,37,2,51,2,55,37,113,112,34,253,197,253,200,33,112,1,8,3,134,36,254,101,254,94,3,98,252,120,34,1,166,1,159,0,0,0,1,0,25,0,0,5,95,5,150,0,11,0,0,51,35,9,1,51,9,1,51,9,1,35,1,250,225,2,50,253,206,225,1,194,1,194,225,253,206,2,50,225,254,62,2,203,2,203,253,196,2,60,253,53,253,53,2,60,0,0,1,0,170,254,132,5,187,5,150,0,11,0,0,51,17,51,17,33,17,51,17,51,17,35,17,170,185,2,230,185,185,185,5,150,251,0,5,0,251,0,253,238,1,124,0,0,0,0,1,0,125,0,0,4,214,5,150,0,15,0,0,1,17,35,17,6,35,32,25,1,51,17,16,33,50,55,17,4,214,185,196,233,254,13,185,1,83,229,175,5,150,250,106,2,122,114,1,225,1,173,254,80,254,188,133,2,111,0,1,0,170,0,0,6,169,5,150,0,11,0,0,51,17,51,17,33,17,51,17,33,17,51,17,170,185,1,234,185,1,234,185,5,150,251,0,5,0,251,0,5,0,250,106,0,0,0,1,0,170,254,132,7,98,5,150,0,15,0,0,51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,170,185,1,234,185,1,234,185,185,185,5,150,251,0,5,0,251,0,5,0,251,0,253,238,1,124,0,1,0,0,0,0,6,74,5,150,0,17,0,0,1,17,33,50,53,16,33,35,53,51,32,17,16,41,1,17,33,53,2,255,1,152,238,254,220,188,198,1,223,254,94,253,158,253,186,5,150,251,3,249,1,12,150,254,105,254,99,5,0,150,0,2,0,170,0,0,6,49,5,150,0,15,0,19,0,0,1,17,33,50,53,16,33,35,53,51,32,17,16,41,1,17,1,17,51,17,1,99,1,152,238,254,220,188,198,1,223,254,94,253,158,4,206,185,5,150,251,3,249,1,12,150,254,105,254,99,5,150,250,106,5,150,250,106,0,0,0,1,0,170,0,0,4,174,5,150,0,15,0,0,1,17,33,50,53,16,33,35,53,51,32,17,16,41,1,17,1,99,1,152,238,254,220,188,197,1,224,254,94,253,158,5,150,251,3,249,1,12,150,254,105,254,99,5,150,0,0,1,0,125,255,246,4,251,5,160,0,20,0,0,55,22,51,32,19,33,53,33,2,33,34,7,53,54,51,32,17,16,33,34,39,125,185,195,2,30,40,252,134,3,123,33,253,218,195,185,185,215,2,238,253,18,215,185,210,70,1,254,150,1,234,70,160,60,253,63,253,23,60,0,0,0,0,2,0,170,255,246,7,130,5,160,0,14,0,22,0,0,51,17,51,17,33,18,33,32,17,16,33,32,3,33,17,37,32,17,16,33,32,17,16,170,184,1,149,34,2,40,2,65,253,191,253,206,25,254,108,3,223,1,126,254,130,254,119,5,150,253,138,2,128,253,41,253,45,2,148,253,118,140,2,67,2,59,253,197,253,189,0,0,0,1,0,25,0,0,4,111,5,150,0,16,0,0,33,17,33,34,21,20,5,21,1,35,1,36,17,16,41,1,17,3,182,254,104,228,1,154,254,47,234,1,240,254,108,1,172,2,78,4,253,198,250,65,131,253,135,2,137,139,1,23,1,107,250,106,0,0,255,255,0,100,0,0,3,217,4,26,2,2,0,68,0,0,0,2,0,125,255,246,4,142,6,3,0,18,0,26,0,0,1,16,33,32,25,1,16,33,32,55,21,6,33,32,17,54,51,32,17,1,32,17,16,33,32,17,16,4,142,253,250,253,245,2,32,1,36,171,153,254,199,254,161,129,214,1,252,253,250,1,76,254,190,254,169,2,8,253,238,2,18,1,69,2,73,109,163,96,254,87,195,254,4,254,110,1,124,1,118,254,138,254,132,0,0,2,0,150,0,0,4,42,4,26,0,12,0,23,0,0,37,50,53,52,43,1,53,36,53,52,35,33,17,7,17,33,32,17,20,7,22,21,16,33,2,196,156,243,80,1,54,128,254,124,185,2,78,1,52,196,214,254,165,150,160,150,121,35,174,110,253,18,150,4,26,254,249,163,79,53,179,254,199,0,0,1,0,150,0,0,3,80,4,26,0,5,0,0,51,17,33,21,33,17,150,2,186,253,255,4,26,150,252,124,0,0,0,2,0,0,254,132,5,73,4,26,0,4,0,18,0,0,37,33,17,33,16,1,17,51,50,17,53,33,17,51,17,35,17,33,17,1,198,2,17,254,142,253,155,184,244,2,228,185,185,252,40,150,2,238,253,209,253,47,2,18,2,238,150,252,124,253,238,1,124,254,132,0,255,255,0,100,0,0,4,7,4,26,2,2,0,72,0,0,0,3,0,25,0,0,6,159,4,33,0,16,0,20,0,37,0,0,33,39,38,35,53,50,18,59,1,21,35,34,2,7,22,27,1,1,17,35,17,1,19,18,55,38,2,43,1,53,51,50,18,51,21,34,15,1,5,201,147,148,138,160,157,188,107,79,108,102,125,118,165,166,253,24,185,253,27,166,165,118,125,102,108,79,107,188,157,160,138,148,147,246,247,123,1,183,166,254,220,49,21,254,249,254,248,4,33,251,223,4,33,251,223,1,8,1,7,21,49,1,36,166,254,73,123,247,246,0,0,1,0,100,255,246,3,97,4,36,0,28,0,0,19,54,51,32,17,20,7,22,21,16,33,34,39,53,22,51,50,53,52,35,33,53,33,50,53,52,35,34,7,100,200,150,1,159,138,138,254,97,150,200,200,150,230,152,254,184,1,69,155,230,150,200,3,232,60,254,220,154,79,75,150,254,192,60,160,70,170,150,150,158,142,70,0,0,0,1,0,150,0,0,4,51,4,26,0,9,0,0,33,17,1,35,17,51,17,1,51,17,3,132,253,203,185,175,2,53,185,3,44,252,212,4,26,252,212,3,44,251,230,0,0,0,255,255,0,150,0,0,4,51,5,150,2,34,1,154,0,0,0,3,0,242,0,248,0,0,0,2,0,150,0,0,4,55,4,26,0,16,0,20,0,0,33,39,38,35,53,50,18,59,1,21,35,34,2,7,22,27,1,1,17,35,17,3,97,147,148,138,160,157,188,107,79,108,102,125,118,165,166,253,24,185,246,247,123,1,178,160,254,219,49,21,254,249,254,248,4,26,251,230,4,26,0,1,0,0,0,0,4,13,4,26,0,11,0,0,53,50,25,1,33,17,35,17,33,17,16,33,237,3,32,185,254,82,254,90,150,1,14,2,118,251,230,3,132,254,32,254,92,0,0,1,0,150,0,0,5,30,4,26,0,12,0,0,51,17,51,9,1,51,17,35,17,1,35,1,17,150,235,1,99,1,89,225,165,254,174,146,254,166,4,26,252,191,3,65,251,230,3,35,252,221,3,35,252,221,0,1,0,150,0,0,4,51,4,26,0,11,0,0,51,17,51,17,33,17,51,17,35,17,33,17,150,185,2,43,185,185,253,213,4,26,254,72,1,184,251,230,1,204,254,52,0,0,0,2,0,100,255,246,4,116,4,36,0,7,0,15,0,0,19,16,33,32,17,16,33,32,54,33,32,17,16,33,32,17,100,2,8,2,8,253,248,253,250,183,1,79,1,79,254,177,254,177,2,13,2,23,253,233,253,233,150,1,133,1,125,254,131,0,0,0,0,1,0,150,0,0,4,51,4,26,0,7,0,0,51,17,33,17,35,17,33,17,150,3,157,185,253,213,4,26,251,230,3,132,252,124,0,2,0,150,254,132,4,93,4,26,0,8,0,19,0,0,37,22,51,32,17,16,33,34,7,39,54,51,32,17,16,33,34,39,17,35,1,79,109,134,1,101,254,157,140,105,185,209,223,2,23,253,230,126,118,185,214,54,1,137,1,87,24,135,43,254,13,253,217,50,254,82,255,255,0,100,0,0,3,172,4,26,2,2,0,70,0,0,0,1,0,0,0,0,3,157,4,26,0,7,0,0,1,21,33,17,35,17,33,53,3,157,254,142,185,254,142,4,26,150,252,124,3,132,150,0,0,0,0,1,0,25,254,124,4,2,4,26,0,10,0,0,19,51,9,1,51,1,2,7,39,54,55,25,201,1,41,1,51,196,254,76,116,232,71,176,80,4,26,252,204,3,52,251,199,254,226,71,131,77,174,0,0,0,0,3,0,100,254,132,6,8,5,150,0,13,0,18,0,23,0,0,5,36,17,16,37,17,51,17,4,17,16,5,17,35,25,1,4,17,16,1,17,36,17,16,2,218,253,138,2,118,184,2,118,253,138,184,254,76,2,108,1,180,7,34,1,240,1,244,34,1,117,254,140,31,254,8,254,12,31,254,140,2,12,2,250,33,254,168,254,161,2,217,253,4,30,1,100,1,92,0,0,0,0,1,0,25,0,0,4,51,4,26,0,11,0,0,51,35,9,1,51,9,1,51,9,1,35,1,240,215,1,162,254,94,215,1,54,1,54,215,254,94,1,162,215,254,202,2,13,2,13,254,122,1,134,253,243,253,243,1,134,0,0,1,0,150,254,132,5,6,4,26,0,11,0,0,51,17,51,17,33,17,51,17,51,17,35,17,150,185,2,69,185,185,185,4,26,252,124,3,132,252,124,253,238,1,124,0,0,0,0,1,0,125,0,0,4,44,4,26,0,15,0,0,1,17,35,17,6,35,32,25,1,51,17,20,51,50,55,17,4,44,185,146,203,254,103,185,249,199,125,4,26,251,230,1,158,114,1,155,1,83,254,170,254,133,1,207,0,0,0,1,0,150,0,0,5,205,4,26,0,11,0,0,51,17,51,17,33,17,51,17,33,17,51,17,150,185,1,134,185,1,134,185,4,26,252,124,3,132,252,124,3,132,251,230,0,0,0,1,0,150,254,132,6,134,4,26,0,15,0,0,51,17,51,17,33,17,51,17,33,17,51,17,51,17,35,17,150,185,1,134,185,1,134,185,185,185,4,26,252,124,3,132,252,124,3,132,252,124,253,238,1,124,0,1,0,0,0,0,4,228,4,26,0,17,0,0,1,17,33,50,53,52,43,1,53,51,32,17,16,41,1,17,33,53,2,57,1,42,198,182,178,188,1,103,254,144,254,12,254,128,4,26,252,127,169,137,150,254,216,254,199,3,132,150,0,0,0,2,0,150,0,0,5,80,4,26,0,3,0,19,0,0,33,17,51,17,1,17,33,50,53,52,43,1,53,51,32,17,16,41,1,17,4,151,185,251,255,1,62,178,182,178,187,1,104,254,164,253,248,4,26,251,230,4,26,252,127,169,137,150,254,216,254,199,4,26,0,0,0,1,0,150,0,0,3,250,4,26,0,15,0,0,1,17,33,50,53,52,43,1,53,51,32,17,16,41,1,17,1,79,1,62,178,182,178,187,1,104,254,164,253,248,4,26,252,127,169,137,150,254,216,254,199,4,26,0,0,0,0,1,0,100,0,0,3,182,4,26,0,20,0,0,55,22,51,32,19,33,53,33,2,33,34,7,53,54,51,32,17,16,33,34,39,100,130,130,1,103,41,253,172,2,85,36,254,147,130,130,130,150,2,58,253,198,150,130,180,30,1,55,150,1,33,30,150,30,254,7,253,223,30,0,0,0,0,2,0,150,255,246,6,66,4,36,0,7,0,22,0,0,37,32,17,16,33,32,17,16,5,17,51,17,33,18,33,32,17,16,33,32,3,33,17,4,121,1,6,254,250,254,239,253,46,184,1,90,37,1,172,1,201,254,55,254,73,27,254,167,140,1,133,1,125,254,131,254,123,140,4,26,254,72,1,194,253,231,253,235,1,214,254,52,0,1,0,25,0,0,3,227,4,26,0,16,0,0,33,17,33,34,21,20,5,21,1,35,1,36,53,16,41,1,17,3,42,254,154,138,1,64,254,137,234,1,150,254,198,1,82,2,28,3,129,118,140,65,131,254,69,1,213,97,211,1,17,251,230,0,0,0,255,255,0,100,0,0,4,7,5,150,2,34,0,72,0,0,0,3,0,142,0,188,0,0,255,255,0,100,255,6,1,179,4,26,2,2,0,30,0,0,255,255,0,100,4,167,1,247,5,150,2,2,0,141,0,0,0,3,0,100,4,167,3,177,5,150,0,3,0,7,0,11,0,0,1,21,35,53,33,21,35,53,33,51,7,35,3,177,185,254,37,185,1,108,239,239,164,5,150,170,170,170,170,239,255,255,0,25,0,0,5,167,5,150,0,34,1,180,0,0,2,2,1,191,0,0,0,0,0,1,0,100,3,97,1,29,4,26,0,3,0,0,1,21,35,53,1,29,185,4,26,185,185,0,0,0,0,2,255,206,0,0,5,93,5,150,0,3,0,15,0,0,19,51,7,35,37,21,33,17,33,21,33,17,33,21,33,17,114,239,239,164,5,128,253,18,2,203,253,53,2,253,252,74,5,150,239,239,150,254,32,150,254,12,150,5,150,0,0,0,0,2,255,206,0,0,6,102,5,150,0,3,0,15,0,0,19,51,7,35,1,17,51,17,33,17,51,17,35,17,33,17,114,239,239,164,1,217,185,3,77,185,185,252,179,5,150,239,251,89,5,150,253,138,2,118,250,106,2,138,253,118,0,0,0,2,255,206,0,0,2,126,5,150,0,3,0,7,0,0,19,51,7,35,37,17,35,17,114,239,239,164,2,176,185,5,150,239,239,250,106,5,150,0,0,3,255,206,255,246,6,112,5,160,0,3,0,11,0,19,0,0,19,51,7,35,0,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,114,239,239,164,1,212,2,11,2,0,254,0,253,245,195,2,206,2,195,253,61,253,50,5,150,239,251,229,2,67,2,59,253,197,6,2,215,253,41,253,45,0,0,2,255,206,0,0,6,92,5,150,0,3,0,12,0,0,19,51,7,35,37,51,9,1,51,1,17,35,17,114,239,239,164,1,172,205,1,156,1,162,215,253,222,185,5,150,239,239,253,21,2,235,252,94,254,12,1,244,0,0,0,2,255,206,0,0,6,57,5,170,0,3,0,27,0,0,19,51,7,35,1,53,33,0,17,16,33,32,17,16,1,33,21,33,53,0,17,16,33,32,17,16,1,21,114,239,239,164,1,32,1,49,254,192,2,173,2,173,254,192,1,49,253,218,1,124,254,12,254,12,1,124,5,150,239,251,89,150,1,14,1,124,2,138,253,118,254,132,254,242,150,150,1,14,1,124,1,244,254,12,254,132,254,242,150,0,0,0,255,255,255,96,0,0,2,173,5,150,2,34,1,228,0,0,0,3,1,181,254,252,0,0,255,255,0,25,0,0,5,167,5,150,2,2,0,36,0,0,255,255,0,170,0,0,4,182,5,150,2,2,0,37,0,0,0,1,0,170,0,0,4,79,5,150,0,5,0,0,51,17,33,21,33,17,170,3,165,253,20,5,150,150,251,0,0,0,255,255,0,170,0,0,4,96,5,150,2,2,0,40,0,0,255,255,0,125,0,0,4,181,5,150,2,2,0,61,0,0,255,255,0,170,0,0,5,105,5,150,2,2,0,43,0,0,0,3,0,120,255,246,6,9,5,160,0,7,0,15,0,19,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,33,21,33,1,59,2,11,2,0,254,0,253,245,195,2,206,2,195,253,61,253,50,1,117,2,163,253,93,140,2,67,2,59,253,197,6,2,215,253,41,253,45,3,55,150,255,255,0,200,0,0,1,129,5,150,2,2,0,44,0,0,255,255,0,170,0,0,5,95,5,150,2,2,0,46,0,0,0,1,0,25,0,0,5,167,5,150,0,6,0,0,51,1,51,1,35,9,1,25,2,95,205,2,98,205,253,254,254,1,5,150,250,106,4,214,251,42,255,255,0,170,0,0,6,134,5,150,2,2,0,48,0,0,255,255,0,170,0,0,5,125,5,150,2,2,0,49,0,0,0,3,0,100,0,0,4,72,5,150,0,3,0,7,0,11,0,0,55,33,21,33,17,33,21,33,19,33,21,33,100,3,228,252,28,3,228,252,28,60,3,108,252,148,160,160,5,150,160,254,55,160,255,255,0,120,255,246,6,9,5,160,2,2,0,50,0,0,0,1,0,170,0,0,5,75,5,150,0,7,0,0,51,17,33,17,35,17,33,17,170,4,161,185,252,209,5,150,250,106,5,0,251,0,255,255,0,170,0,0,4,164,5,150,2,2,0,51,0,0,0,1,0,100,0,0,4,56,5,150,0,11,0,0,19,33,21,33,9,1,33,21,33,53,9,1,100,3,212,252,254,1,154,254,102,3,2,252,44,1,149,254,107,5,150,150,253,238,253,168,150,150,2,88,2,18,255,255,0,50,0,0,4,111,5,150,2,2,0,55,0,0,255,255,0,25,0,0,4,251,5,150,2,2,0,60,0,0,0,3,0,100,0,0,6,88,5,150,0,13,0,18,0,23,0,0,37,36,17,16,37,53,51,21,4,17,16,5,21,35,25,1,4,17,16,1,17,36,17,16,3,2,253,98,2,158,184,2,158,253,98,184,254,36,2,148,1,220,113,37,2,51,2,55,37,113,112,34,253,197,253,200,33,112,1,8,3,134,36,254,101,254,94,3,98,252,120,34,1,166,1,159,0,0,255,255,0,25,0,0,5,95,5,150,2,2,0,59,0,0,0,1,0,120,0,0,6,34,5,150,0,19,0,0,1,17,51,17,36,25,1,51,17,16,5,17,35,17,36,25,1,51,17,16,2,241,184,1,192,185,253,135,184,253,135,185,2,61,3,89,252,167,34,1,125,1,186,254,70,253,237,35,254,90,1,166,35,2,19,1,186,254,70,254,131,0,255,255,0,15,0,0,2,58,7,18,2,34,1,198,0,0,0,3,0,142,255,171,1,124,255,255,0,25,0,0,4,251,7,18,2,34,1,209,0,0,0,3,0,142,1,17,1,124,255,255,0,100,0,0,5,9,5,150,2,34,1,220,0,0,0,3,1,180,1,164,0,0,255,255,0,100,255,246,3,57,5,150,2,34,1,224,0,0,0,3,1,180,0,228,0,0,255,255,0,150,254,132,4,31,5,150,2,34,1,226,0,0,0,3,1,180,1,112,0,0,255,255,0,128,0,0,2,19,5,150,2,34,1,228,0,0,0,2,1,180,28,0,0,0,255,255,0,150,255,236,4,36,5,150,2,34,1,238,0,0,0,2,1,181,83,0,0,0,0,2,0,100,0,0,5,9,4,26,0,13,0,21,0,0,19,16,33,32,27,1,51,3,19,35,3,2,33,32,54,33,50,19,2,35,32,17,100,1,194,1,75,113,108,187,198,184,190,106,126,254,209,254,64,183,1,9,235,120,120,235,254,247,2,13,2,13,254,188,1,68,253,240,253,246,1,74,254,182,150,1,123,1,115,254,141,0,0,1,0,150,254,150,4,97,5,150,0,28,0,0,19,17,16,33,32,17,16,7,4,17,16,33,34,39,53,22,51,50,53,16,37,53,36,53,52,35,32,25,1,150,1,238,1,154,251,1,62,254,98,136,106,107,137,227,254,141,1,62,246,254,210,254,150,4,209,2,47,254,176,254,250,63,37,254,161,254,129,60,150,60,233,1,52,1,118,54,232,186,254,100,251,50,0,1,0,35,254,132,4,11,4,26,0,8,0,0,19,51,9,1,51,1,17,35,17,35,195,1,46,1,52,195,254,96,185,4,26,252,177,3,79,251,230,254,132,1,124,0,0,0,0,2,0,100,255,246,4,76,5,150,0,13,0,21,0,0,4,33,32,17,16,33,38,39,53,33,21,33,0,19,7,16,33,32,17,16,33,32,4,76,254,5,254,19,2,3,165,236,3,17,254,15,2,73,13,185,254,190,254,200,1,57,1,65,10,2,28,1,254,123,117,150,150,254,197,254,87,4,1,108,254,142,254,122,0,1,0,100,255,246,3,57,4,36,0,28,0,0,1,38,35,34,21,20,59,1,21,35,34,21,20,51,50,55,21,6,35,32,17,52,55,38,53,16,33,50,23,3,57,150,170,210,245,195,198,252,220,170,150,150,170,254,107,218,208,1,149,160,150,3,82,60,132,158,150,180,150,60,160,50,1,44,200,55,59,174,1,26,50,0,0,0,0,1,0,100,254,112,3,185,5,150,0,22,0,0,1,33,21,0,17,16,59,1,32,21,20,5,39,54,53,52,43,1,32,17,16,1,33,1,47,2,138,253,95,218,181,1,8,254,193,70,216,86,181,254,109,2,99,254,104,5,150,150,254,79,254,86,254,241,223,206,121,138,69,118,75,1,161,1,193,1,158,0,0,0,0,1,0,150,254,132,4,31,4,26,0,15,0,0,51,17,51,23,54,51,32,25,1,35,17,52,35,34,7,17,150,125,33,191,193,1,107,185,233,159,143,4,26,134,134,254,121,251,241,4,18,234,133,253,5,0,0,3,0,120,255,246,4,101,5,160,0,4,0,9,0,17,0,0,1,18,33,32,19,39,2,33,32,3,7,16,33,32,17,16,33,32,1,60,13,1,43,1,33,12,2,25,254,238,254,228,26,198,1,252,1,241,254,15,254,4,2,158,253,238,2,18,150,1,214,254,42,107,2,215,253,41,253,45,0,0,0,1,0,170,0,0,1,99,4,26,0,3,0,0,1,17,35,17,1,99,185,4,26,251,230,4,26,0,0,2,0,150,0,0,4,58,4,26,0,6,0,10,0,0,9,2,35,1,53,9,1,17,51,17,4,52,254,56,1,206,237,254,118,1,141,253,70,185,4,26,254,23,253,207,1,249,103,1,186,251,230,4,26,251,230,0,0,0,0,1,0,40,0,0,4,47,5,158,0,10,0,0,1,38,39,55,22,19,1,35,9,1,35,1,206,90,166,71,242,116,1,180,206,254,199,254,201,201,4,12,194,67,141,71,254,226,251,199,3,62,252,194,0,0,0,1,0,40,0,0,4,16,4,26,0,6,0,0,19,51,9,1,51,1,35,40,200,1,45,1,43,200,254,85,172,4,26,252,201,3,55,251,230,0,0,1,0,125,254,112,3,200,5,150,0,32,0,0,1,51,21,35,34,21,20,59,1,21,35,32,17,16,59,1,32,21,20,5,39,54,53,52,43,1,32,17,16,37,38,53,16,2,109,244,243,222,223,232,222,254,184,218,181,1,8,254,193,70,216,86,181,254,109,1,13,179,5,150,150,164,194,150,254,161,254,241,223,206,121,138,69,118,75,1,161,1,76,99,54,220,1,52,0,0,0,2,0,100,0,1,4,76,4,26,0,7,0,15,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,29,1,59,1,59,254,197,254,197,185,1,244,1,244,254,12,254,14,150,1,123,1,115,254,141,4,2,13,253,243,253,244,0,0,0,0,2,0,135,254,132,4,88,4,26,0,8,0,19,0,0,37,22,51,32,17,16,33,32,17,2,33,32,17,16,33,34,39,17,35,17,1,64,109,154,1,91,254,197,254,217,185,1,226,1,239,253,240,146,118,185,224,64,1,134,1,90,254,166,1,244,254,12,253,218,60,254,72,3,162,0,0,1,0,100,254,132,3,175,4,26,0,23,0,0,1,38,35,32,17,20,31,1,4,21,16,33,53,32,53,52,47,1,36,17,16,33,50,23,3,146,112,133,254,123,206,157,1,44,254,72,1,1,141,199,254,192,2,57,133,112,3,82,50,254,153,233,64,45,74,230,254,237,150,121,96,44,61,79,1,110,2,1,50,0,0,2,0,100,0,1,4,203,4,26,0,7,0,18,0,0,36,33,32,17,16,33,32,17,7,16,41,1,21,33,22,21,16,33,32,1,29,1,59,1,59,254,207,254,187,185,1,254,2,105,254,251,134,254,12,254,14,150,1,123,1,115,254,141,4,2,13,150,129,246,253,244,0,1,0,0,255,252,3,6,4,26,0,15,0,0,17,33,21,33,17,20,51,50,55,21,6,35,32,25,1,33,3,6,254,197,216,14,15,41,36,254,159,254,238,4,26,150,253,238,221,1,150,4,1,118,2,18,0,1,0,150,255,236,4,36,4,26,0,13,0,0,19,17,51,17,16,33,32,25,1,51,17,16,33,32,150,185,1,14,1,14,185,254,57,254,57,1,172,2,110,253,146,254,214,1,42,2,110,253,146,254,64,0,0,2,0,100,254,132,5,125,4,26,0,18,0,25,0,0,1,51,6,17,16,5,17,16,33,32,17,16,5,17,35,17,36,17,16,0,17,16,35,34,21,17,1,24,205,200,1,109,1,108,1,135,253,198,185,253,218,4,96,203,182,4,26,225,254,237,254,112,20,2,13,1,139,254,12,253,218,20,254,152,1,104,20,2,38,1,19,253,93,1,144,1,94,245,253,243,0,1,0,40,254,132,4,66,4,26,0,11,0,0,9,1,51,9,1,51,9,1,35,9,1,35,1,207,254,89,205,1,64,1,64,205,254,90,1,166,205,254,192,254,192,205,1,79,2,203,253,226,2,30,253,53,253,53,2,30,253,226,0,0,0,1,0,150,254,132,5,180,4,26,0,19,0,0,37,17,51,17,36,25,1,51,17,16,5,17,35,17,36,25,1,51,17,16,2,200,186,1,121,185,253,206,186,253,206,185,144,3,138,252,118,38,1,100,2,0,254,0,254,4,37,254,139,1,117,37,1,252,2,0,254,0,254,156,0,0,0,1,0,120,0,0,6,19,4,26,0,26,0,0,19,51,6,17,16,51,50,17,51,16,51,50,17,16,39,51,22,17,16,33,34,3,2,35,32,17,16,250,185,130,215,225,185,225,215,130,185,130,254,112,235,85,80,235,254,112,4,26,225,254,237,254,112,2,163,253,93,1,144,1,19,225,225,254,237,253,218,1,63,254,193,2,38,1,19,0,0,0,255,255,255,241,0,0,2,28,5,150,2,34,1,228,0,0,0,2,0,142,141,0,0,0,255,255,0,150,255,236,4,36,5,150,2,34,1,238,0,0,0,3,0,142,0,228,0,0,255,255,0,100,0,1,4,76,5,150,2,34,1,233,0,0,0,3,1,180,1,110,0,0,255,255,0,150,255,236,4,36,5,150,2,34,1,238,0,0,0,3,1,180,1,115,0,0,255,255,0,120,0,0,6,19,5,150,2,34,1,242,0,0,0,3,1,180,2,91,0,0,0,1,0,150,0,0,6,72,5,222,0,33,0,0,1,17,35,17,33,17,35,17,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,21,38,35,32,29,1,6,72,185,254,61,185,254,60,185,1,126,89,85,79,96,196,1,196,1,186,139,155,149,146,255,0,4,26,251,230,3,142,252,114,3,142,252,114,4,87,1,125,40,150,40,213,79,51,1,145,60,150,60,233,69,0,0,1,0,150,0,0,6,125,5,222,0,33,0,0,1,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,17,35,17,38,35,32,29,1,33,21,33,17,35,3,19,254,60,185,1,126,89,85,79,96,196,1,196,1,236,179,203,185,110,88,254,206,1,59,254,197,185,3,142,252,114,4,87,1,125,40,150,40,213,79,51,1,145,72,250,106,5,53,19,243,59,140,252,114,0,0,1,0,150,0,0,5,133,5,212,0,31,0,0,1,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,21,38,35,34,29,1,33,21,33,17,35,3,19,254,60,185,1,126,89,85,79,96,196,1,196,1,156,119,95,89,126,226,1,59,254,197,185,3,142,252,114,4,77,1,125,40,150,40,213,69,61,1,125,40,150,40,223,69,140,252,114,0,1,0,150,254,114,3,193,5,222,0,21,0,0,1,33,17,35,17,16,33,50,23,21,38,35,32,29,1,33,17,16,7,39,54,53,3,8,254,71,185,1,186,139,155,149,146,255,0,2,114,155,155,125,3,142,252,114,4,77,1,145,60,150,60,233,69,252,54,254,194,160,105,135,238,0,0,1,0,150,254,114,6,72,5,222,0,37,0,0,1,53,16,33,50,23,21,38,35,32,29,1,33,17,16,7,39,54,53,17,33,17,35,17,33,17,35,17,16,33,50,23,21,38,35,34,29,1,3,19,1,186,139,155,149,146,255,0,2,124,155,155,125,254,61,185,254,60,185,1,126,89,85,79,96,196,4,26,51,1,145,60,150,60,233,69,252,54,254,194,160,105,135,238,3,62,252,114,3,142,252,114,4,87,1,125,40,150,40,213,79,0,0,2,0,150,0,0,6,241,5,222,0,8,0,33,0,0,37,22,51,32,17,16,33,34,7,3,38,35,32,29,1,33,21,33,17,35,17,16,33,50,23,17,54,51,32,17,16,33,34,39,4,0,91,130,1,94,254,195,144,110,185,110,88,254,206,1,59,254,197,185,1,236,179,203,119,136,1,242,253,245,226,189,183,29,1,143,1,81,54,1,241,19,243,59,150,252,124,4,77,1,145,72,254,82,50,254,8,253,222,43,0,0,0,2,0,150,0,0,9,110,5,222,0,8,0,49,0,0,37,22,51,32,17,16,33,34,7,37,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,17,54,51,32,17,16,33,34,39,17,38,35,32,29,1,33,21,33,17,35,6,125,91,130,1,94,254,195,144,110,252,150,254,60,185,1,126,89,85,79,96,196,1,196,1,236,179,203,119,136,1,242,253,245,226,189,110,88,254,206,1,59,254,197,185,183,29,1,143,1,81,54,74,252,114,4,87,1,125,40,150,40,213,79,51,1,145,72,254,82,50,254,8,253,222,43,5,10,19,243,59,140,252,114,0,0,0,1,0,150,0,0,6,208,5,222,0,29,0,0,1,38,35,32,29,1,33,21,33,17,35,17,16,33,50,23,17,54,51,32,25,1,35,17,52,35,34,7,17,35,3,71,110,88,254,206,1,59,254,197,185,1,236,179,203,134,193,1,137,185,233,159,143,185,5,53,19,243,59,150,252,124,4,77,1,145,72,254,18,114,254,121,253,109,2,150,234,133,253,5,0,0,0,1,0,150,0,0,9,77,5,222,0,45,0,0,1,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,17,54,51,32,25,1,35,17,52,35,34,7,17,35,17,38,35,32,29,1,33,21,33,17,35,3,19,254,60,185,1,126,89,85,79,96,196,1,196,1,236,179,203,134,193,1,137,185,233,159,143,185,110,88,254,206,1,59,254,197,185,3,142,252,114,4,87,1,125,40,150,40,213,79,51,1,145,72,254,18,114,254,121,253,109,2,150,234,133,253,5,5,53,19,243,59,140,252,114,0,0,0,1,0,150,0,0,7,13,5,222,0,34,0,0,1,38,35,32,29,1,33,21,33,17,35,17,16,33,50,23,17,54,51,32,17,20,5,1,35,1,53,36,53,52,35,34,7,17,35,3,71,110,88,254,206,1,59,254,197,185,1,236,179,203,153,200,1,136,254,212,1,80,234,254,178,1,91,220,173,167,185,5,53,19,243,59,150,252,124,4,77,1,145,72,254,50,82,254,209,220,84,254,69,1,189,83,31,189,152,94,252,218,0,1,0,150,0,0,9,138,5,222,0,50,0,0,1,33,17,35,17,16,33,50,23,21,38,35,34,29,1,33,53,16,33,50,23,17,54,51,32,17,20,5,1,35,1,53,36,53,52,35,34,7,17,35,17,38,35,32,29,1,33,21,33,17,35,3,19,254,60,185,1,126,89,85,79,96,196,1,196,1,236,179,203,153,200,1,136,254,212,1,80,234,254,178,1,91,220,173,167,185,110,88,254,206,1,59,254,197,185,3,142,252,114,4,87,1,125,40,150,40,213,79,51,1,145,72,254,50,82,254,209,220,84,254,69,1,189,83,31,189,152,94,252,218,5,53,19,243,59,140,252,114,0,2,0,115,255,246,4,136,4,36,0,7,0,15,0,0,36,33,32,17,16,33,32,17,7,16,33,32,17,16,33,32,1,54,1,77,1,66,254,190,254,179,195,2,16,2,5,253,251,253,240,140,1,133,1,125,254,131,6,2,25,253,231,253,235,0,0,0,0,1,0,115,0,0,3,21,4,26,0,9,0,0,37,17,35,53,37,17,51,21,33,53,1,109,250,1,179,239,253,94,150,2,199,99,90,252,124,150,150,0,0,0,0,1,0,115,0,0,3,247,4,36,0,16,0,0,51,53,0,53,52,33,34,7,53,54,51,32,17,16,1,33,21,115,2,153,254,242,200,195,195,200,1,199,253,221,2,85,150,1,81,243,180,110,160,100,254,182,254,222,254,222,150,0,0,0,0,1,0,100,254,232,3,197,4,26,0,28,0,0,19,54,51,32,17,20,7,22,21,16,33,34,39,53,22,51,32,53,52,35,33,53,33,50,53,52,33,34,7,100,200,180,1,229,188,188,254,27,180,200,200,180,1,44,252,254,234,1,19,255,254,212,180,200,3,222,60,254,132,186,89,85,190,254,112,60,160,70,250,200,150,200,230,70,0,1,0,60,254,232,4,81,4,25,0,14,0,0,1,35,17,33,53,1,51,1,33,17,51,17,23,21,35,3,189,185,253,56,2,33,194,253,222,2,7,185,148,148,254,232,1,53,150,3,102,252,154,1,222,254,34,76,74,0,0,1,0,155,254,222,4,21,4,26,0,21,0,0,19,33,21,33,3,54,51,32,17,16,33,34,39,53,22,51,32,17,52,33,34,7,205,2,252,253,161,33,117,99,1,244,253,208,180,150,150,190,1,109,254,197,195,195,4,26,150,254,110,22,254,122,254,92,60,160,70,1,14,240,50,0,0,2,0,120,255,246,4,126,5,93,0,12,0,22,0,0,19,16,1,23,4,7,54,51,32,17,16,33,32,54,33,32,17,16,33,34,7,6,21,120,2,146,96,254,170,152,111,155,1,248,253,245,254,5,175,1,85,1,77,254,180,184,130,28,2,8,1,250,1,91,127,176,213,43,254,72,254,42,150,1,64,1,34,48,40,136,0,0,0,1,0,40,254,232,3,202,4,26,0,6,0,0,19,33,21,1,35,1,33,40,3,162,253,156,211,2,120,253,29,4,26,150,251,100,4,156,0,0,0,3,0,115,255,246,4,111,5,64,0,15,0,23,0,31,0,0,19,52,55,38,53,16,33,32,17,20,7,4,21,16,33,32,0,53,52,33,32,21,20,33,0,53,52,33,32,21,20,33,115,252,212,1,214,1,214,217,1,1,254,2,254,2,3,27,254,219,254,235,1,34,1,64,254,179,254,195,1,74,1,118,223,108,95,208,1,80,254,176,208,95,108,223,254,128,3,12,238,182,182,238,253,138,238,242,242,238,0,2,0,115,254,187,4,121,4,34,0,12,0,22,0,0,1,16,1,39,36,55,6,35,32,17,16,33,32,6,33,32,17,16,33,50,55,54,53,4,121,253,110,96,1,86,152,111,155,254,8,2,11,1,251,175,254,171,254,179,1,76,184,130,28,2,16,254,6,254,165,127,176,213,43,1,184,1,214,150,254,192,254,222,48,40,136,0,0,2,0,90,254,112,4,66,4,26,0,38,0,46,0,0,1,50,23,55,51,21,35,22,23,16,33,34,39,6,21,20,51,33,32,21,16,33,34,39,53,22,51,32,53,52,35,33,34,53,52,55,38,53,16,18,33,50,53,52,35,32,21,2,45,133,97,146,157,186,84,1,254,67,72,112,75,89,1,88,1,81,254,0,242,211,214,243,1,67,149,254,149,243,120,125,185,1,1,252,252,254,255,4,26,50,50,150,79,134,254,140,30,63,61,71,245,254,207,90,170,110,155,95,184,124,103,89,178,1,116,253,188,215,215,215,0,3,0,90,254,112,4,66,5,150,0,38,0,46,0,53,0,0,1,50,23,55,51,21,35,22,23,16,33,34,39,6,21,20,51,33,32,21,16,33,34,39,53,22,51,32,53,52,35,33,34,53,52,55,38,53,16,18,33,50,53,52,35,32,21,19,51,19,35,39,7,35,2,45,133,97,146,157,186,84,1,254,67,72,112,75,89,1,88,1,81,254,0,242,211,214,243,1,67,149,254,149,243,120,125,185,1,1,252,252,254,255,188,150,175,150,100,100,150,4,26,50,50,150,79,134,254,140,30,63,61,71,245,254,207,90,170,110,155,95,184,124,103,89,178,1,116,253,188,215,215,215,2,233,254,252,160,160,0,0,0,3,0,90,254,112,4,66,5,150,0,38,0,46,0,56,0,0,1,50,23,55,51,21,35,22,23,16,33,34,39,6,21,20,51,33,32,21,16,33,34,39,53,22,51,32,53,52,35,33,34,53,52,55,38,53,16,18,33,50,53,52,35,32,21,3,51,20,51,50,53,51,16,33,32,2,45,133,97,146,157,186,84,1,254,67,72,112,75,89,1,88,1,81,254,0,242,211,214,243,1,67,149,254,149,243,120,125,185,1,1,252,252,254,255,10,135,130,130,135,254,247,254,247,4,26,50,50,150,79,134,254,140,30,63,61,71,245,254,207,90,170,110,155,95,184,124,103,89,178,1,116,253,188,215,215,215,2,233,150,150,254,252,0,0,3,0,90,254,112,4,66,5,150,0,38,0,46,0,50,0,0,1,50,23,55,51,21,35,22,23,16,33,34,39,6,21,20,51,33,32,21,16,33,34,39,53,22,51,32,53,52,35,33,34,53,52,55,38,53,16,18,33,50,53,52,35,32,21,1,21,35,53,2,45,133,97,146,157,186,84,1,254,67,72,112,75,89,1,88,1,81,254,0,242,211,214,243,1,67,149,254,149,243,120,125,185,1,1,252,252,254,255,1,96,205,4,26,50,50,150,79,134,254,140,30,63,61,71,245,254,207,90,170,110,155,95,184,124,103,89,178,1,116,253,188,215,215,215,2,233,190,190,0,0,0,0,3,0,90,254,112,4,66,5,150,0,38,0,46,0,50,0,0,1,50,23,55,51,21,35,22,23,16,33,34,39,6,21,20,51,33,32,21,16,33,34,39,53,22,51,32,53,52,35,33,34,53,52,55,38,53,16,18,33,50,53,52,35,32,21,1,3,35,19,2,45,133,97,146,157,186,84,1,254,67,72,112,75,89,1,88,1,81,254,0,242,211,214,243,1,67,149,254,149,243,120,125,185,1,1,252,252,254,255,1,213,150,185,150,4,26,50,50,150,79,134,254,140,30,63,61,71,245,254,207,90,170,110,155,95,184,124,103,89,178,1,116,253,188,215,215,215,2,233,254,232,1,24,0,0,0,0,2,0,150,0,0,4,58,5,150,0,6,0,10,0,0,9,2,35,1,53,9,1,17,51,17,4,52,254,56,1,206,237,254,118,1,141,253,70,185,4,26,254,23,253,207,1,249,103,1,186,251,230,5,150,250,106,0,0,0,0,3,0,150,254,132,4,58,5,150,0,3,0,7,0,14,0,0,51,17,51,17,5,3,35,19,9,2,35,1,53,1,150,185,1,100,150,185,150,2,58,254,56,1,206,237,254,118,1,141,5,150,250,106,100,254,232,1,24,4,126,254,23,253,207,1,249,103,1,186,0,0,0,1,0,170,255,254,5,161,5,170,0,28,0,0,51,17,16,33,50,5,21,1,4,17,16,33,34,39,53,22,51,32,17,52,37,35,53,1,38,35,32,25,1,170,2,153,233,1,76,254,76,1,221,254,18,176,156,157,177,1,41,254,167,136,1,182,184,184,254,32,3,142,2,28,80,130,254,79,5,254,130,254,90,70,160,80,1,16,251,1,128,1,204,40,254,132,252,104,0,0,0,0,0,1,0,0,25,196,0,1,4,73,24,0,0,10,1,182,0,23,0,26,255,106,0,25,0,26,255,106,0,25,0,28,255,156,0,26,0,23,255,106,0,26,0,25,255,156,0,28,0,26,255,206,0,36,0,55,255,106,0,36,0,57,255,106,0,36,0,60,255,81,0,36,0,173,255,81,0,36,0,207,255,81,0,36,1,17,255,106,0,36,1,94,255,106,0,36,1,96,255,106,0,36,1,110,255,81,0,41,0,36,255,106,0,41,0,98,255,106,0,41,0,99,255,106,0,41,0,143,255,106,0,41,0,160,255,106,0,41,0,161,255,106,0,41,0,182,255,106,0,41,0,184,255,106,0,41,0,253,255,106,0,41,1,21,255,106,0,41,1,23,255,106,0,46,0,38,255,106,0,46,0,42,255,106,0,46,0,50,255,106,0,46,0,52,255,106,0,46,0,100,255,106,0,46,0,103,255,106,0,46,0,144,255,106,0,46,0,162,255,106,0,46,0,163,255,106,0,46,0,191,255,106,0,46,0,192,255,106,0,46,0,193,255,106,0,46,0,255,255,106,0,46,1,7,255,106,0,46,1,25,255,106,0,46,1,27,255,106,0,46,1,37,255,106,0,46,1,39,255,106,0,46,1,41,255,106,0,46,1,43,255,106,0,46,1,78,255,106,0,46,1,80,255,106,0,46,1,82,255,106,0,47,0,38,255,106,0,47,0,42,255,106,0,47,0,50,255,106,0,47,0,52,255,106,0,47,0,55,254,212,0,47,0,57,255,56,0,47,0,60,255,31,0,47,0,100,255,106,0,47,0,103,255,106,0,47,0,144,255,106,0,47,0,162,255,106,0,47,0,163,255,106,0,47,0,173,255,31,0,47,0,191,255,106,0,47,0,192,255,106,0,47,0,193,255,106,0,47,0,207,255,31,0,47,0,255,255,106,0,47,1,7,255,106,0,47,1,17,254,212,0,47,1,25,255,106,0,47,1,27,255,106,0,47,1,37,255,106,0,47,1,39,255,106,0,47,1,41,255,106,0,47,1,43,255,106,0,47,1,78,255,106,0,47,1,80,255,106,0,47,1,82,255,106,0,47,1,94,254,212,0,47,1,96,254,212,0,47,1,110,255,31,0,51,0,36,255,106,0,51,0,45,255,156,0,51,0,98,255,106,0,51,0,99,255,106,0,51,0,143,255,106,0,51,0,160,255,106,0,51,0,161,255,106,0,51,0,182,255,106,0,51,0,184,255,106,0,51,0,253,255,106,0,51,1,21,255,106,0,51,1,23,255,106,0,51,1,60,255,156,0,54,0,54,255,156,0,54,1,3,255,156,0,55,0,36,255,106,0,55,0,45,255,131,0,55,0,68,255,106,0,55,0,70,255,106,0,55,0,71,255,106,0,55,0,72,255,106,0,55,0,74,255,106,0,55,0,80,255,116,0,55,0,81,255,106,0,55,0,82,255,106,0,55,0,83,255,106,0,55,0,84,255,106,0,55,0,85,255,106,0,55,0,86,255,106,0,55,0,87,255,106,0,55,0,88,255,106,0,55,0,89,255,106,0,55,0,90,255,106,0,55,0,91,255,106,0,55,0,92,255,106,0,55,0,93,255,106,0,55,0,98,255,106,0,55,0,99,255,106,0,55,0,105,255,106,0,55,0,106,255,106,0,55,0,107,255,106,0,55,0,108,255,106,0,55,0,109,255,106,0,55,0,110,255,106,0,55,0,111,255,106,0,55,0,112,255,106,0,55,0,113,255,106,0,55,0,114,255,106,0,55,0,115,255,106,0,55,0,121,255,106,0,55,0,122,255,106,0,55,0,123,255,106,0,55,0,124,255,106,0,55,0,125,255,106,0,55,0,126,255,106,0,55,0,127,255,106,0,55,0,128,255,106,0,55,0,129,255,106,0,55,0,143,255,106,0,55,0,150,255,106,0,55,0,151,255,106,0,55,0,160,255,106,0,55,0,161,255,106,0,55,0,164,255,106,0,55,0,182,255,106,0,55,0,184,255,106,0,55,0,250,255,106,0,55,0,252,255,106,0,55,0,253,255,106,0,55,0,254,255,106,0,55,1,0,255,106,0,55,1,2,255,106,0,55,1,4,255,106,0,55,1,6,255,106,0,55,1,8,255,106,0,55,1,10,255,106,0,55,1,12,255,106,0,55,1,14,255,106,0,55,1,16,255,106,0,55,1,18,255,106,0,55,1,20,255,106,0,55,1,21,255,106,0,55,1,22,255,106,0,55,1,23,255,106,0,55,1,24,255,106,0,55,1,26,255,106,0,55,1,28,255,106,0,55,1,32,255,106,0,55,1,34,255,106,0,55,1,36,255,106,0,55,1,38,255,106,0,55,1,40,255,106,0,55,1,42,255,106,0,55,1,44,255,106,0,55,1,60,255,131,0,55,1,64,255,106,0,55,1,74,255,106,0,55,1,77,255,106,0,55,1,79,255,106,0,55,1,81,255,106,0,55,1,83,255,106,0,55,1,85,255,106,0,55,1,87,255,106,0,55,1,89,255,106,0,55,1,91,255,106,0,55,1,93,255,106,0,55,1,95,255,106,0,55,1,97,255,106,0,55,1,99,255,106,0,55,1,101,255,106,0,55,1,103,255,106,0,55,1,105,255,106,0,55,1,107,255,106,0,55,1,109,255,106,0,55,1,111,255,106,0,57,0,36,255,106,0,57,0,68,255,156,0,57,0,70,255,131,0,57,0,71,255,131,0,57,0,72,255,131,0,57,0,74,255,131,0,57,0,80,255,156,0,57,0,81,255,156,0,57,0,82,255,131,0,57,0,83,255,156,0,57,0,84,255,131,0,57,0,85,255,156,0,57,0,86,255,131,0,57,0,93,255,156,0,57,0,98,255,106,0,57,0,99,255,106,0,57,0,105,255,156,0,57,0,106,255,156,0,57,0,107,255,156,0,57,0,108,255,156,0,57,0,109,255,156,0,57,0,110,255,156,0,57,0,111,255,131,0,57,0,112,255,131,0,57,0,113,255,131,0,57,0,114,255,131,0,57,0,115,255,131,0,57,0,120,255,156,0,57,0,121,255,131,0,57,0,122,255,131,0,57,0,123,255,131,0,57,0,124,255,131,0,57,0,125,255,131,0,57,0,143,255,106,0,57,0,150,255,156,0,57,0,151,255,131,0,57,0,160,255,106,0,57,0,161,255,106,0,57,0,164,255,131,0,57,0,182,255,106,0,57,0,184,255,106,0,57,0,250,255,156,0,57,0,252,255,156,0,57,0,253,255,106,0,57,0,254,255,156,0,57,1,2,255,156,0,57,1,4,255,131,0,57,1,6,255,131,0,57,1,8,255,131,0,57,1,10,255,131,0,57,1,12,255,131,0,57,1,14,255,156,0,57,1,16,255,156,0,57,1,20,255,156,0,57,1,21,255,106,0,57,1,22,255,131,0,57,1,23,255,106,0,57,1,24,255,131,0,57,1,26,255,131,0,57,1,28,255,131,0,57,1,32,255,131,0,57,1,34,255,131,0,57,1,36,255,131,0,57,1,38,255,131,0,57,1,40,255,131,0,57,1,42,255,131,0,57,1,44,255,131,0,57,1,64,255,156,0,57,1,74,255,156,0,57,1,77,255,156,0,57,1,79,255,131,0,57,1,81,255,131,0,57,1,83,255,131,0,57,1,85,255,156,0,57,1,87,255,156,0,57,1,89,255,131,0,57,1,91,255,131,0,57,1,93,255,131,0,57,1,99,255,156,0,57,1,101,255,156,0,57,1,103,255,156,0,57,1,105,255,156,0,57,1,107,255,156,0,60,0,36,255,106,0,60,0,68,255,106,0,60,0,70,255,106,0,60,0,71,255,106,0,60,0,72,255,106,0,60,0,74,255,106,0,60,0,80,255,156,0,60,0,81,255,156,0,60,0,82,255,106,0,60,0,83,255,156,0,60,0,84,255,106,0,60,0,85,255,156,0,60,0,86,255,106,0,60,0,88,255,156,0,60,0,91,255,156,0,60,0,93,255,156,0,60,0,98,255,81,0,60,0,99,255,81,0,60,0,105,255,106,0,60,0,106,255,106,0,60,0,107,255,106,0,60,0,108,255,106,0,60,0,109,255,106,0,60,0,110,255,106,0,60,0,111,255,106,0,60,0,112,255,106,0,60,0,113,255,106,0,60,0,114,255,106,0,60,0,115,255,106,0,60,0,120,255,156,0,60,0,121,255,106,0,60,0,122,255,106,0,60,0,123,255,106,0,60,0,124,255,106,0,60,0,125,255,106,0,60,0,126,255,156,0,60,0,127,255,156,0,60,0,128,255,156,0,60,0,129,255,156,0,60,0,143,255,81,0,60,0,150,255,106,0,60,0,151,255,106,0,60,0,160,255,81,0,60,0,161,255,81,0,60,0,164,255,106,0,60,0,182,255,81,0,60,0,184,255,81,0,60,0,250,255,156,0,60,0,252,255,156,0,60,0,253,255,81,0,60,0,254,255,106,0,60,1,0,255,106,0,60,1,2,255,156,0,60,1,4,255,106,0,60,1,6,255,106,0,60,1,8,255,106,0,60,1,10,255,106,0,60,1,12,255,106,0,60,1,14,255,156,0,60,1,16,255,156,0,60,1,18,255,156,0,60,1,20,255,156,0,60,1,21,255,81,0,60,1,22,255,106,0,60,1,23,255,81,0,60,1,24,255,106,0,60,1,26,255,106,0,60,1,28,255,106,0,60,1,32,255,106,0,60,1,34,255,106,0,60,1,36,255,106,0,60,1,38,255,106,0,60,1,40,255,106,0,60,1,42,255,106,0,60,1,44,255,106,0,60,1,64,255,156,0,60,1,74,255,156,0,60,1,77,255,156,0,60,1,79,255,106,0,60,1,81,255,106,0,60,1,83,255,106,0,60,1,85,255,156,0,60,1,87,255,156,0,60,1,89,255,106,0,60,1,91,255,106,0,60,1,93,255,106,0,60,1,95,255,156,0,60,1,97,255,156,0,60,1,99,255,156,0,60,1,101,255,156,0,60,1,103,255,156,0,60,1,105,255,156,0,60,1,107,255,156,0,98,0,55,255,106,0,98,0,57,255,106,0,98,0,60,255,81,0,98,0,173,255,81,0,98,0,207,255,81,0,98,1,17,255,106,0,98,1,94,255,106,0,98,1,96,255,106,0,98,1,110,255,81,0,99,0,55,255,106,0,99,0,57,255,106,0,99,0,60,255,81,0,99,0,173,255,81,0,99,0,207,255,81,0,99,1,17,255,106,0,99,1,94,255,106,0,99,1,96,255,106,0,99,1,110,255,81,0,160,0,55,255,106,0,160,0,57,255,106,0,160,0,60,255,81,0,160,0,173,255,81,0,160,0,207,255,81,0,160,1,17,255,106,0,160,1,94,255,106,0,160,1,96,255,106,0,160,1,110,255,81,0,161,0,55,255,106,0,161,0,57,255,106,0,161,0,60,255,81,0,161,0,173,255,81,0,161,0,207,255,81,0,161,1,17,255,106,0,161,1,94,255,106,0,161,1,96,255,106,0,161,1,110,255,81,0,173,0,36,255,81,0,173,0,68,255,106,0,173,0,70,255,106,0,173,0,71,255,106,0,173,0,72,255,106,0,173,0,74,255,106,0,173,0,80,255,156,0,173,0,81,255,156,0,173,0,82,255,106,0,173,0,83,255,156,0,173,0,84,255,106,0,173,0,85,255,156,0,173,0,86,255,106,0,173,0,88,255,156,0,173,0,91,255,156,0,173,0,93,255,156,0,173,0,98,255,81,0,173,0,99,255,81,0,173,0,105,255,106,0,173,0,106,255,106,0,173,0,107,255,106,0,173,0,108,255,106,0,173,0,109,255,106,0,173,0,110,255,106,0,173,0,111,255,106,0,173,0,112,255,106,0,173,0,113,255,106,0,173,0,114,255,106,0,173,0,115,255,106,0,173,0,120,255,156,0,173,0,121,255,106,0,173,0,122,255,106,0,173,0,123,255,106,0,173,0,124,255,106,0,173,0,125,255,106,0,173,0,126,255,156,0,173,0,127,255,156,0,173,0,128,255,156,0,173,0,129,255,156,0,173,0,143,255,81,0,173,0,150,255,106,0,173,0,151,255,106,0,173,0,160,255,81,0,173,0,161,255,81,0,173,0,164,255,106,0,173,0,182,255,81,0,173,0,184,255,81,0,173,0,250,255,156,0,173,0,252,255,156,0,173,0,253,255,81,0,173,0,254,255,106,0,173,1,0,255,106,0,173,1,2,255,156,0,173,1,4,255,106,0,173,1,6,255,106,0,173,1,8,255,106,0,173,1,10,255,106,0,173,1,12,255,106,0,173,1,14,255,156,0,173,1,16,255,156,0,173,1,18,255,156,0,173,1,20,255,156,0,173,1,21,255,81,0,173,1,22,255,106,0,173,1,23,255,81,0,173,1,24,255,106,0,173,1,26,255,106,0,173,1,28,255,106,0,173,1,32,255,106,0,173,1,34,255,106,0,173,1,36,255,106,0,173,1,38,255,106,0,173,1,40,255,106,0,173,1,42,255,106,0,173,1,44,255,106,0,173,1,64,255,156,0,173,1,74,255,156,0,173,1,77,255,156,0,173,1,79,255,106,0,173,1,81,255,106,0,173,1,83,255,106,0,173,1,85,255,156,0,173,1,87,255,156,0,173,1,89,255,106,0,173,1,91,255,106,0,173,1,93,255,106,0,173,1,95,255,156,0,173,1,97,255,156,0,173,1,99,255,156,0,173,1,101,255,156,0,173,1,103,255,156,0,173,1,105,255,156,0,173,1,107,255,156,0,182,0,55,255,106,0,182,0,57,255,106,0,182,0,60,255,81,0,182,0,173,255,81,0,182,0,207,255,81,0,182,1,17,255,106,0,182,1,94,255,106,0,182,1,96,255,106,0,182,1,110,255,81,0,184,0,55,255,106,0,184,0,57,255,106,0,184,0,60,255,81,0,184,0,173,255,81,0,184,0,207,255,81,0,184,1,17,255,106,0,184,1,94,255,106,0,184,1,96,255,106,0,184,1,110,255,81,0,207,0,36,255,81,0,207,0,68,255,106,0,207,0,70,255,106,0,207,0,71,255,106,0,207,0,72,255,106,0,207,0,74,255,106,0,207,0,80,255,156,0,207,0,81,255,156,0,207,0,82,255,106,0,207,0,83,255,156,0,207,0,84,255,106,0,207,0,85,255,156,0,207,0,86,255,106,0,207,0,88,255,156,0,207,0,91,255,156,0,207,0,93,255,156,0,207,0,98,255,81,0,207,0,99,255,81,0,207,0,105,255,106,0,207,0,106,255,106,0,207,0,107,255,106,0,207,0,108,255,106,0,207,0,109,255,106,0,207,0,110,255,106,0,207,0,111,255,106,0,207,0,112,255,106,0,207,0,113,255,106,0,207,0,114,255,106,0,207,0,115,255,106,0,207,0,120,255,156,0,207,0,121,255,106,0,207,0,122,255,106,0,207,0,123,255,106,0,207,0,124,255,106,0,207,0,125,255,106,0,207,0,126,255,156,0,207,0,127,255,156,0,207,0,128,255,156,0,207,0,129,255,156,0,207,0,143,255,81,0,207,0,150,255,106,0,207,0,151,255,106,0,207,0,160,255,81,0,207,0,161,255,81,0,207,0,164,255,106,0,207,0,182,255,81,0,207,0,184,255,81,0,207,0,250,255,156,0,207,0,252,255,156,0,207,0,253,255,81,0,207,0,254,255,106,0,207,1,0,255,106,0,207,1,2,255,156,0,207,1,4,255,106,0,207,1,6,255,106,0,207,1,8,255,106,0,207,1,10,255,106,0,207,1,12,255,106,0,207,1,14,255,156,0,207,1,16,255,156,0,207,1,18,255,156,0,207,1,20,255,156,0,207,1,21,255,81,0,207,1,22,255,106,0,207,1,23,255,81,0,207,1,24,255,106,0,207,1,26,255,106,0,207,1,28,255,106,0,207,1,32,255,106,0,207,1,34,255,106,0,207,1,36,255,106,0,207,1,38,255,106,0,207,1,40,255,106,0,207,1,42,255,106,0,207,1,44,255,106,0,207,1,64,255,156,0,207,1,74,255,156,0,207,1,77,255,156,0,207,1,79,255,106,0,207,1,81,255,106,0,207,1,83,255,106,0,207,1,85,255,156,0,207,1,87,255,156,0,207,1,89,255,106,0,207,1,91,255,106,0,207,1,93,255,106,0,207,1,95,255,156,0,207,1,97,255,156,0,207,1,99,255,156,0,207,1,101,255,156,0,207,1,103,255,156,0,207,1,105,255,156,0,207,1,107,255,156,0,219,0,38,255,106,0,219,0,42,255,106,0,219,0,50,255,106,0,219,0,52,255,106,0,219,0,55,254,212,0,219,0,57,254,212,0,219,0,60,254,224,0,219,0,100,255,106,0,219,0,103,255,106,0,219,0,144,255,106,0,219,0,162,255,106,0,219,0,163,255,106,0,219,0,173,255,31,0,219,0,191,255,106,0,219,0,192,255,106,0,219,0,193,255,106,0,219,0,207,255,31,0,219,1,17,254,212,0,219,1,94,254,212,0,219,1,96,254,212,0,219,1,110,255,31,0,253,0,55,255,131,0,253,0,57,255,106,0,253,0,60,255,81,0,253,0,173,255,81,0,253,0,207,255,81,0,253,1,17,255,106,0,253,1,94,255,106,0,253,1,96,255,106,0,253,1,110,255,81,1,3,0,54,255,160,1,17,0,36,255,106,1,17,0,45,255,131,1,17,0,68,255,106,1,17,0,70,255,106,1,17,0,71,255,106,1,17,0,72,255,106,1,17,0,74,255,106,1,17,0,80,255,116,1,17,0,81,255,106,1,17,0,82,255,106,1,17,0,83,255,106,1,17,0,84,255,106,1,17,0,85,255,106,1,17,0,86,255,106,1,17,0,87,255,106,1,17,0,88,255,106,1,17,0,89,255,106,1,17,0,90,255,106,1,17,0,91,255,106,1,17,0,92,255,106,1,17,0,93,255,106,1,17,0,98,255,106,1,17,0,99,255,106,1,17,0,105,255,106,1,17,0,106,255,106,1,17,0,107,255,106,1,17,0,108,255,106,1,17,0,109,255,106,1,17,0,110,255,106,1,17,0,111,255,106,1,17,0,112,255,106,1,17,0,113,255,106,1,17,0,114,255,106,1,17,0,115,255,106,1,17,0,121,255,106,1,17,0,122,255,106,1,17,0,123,255,106,1,17,0,124,255,106,1,17,0,125,255,106,1,17,0,126,255,106,1,17,0,127,255,106,1,17,0,128,255,106,1,17,0,129,255,106,1,17,0,143,255,106,1,17,0,150,255,106,1,17,0,151,255,106,1,17,0,160,255,106,1,17,0,161,255,106,1,17,0,164,255,106,1,17,0,182,255,106,1,17,0,184,255,106,1,17,0,250,255,106,1,17,0,252,255,106,1,17,0,253,255,106,1,17,0,254,255,106,1,17,1,0,255,106,1,17,1,2,255,106,1,17,1,4,255,106,1,17,1,6,255,106,1,17,1,8,255,106,1,17,1,10,255,106,1,17,1,12,255,106,1,17,1,14,255,106,1,17,1,16,255,106,1,17,1,18,255,106,1,17,1,20,255,106,1,17,1,21,255,106,1,17,1,22,255,106,1,17,1,23,255,106,1,17,1,24,255,106,1,17,1,26,255,106,1,17,1,28,255,106,1,17,1,32,255,106,1,17,1,34,255,106,1,17,1,36,255,106,1,17,1,38,255,106,1,17,1,40,255,106,1,17,1,42,255,106,1,17,1,44,255,106,1,17,1,60,255,131,1,17,1,64,255,106,1,17,1,74,255,106,1,17,1,77,255,106,1,17,1,79,255,106,1,17,1,81,255,106,1,17,1,83,255,106,1,17,1,85,255,106,1,17,1,87,255,106,1,17,1,89,255,106,1,17,1,91,255,106,1,17,1,93,255,106,1,17,1,95,255,106,1,17,1,97,255,106,1,17,1,99,255,106,1,17,1,101,255,106,1,17,1,103,255,106,1,17,1,105,255,106,1,17,1,107,255,106,1,17,1,109,255,106,1,17,1,111,255,106,1,21,0,55,255,106,1,21,0,57,255,106,1,21,0,60,255,81,1,21,0,173,255,81,1,21,0,207,255,81,1,21,1,17,255,106,1,21,1,94,255,106,1,21,1,96,255,106,1,21,1,110,255,81,1,23,0,55,255,106,1,23,0,57,255,106,1,23,0,60,255,81,1,23,0,173,255,81,1,23,0,207,255,81,1,23,1,17,255,106,1,23,1,94,255,106,1,23,1,96,255,106,1,23,1,110,255,81,1,62,0,38,255,106,1,62,0,42,255,106,1,62,0,50,255,106,1,62,0,52,255,106,1,62,0,100,255,106,1,62,0,103,255,106,1,62,0,144,255,106,1,62,0,162,255,106,1,62,0,163,255,106,1,62,0,191,255,106,1,62,0,192,255,106,1,62,0,193,255,106,1,62,0,255,255,106,1,62,1,7,255,106,1,62,1,25,255,106,1,62,1,27,255,106,1,62,1,37,255,106,1,62,1,39,255,106,1,62,1,41,255,106,1,62,1,43,255,106,1,62,1,78,255,106,1,62,1,80,255,106,1,62,1,82,255,106,1,65,0,38,255,106,1,65,0,42,255,106,1,65,0,50,255,106,1,65,0,52,255,106,1,65,0,55,254,212,1,65,0,60,255,31,1,65,0,100,255,106,1,65,0,103,255,106,1,65,0,144,255,106,1,65,0,162,255,106,1,65,0,163,255,106,1,65,0,173,255,31,1,65,0,191,255,106,1,65,0,192,255,106,1,65,0,193,255,106,1,65,0,207,255,31,1,65,1,17,254,212,1,65,1,25,255,106,1,65,1,27,255,106,1,65,1,37,255,106,1,65,1,39,255,106,1,65,1,41,255,106,1,65,1,43,255,106,1,65,1,78,255,106,1,65,1,80,255,106,1,65,1,82,255,106,1,65,1,94,254,212,1,65,1,96,254,212,1,65,1,110,255,31,1,67,0,38,255,106,1,67,0,42,255,106,1,67,0,55,254,212,1,67,0,100,255,106,1,67,0,103,255,106,1,67,0,144,255,106,1,67,0,162,255,106,1,67,0,163,255,106,1,67,0,173,255,31,1,67,0,191,255,106,1,67,0,192,255,106,1,67,0,193,255,106,1,67,0,207,255,31,1,67,0,255,255,106,1,67,1,7,255,106,1,67,1,17,254,212,1,67,1,25,255,106,1,67,1,27,255,106,1,67,1,37,255,106,1,67,1,39,255,106,1,67,1,41,255,106,1,67,1,43,255,106,1,67,1,78,255,106,1,67,1,80,255,106,1,67,1,82,255,106,1,67,1,94,254,212,1,67,1,96,254,212,1,67,1,110,255,31,1,69,0,55,255,56,1,69,0,173,255,31,1,69,0,207,255,31,1,69,1,17,255,56,1,69,1,94,255,56,1,69,1,96,255,56,1,69,1,110,255,31,1,71,0,55,254,212,1,71,0,173,255,31,1,71,0,207,255,31,1,71,1,17,254,212,1,71,1,94,254,212,1,71,1,96,254,212,1,71,1,110,255,31,1,94,0,36,255,106,1,94,0,45,255,131,1,94,0,68,255,106,1,94,0,70,255,106,1,94,0,71,255,106,1,94,0,72,255,106,1,94,0,74,255,106,1,94,0,80,255,116,1,94,0,81,255,106,1,94,0,82,255,106,1,94,0,83,255,106,1,94,0,84,255,106,1,94,0,85,255,106,1,94,0,86,255,106,1,94,0,87,255,106,1,94,0,88,255,106,1,94,0,89,255,106,1,94,0,90,255,106,1,94,0,91,255,106,1,94,0,92,255,106,1,94,0,93,255,106,1,94,0,98,255,106,1,94,0,99,255,106,1,94,0,105,255,106,1,94,0,106,255,106,1,94,0,107,255,106,1,94,0,108,255,106,1,94,0,109,255,106,1,94,0,110,255,106,1,94,0,111,255,106,1,94,0,112,255,106,1,94,0,113,255,106,1,94,0,114,255,106,1,94,0,115,255,106,1,94,0,121,255,106,1,94,0,122,255,106,1,94,0,123,255,106,1,94,0,124,255,106,1,94,0,125,255,106,1,94,0,126,255,106,1,94,0,127,255,106,1,94,0,128,255,106,1,94,0,129,255,106,1,94,0,143,255,106,1,94,0,150,255,106,1,94,0,151,255,106,1,94,0,160,255,106,1,94,0,161,255,106,1,94,0,164,255,106,1,94,0,182,255,106,1,94,0,184,255,106,1,94,0,250,255,106,1,94,0,252,255,106,1,94,0,253,255,106,1,94,0,254,255,106,1,94,1,0,255,106,1,94,1,2,255,106,1,94,1,4,255,106,1,94,1,6,255,106,1,94,1,8,255,106,1,94,1,10,255,106,1,94,1,12,255,106,1,94,1,14,255,106,1,94,1,16,255,106,1,94,1,18,255,106,1,94,1,20,255,106,1,94,1,21,255,106,1,94,1,22,255,106,1,94,1,23,255,106,1,94,1,24,255,106,1,94,1,26,255,106,1,94,1,28,255,106,1,94,1,32,255,106,1,94,1,34,255,106,1,94,1,36,255,106,1,94,1,38,255,106,1,94,1,40,255,106,1,94,1,42,255,106,1,94,1,44,255,106,1,94,1,60,255,131,1,94,1,64,255,106,1,94,1,74,255,106,1,94,1,77,255,106,1,94,1,79,255,106,1,94,1,81,255,106,1,94,1,83,255,106,1,94,1,85,255,106,1,94,1,87,255,106,1,94,1,89,255,106,1,94,1,91,255,106,1,94,1,93,255,106,1,94,1,95,255,106,1,94,1,97,255,106,1,94,1,99,255,106,1,94,1,101,255,106,1,94,1,103,255,106,1,94,1,105,255,106,1,94,1,107,255,106,1,94,1,109,255,106,1,94,1,111,255,106,1,96,0,36,255,106,1,96,0,45,255,131,1,96,0,98,255,106,1,96,0,99,255,106,1,96,0,143,255,106,1,96,0,160,255,106,1,96,0,161,255,106,1,96,0,182,255,106,1,96,0,184,255,106,1,96,0,253,255,106,1,96,1,21,255,106,1,96,1,23,255,106,1,96,1,60,255,131,1,110,0,36,255,81,1,110,0,68,255,106,1,110,0,70,255,106,1,110,0,71,255,106,1,110,0,72,255,106,1,110,0,74,255,106,1,110,0,80,255,156,1,110,0,81,255,156,1,110,0,82,255,106,1,110,0,83,255,156,1,110,0,84,255,106,1,110,0,85,255,156,1,110,0,86,255,106,1,110,0,88,255,156,1,110,0,91,255,156,1,110,0,93,255,156,1,110,0,98,255,81,1,110,0,99,255,81,1,110,0,105,255,106,1,110,0,106,255,106,1,110,0,107,255,106,1,110,0,108,255,106,1,110,0,109,255,106,1,110,0,110,255,106,1,110,0,111,255,106,1,110,0,112,255,106,1,110,0,113,255,106,1,110,0,114,255,106,1,110,0,115,255,106,1,110,0,120,255,156,1,110,0,121,255,106,1,110,0,122,255,106,1,110,0,123,255,106,1,110,0,124,255,106,1,110,0,125,255,106,1,110,0,126,255,156,1,110,0,127,255,156,1,110,0,128,255,156,1,110,0,129,255,156,1,110,0,143,255,81,1,110,0,150,255,106,1,110,0,151,255,106,1,110,0,160,255,81,1,110,0,161,255,81,1,110,0,164,255,106,1,110,0,182,255,81,1,110,0,184,255,81,1,110,0,250,255,156,1,110,0,252,255,156,1,110,0,253,255,81,1,110,0,254,255,106,1,110,1,0,255,106,1,110,1,2,255,156,1,110,1,4,255,106,1,110,1,6,255,106,1,110,1,8,255,106,1,110,1,10,255,106,1,110,1,12,255,106,1,110,1,14,255,156,1,110,1,16,255,156,1,110,1,18,255,156,1,110,1,20,255,156,1,110,1,21,255,81,1,110,1,22,255,106,1,110,1,23,255,81,1,110,1,24,255,106,1,110,1,26,255,106,1,110,1,28,255,106,1,110,1,32,255,106,1,110,1,34,255,106,1,110,1,36,255,106,1,110,1,38,255,106,1,110,1,40,255,106,1,110,1,42,255,106,1,110,1,44,255,106,1,110,1,64,255,156,1,110,1,74,255,156,1,110,1,77,255,156,1,110,1,79,255,106,1,110,1,81,255,106,1,110,1,83,255,106,1,110,1,85,255,156,1,110,1,87,255,156,1,110,1,89,255,106,1,110,1,91,255,106,1,110,1,93,255,106,1,110,1,95,255,156,1,110,1,97,255,156,1,110,1,99,255,156,1,110,1,101,255,156,1,110,1,103,255,156,1,110,1,105,255,156,1,110,1,107,255,156,1,114,1,132,255,106,1,114,1,137,255,106,1,114,1,140,255,56,1,117,1,114,255,31,1,117,1,118,254,187,1,117,1,125,255,81,1,118,1,128,255,206,1,118,1,131,255,206,1,118,1,134,255,206,1,128,1,118,255,106,1,130,1,114,255,106,1,130,1,118,254,187,1,130,1,125,255,81,1,132,1,114,255,106,1,132,1,118,255,56,1,132,1,125,255,156,1,133,1,114,255,106,1,133,1,118,255,6,1,133,1,125,255,106,1,134,1,118,255,6,1,136,1,128,255,206,1,136,1,131,255,206,1,136,1,134,255,206,1,139,1,128,255,206,1,139,1,131,255,206,1,139,1,134,255,206,1,140,1,133,255,181,1,140,1,137,255,131,1,142,1,133,255,181,1,142,1,137,255,131,1,143,1,118,255,106,1,144,1,118,255,156,1,149,1,150,255,106,1,160,1,150,255,156,1,165,1,150,255,156,1,166,1,150,255,156,0,0,0,16,0,198,0,1,0,0,0,0,0,0,0,19,0,12,0,1,0,0,0,0,0,1,0,9,0,0,0,1,0,0,0,0,0,2,0,7,0,41,0,1,0,0,0,0,0,3,0,31,0,0,0,1,0,0,0,0,0,4,0,17,0,31,0,1,0,0,0,0,0,5,0,12,0,48,0,1,0,0,0,0,0,6,0,17,0,31,0,1,0,0,0,0,0,9,0,12,0,19,0,3,0,1,4,9,0,0,0,38,0,84,0,3,0,1,4,9,0,1,0,18,0,60,0,3,0,1,4,9,0,2,0,14,0,142,0,3,0,1,4,9,0,3,0,62,0,60,0,3,0,1,4,9,0,4,0,34,0,122,0,3,0,1,4,9,0,5,0,24,0,156,0,3,0,1,4,9,0,6,0,34,0,122,0,3,0,1,4,9,0,9,0,24,0,98,83,97,110,115,97,116,105,111,110,32,45,32,169,32,50,48,49,49,32,66,101,114,110,100,32,77,111,110,116,97,103,83,97,110,115,97,116,105,111,110,32,82,101,103,117,108,97,114,86,101,114,115,105,111,110,32,49,46,51,49,0,83,0,97,0,110,0,115,0,97,0,116,0,105,0,111,0,110,0,32,0,45,0,32,0,169,0,32,0,50,0,48,0,49,0,49,0,32,0,66,0,101,0,114,0,110,0,100,0,32,0,77,0,111,0,110,0,116,0,97,0,103,0,83,0,97,0,110,0,115,0,97,0,116,0,105,0,111,0,110,0,32,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,51,0,49,0,0,0,2,0,0,0,0,0,0,255,92,0,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,21,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,0,125,0,126,0,127,0,128,0,129,0,130,0,131,0,132,0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,0,141,0,142,0,144,0,145,0,147,0,150,0,151,0,157,0,158,0,160,0,161,0,162,0,163,0,164,0,166,0,169,0,170,0,171,0,172,0,173,0,174,0,175,0,176,0,177,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,186,0,187,0,189,0,190,0,191,0,194,0,195,0,196,0,197,0,198,0,199,0,200,0,201,0,202,0,203,0,204,0,205,0,206,0,207,0,208,0,209,0,211,0,212,0,213,0,214,0,216,0,217,0,218,0,222,1,2,0,228,0,229,0,232,0,233,0,234,0,235,0,236,0,237,0,238,0,239,0,240,0,241,0,242,0,243,0,244,0,245,0,246,0,226,0,227,0,230,0,231,0,143,0,146,0,148,0,149,0,152,0,153,0,154,0,155,0,156,0,159,0,165,0,167,0,168,0,185,0,188,0,192,0,193,1,3,0,215,0,219,0,220,0,221,0,223,0,224,0,225,1,4,1,5,1,6,1,7,1,8,1,9,1,10,0,253,0,254,1,11,1,12,1,13,1,14,1,15,1,16,0,255,1,0,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,1,1,38,1,39,1,40,1,41,1,42,1,43,1,44,1,45,0,248,0,249,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,1,90,1,91,1,92,1,93,1,94,0,251,0,252,1,95,1,96,1,97,1,98,1,99,1,100,1,101,1,102,1,103,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,1,113,1,114,1,115,1,116,1,117,1,118,1,119,1,120,1,121,1,122,1,123,1,124,1,125,1,126,1,127,1,128,1,129,1,130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,1,138,1,139,1,140,1,141,1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151,1,152,1,153,1,154,1,155,1,156,1,157,1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,1,176,1,177,1,178,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,189,1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1,201,1,202,1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213,1,214,1,215,1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1,226,1,227,1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,1,238,1,239,1,240,1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1,251,1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,10,99,111,109,109,97,99,99,101,110,116,7,77,84,46,115,105,103,110,4,69,117,114,111,4,90,100,111,116,4,122,100,111,116,6,90,97,99,117,116,101,6,122,97,99,117,116,101,7,65,111,103,111,110,101,107,7,97,111,103,111,110,101,107,6,78,97,99,117,116,101,6,110,97,99,117,116,101,6,83,97,99,117,116,101,6,115,97,99,117,116,101,7,69,111,103,111,110,101,107,7,101,111,103,111,110,101,107,6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,69,99,97,114,111,110,6,101,99,97,114,111,110,6,78,99,97,114,111,110,6,110,99,97,114,111,110,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,84,99,97,114,111,110,6,116,99,97,114,111,110,5,85,114,105,110,103,5,117,114,105,110,103,7,65,109,97,99,114,111,110,7,97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97,98,114,101,118,101,11,67,99,105,114,99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,10,67,100,111,116,97,99,99,101,110,116,10,99,100,111,116,97,99,99,101,110,116,6,68,99,114,111,97,116,7,69,109,97,99,114,111,110,7,101,109,97,99,114,111,110,6,69,98,114,101,118,101,6,101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110,116,10,101,100,111,116,97,99,99,101,110,116,11,71,99,105,114,99,117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108,101,120,10,71,100,111,116,97,99,99,101,110,116,10,103,100,111,116,97,99,99,101,110,116,12,71,99,111,109,109,97,97,99,99,101,110,116,12,103,99,111,109,109,97,97,99,99,101,110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104,99,105,114,99,117,109,102,108,101,120,4,72,98,97,114,4,104,98,97,114,6,73,116,105,108,100,101,6,105,116,105,108,100,101,7,73,109,97,99,114,111,110,7,105,109,97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101,118,101,7,73,111,103,111,110,101,107,7,105,111,103,111,110,101,107,10,73,100,111,116,97,99,99,101,110,116,2,73,74,2,105,106,11,74,99,105,114,99,117,109,102,108,101,120,11,106,99,105,114,99,117,109,102,108,101,120,12,75,99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109,109,97,97,99,99,101,110,116,12,107,103,114,101,101,110,108,97,110,100,105,99,6,76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97,99,99,101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97,114,111,110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,12,78,99,111,109,109,97,97,99,99,101,110,116,12,110,99,111,109,109,97,97,99,99,101,110,116,11,110,97,112,111,115,116,114,111,112,104,101,3,69,110,103,3,101,110,103,7,79,109,97,99,114,111,110,7,111,109,97,99,114,111,110,6,79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104,117,110,103,97,114,117,109,108,97,117,116,13,111,104,117,110,103,97,114,117,109,108,97,117,116,6,82,97,99,117,116,101,6,114,97,99,117,116,101,12,82,99,111,109,109,97,97,99,99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110,116,11,83,99,105,114,99,117,109,102,108,101,120,11,115,99,105,114,99,117,109,102,108,101,120,12,83,99,111,109,109,97,97,99,99,101,110,116,12,115,99,111,109,109,97,97,99,99,101,110,116,12,84,99,111,109,109,97,97,99,99,101,110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,4,84,98,97,114,4,116,98,97,114,6,85,116,105,108,100,101,6,117,116,105,108,100,101,7,85,109,97,99,114,111,110,7,117,109,97,99,114,111,110,6,85,98,114,101,118,101,6,117,98,114,101,118,101,13,85,104,117,110,103,97,114,117,109,108,97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117,116,7,85,111,103,111,110,101,107,7,117,111,103,111,110,101,107,11,87,99,105,114,99,117,109,102,108,101,120,11,119,99,105,114,99,117,109,102,108,101,120,11,89,99,105,114,99,117,109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101,120,5,108,111,110,103,115,9,97,102,105,105,49,48,48,50,51,9,97,102,105,105,49,48,48,49,55,9,97,102,105,105,49,48,48,49,56,9,97,102,105,105,49,48,48,49,57,9,97,102,105,105,49,48,48,50,48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105,49,48,48,50,50,9,97,102,105,105,49,48,48,50,52,9,97,102,105,105,49,48,48,50,53,9,97,102,105,105,49,48,48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102,105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50,57,9,97,102,105,105,49,48,48,51,48,9,97,102,105,105,49,48,48,51,49,9,97,102,105,105,49,48,48,51,50,9,97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48,48,51,52,9,97,102,105,105,49,48,48,51,53,9,97,102,105,105,49,48,48,51,54,9,97,102,105,105,49,48,48,51,55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105,49,48,48,51,57,9,97,102,105,105,49,48,48,52,48,9,97,102,105,105,49,48,48,52,49,9,97,102,105,105,49,48,48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102,105,105,49,48,48,52,52,9,97,102,105,105,49,48,48,52,53,9,97,102,105,105,49,48,48,52,54,9,97,102,105,105,49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9,97,102,105,105,49,48,48,52,57,9,97,102,105,105,49,48,48,54,53,9,97,102,105,105,49,48,48,54,54,9,97,102,105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54,56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105,49,48,48,55,48,9,97,102,105,105,49,48,48,55,50,9,97,102,105,105,49,48,48,55,51,9,97,102,105,105,49,48,48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102,105,105,49,48,48,55,54,9,97,102,105,105,49,48,48,55,55,9,97,102,105,105,49,48,48,55,56,9,97,102,105,105,49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9,97,102,105,105,49,48,48,56,49,9,97,102,105,105,49,48,48,56,50,9,97,102,105,105,49,48,48,56,51,9,97,102,105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56,53,9,97,102,105,105,49,48,48,56,54,9,97,102,105,105,49,48,48,56,55,9,97,102,105,105,49,48,48,56,56,9,97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48,48,57,48,9,97,102,105,105,49,48,48,57,49,9,97,102,105,105,49,48,48,57,50,9,97,102,105,105,49,48,48,57,51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105,49,48,48,57,53,9,97,102,105,105,49,48,48,57,54,9,97,102,105,105,49,48,48,57,55,9,97,102,105,105,49,48,48,55,49,7,117,110,105,48,51,55,69,5,116,111,110,111,115,13,100,105,101,114,101,115,105,115,116,111,110,111,115,10,65,108,112,104,97,116,111,110,111,115,9,97,110,111,116,101,108,101,105,97,12,69,112,115,105,108,111,110,116,111,110,111,115,8,69,116,97,116,111,110,111,115,9,73,111,116,97,116,111,110,111,115,12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,112,115,105,108,111,110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,111,115,17,105,111,116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,5,65,108,112,104,97,4,66,101,116,97,5,71,97,109,109,97,7,69,112,115,105,108,111,110,4,90,101,116,97,3,69,116,97,5,84,104,101,116,97,4,73,111,116,97,5,75,97,112,112,97,6,76,97,109,98,100,97,2,77,117,2,78,117,2,88,105,7,79,109,105,99,114,111,110,2,80,105,3,82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112,115,105,108,111,110,3,80,104,105,3,67,104,105,3,80,115,105,12,73,111,116,97,100,105,101,114,101,115,105,115,15,85,112,115,105,108,111,110,100,105,101,114,101,115,105,115,10,97,108,112,104,97,116,111,110,111,115,12,101,112,115,105,108,111,110,116,111,110,111,115,8,101,116,97,116,111,110,111,115,9,105,111,116,97,116,111,110,111,115,20,117,112,115,105,108,111,110,100,105,101,114,101,115,105,115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116,97,5,103,97,109,109,97,5,100,101,108,116,97,7,101,112,115,105,108,111,110,4,122,101,116,97,3,101,116,97,5,116,104,101,116,97,4,105,111,116,97,5,107,97,112,112,97,6,108,97,109,98,100,97,2,110,117,2,120,105,7,111,109,105,99,114,111,110,3,114,104,111,6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97,117,7,117,112,115,105,108,111,110,3,112,104,105,3,99,104,105,3,112,115,105,5,111,109,101,103,97,12,105,111,116,97,100,105,101,114,101,115,105,115,15,117,112,115,105,108,111,110,100,105,101,114,101,115,105,115,12,111,109,105,99,114,111,110,116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110,111,115,10,111,109,101,103,97,116,111,110,111,115,3,102,102,105,3,102,102,108,2,102,102,2,102,106,3,102,102,106,2,102,98,3,102,102,98,2,102,104,3,102,102,104,2,102,107,3,102,102,107,8,122,101,114,111,46,111,115,102,7,111,110,101,46,111,115,102,7,116,119,111,46,111,115,102,9,116,104,114,101,101,46,111,115,102,8,102,111,117,114,46,111,115,102,8,102,105,118,101,46,111,115,102,7,115,105,120,46,111,115,102,9,115,101,118,101,110,46,111,115,102,9,101,105,103,104,116,46,111,115,102,8,110,105,110,101,46,111,115,102,5,103,46,97,108,116,15,103,99,105,114,99,117,109,102,108,101,120,46,97,108,116,10,103,98,114,101,118,101,46,97,108,116,14,103,100,111,116,97,99,99,101,110,116,46,97,108,116,10,103,99,111,109,109,97,46,97,108,116,5,107,46,97,108,116,10,107,99,111,109,109,97,46,97,108,116,14,103,101,114,109,97,110,100,98,108,115,46,99,97,112,0,0,0,0,1,255,255,0,2,0,1,0,0,0,12,0,0,0,22,0,0,0,2,0,1,0,0,2,20,0,1,0,4,0,0,0,1,0,0,0,0,0,1,0,0,0,10,0,40,0,42,0,1,108,97,116,110,0,8,0,10,0,1,122,122,48,49,0,16,0,0,255,255,0,0,0,0,255,255,0,0,0,0,0,0,0,1,0,0,0,10,0,62,0,198,0,1,108,97,116,110,0,8,0,10,0,1,122,122,48,49,0,28,0,0,255,255,0,6,0,1,0,0,0,2,0,3,0,4,0,5,0,0,255,255,0,5,0,6,0,7,0,8,0,9,0,10,0,11,108,105,103,97,0,68,111,110,117,109,0,74,115,97,108,116,0,80,115,115,48,49,0,88,115,115,48,50,0,94,115,115,48,51,0,100,122,122,48,49,0,106,122,122,48,50,0,112,122,122,48,51,0,118,122,122,48,52,0,124,122,122,48,53,0,130,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,2,0,2,0,3,0,0,0,1,0,2,0,0,0,1,0,3,0,0,0,1,0,4,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,2,0,0,0,1,0,3,0,0,0,1,0,4,0,5,0,12,0,20,0,28,0,36,0,44,0,4,0,0,0,1,0,40,0,1,0,0,0,1,0,164,0,1,0,0,0,1,0,192,0,1,0,0,0,1,0,234,0,1,0,0,0,1,0,244,0,1,0,126,0,1,0,8,0,13,0,28,0,34,0,42,0,48,0,56,0,62,0,70,0,76,0,84,0,90,0,98,0,104,0,112,0,238,0,2,0,76,1,248,0,3,0,73,0,76,0,239,0,2,0,79,1,249,0,3,0,73,0,79,1,251,0,2,0,77,1,252,0,3,0,73,0,77,1,253,0,2,0,69,1,254,0,3,0,73,0,69,1,255,0,2,0,75,2,0,0,3,0,73,0,75,2,1,0,2,0,78,2,2,0,3,0,73,0,78,1,250,0,2,0,73,0,1,0,1,0,73,0,2,0,26,0,10,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,0,2,0,1,0,19,0,28,0,0,0,2,0,16,0,5,2,13,2,14,2,15,2,16,2,17,0,2,0,5,0,74,0,74,0,0,1,38,1,38,0,1,1,40,1,40,0,2,1,42,1,42,0,3,1,44,1,44,0,4,0,2,0,10,0,2,2,18,2,19,0,1,0,2,0,78,1,63,0,2,0,8,0,1,2,20,0,1,0,1,0,137,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,48,34,32,73,68,32,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,34,32,73,68,32,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,34,32,73,68,32,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,34,32,73,68,32,51,32,85,78,73,67,79,68,69,32,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,34,32,73,68,32,52,32,85,78,73,67,79,68,69,32,51,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,34,32,73,68,32,53,32,85,78,73,67,79,68,69,32,51,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,34,32,73,68,32,54,32,85,78,73,67,79,68,69,32,51,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,34,32,73,68,32,55,32,85,78,73,67,79,68,69,32,51,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,34,32,73,68,32,56,32,85,78,73,67,79,68,69,32,51,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,34,32,73,68,32,57,32,85,78,73,67,79,68,69,32,51,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,34,32,73,68,32,49,48,32,85,78,73,67,79,68,69,32,51,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,34,32,73,68,32,49,49,32,85,78,73,67,79,68,69,32,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,34,32,73,68,32,49,50,32,85,78,73,67,79,68,69,32,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,34,32,73,68,32,49,51,32,85,78,73,67,79,68,69,32,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,34,32,73,68,32,49,52,32,85,78,73,67,79,68,69,32,52,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,34,32,73,68,32,49,53,32,85,78,73,67,79,68,69,32,52,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,34,32,73,68,32,49,54,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,50,68,44,85,43,50,48,49,48,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,34,32,73,68,32,49,55,32,85,78,73,67,79,68,69,32,52,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,34,32,73,68,32,49,56,32,85,78,73,67,79,68,69,32,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,34,32,73,68,32,49,57,32,85,78,73,67,79,68,69,32,52,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,34,32,73,68,32,50,48,32,85,78,73,67,79,68,69,32,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,34,32,73,68,32,50,49,32,85,78,73,67,79,68,69,32,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,34,32,73,68,32,50,50,32,85,78,73,67,79,68,69,32,53,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,34,32,73,68,32,50,51,32,85,78,73,67,79,68,69,32,53,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,34,32,73,68,32,50,52,32,85,78,73,67,79,68,69,32,53,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,34,32,73,68,32,50,53,32,85,78,73,67,79,68,69,32,53,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,34,32,73,68,32,50,54,32,85,78,73,67,79,68,69,32,53,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,34,32,73,68,32,50,55,32,85,78,73,67,79,68,69,32,53,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,34,32,73,68,32,50,56,32,85,78,73,67,79,68,69,32,53,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,34,32,73,68,32,50,57,32,85,78,73,67,79,68,69,32,53,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,34,32,73,68,32,51,48,32,85,78,73,67,79,68,69,32,53,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,34,32,73,68,32,51,49,32,85,78,73,67,79,68,69,32,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,34,32,73,68,32,51,50,32,85,78,73,67,79,68,69,32,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,34,32,73,68,32,51,51,32,85,78,73,67,79,68,69,32,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,34,32,73,68,32,51,52,32,85,78,73,67,79,68,69,32,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,34,32,73,68,32,51,53,32,85,78,73,67,79,68,69,32,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,34,32,73,68,32,51,54,32,85,78,73,67,79,68,69,32,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,34,32,73,68,32,51,55,32,85,78,73,67,79,68,69,32,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,34,32,73,68,32,51,56,32,85,78,73,67,79,68,69,32,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,34,32,73,68,32,51,57,32,85,78,73,67,79,68,69,32,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,34,32,73,68,32,52,48,32,85,78,73,67,79,68,69,32,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,34,32,73,68,32,52,49,32,85,78,73,67,79,68,69,32,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,34,32,73,68,32,52,50,32,85,78,73,67,79,68,69,32,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,34,32,73,68,32,52,51,32,85,78,73,67,79,68,69,32,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,34,32,73,68,32,52,52,32,85,78,73,67,79,68,69,32,55,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,34,32,73,68,32,52,53,32,85,78,73,67,79,68,69,32,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,34,32,73,68,32,52,54,32,85,78,73,67,79,68,69,32,55,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,34,32,73,68,32,52,55,32,85,78,73,67,79,68,69,32,55,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,34,32,73,68,32,52,56,32,85,78,73,67,79,68,69,32,55,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,34,32,73,68,32,52,57,32,85,78,73,67,79,68,69,32,55,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,34,32,73,68,32,53,48,32,85,78,73,67,79,68,69,32,55,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,34,32,73,68,32,53,49,32,85,78,73,67,79,68,69,32,56,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,34,32,73,68,32,53,50,32,85,78,73,67,79,68,69,32,56,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,51,34,32,73,68,32,53,51,32,85,78,73,67,79,68,69,32,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,52,34,32,73,68,32,53,52,32,85,78,73,67,79,68,69,32,56,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,53,34,32,73,68,32,53,53,32,85,78,73,67,79,68,69,32,56,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,54,34,32,73,68,32,53,54,32,85,78,73,67,79,68,69,32,56,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,55,34,32,73,68,32,53,55,32,85,78,73,67,79,68,69,32,56,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,56,34,32,73,68,32,53,56,32,85,78,73,67,79,68,69,32,56,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,57,34,32,73,68,32,53,57,32,85,78,73,67,79,68,69,32,56,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,48,34,32,73,68,32,54,48,32,85,78,73,67,79,68,69,32,56,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,49,34,32,73,68,32,54,49,32,85,78,73,67,79,68,69,32,57,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,50,34,32,73,68,32,54,50,32,85,78,73,67,79,68,69,32,57,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,51,34,32,73,68,32,54,51,32,85,78,73,67,79,68,69,32,57,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,52,34,32,73,68,32,54,52,32,85,78,73,67,79,68,69,32,57,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,53,34,32,73,68,32,54,53,32,85,78,73,67,79,68,69,32,57,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,54,34,32,73,68,32,54,54,32,85,78,73,67,79,68,69,32,57,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,55,34,32,73,68,32,54,55,32,85,78,73,67,79,68,69,32,57,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,56,34,32,73,68,32,54,56,32,85,78,73,67,79,68,69,32,57,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,54,57,34,32,73,68,32,54,57,32,85,78,73,67,79,68,69,32,57,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,48,34,32,73,68,32,55,48,32,85,78,73,67,79,68,69,32,57,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,49,34,32,73,68,32,55,49,32,85,78,73,67,79,68,69,32,49,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,50,34,32,73,68,32,55,50,32,85,78,73,67,79,68,69,32,49,48,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,73,68,32,55,51,32,85,78,73,67,79,68,69,32,49,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,52,34,32,73,68,32,55,52,32,85,78,73,67,79,68,69,32,49,48,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,53,34,32,73,68,32,55,53,32,85,78,73,67,79,68,69,32,49,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,54,34,32,73,68,32,55,54,32,85,78,73,67,79,68,69,32,49,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,55,34,32,73,68,32,55,55,32,85,78,73,67,79,68,69,32,49,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,56,34,32,73,68,32,55,56,32,85,78,73,67,79,68,69,32,49,48,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,55,57,34,32,73,68,32,55,57,32,85,78,73,67,79,68,69,32,49,48,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,48,34,32,73,68,32,56,48,32,85,78,73,67,79,68,69,32,49,48,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,49,34,32,73,68,32,56,49,32,85,78,73,67,79,68,69,32,49,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,50,34,32,73,68,32,56,50,32,85,78,73,67,79,68,69,32,49,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,51,34,32,73,68,32,56,51,32,85,78,73,67,79,68,69,32,49,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,52,34,32,73,68,32,56,52,32,85,78,73,67,79,68,69,32,49,49,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,53,34,32,73,68,32,56,53,32,85,78,73,67,79,68,69,32,49,49,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,54,34,32,73,68,32,56,54,32,85,78,73,67,79,68,69,32,49,49,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,55,34,32,73,68,32,56,55,32,85,78,73,67,79,68,69,32,49,49,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,56,34,32,73,68,32,56,56,32,85,78,73,67,79,68,69,32,49,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,56,57,34,32,73,68,32,56,57,32,85,78,73,67,79,68,69,32,49,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,48,34,32,73,68,32,57,48,32,85,78,73,67,79,68,69,32,49,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,49,34,32,73,68,32,57,49,32,85,78,73,67,79,68,69,32,49,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,50,34,32,73,68,32,57,50,32,85,78,73,67,79,68,69,32,49,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,51,34,32,73,68,32,57,51,32,85,78,73,67,79,68,69,32,49,50,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,52,34,32,73,68,32,57,52,32,85,78,73,67,79,68,69,32,49,50,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,53,34,32,73,68,32,57,53,32,85,78,73,67,79,68,69,32,49,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,54,34,32,73,68,32,57,54,32,85,78,73,67,79,68,69,32,49,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,55,34,32,73,68,32,57,55,32,85,78,73,67,79,68,69,32,49,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,56,34,32,73,68,32,57,56,32,85,78,73,67,79,68,69,32,49,57,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,57,57,34,32,73,68,32,57,57,32,85,78,73,67,79,68,69,32,49,57,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,48,34,32,73,68,32,49,48,48,32,85,78,73,67,79,68,69,32,49,57,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,49,34,32,73,68,32,49,48,49,32,85,78,73,67,79,68,69,32,50,48,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,50,34,32,73,68,32,49,48,50,32,85,78,73,67,79,68,69,32,50,48,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,51,34,32,73,68,32,49,48,51,32,85,78,73,67,79,68,69,32,50,49,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,52,34,32,73,68,32,49,48,52,32,85,78,73,67,79,68,69,32,50,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,53,34,32,73,68,32,49,48,53,32,85,78,73,67,79,68,69,32,50,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,54,34,32,73,68,32,49,48,54,32,85,78,73,67,79,68,69,32,50,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,55,34,32,73,68,32,49,48,55,32,85,78,73,67,79,68,69,32,50,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,56,34,32,73,68,32,49,48,56,32,85,78,73,67,79,68,69,32,50,50,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,48,57,34,32,73,68,32,49,48,57,32,85,78,73,67,79,68,69,32,50,50,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,48,34,32,73,68,32,49,49,48,32,85,78,73,67,79,68,69,32,50,50,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,49,34,32,73,68,32,49,49,49,32,85,78,73,67,79,68,69,32,50,51,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,50,34,32,73,68,32,49,49,50,32,85,78,73,67,79,68,69,32,50,51,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,51,34,32,73,68,32,49,49,51,32,85,78,73,67,79,68,69,32,50,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,52,34,32,73,68,32,49,49,52,32,85,78,73,67,79,68,69,32,50,51,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,53,34,32,73,68,32,49,49,53,32,85,78,73,67,79,68,69,32,50,51,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,54,34,32,73,68,32,49,49,54,32,85,78,73,67,79,68,69,32,50,51,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,55,34,32,73,68,32,49,49,55,32,85,78,73,67,79,68,69,32,50,51,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,56,34,32,73,68,32,49,49,56,32,85,78,73,67,79,68,69,32,50,51,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,49,57,34,32,73,68,32,49,49,57,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,69,70,44,85,43,70,56,70,70,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,48,34,32,73,68,32,49,50,48,32,85,78,73,67,79,68,69,32,50,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,49,34,32,73,68,32,49,50,49,32,85,78,73,67,79,68,69,32,50,52,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,50,34,32,73,68,32,49,50,50,32,85,78,73,67,79,68,69,32,50,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,51,34,32,73,68,32,49,50,51,32,85,78,73,67,79,68,69,32,50,52,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,52,34,32,73,68,32,49,50,52,32,85,78,73,67,79,68,69,32,50,52,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,53,34,32,73,68,32,49,50,53,32,85,78,73,67,79,68,69,32,50,52,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,54,34,32,73,68,32,49,50,54,32,85,78,73,67,79,68,69,32,50,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,55,34,32,73,68,32,49,50,55,32,85,78,73,67,79,68,69,32,50,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,56,34,32,73,68,32,49,50,56,32,85,78,73,67,79,68,69,32,50,53,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,50,57,34,32,73,68,32,49,50,57,32,85,78,73,67,79,68,69,32,50,53,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,48,34,32,73,68,32,49,51,48,32,85,78,73,67,79,68,69,32,56,50,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,49,34,32,73,68,32,49,51,49,32,85,78,73,67,79,68,69,32,49,55,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,50,34,32,73,68,32,49,51,50,32,85,78,73,67,79,68,69,32,49,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,51,34,32,73,68,32,49,51,51,32,85,78,73,67,79,68,69,32,49,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,52,34,32,73,68,32,49,51,52,32,85,78,73,67,79,68,69,32,49,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,53,34,32,73,68,32,49,51,53,32,85,78,73,67,79,68,69,32,56,50,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,54,34,32,73,68,32,49,51,54,32,85,78,73,67,79,68,69,32,49,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,55,34,32,73,68,32,49,51,55,32,85,78,73,67,79,68,69,32,50,50,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,56,34,32,73,68,32,49,51,56,32,85,78,73,67,79,68,69,32,49,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,51,57,34,32,73,68,32,49,51,57,32,85,78,73,67,79,68,69,32,49,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,48,34,32,73,68,32,49,52,48,32,85,78,73,67,79,68,69,32,56,52,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,49,34,32,73,68,32,49,52,49,32,85,78,73,67,79,68,69,32,49,56,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,50,34,32,73,68,32,49,52,50,32,85,78,73,67,79,68,69,32,49,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,51,34,32,73,68,32,49,52,51,32,85,78,73,67,79,68,69,32,49,57,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,52,34,32,73,68,32,49,52,52,32,85,78,73,67,79,68,69,32,50,49,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,53,34,32,73,68,32,49,52,53,32,85,78,73,67,79,68,69,32,49,55,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,54,34,32,73,68,32,49,52,54,32,85,78,73,67,79,68,69,32,49,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,55,34,32,73,68,32,49,52,55,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,66,53,44,85,43,48,51,66,67,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,56,34,32,73,68,32,49,52,56,32,85,78,73,67,79,68,69,32,49,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,52,57,34,32,73,68,32,49,52,57,32,85,78,73,67,79,68,69,32,49,56,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,48,34,32,73,68,32,49,53,48,32,85,78,73,67,79,68,69,32,50,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,49,34,32,73,68,32,49,53,49,32,85,78,73,67,79,68,69,32,50,52,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,50,34,32,73,68,32,49,53,50,32,85,78,73,67,79,68,69,32,49,57,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,51,34,32,73,68,32,49,53,51,32,85,78,73,67,79,68,69,32,49,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,52,34,32,73,68,32,49,53,52,32,85,78,73,67,79,68,69,32,49,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,53,34,32,73,68,32,49,53,53,32,85,78,73,67,79,68,69,32,52,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,54,34,32,73,68,32,49,53,54,32,85,78,73,67,79,68,69,32,49,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,55,34,32,73,68,32,49,53,55,32,85,78,73,67,79,68,69,32,49,56,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,56,34,32,73,68,32,49,53,56,32,85,78,73,67,79,68,69,32,56,50,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,53,57,34,32,73,68,32,49,53,57,32,85,78,73,67,79,68,69,32,49,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,48,34,32,73,68,32,49,54,48,32,85,78,73,67,79,68,69,32,49,57,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,49,34,32,73,68,32,49,54,49,32,85,78,73,67,79,68,69,32,49,57,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,50,34,32,73,68,32,49,54,50,32,85,78,73,67,79,68,69,32,50,49,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,51,34,32,73,68,32,49,54,51,32,85,78,73,67,79,68,69,32,51,51,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,52,34,32,73,68,32,49,54,52,32,85,78,73,67,79,68,69,32,51,51,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,53,34,32,73,68,32,49,54,53,32,85,78,73,67,79,68,69,32,56,50,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,54,34,32,73,68,32,49,54,54,32,85,78,73,67,79,68,69,32,56,50,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,55,34,32,73,68,32,49,54,55,32,85,78,73,67,79,68,69,32,56,50,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,56,34,32,73,68,32,49,54,56,32,85,78,73,67,79,68,69,32,56,50,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,54,57,34,32,73,68,32,49,54,57,32,85,78,73,67,79,68,69,32,56,50,49,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,48,34,32,73,68,32,49,55,48,32,85,78,73,67,79,68,69,32,56,50,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,49,34,32,73,68,32,49,55,49,32,85,78,73,67,79,68,69,32,50,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,50,34,32,73,68,32,49,55,50,32,85,78,73,67,79,68,69,32,50,53,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,51,34,32,73,68,32,49,55,51,32,85,78,73,67,79,68,69,32,51,55,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,52,34,32,73,68,32,49,55,52,32,85,78,73,67,79,68,69,32,49,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,53,34,32,73,68,32,49,55,53,32,85,78,73,67,79,68,69,32,56,50,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,54,34,32,73,68,32,49,55,54,32,85,78,73,67,79,68,69,32,56,50,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,55,34,32,73,68,32,49,55,55,32,85,78,73,67,79,68,69,32,56,50,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,56,34,32,73,68,32,49,55,56,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,66,55,44,85,43,50,50,49,57,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,55,57,34,32,73,68,32,49,55,57,32,85,78,73,67,79,68,69,32,56,50,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,48,34,32,73,68,32,49,56,48,32,85,78,73,67,79,68,69,32,56,50,50,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,49,34,32,73,68,32,49,56,49,32,85,78,73,67,79,68,69,32,56,50,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,50,34,32,73,68,32,49,56,50,32,85,78,73,67,79,68,69,32,49,57,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,51,34,32,73,68,32,49,56,51,32,85,78,73,67,79,68,69,32,50,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,52,34,32,73,68,32,49,56,52,32,85,78,73,67,79,68,69,32,49,57,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,53,34,32,73,68,32,49,56,53,32,85,78,73,67,79,68,69,32,50,48,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,54,34,32,73,68,32,49,56,54,32,85,78,73,67,79,68,69,32,50,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,55,34,32,73,68,32,49,56,55,32,85,78,73,67,79,68,69,32,50,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,56,34,32,73,68,32,49,56,56,32,85,78,73,67,79,68,69,32,50,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,56,57,34,32,73,68,32,49,56,57,32,85,78,73,67,79,68,69,32,50,48,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,48,34,32,73,68,32,49,57,48,32,85,78,73,67,79,68,69,32,50,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,49,34,32,73,68,32,49,57,49,32,85,78,73,67,79,68,69,32,50,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,50,34,32,73,68,32,49,57,50,32,85,78,73,67,79,68,69,32,50,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,51,34,32,73,68,32,49,57,51,32,85,78,73,67,79,68,69,32,50,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,52,34,32,73,68,32,49,57,52,32,85,78,73,67,79,68,69,32,50,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,53,34,32,73,68,32,49,57,53,32,85,78,73,67,79,68,69,32,50,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,54,34,32,73,68,32,49,57,54,32,85,78,73,67,79,68,69,32,50,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,55,34,32,73,68,32,49,57,55,32,85,78,73,67,79,68,69,32,55,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,56,34,32,73,68,32,49,57,56,32,85,78,73,67,79,68,69,32,55,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,49,57,57,34,32,73,68,32,49,57,57,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,65,70,44,85,43,48,50,67,57,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,48,34,32,73,68,32,50,48,48,32,85,78,73,67,79,68,69,32,49,56,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,49,34,32,73,68,32,50,48,49,32,85,78,73,67,79,68,69,32,56,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,50,34,32,73,68,32,50,48,50,32,85,78,73,67,79,68,69,32,51,53,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,51,34,32,73,68,32,50,48,51,32,85,78,73,67,79,68,69,32,51,53,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,52,34,32,73,68,32,50,48,52,32,85,78,73,67,79,68,69,32,49,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,53,34,32,73,68,32,50,48,53,32,85,78,73,67,79,68,69,32,50,48,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,54,34,32,73,68,32,50,48,54,32,85,78,73,67,79,68,69,32,50,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,55,34,32,73,68,32,50,48,55,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,68,68,44,85,43,70,66,48,49,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,56,34,32,73,68,32,50,48,56,32,85,78,73,67,79,68,69,32,50,53,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,48,57,34,32,73,68,32,50,48,57,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,68,69,44,85,43,70,66,48,50,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,48,34,32,73,68,32,50,49,48,32,85,78,73,67,79,68,69,32,50,53,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,49,34,32,73,68,32,50,49,49,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,48,65,68,44,85,43,50,50,49,50,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,50,34,32,73,68,32,50,49,50,32,85,78,73,67,79,68,69,32,50,49,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,51,34,32,73,68,32,50,49,51,32,85,78,73,67,79,68,69,32,49,56,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,52,34,32,73,68,32,50,49,52,32,85,78,73,67,79,68,69,32,49,55,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,53,34,32,73,68,32,50,49,53,32,85,78,73,67,79,68,69,32,49,55,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,54,34,32,73,68,32,50,49,54,32,85,78,73,67,79,68,69,32,49,56,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,55,34,32,73,68,32,50,49,55,32,85,78,73,67,79,68,69,32,49,56,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,56,34,32,73,68,32,50,49,56,32,85,78,73,67,79,68,69,32,49,57,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,49,57,34,32,73,68,32,50,49,57,32,85,78,73,67,79,68,69,32,51,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,48,34,32,73,68,32,50,50,48,32,85,78,73,67,79,68,69,32,51,50,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,49,34,32,73,68,32,50,50,49,32,85,78,73,67,79,68,69,32,51,56,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,50,34,32,73,68,32,50,50,50,32,85,78,73,67,79,68,69,32,51,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,51,34,32,73,68,32,50,50,51,32,85,78,73,67,79,68,69,32,56,56,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,52,34,32,73,68,32,50,50,52,32,85,78,73,67,79,68,69,32,56,55,51,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,53,34,32,73,68,32,50,50,53,32,85,78,73,67,79,68,69,32,56,56,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,54,34,32,73,68,32,50,50,54,32,85,78,73,67,79,68,69,32,56,56,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,55,34,32,73,68,32,50,50,55,32,85,78,73,67,79,68,69,32,56,55,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,56,34,32,73,68,32,50,50,56,32,85,78,73,67,79,68,69,32,56,55,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,50,57,34,32,73,68,32,50,50,57,32,85,78,73,67,79,68,69,32,56,55,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,48,34,32,73,68,32,50,51,48,32,85,78,73,67,79,68,69,32,57,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,49,34,32,73,68,32,50,51,49,32,85,78,73,67,79,68,69,32,56,55,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,50,34,32,73,68,32,50,51,50,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,51,65,57,44,85,43,50,49,50,54,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,51,34,32,73,68,32,50,51,51,32,85,78,73,67,79,68,69,32,56,55,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,52,34,32,73,68,32,50,51,52,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,50,50,52,56,44,85,43,50,50,70,50,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,53,34,32,73,68,32,50,51,53,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,51,57,52,44,85,43,50,50,48,54,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,54,34,32,73,68,32,50,51,54,32,85,78,73,67,79,68,69,32,57,54,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,55,34,32,73,68,32,50,51,55,32,85,78,73,67,79,68,69,32,56,50,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,56,34,32,73,68,32,50,51,56,32,85,78,73,67,79,68,69,32,54,49,52,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,51,57,34,32,73,68,32,50,51,57,32,85,78,73,67,79,68,69,32,54,49,52,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,48,34,32,73,68,32,50,52,48,32,85,78,73,67,79,68,69,32,54,49,52,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,49,34,32,73,68,32,50,52,49,32,85,78,73,67,79,68,69,32,51,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,50,34,32,73,68,32,50,52,50,32,85,78,73,67,79,68,69,32,55,50,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,51,34,32,73,68,32,50,52,51,32,85,78,73,67,79,68,69,32,55,50,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,52,34,32,73,68,32,50,52,52,32,85,78,73,67,79,68,69,32,55,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,53,34,32,73,68,32,50,52,53,32,85,78,73,67,79,68,69,32,55,51,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,54,34,32,73,68,32,50,52,54,32,85,78,73,67,79,68,69,32,55,51,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,55,34,32,73,68,32,50,52,55,32,85,78,73,67,79,68,69,32,55,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,56,34,32,73,68,32,50,52,56,32,85,78,73,67,79,68,69,32,56,51,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,52,57,34,32,73,68,32,50,52,57,32,85,78,73,67,79,68,69,32,51,55,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,48,34,32,73,68,32,50,53,48,32,85,78,73,67,79,68,69,32,51,56,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,49,34,32,73,68,32,50,53,49,32,85,78,73,67,79,68,69,32,51,55,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,50,34,32,73,68,32,50,53,50,32,85,78,73,67,79,68,69,32,51,55,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,51,34,32,73,68,32,50,53,51,32,85,78,73,67,79,68,69,32,50,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,52,34,32,73,68,32,50,53,52,32,85,78,73,67,79,68,69,32,50,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,53,34,32,73,68,32,50,53,53,32,85,78,73,67,79,68,69,32,50,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,54,34,32,73,68,32,50,53,54,32,85,78,73,67,79,68,69,32,50,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,55,34,32,73,68,32,50,53,55,32,85,78,73,67,79,68,69,32,51,50,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,56,34,32,73,68,32,50,53,56,32,85,78,73,67,79,68,69,32,51,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,53,57,34,32,73,68,32,50,53,57,32,85,78,73,67,79,68,69,32,51,52,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,48,34,32,73,68,32,50,54,48,32,85,78,73,67,79,68,69,32,51,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,49,34,32,73,68,32,50,54,49,32,85,78,73,67,79,68,69,32,50,56,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,50,34,32,73,68,32,50,54,50,32,85,78,73,67,79,68,69,32,50,56,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,51,34,32,73,68,32,50,54,51,32,85,78,73,67,79,68,69,32,50,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,52,34,32,73,68,32,50,54,52,32,85,78,73,67,79,68,69,32,50,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,53,34,32,73,68,32,50,54,53,32,85,78,73,67,79,68,69,32,50,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,54,34,32,73,68,32,50,54,54,32,85,78,73,67,79,68,69,32,50,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,55,34,32,73,68,32,50,54,55,32,85,78,73,67,79,68,69,32,50,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,56,34,32,73,68,32,50,54,56,32,85,78,73,67,79,68,69,32,50,56,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,54,57,34,32,73,68,32,50,54,57,32,85,78,73,67,79,68,69,32,51,50,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,48,34,32,73,68,32,50,55,48,32,85,78,73,67,79,68,69,32,51,50,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,49,34,32,73,68,32,50,55,49,32,85,78,73,67,79,68,69,32,51,52,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,50,34,32,73,68,32,50,55,50,32,85,78,73,67,79,68,69,32,51,52,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,51,34,32,73,68,32,50,55,51,32,85,78,73,67,79,68,69,32,51,53,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,52,34,32,73,68,32,50,55,52,32,85,78,73,67,79,68,69,32,51,53,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,53,34,32,73,68,32,50,55,53,32,85,78,73,67,79,68,69,32,51,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,54,34,32,73,68,32,50,55,54,32,85,78,73,67,79,68,69,32,51,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,55,34,32,73,68,32,50,55,55,32,85,78,73,67,79,68,69,32,50,53,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,56,34,32,73,68,32,50,55,56,32,85,78,73,67,79,68,69,32,50,53,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,55,57,34,32,73,68,32,50,55,57,32,85,78,73,67,79,68,69,32,50,53,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,48,34,32,73,68,32,50,56,48,32,85,78,73,67,79,68,69,32,50,53,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,49,34,32,73,68,32,50,56,49,32,85,78,73,67,79,68,69,32,50,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,50,34,32,73,68,32,50,56,50,32,85,78,73,67,79,68,69,32,50,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,51,34,32,73,68,32,50,56,51,32,85,78,73,67,79,68,69,32,50,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,52,34,32,73,68,32,50,56,52,32,85,78,73,67,79,68,69,32,50,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,53,34,32,73,68,32,50,56,53,32,85,78,73,67,79,68,69,32,50,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,54,34,32,73,68,32,50,56,54,32,85,78,73,67,79,68,69,32,50,55,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,55,34,32,73,68,32,50,56,55,32,85,78,73,67,79,68,69,32,50,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,56,34,32,73,68,32,50,56,56,32,85,78,73,67,79,68,69,32,50,55,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,56,57,34,32,73,68,32,50,56,57,32,85,78,73,67,79,68,69,32,50,55,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,48,34,32,73,68,32,50,57,48,32,85,78,73,67,79,68,69,32,50,55,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,49,34,32,73,68,32,50,57,49,32,85,78,73,67,79,68,69,32,50,55,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,50,34,32,73,68,32,50,57,50,32,85,78,73,67,79,68,69,32,50,55,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,51,34,32,73,68,32,50,57,51,32,85,78,73,67,79,68,69,32,50,56,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,52,34,32,73,68,32,50,57,52,32,85,78,73,67,79,68,69,32,50,56,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,53,34,32,73,68,32,50,57,53,32,85,78,73,67,79,68,69,32,50,56,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,54,34,32,73,68,32,50,57,54,32,85,78,73,67,79,68,69,32,50,56,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,55,34,32,73,68,32,50,57,55,32,85,78,73,67,79,68,69,32,50,56,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,56,34,32,73,68,32,50,57,56,32,85,78,73,67,79,68,69,32,50,56,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,50,57,57,34,32,73,68,32,50,57,57,32,85,78,73,67,79,68,69,32,50,57,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,48,34,32,73,68,32,51,48,48,32,85,78,73,67,79,68,69,32,50,57,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,49,34,32,73,68,32,51,48,49,32,85,78,73,67,79,68,69,32,50,57,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,50,34,32,73,68,32,51,48,50,32,85,78,73,67,79,68,69,32,50,57,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,51,34,32,73,68,32,51,48,51,32,85,78,73,67,79,68,69,32,50,57,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,52,34,32,73,68,32,51,48,52,32,85,78,73,67,79,68,69,32,50,57,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,53,34,32,73,68,32,51,48,53,32,85,78,73,67,79,68,69,32,50,57,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,54,34,32,73,68,32,51,48,54,32,85,78,73,67,79,68,69,32,50,57,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,55,34,32,73,68,32,51,48,55,32,85,78,73,67,79,68,69,32,50,57,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,56,34,32,73,68,32,51,48,56,32,85,78,73,67,79,68,69,32,50,57,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,48,57,34,32,73,68,32,51,48,57,32,85,78,73,67,79,68,69,32,51,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,48,34,32,73,68,32,51,49,48,32,85,78,73,67,79,68,69,32,51,48,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,49,34,32,73,68,32,51,49,49,32,85,78,73,67,79,68,69,32,51,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,50,34,32,73,68,32,51,49,50,32,85,78,73,67,79,68,69,32,51,48,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,51,34,32,73,68,32,51,49,51,32,85,78,73,67,79,68,69,32,51,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,52,34,32,73,68,32,51,49,52,32,85,78,73,67,79,68,69,32,51,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,53,34,32,73,68,32,51,49,53,32,85,78,73,67,79,68,69,32,51,48,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,54,34,32,73,68,32,51,49,54,32,85,78,73,67,79,68,69,32,51,48,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,55,34,32,73,68,32,51,49,55,32,85,78,73,67,79,68,69,32,51,48,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,56,34,32,73,68,32,51,49,56,32,85,78,73,67,79,68,69,32,51,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,49,57,34,32,73,68,32,51,49,57,32,85,78,73,67,79,68,69,32,51,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,48,34,32,73,68,32,51,50,48,32,85,78,73,67,79,68,69,32,51,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,49,34,32,73,68,32,51,50,49,32,85,78,73,67,79,68,69,32,51,49,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,50,34,32,73,68,32,51,50,50,32,85,78,73,67,79,68,69,32,51,49,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,51,34,32,73,68,32,51,50,51,32,85,78,73,67,79,68,69,32,51,49,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,52,34,32,73,68,32,51,50,52,32,85,78,73,67,79,68,69,32,51,49,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,53,34,32,73,68,32,51,50,53,32,85,78,73,67,79,68,69,32,51,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,54,34,32,73,68,32,51,50,54,32,85,78,73,67,79,68,69,32,51,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,55,34,32,73,68,32,51,50,55,32,85,78,73,67,79,68,69,32,51,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,56,34,32,73,68,32,51,50,56,32,85,78,73,67,79,68,69,32,51,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,50,57,34,32,73,68,32,51,50,57,32,85,78,73,67,79,68,69,32,51,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,48,34,32,73,68,32,51,51,48,32,85,78,73,67,79,68,69,32,51,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,49,34,32,73,68,32,51,51,49,32,85,78,73,67,79,68,69,32,51,50,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,50,34,32,73,68,32,51,51,50,32,85,78,73,67,79,68,69,32,51,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,51,34,32,73,68,32,51,51,51,32,85,78,73,67,79,68,69,32,51,51,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,52,34,32,73,68,32,51,51,52,32,85,78,73,67,79,68,69,32,51,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,53,34,32,73,68,32,51,51,53,32,85,78,73,67,79,68,69,32,51,51,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,54,34,32,73,68,32,51,51,54,32,85,78,73,67,79,68,69,32,51,51,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,55,34,32,73,68,32,51,51,55,32,85,78,73,67,79,68,69,32,51,51,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,56,34,32,73,68,32,51,51,56,32,85,78,73,67,79,68,69,32,51,51,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,51,57,34,32,73,68,32,51,51,57,32,85,78,73,67,79,68,69,32,51,51,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,48,34,32,73,68,32,51,52,48,32,85,78,73,67,79,68,69,32,51,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,49,34,32,73,68,32,51,52,49,32,85,78,73,67,79,68,69,32,51,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,50,34,32,73,68,32,51,52,50,32,85,78,73,67,79,68,69,32,51,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,51,34,32,73,68,32,51,52,51,32,85,78,73,67,79,68,69,32,51,52,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,52,34,32,73,68,32,51,52,52,32,85,78,73,67,79,68,69,32,51,52,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,53,34,32,73,68,32,51,52,53,32,85,78,73,67,79,68,69,32,51,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,54,34,32,73,68,32,51,52,54,32,85,78,73,67,79,68,69,32,51,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,55,34,32,73,68,32,51,52,55,32,85,78,73,67,79,68,69,32,51,53,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,56,34,32,73,68,32,51,52,56,32,85,78,73,67,79,68,69,32,53,51,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,52,57,34,32,73,68,32,51,52,57,32,85,78,73,67,79,68,69,32,53,51,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,48,34,32,73,68,32,51,53,48,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,49,54,50,44,85,43,48,50,49,65,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,49,34,32,73,68,32,51,53,49,32,85,78,73,67,79,68,69,86,65,76,85,69,83,32,34,85,43,48,49,54,51,44,85,43,48,50,49,66,34,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,50,34,32,73,68,32,51,53,50,32,85,78,73,67,79,68,69,32,51,53,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,51,34,32,73,68,32,51,53,51,32,85,78,73,67,79,68,69,32,51,53,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,52,34,32,73,68,32,51,53,52,32,85,78,73,67,79,68,69,32,51,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,53,34,32,73,68,32,51,53,53,32,85,78,73,67,79,68,69,32,51,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,54,34,32,73,68,32,51,53,54,32,85,78,73,67,79,68,69,32,51,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,55,34,32,73,68,32,51,53,55,32,85,78,73,67,79,68,69,32,51,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,56,34,32,73,68,32,51,53,56,32,85,78,73,67,79,68,69,32,51,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,53,57,34,32,73,68,32,51,53,57,32,85,78,73,67,79,68,69,32,51,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,48,34,32,73,68,32,51,54,48,32,85,78,73,67,79,68,69,32,51,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,49,34,32,73,68,32,51,54,49,32,85,78,73,67,79,68,69,32,51,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,50,34,32,73,68,32,51,54,50,32,85,78,73,67,79,68,69,32,51,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,51,34,32,73,68,32,51,54,51,32,85,78,73,67,79,68,69,32,51,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,52,34,32,73,68,32,51,54,52,32,85,78,73,67,79,68,69,32,51,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,53,34,32,73,68,32,51,54,53,32,85,78,73,67,79,68,69,32,51,55,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,54,34,32,73,68,32,51,54,54,32,85,78,73,67,79,68,69,32,51,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,55,34,32,73,68,32,51,54,55,32,85,78,73,67,79,68,69,32,51,55,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,56,34,32,73,68,32,51,54,56,32,85,78,73,67,79,68,69,32,51,56,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,54,57,34,32,73,68,32,51,54,57,32,85,78,73,67,79,68,69,32,49,48,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,48,34,32,73,68,32,51,55,48,32,85,78,73,67,79,68,69,32,49,48,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,49,34,32,73,68,32,51,55,49,32,85,78,73,67,79,68,69,32,49,48,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,50,34,32,73,68,32,51,55,50,32,85,78,73,67,79,68,69,32,49,48,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,51,34,32,73,68,32,51,55,51,32,85,78,73,67,79,68,69,32,49,48,52,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,52,34,32,73,68,32,51,55,52,32,85,78,73,67,79,68,69,32,49,48,52,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,53,34,32,73,68,32,51,55,53,32,85,78,73,67,79,68,69,32,49,48,52,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,54,34,32,73,68,32,51,55,54,32,85,78,73,67,79,68,69,32,49,48,52,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,55,34,32,73,68,32,51,55,55,32,85,78,73,67,79,68,69,32,49,48,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,56,34,32,73,68,32,51,55,56,32,85,78,73,67,79,68,69,32,49,48,52,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,55,57,34,32,73,68,32,51,55,57,32,85,78,73,67,79,68,69,32,49,48,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,48,34,32,73,68,32,51,56,48,32,85,78,73,67,79,68,69,32,49,48,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,49,34,32,73,68,32,51,56,49,32,85,78,73,67,79,68,69,32,49,48,53,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,50,34,32,73,68,32,51,56,50,32,85,78,73,67,79,68,69,32,49,48,53,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,51,34,32,73,68,32,51,56,51,32,85,78,73,67,79,68,69,32,49,48,53,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,52,34,32,73,68,32,51,56,52,32,85,78,73,67,79,68,69,32,49,48,53,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,53,34,32,73,68,32,51,56,53,32,85,78,73,67,79,68,69,32,49,48,53,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,54,34,32,73,68,32,51,56,54,32,85,78,73,67,79,68,69,32,49,48,53,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,55,34,32,73,68,32,51,56,55,32,85,78,73,67,79,68,69,32,49,48,53,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,56,34,32,73,68,32,51,56,56,32,85,78,73,67,79,68,69,32,49,48,53,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,56,57,34,32,73,68,32,51,56,57,32,85,78,73,67,79,68,69,32,49,48,53,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,48,34,32,73,68,32,51,57,48,32,85,78,73,67,79,68,69,32,49,48,54,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,49,34,32,73,68,32,51,57,49,32,85,78,73,67,79,68,69,32,49,48,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,50,34,32,73,68,32,51,57,50,32,85,78,73,67,79,68,69,32,49,48,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,51,34,32,73,68,32,51,57,51,32,85,78,73,67,79,68,69,32,49,48,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,52,34,32,73,68,32,51,57,52,32,85,78,73,67,79,68,69,32,49,48,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,53,34,32,73,68,32,51,57,53,32,85,78,73,67,79,68,69,32,49,48,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,54,34,32,73,68,32,51,57,54,32,85,78,73,67,79,68,69,32,49,48,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,55,34,32,73,68,32,51,57,55,32,85,78,73,67,79,68,69,32,49,48,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,56,34,32,73,68,32,51,57,56,32,85,78,73,67,79,68,69,32,49,48,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,51,57,57,34,32,73,68,32,51,57,57,32,85,78,73,67,79,68,69,32,49,48,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,48,34,32,73,68,32,52,48,48,32,85,78,73,67,79,68,69,32,49,48,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,49,34,32,73,68,32,52,48,49,32,85,78,73,67,79,68,69,32,49,48,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,50,34,32,73,68,32,52,48,50,32,85,78,73,67,79,68,69,32,49,48,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,51,34,32,73,68,32,52,48,51,32,85,78,73,67,79,68,69,32,49,48,55,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,52,34,32,73,68,32,52,48,52,32,85,78,73,67,79,68,69,32,49,48,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,53,34,32,73,68,32,52,48,53,32,85,78,73,67,79,68,69,32,49,48,55,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,54,34,32,73,68,32,52,48,54,32,85,78,73,67,79,68,69,32,49,48,55,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,55,34,32,73,68,32,52,48,55,32,85,78,73,67,79,68,69,32,49,48,55,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,56,34,32,73,68,32,52,48,56,32,85,78,73,67,79,68,69,32,49,48,55,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,48,57,34,32,73,68,32,52,48,57,32,85,78,73,67,79,68,69,32,49,48,55,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,48,34,32,73,68,32,52,49,48,32,85,78,73,67,79,68,69,32,49,48,56,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,49,34,32,73,68,32,52,49,49,32,85,78,73,67,79,68,69,32,49,48,56,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,50,34,32,73,68,32,52,49,50,32,85,78,73,67,79,68,69,32,49,48,56,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,51,34,32,73,68,32,52,49,51,32,85,78,73,67,79,68,69,32,49,48,56,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,52,34,32,73,68,32,52,49,52,32,85,78,73,67,79,68,69,32,49,48,56,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,53,34,32,73,68,32,52,49,53,32,85,78,73,67,79,68,69,32,49,48,56,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,54,34,32,73,68,32,52,49,54,32,85,78,73,67,79,68,69,32,49,48,56,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,55,34,32,73,68,32,52,49,55,32,85,78,73,67,79,68,69,32,49,48,56,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,56,34,32,73,68,32,52,49,56,32,85,78,73,67,79,68,69,32,49,48,56,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,49,57,34,32,73,68,32,52,49,57,32,85,78,73,67,79,68,69,32,49,48,56,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,48,34,32,73,68,32,52,50,48,32,85,78,73,67,79,68,69,32,49,48,57,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,49,34,32,73,68,32,52,50,49,32,85,78,73,67,79,68,69,32,49,48,57,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,50,34,32,73,68,32,52,50,50,32,85,78,73,67,79,68,69,32,49,48,57,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,51,34,32,73,68,32,52,50,51,32,85,78,73,67,79,68,69,32,49,48,57,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,52,34,32,73,68,32,52,50,52,32,85,78,73,67,79,68,69,32,49,48,57,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,53,34,32,73,68,32,52,50,53,32,85,78,73,67,79,68,69,32,49,48,57,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,54,34,32,73,68,32,52,50,54,32,85,78,73,67,79,68,69,32,49,48,57,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,55,34,32,73,68,32,52,50,55,32,85,78,73,67,79,68,69,32,49,48,57,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,56,34,32,73,68,32,52,50,56,32,85,78,73,67,79,68,69,32,49,48,57,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,50,57,34,32,73,68,32,52,50,57,32,85,78,73,67,79,68,69,32,49,48,57,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,48,34,32,73,68,32,52,51,48,32,85,78,73,67,79,68,69,32,49,49,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,49,34,32,73,68,32,52,51,49,32,85,78,73,67,79,68,69,32,49,49,48,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,50,34,32,73,68,32,52,51,50,32,85,78,73,67,79,68,69,32,49,49,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,51,34,32,73,68,32,52,51,51,32,85,78,73,67,79,68,69,32,49,49,48,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,52,34,32,73,68,32,52,51,52,32,85,78,73,67,79,68,69,32,49,49,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,53,34,32,73,68,32,52,51,53,32,85,78,73,67,79,68,69,32,56,57,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,54,34,32,73,68,32,52,51,54,32,85,78,73,67,79,68,69,32,57,48,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,55,34,32,73,68,32,52,51,55,32,85,78,73,67,79,68,69,32,57,48,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,56,34,32,73,68,32,52,51,56,32,85,78,73,67,79,68,69,32,57,48,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,51,57,34,32,73,68,32,52,51,57,32,85,78,73,67,79,68,69,32,57,48,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,48,34,32,73,68,32,52,52,48,32,85,78,73,67,79,68,69,32,57,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,49,34,32,73,68,32,52,52,49,32,85,78,73,67,79,68,69,32,57,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,50,34,32,73,68,32,52,52,50,32,85,78,73,67,79,68,69,32,57,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,51,34,32,73,68,32,52,52,51,32,85,78,73,67,79,68,69,32,57,48,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,52,34,32,73,68,32,52,52,52,32,85,78,73,67,79,68,69,32,57,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,53,34,32,73,68,32,52,52,53,32,85,78,73,67,79,68,69,32,57,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,54,34,32,73,68,32,52,52,54,32,85,78,73,67,79,68,69,32,57,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,55,34,32,73,68,32,52,52,55,32,85,78,73,67,79,68,69,32,57,49,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,56,34,32,73,68,32,52,52,56,32,85,78,73,67,79,68,69,32,57,49,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,52,57,34,32,73,68,32,52,52,57,32,85,78,73,67,79,68,69,32,57,49,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,48,34,32,73,68,32,52,53,48,32,85,78,73,67,79,68,69,32,57,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,49,34,32,73,68,32,52,53,49,32,85,78,73,67,79,68,69,32,57,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,50,34,32,73,68,32,52,53,50,32,85,78,73,67,79,68,69,32,57,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,51,34,32,73,68,32,52,53,51,32,85,78,73,67,79,68,69,32,57,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,52,34,32,73,68,32,52,53,52,32,85,78,73,67,79,68,69,32,57,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,53,34,32,73,68,32,52,53,53,32,85,78,73,67,79,68,69,32,57,50,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,54,34,32,73,68,32,52,53,54,32,85,78,73,67,79,68,69,32,57,50,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,55,34,32,73,68,32,52,53,55,32,85,78,73,67,79,68,69,32,57,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,56,34,32,73,68,32,52,53,56,32,85,78,73,67,79,68,69,32,57,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,53,57,34,32,73,68,32,52,53,57,32,85,78,73,67,79,68,69,32,57,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,48,34,32,73,68,32,52,54,48,32,85,78,73,67,79,68,69,32,57,50,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,49,34,32,73,68,32,52,54,49,32,85,78,73,67,79,68,69,32,57,50,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,50,34,32,73,68,32,52,54,50,32,85,78,73,67,79,68,69,32,57,50,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,51,34,32,73,68,32,52,54,51,32,85,78,73,67,79,68,69,32,57,51,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,52,34,32,73,68,32,52,54,52,32,85,78,73,67,79,68,69,32,57,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,53,34,32,73,68,32,52,54,53,32,85,78,73,67,79,68,69,32,57,51,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,54,34,32,73,68,32,52,54,54,32,85,78,73,67,79,68,69,32,57,51,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,55,34,32,73,68,32,52,54,55,32,85,78,73,67,79,68,69,32,57,51,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,56,34,32,73,68,32,52,54,56,32,85,78,73,67,79,68,69,32,57,51,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,54,57,34,32,73,68,32,52,54,57,32,85,78,73,67,79,68,69,32,57,51,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,48,34,32,73,68,32,52,55,48,32,85,78,73,67,79,68,69,32,57,51,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,49,34,32,73,68,32,52,55,49,32,85,78,73,67,79,68,69,32,57,52,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,50,34,32,73,68,32,52,55,50,32,85,78,73,67,79,68,69,32,57,52,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,51,34,32,73,68,32,52,55,51,32,85,78,73,67,79,68,69,32,57,52,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,52,34,32,73,68,32,52,55,52,32,85,78,73,67,79,68,69,32,57,52,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,53,34,32,73,68,32,52,55,53,32,85,78,73,67,79,68,69,32,57,52,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,54,34,32,73,68,32,52,55,54,32,85,78,73,67,79,68,69,32,57,52,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,55,34,32,73,68,32,52,55,55,32,85,78,73,67,79,68,69,32,57,52,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,56,34,32,73,68,32,52,55,56,32,85,78,73,67,79,68,69,32,57,52,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,55,57,34,32,73,68,32,52,55,57,32,85,78,73,67,79,68,69,32,57,52,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,48,34,32,73,68,32,52,56,48,32,85,78,73,67,79,68,69,32,57,52,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,49,34,32,73,68,32,52,56,49,32,85,78,73,67,79,68,69,32,57,53,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,50,34,32,73,68,32,52,56,50,32,85,78,73,67,79,68,69,32,57,53,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,51,34,32,73,68,32,52,56,51,32,85,78,73,67,79,68,69,32,57,53,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,52,34,32,73,68,32,52,56,52,32,85,78,73,67,79,68,69,32,57,53,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,53,34,32,73,68,32,52,56,53,32,85,78,73,67,79,68,69,32,57,53,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,54,34,32,73,68,32,52,56,54,32,85,78,73,67,79,68,69,32,57,53,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,55,34,32,73,68,32,52,56,55,32,85,78,73,67,79,68,69,32,57,53,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,56,34,32,73,68,32,52,56,56,32,85,78,73,67,79,68,69,32,57,53,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,56,57,34,32,73,68,32,52,56,57,32,85,78,73,67,79,68,69,32,57,53,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,48,34,32,73,68,32,52,57,48,32,85,78,73,67,79,68,69,32,57,54,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,49,34,32,73,68,32,52,57,49,32,85,78,73,67,79,68,69,32,57,54,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,50,34,32,73,68,32,52,57,50,32,85,78,73,67,79,68,69,32,57,54,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,51,34,32,73,68,32,52,57,51,32,85,78,73,67,79,68,69,32,57,54,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,52,34,32,73,68,32,52,57,52,32,85,78,73,67,79,68,69,32,57,54,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,53,34,32,73,68,32,52,57,53,32,85,78,73,67,79,68,69,32,57,54,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,54,34,32,73,68,32,52,57,54,32,85,78,73,67,79,68,69,32,57,54,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,55,34,32,73,68,32,52,57,55,32,85,78,73,67,79,68,69,32,57,54,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,56,34,32,73,68,32,52,57,56,32,85,78,73,67,79,68,69,32,57,54,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,52,57,57,34,32,73,68,32,52,57,57,32,85,78,73,67,79,68,69,32,57,55,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,48,34,32,73,68,32,53,48,48,32,85,78,73,67,79,68,69,32,57,55,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,49,34,32,73,68,32,53,48,49,32,85,78,73,67,79,68,69,32,57,55,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,50,34,32,73,68,32,53,48,50,32,85,78,73,67,79,68,69,32,57,55,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,51,34,32,73,68,32,53,48,51,32,85,78,73,67,79,68,69,32,57,55,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,52,34,32,73,68,32,53,48,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,53,34,32,73,68,32,53,48,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,54,34,32,73,68,32,53,48,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,55,34,32,73,68,32,53,48,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,56,34,32,73,68,32,53,48,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,48,57,34,32,73,68,32,53,48,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,48,34,32,73,68,32,53,49,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,49,34,32,73,68,32,53,49,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,50,34,32,73,68,32,53,49,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,51,34,32,73,68,32,53,49,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,52,34,32,73,68,32,53,49,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,53,34,32,73,68,32,53,49,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,54,34,32,73,68,32,53,49,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,55,34,32,73,68,32,53,49,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,56,34,32,73,68,32,53,49,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,49,57,34,32,73,68,32,53,49,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,48,34,32,73,68,32,53,50,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,49,34,32,73,68,32,53,50,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,50,34,32,73,68,32,53,50,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,51,34,32,73,68,32,53,50,51,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,52,34,32,73,68,32,53,50,52,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,53,34,32,73,68,32,53,50,53,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,54,34,32,73,68,32,53,50,54,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,55,34,32,73,68,32,53,50,55,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,56,34,32,73,68,32,53,50,56,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,50,57,34,32,73,68,32,53,50,57,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,51,48,34,32,73,68,32,53,51,48,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,51,49,34,32,73,68,32,53,51,49,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,71,76,89,80,72,32,34,103,108,121,112,104,53,51,50,34,32,73,68,32,53,51,50,32,84,89,80,69,32,66,65,83,69,32,69,78,68,95,71,76,89,80,72,13,68,69,70,95,83,67,82,73,80,84,32,78,65,77,69,32,34,76,97,116,105,110,34,32,84,65,71,32,34,108,97,116,110,34,13,13,68,69,70,95,76,65,78,71,83,89,83,32,78,65,77,69,32,34,68,101,102,97,117,108,116,34,32,84,65,71,32,34,100,102,108,116,34,13,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,79,108,100,115,116,121,108,101,32,70,105,103,117,114,101,115,34,32,84,65,71,32,34,111,110,117,109,34,13,32,76,79,79,75,85,80,32,34,79,108,100,115,116,121,108,101,32,70,105,103,117,114,101,115,34,13,69,78,68,95,70,69,65,84,85,82,69,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,83,116,97,110,100,97,114,100,32,76,105,103,97,116,117,114,101,115,34,32,84,65,71,32,34,108,105,103,97,34,13,32,76,79,79,75,85,80,32,34,83,116,97,110,100,97,114,116,32,76,105,103,97,116,117,114,101,115,34,13,69,78,68,95,70,69,65,84,85,82,69,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,83,116,121,108,105,115,116,105,99,32,65,108,116,101,114,110,97,116,101,115,34,32,84,65,71,32,34,115,97,108,116,34,13,32,76,79,79,75,85,80,32,34,65,108,116,32,103,34,32,76,79,79,75,85,80,32,34,65,108,116,32,107,34,13,69,78,68,95,70,69,65,84,85,82,69,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,83,116,121,108,105,115,116,105,99,32,83,101,116,32,49,34,32,84,65,71,32,34,115,115,48,49,34,13,32,76,79,79,75,85,80,32,34,65,108,116,32,103,34,13,69,78,68,95,70,69,65,84,85,82,69,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,83,116,121,108,105,115,116,105,99,32,83,101,116,32,50,34,32,84,65,71,32,34,115,115,48,50,34,13,32,76,79,79,75,85,80,32,34,65,108,116,32,107,34,13,69,78,68,95,70,69,65,84,85,82,69,13,68,69,70,95,70,69,65,84,85,82,69,32,78,65,77,69,32,34,83,116,121,108,105,115,116,105,99,32,83,101,116,32,51,34,32,84,65,71,32,34,115,115,48,51,34,13,32,76,79,79,75,85,80,32,34,67,97,112,105,116,97,108,32,223,34,13,69,78,68,95,70,69,65,84,85,82,69,13,69,78,68,95,76,65,78,71,83,89,83,13,69,78,68,95,83,67,82,73,80,84,13,68,69,70,95,76,79,79,75,85,80,32,34,83,116,97,110,100,97,114,116,32,76,105,103,97,116,117,114,101,115,34,32,80,82,79,67,69,83,83,95,66,65,83,69,32,80,82,79,67,69,83,83,95,77,65,82,75,83,32,65,76,76,32,68,73,82,69,67,84,73,79,78,32,76,84,82,13,73,78,95,67,79,78,84,69,88,84,13,69,78,68,95,67,79,78,84,69,88,84,13,65,83,95,83,85,66,83,84,73,84,85,84,73,79,78,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,54,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,50,51,56,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,54,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,52,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,50,51,57,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,53,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,55,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,55,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,55,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,56,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,54,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,57,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,54,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,48,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,53,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,49,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,53,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,50,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,56,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,51,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,56,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,52,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,32,71,76,89,80,72,32,34,103,108,121,112,104,55,51,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,48,54,34,13,69,78,68,95,83,85,66,13,69,78,68,95,83,85,66,83,84,73,84,85,84,73,79,78,13,68,69,70,95,76,79,79,75,85,80,32,34,79,108,100,115,116,121,108,101,32,70,105,103,117,114,101,115,34,32,80,82,79,67,69,83,83,95,66,65,83,69,32,80,82,79,67,69,83,83,95,77,65,82,75,83,32,65,76,76,32,68,73,82,69,67,84,73,79,78,32,76,84,82,13,73,78,95,67,79,78,84,69,88,84,13,69,78,68,95,67,79,78,84,69,88,84,13,65,83,95,83,85,66,83,84,73,84,85,84,73,79,78,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,49,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,53,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,48,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,54,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,49,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,55,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,50,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,56,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,51,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,49,57,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,52,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,48,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,53,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,49,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,54,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,50,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,55,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,51,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,56,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,52,34,13,69,78,68,95,83,85,66,13,69,78,68,95,83,85,66,83,84,73,84,85,84,73,79,78,13,68,69,70,95,76,79,79,75,85,80,32,34,65,108,116,32,103,34,32,80,82,79,67,69,83,83,95,66,65,83,69,32,80,82,79,67,69,83,83,95,77,65,82,75,83,32,65,76,76,32,68,73,82,69,67,84,73,79,78,32,76,84,82,13,73,78,95,67,79,78,84,69,88,84,13,69,78,68,95,67,79,78,84,69,88,84,13,65,83,95,83,85,66,83,84,73,84,85,84,73,79,78,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,52,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,53,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,57,52,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,54,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,57,54,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,55,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,50,57,56,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,56,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,51,48,48,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,50,57,34,13,69,78,68,95,83,85,66,13,69,78,68,95,83,85,66,83,84,73,84,85,84,73,79,78,13,68,69,70,95,76,79,79,75,85,80,32,34,65,108,116,32,107,34,32,80,82,79,67,69,83,83,95,66,65,83,69,32,80,82,79,67,69,83,83,95,77,65,82,75,83,32,65,76,76,32,68,73,82,69,67,84,73,79,78,32,76,84,82,13,73,78,95,67,79,78,84,69,88,84,13,69,78,68,95,67,79,78,84,69,88,84,13,65,83,95,83,85,66,83,84,73,84,85,84,73,79,78,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,55,56,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,51,48,34,13,69,78,68,95,83,85,66,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,51,49,57,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,51,49,34,13,69,78,68,95,83,85,66,13,69,78,68,95,83,85,66,83,84,73,84,85,84,73,79,78,13,68,69,70,95,76,79,79,75,85,80,32,34,67,97,112,105,116,97,108,32,223,34,32,80,82,79,67,69,83,83,95,66,65,83,69,32,80,82,79,67,69,83,83,95,77,65,82,75,83,32,65,76,76,32,68,73,82,69,67,84,73,79,78,32,76,84,82,13,73,78,95,67,79,78,84,69,88,84,13,69,78,68,95,67,79,78,84,69,88,84,13,65,83,95,83,85,66,83,84,73,84,85,84,73,79,78,13,83,85,66,32,71,76,89,80,72,32,34,103,108,121,112,104,49,51,55,34,13,87,73,84,72,32,71,76,89,80,72,32,34,103,108,121,112,104,53,51,50,34,13,69,78,68,95,83,85,66,13,69,78,68,95,83,85,66,83,84,73,84,85,84,73,79,78,13,71,82,73,68,95,80,80,69,77,32,50,48,13,80,82,69,83,69,78,84,65,84,73,79,78,95,80,80,69,77,32,55,50,13,80,80,79,83,73,84,73,79,78,73,78,71,95,80,80,69,77,32,49,52,52,13,67,77,65,80,95,70,79,82,77,65,84,32,49,32,48,32,52,13,67,77,65,80,95,70,79,82,77,65,84,32,51,32,49,32,52,32,69,78,68,13,13,0,0,0,0,0, \ No newline at end of file From 59d80dbe6d8dcd8f68c3451d1cafd483dae0b238 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 25 Jan 2020 15:25:10 +0100 Subject: [PATCH 169/192] Utility/SimpleTextDrawer: Fix a lot of minor bugs + add .inl --- include/Nazara/Utility/SimpleTextDrawer.hpp | 72 +++-- include/Nazara/Utility/SimpleTextDrawer.inl | 317 ++++++++++++++++++++ src/Nazara/Utility/SimpleTextDrawer.cpp | 280 +---------------- 3 files changed, 361 insertions(+), 308 deletions(-) create mode 100644 include/Nazara/Utility/SimpleTextDrawer.inl diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index 7533cfd23..6404e72e2 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -19,19 +19,19 @@ namespace Nz class NAZARA_UTILITY_API SimpleTextDrawer : public AbstractTextDrawer { public: - SimpleTextDrawer(); - SimpleTextDrawer(const SimpleTextDrawer& drawer); - SimpleTextDrawer(SimpleTextDrawer&& drawer); - virtual ~SimpleTextDrawer(); + inline SimpleTextDrawer(); + inline SimpleTextDrawer(const SimpleTextDrawer& drawer); + inline SimpleTextDrawer(SimpleTextDrawer&& drawer); + ~SimpleTextDrawer() = default; - void AppendText(const String& str); + inline void AppendText(const String& str); void Clear() override; const Recti& GetBounds() const override; - unsigned int GetCharacterSize() const; - const Color& GetColor() const; - Font* GetFont() const; + inline unsigned int GetCharacterSize() const; + inline const Color& GetColor() const; + inline Font* GetFont() const; Font* GetFont(std::size_t index) const override; std::size_t GetFontCount() const override; const Glyph& GetGlyph(std::size_t index) const override; @@ -39,42 +39,52 @@ namespace Nz const Line& GetLine(std::size_t index) const override; std::size_t GetLineCount() const override; float GetMaxLineWidth() const override; - const Color& GetOutlineColor() const; - float GetOutlineThickness() const; - TextStyleFlags GetStyle() const; - const String& GetText() const; + inline const Color& GetOutlineColor() const; + inline float GetOutlineThickness() const; + inline TextStyleFlags GetStyle() const; + inline const String& GetText() const; - void SetCharacterSize(unsigned int characterSize); - void SetColor(const Color& color); - void SetFont(Font* font); - void SetMaxLineWidth(float lineWidth) override; - void SetOutlineColor(const Color& color); - void SetOutlineThickness(float thickness); - void SetStyle(TextStyleFlags style); - void SetText(const String& str); + inline void SetCharacterSize(unsigned int characterSize); + inline void SetColor(const Color& color); + inline void SetFont(Font* font); + inline void SetLineSpacingFactor(float factor); + inline void SetMaxLineWidth(float lineWidth) override; + inline void SetOutlineColor(const Color& color); + inline void SetOutlineThickness(float thickness); + inline void SetStyle(TextStyleFlags style); + inline void SetText(const String& str); - SimpleTextDrawer& operator=(const SimpleTextDrawer& drawer); - SimpleTextDrawer& operator=(SimpleTextDrawer&& drawer); + inline SimpleTextDrawer& operator=(const SimpleTextDrawer& drawer); + inline SimpleTextDrawer& operator=(SimpleTextDrawer&& drawer); - static SimpleTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); - static SimpleTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor); - static SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); - static SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor); + static inline SimpleTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); + static inline SimpleTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor); + static inline SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); + static inline SimpleTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor); private: - void AppendNewLine() const; + inline void AppendNewLine() const; void AppendNewLine(std::size_t glyphIndex, unsigned int glyphPosition) const; + void ClearGlyphs() const; + void ConnectFontSlots(); void DisconnectFontSlots(); + bool GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, Nz::Color color, int renderOrder, int* advance) const; void GenerateGlyphs(const String& text) const; + + inline void InvalidateColor(); + inline void InvalidateGlyphs(); + void OnFontAtlasLayerChanged(const Font* font, AbstractImage* oldLayer, AbstractImage* newLayer); void OnFontInvalidated(const Font* font); void OnFontRelease(const Font* object); - bool ShouldLineWrap(float size) const; - void UpdateGlyphColor() const; - void UpdateGlyphs() const; + + inline bool ShouldLineWrap(float size) const; + + inline void UpdateGlyphColor() const; + inline void UpdateGlyphs() const; static constexpr std::size_t InvalidGlyph = std::numeric_limits::max(); @@ -104,4 +114,6 @@ namespace Nz }; } +#include + #endif // NAZARA_SIMPLETEXTDRAWER_HPP diff --git a/include/Nazara/Utility/SimpleTextDrawer.inl b/include/Nazara/Utility/SimpleTextDrawer.inl new file mode 100644 index 000000000..13296c0ae --- /dev/null +++ b/include/Nazara/Utility/SimpleTextDrawer.inl @@ -0,0 +1,317 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + inline SimpleTextDrawer::SimpleTextDrawer() : + m_color(Color::White), + m_outlineColor(Color::Black), + m_style(TextStyle_Regular), + m_colorUpdated(true), + m_glyphUpdated(true), + m_maxLineWidth(std::numeric_limits::infinity()), + m_outlineThickness(0.f), + m_characterSize(24) + { + SetFont(Font::GetDefault()); + } + + inline SimpleTextDrawer::SimpleTextDrawer(const SimpleTextDrawer& drawer) : + m_color(drawer.m_color), + m_text(drawer.m_text), + m_style(drawer.m_style), + m_colorUpdated(false), + m_glyphUpdated(false), + m_outlineColor(drawer.m_outlineColor), + m_maxLineWidth(drawer.m_maxLineWidth), + m_outlineThickness(drawer.m_outlineThickness), + m_characterSize(drawer.m_characterSize) + { + SetFont(drawer.m_font); + } + + inline SimpleTextDrawer::SimpleTextDrawer(SimpleTextDrawer&& drawer) + { + operator=(std::move(drawer)); + } + + inline void SimpleTextDrawer::AppendText(const String& str) + { + m_text.Append(str); + if (m_glyphUpdated) + GenerateGlyphs(str); + } + + inline unsigned int SimpleTextDrawer::GetCharacterSize() const + { + return m_characterSize; + } + + inline const Color& SimpleTextDrawer::GetColor() const + { + return m_color; + } + + inline Font* SimpleTextDrawer::GetFont() const + { + return m_font; + } + + inline const Color& SimpleTextDrawer::GetOutlineColor() const + { + return m_outlineColor; + } + + inline float SimpleTextDrawer::GetOutlineThickness() const + { + return m_outlineThickness; + } + + inline TextStyleFlags SimpleTextDrawer::GetStyle() const + { + return m_style; + } + + inline const String& SimpleTextDrawer::GetText() const + { + return m_text; + } + + inline void SimpleTextDrawer::SetCharacterSize(unsigned int characterSize) + { + if (m_characterSize != characterSize) + { + m_characterSize = characterSize; + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetColor(const Color& color) + { + if (m_color != color) + { + m_color = color; + + InvalidateColor(); + } + } + + inline void SimpleTextDrawer::SetFont(Font* font) + { + if (m_font != font) + { + m_font = font; + + if (m_font) + ConnectFontSlots(); + else + DisconnectFontSlots(); + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetMaxLineWidth(float lineWidth) + { + if (m_maxLineWidth != lineWidth) + { + NazaraAssert(lineWidth > 0.f, "Max line width must be positive"); + + m_maxLineWidth = lineWidth; + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetOutlineColor(const Color& color) + { + if (m_outlineColor != color) + { + m_outlineColor = color; + + InvalidateColor(); + } + } + + inline void SimpleTextDrawer::SetOutlineThickness(float thickness) + { + if (m_outlineThickness != thickness) + { + NazaraAssert(thickness >= 0.f, "Thickness must be zero or positive"); + + m_outlineThickness = thickness; + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetStyle(TextStyleFlags style) + { + if (m_style != style) + { + m_style = style; + + InvalidateGlyphs(); + } + } + + inline void SimpleTextDrawer::SetText(const String& str) + { + if (m_text != str) + { + m_text = str; + + InvalidateGlyphs(); + } + } + + inline SimpleTextDrawer& SimpleTextDrawer::operator=(const SimpleTextDrawer& drawer) + { + m_characterSize = drawer.m_characterSize; + m_color = drawer.m_color; + m_maxLineWidth = drawer.m_maxLineWidth; + m_outlineColor = drawer.m_outlineColor; + m_outlineThickness = drawer.m_outlineThickness; + m_style = drawer.m_style; + m_text = drawer.m_text; + + SetFont(drawer.m_font); + InvalidateGlyphs(); + + return *this; + } + + inline SimpleTextDrawer& SimpleTextDrawer::operator=(SimpleTextDrawer&& drawer) + { + DisconnectFontSlots(); + + m_bounds = std::move(drawer.m_bounds); + m_colorUpdated = std::move(drawer.m_colorUpdated); + m_characterSize = std::move(drawer.m_characterSize); + m_color = std::move(drawer.m_color); + m_glyphs = std::move(drawer.m_glyphs); + m_glyphUpdated = std::move(drawer.m_glyphUpdated); + m_font = std::move(drawer.m_font); + m_maxLineWidth = drawer.m_maxLineWidth; + m_outlineColor = std::move(drawer.m_outlineColor); + m_outlineThickness = std::move(drawer.m_outlineThickness); + m_style = std::move(drawer.m_style); + m_text = std::move(drawer.m_text); + + // Update slot pointers (TODO: Improve the way of doing this) + ConnectFontSlots(); + drawer.DisconnectFontSlots(); + + return *this; + } + + inline SimpleTextDrawer SimpleTextDrawer::Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color) + { + SimpleTextDrawer drawer; + drawer.SetCharacterSize(characterSize); + drawer.SetColor(color); + drawer.SetStyle(style); + drawer.SetText(str); + + return drawer; + } + + inline SimpleTextDrawer SimpleTextDrawer::Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor) + { + SimpleTextDrawer drawer; + drawer.SetCharacterSize(characterSize); + drawer.SetColor(color); + drawer.SetOutlineColor(outlineColor); + drawer.SetOutlineThickness(outlineThickness); + drawer.SetStyle(style); + drawer.SetText(str); + + return drawer; + } + + inline SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color) + { + SimpleTextDrawer drawer; + drawer.SetCharacterSize(characterSize); + drawer.SetColor(color); + drawer.SetFont(font); + drawer.SetStyle(style); + drawer.SetText(str); + + return drawer; + } + + inline SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor) + { + SimpleTextDrawer drawer; + drawer.SetCharacterSize(characterSize); + drawer.SetColor(color); + drawer.SetFont(font); + drawer.SetOutlineColor(outlineColor); + drawer.SetOutlineThickness(outlineThickness); + drawer.SetStyle(style); + drawer.SetText(str); + + return drawer; + } + + inline void SimpleTextDrawer::AppendNewLine() const + { + AppendNewLine(InvalidGlyph, 0); + } + + inline void SimpleTextDrawer::InvalidateColor() + { + m_colorUpdated = false; + } + + inline void SimpleTextDrawer::InvalidateGlyphs() + { + m_glyphUpdated = false; + } + + inline bool SimpleTextDrawer::ShouldLineWrap(float size) const + { + if (m_lines.back().glyphIndex > m_glyphs.size()) + return false; + + return m_lines.back().bounds.GetMaximum().x + size > m_maxLineWidth; + } + + inline void SimpleTextDrawer::UpdateGlyphColor() const + { + if (m_outlineThickness > 0.f) + { + for (std::size_t glyphIndex = 0; glyphIndex < m_glyphs.size(); ++glyphIndex) + { + Glyph& glyph = m_glyphs[glyphIndex]; + if (glyphIndex % 2 == 0) + glyph.color = m_outlineColor; + else + glyph.color = m_color; + } + } + else + { + for (Glyph& glyph : m_glyphs) + glyph.color = m_color; + } + + m_colorUpdated = true; + } + + inline void SimpleTextDrawer::UpdateGlyphs() const + { + NazaraAssert(m_font && m_font->IsValid(), "Invalid font"); + + ClearGlyphs(); + GenerateGlyphs(m_text); + } +} + +#include diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 5f5357dbc..6a9fd3999 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -9,47 +9,6 @@ namespace Nz { - SimpleTextDrawer::SimpleTextDrawer() : - m_color(Color::White), - m_outlineColor(Color::Black), - m_style(TextStyle_Regular), - m_colorUpdated(true), - m_glyphUpdated(true), - m_maxLineWidth(std::numeric_limits::infinity()), - m_outlineThickness(0.f), - m_characterSize(24) - { - SetFont(Font::GetDefault()); - } - - SimpleTextDrawer::SimpleTextDrawer(const SimpleTextDrawer& drawer) : - m_color(drawer.m_color), - m_text(drawer.m_text), - m_style(drawer.m_style), - m_colorUpdated(false), - m_glyphUpdated(false), - m_outlineColor(drawer.m_outlineColor), - m_maxLineWidth(drawer.m_maxLineWidth), - m_outlineThickness(drawer.m_outlineThickness), - m_characterSize(drawer.m_characterSize) - { - SetFont(drawer.m_font); - } - - SimpleTextDrawer::SimpleTextDrawer(SimpleTextDrawer&& drawer) - { - operator=(std::move(drawer)); - } - - SimpleTextDrawer::~SimpleTextDrawer() = default; - - void SimpleTextDrawer::AppendText(const String& str) - { - m_text.Append(str); - if (m_glyphUpdated) - GenerateGlyphs(str); - } - void SimpleTextDrawer::Clear() { m_text.Clear(true); @@ -64,27 +23,12 @@ namespace Nz return m_bounds; } - unsigned int SimpleTextDrawer::GetCharacterSize() const - { - return m_characterSize; - } - - const Color& SimpleTextDrawer::GetColor() const - { - return m_color; - } - - Font* SimpleTextDrawer::GetFont() const - { - return m_font; - } - Font* SimpleTextDrawer::GetFont(std::size_t index) const { NazaraAssert(index == 0, "Font index out of range"); NazaraUnused(index); - return m_font; + return GetFont(); } std::size_t SimpleTextDrawer::GetFontCount() const @@ -132,188 +76,6 @@ namespace Nz return m_maxLineWidth; } - const Color& SimpleTextDrawer::GetOutlineColor() const - { - return m_outlineColor; - } - - float SimpleTextDrawer::GetOutlineThickness() const - { - return m_outlineThickness; - } - - TextStyleFlags SimpleTextDrawer::GetStyle() const - { - return m_style; - } - - const String& SimpleTextDrawer::GetText() const - { - return m_text; - } - - void SimpleTextDrawer::SetCharacterSize(unsigned int characterSize) - { - m_characterSize = characterSize; - - m_glyphUpdated = false; - } - - void SimpleTextDrawer::SetColor(const Color& color) - { - m_color = color; - - m_colorUpdated = false; - } - - void SimpleTextDrawer::SetFont(Font* font) - { - if (m_font != font) - { - m_font = font; - - if (m_font) - ConnectFontSlots(); - else - DisconnectFontSlots(); - - m_glyphUpdated = false; - } - } - - void SimpleTextDrawer::SetMaxLineWidth(float lineWidth) - { - NazaraAssert(m_maxLineWidth > 0.f, "Max line width must be positive"); - - m_maxLineWidth = lineWidth; - - m_glyphUpdated = false; - } - - void SimpleTextDrawer::SetOutlineColor(const Color& color) - { - m_outlineColor = color; - - m_colorUpdated = false; - } - - void SimpleTextDrawer::SetOutlineThickness(float thickness) - { - NazaraAssert(thickness >= 0.f, "Thickness must be zero or positive"); - - m_outlineThickness = thickness; - - m_glyphUpdated = false; - } - - void SimpleTextDrawer::SetStyle(TextStyleFlags style) - { - m_style = style; - - m_glyphUpdated = false; - } - - void SimpleTextDrawer::SetText(const String& str) - { - m_text = str; - - m_glyphUpdated = false; - } - - SimpleTextDrawer& SimpleTextDrawer::operator=(const SimpleTextDrawer& drawer) - { - m_characterSize = drawer.m_characterSize; - m_color = drawer.m_color; - m_outlineColor = drawer.m_outlineColor; - m_outlineThickness = drawer.m_outlineThickness; - m_style = drawer.m_style; - m_text = drawer.m_text; - - m_colorUpdated = false; - m_glyphUpdated = false; - SetFont(drawer.m_font); - - return *this; - } - - SimpleTextDrawer& SimpleTextDrawer::operator=(SimpleTextDrawer&& drawer) - { - DisconnectFontSlots(); - - m_bounds = std::move(drawer.m_bounds); - m_colorUpdated = std::move(drawer.m_colorUpdated); - m_characterSize = std::move(drawer.m_characterSize); - m_color = std::move(drawer.m_color); - m_glyphs = std::move(drawer.m_glyphs); - m_glyphUpdated = std::move(drawer.m_glyphUpdated); - m_font = std::move(drawer.m_font); - m_maxLineWidth = drawer.m_maxLineWidth; - m_outlineColor = std::move(drawer.m_outlineColor); - m_outlineThickness = std::move(drawer.m_outlineThickness); - m_style = std::move(drawer.m_style); - m_text = std::move(drawer.m_text); - - // Update slot pointers (TODO: Improve the way of doing this) - ConnectFontSlots(); - - return *this; - } - - SimpleTextDrawer SimpleTextDrawer::Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color) - { - SimpleTextDrawer drawer; - drawer.SetCharacterSize(characterSize); - drawer.SetColor(color); - drawer.SetStyle(style); - drawer.SetText(str); - - return drawer; - } - - SimpleTextDrawer SimpleTextDrawer::Draw(const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor) - { - SimpleTextDrawer drawer; - drawer.SetCharacterSize(characterSize); - drawer.SetColor(color); - drawer.SetOutlineColor(outlineColor); - drawer.SetOutlineThickness(outlineThickness); - drawer.SetStyle(style); - drawer.SetText(str); - - return drawer; - } - - SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color) - { - SimpleTextDrawer drawer; - drawer.SetCharacterSize(characterSize); - drawer.SetColor(color); - drawer.SetFont(font); - drawer.SetStyle(style); - drawer.SetText(str); - - return drawer; - } - - SimpleTextDrawer SimpleTextDrawer::Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style, const Color& color, float outlineThickness, const Color& outlineColor) - { - SimpleTextDrawer drawer; - drawer.SetCharacterSize(characterSize); - drawer.SetColor(color); - drawer.SetFont(font); - drawer.SetOutlineColor(outlineColor); - drawer.SetOutlineThickness(outlineThickness); - drawer.SetStyle(style); - drawer.SetText(str); - - return drawer; - } - - void SimpleTextDrawer::AppendNewLine() const - { - AppendNewLine(InvalidGlyph, 0); - } - void SimpleTextDrawer::AppendNewLine(std::size_t glyphIndex, unsigned int glyphPosition) const { // Ensure we're appending from last line @@ -574,7 +336,7 @@ namespace Nz } #endif - m_glyphUpdated = false; + InvalidateGlyphs(); } void SimpleTextDrawer::OnFontRelease(const Font* font) @@ -592,42 +354,4 @@ namespace Nz SetFont(nullptr); } - - bool SimpleTextDrawer::ShouldLineWrap(float size) const - { - if (m_lines.back().glyphIndex > m_glyphs.size()) - return false; - - return m_lines.back().bounds.GetMaximum().x + size > m_maxLineWidth; - } - - void SimpleTextDrawer::UpdateGlyphColor() const - { - if (m_outlineThickness > 0.f) - { - for (std::size_t glyphIndex = 0; glyphIndex < m_glyphs.size(); ++glyphIndex) - { - Glyph& glyph = m_glyphs[glyphIndex]; - if (glyphIndex % 2 == 0) - glyph.color = m_outlineColor; - else - glyph.color = m_color; - } - } - else - { - for (Glyph& glyph : m_glyphs) - glyph.color = m_color; - } - - m_colorUpdated = true; - } - - void SimpleTextDrawer::UpdateGlyphs() const - { - NazaraAssert(m_font && m_font->IsValid(), "Invalid font"); - - ClearGlyphs(); - GenerateGlyphs(m_text); - } } From 548ede46134bb9027e06012b7120a8dad848ee8b Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 25 Jan 2020 19:07:20 +0100 Subject: [PATCH 170/192] Utility/*TextDrawer: Use float internally + some fixes --- ChangeLog.md | 1 + include/Nazara/Graphics/TextSprite.hpp | 2 +- include/Nazara/Graphics/TextSprite.inl | 2 +- include/Nazara/Utility/AbstractTextDrawer.hpp | 2 +- include/Nazara/Utility/RichTextDrawer.hpp | 14 ++-- include/Nazara/Utility/RichTextDrawer.inl | 2 +- include/Nazara/Utility/SimpleTextDrawer.hpp | 14 ++-- include/Nazara/Utility/SimpleTextDrawer.inl | 33 ++++++++- src/Nazara/Graphics/TextSprite.cpp | 5 +- src/Nazara/Utility/RichTextDrawer.cpp | 42 +++++------ src/Nazara/Utility/SimpleTextDrawer.cpp | 74 +++++++------------ 11 files changed, 98 insertions(+), 93 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 23ce656dd..bc2e3ea88 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -218,6 +218,7 @@ Nazara Engine: - ⚠ OBJLoader flips UV by default, fixing a lot of models UV - On Windows, Thread::Set(Current)Name now uses `SetThreadDescription` Win32 function if possible instead of triggering a debugger exception. MinGW builds will use this if available too. - ⚠ Removed Texture(const Image\*) constructor, use Texture::LoadFromImage instead +- ⚠ TextDrawers now use floating-point internally and to exposes their Bounds (AbstractTextDrawer::GetBounds() now returns a Rectf) Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Graphics/TextSprite.hpp b/include/Nazara/Graphics/TextSprite.hpp index 3811fea95..1826aa21b 100644 --- a/include/Nazara/Graphics/TextSprite.hpp +++ b/include/Nazara/Graphics/TextSprite.hpp @@ -102,7 +102,7 @@ namespace Nz mutable std::unordered_map m_renderInfos; mutable std::vector m_localVertices; Color m_color; - Recti m_localBounds; + Rectf m_localBounds; float m_scale; static TextSpriteLibrary::LibraryMap s_library; diff --git a/include/Nazara/Graphics/TextSprite.inl b/include/Nazara/Graphics/TextSprite.inl index 04a3c1170..97b17d888 100644 --- a/include/Nazara/Graphics/TextSprite.inl +++ b/include/Nazara/Graphics/TextSprite.inl @@ -14,7 +14,7 @@ namespace Nz inline TextSprite::TextSprite() : m_color(Color::White), - m_localBounds(Nz::Recti::Zero()), + m_localBounds(Nz::Rectf::Zero()), m_scale(1.f) { ResetMaterials(1U); diff --git a/include/Nazara/Utility/AbstractTextDrawer.hpp b/include/Nazara/Utility/AbstractTextDrawer.hpp index 37204897a..e62338c61 100644 --- a/include/Nazara/Utility/AbstractTextDrawer.hpp +++ b/include/Nazara/Utility/AbstractTextDrawer.hpp @@ -29,7 +29,7 @@ namespace Nz virtual void Clear() = 0; - virtual const Recti& GetBounds() const = 0; + virtual const Rectf& GetBounds() const = 0; virtual Font* GetFont(std::size_t index) const = 0; virtual std::size_t GetFontCount() const = 0; virtual const Glyph& GetGlyph(std::size_t index) const = 0; diff --git a/include/Nazara/Utility/RichTextDrawer.hpp b/include/Nazara/Utility/RichTextDrawer.hpp index 2a1709d8c..67f5ec0de 100644 --- a/include/Nazara/Utility/RichTextDrawer.hpp +++ b/include/Nazara/Utility/RichTextDrawer.hpp @@ -43,7 +43,7 @@ namespace Nz inline const String& GetBlockText(std::size_t index) const; inline BlockRef GetBlock(std::size_t index); - const Recti& GetBounds() const override; + const Rectf& GetBounds() const override; inline unsigned int GetDefaultCharacterSize() const; inline const Color& GetDefaultColor() const; inline const FontRef& GetDefaultFont() const; @@ -86,14 +86,11 @@ namespace Nz static constexpr std::size_t InvalidBlockIndex = std::numeric_limits::max(); - //static RichTextDrawer Draw(const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); - //static RichTextDrawer Draw(Font* font, const String& str, unsigned int characterSize, TextStyleFlags style = TextStyle_Regular, const Color& color = Color::White); - private: struct Block; inline void AppendNewLine(const Font* font, unsigned int characterSize) const; - void AppendNewLine(const Font* font, unsigned int characterSize, std::size_t glyphIndex, unsigned int glyphPosition) const; + void AppendNewLine(const Font* font, unsigned int characterSize, std::size_t glyphIndex, float glyphPosition) const; inline void ClearGlyphs() const; inline void ConnectFontSlots(); inline void DisconnectFontSlots(); @@ -145,14 +142,13 @@ namespace Nz std::vector m_fonts; mutable std::vector m_glyphs; mutable std::vector m_lines; - mutable Rectf m_workingBounds; - mutable Recti m_bounds; - mutable Vector2ui m_drawPos; + mutable Rectf m_bounds; + mutable Vector2f m_drawPos; mutable bool m_glyphUpdated; float m_defaultOutlineThickness; float m_maxLineWidth; unsigned int m_defaultCharacterSize; - mutable unsigned int m_lastSeparatorPosition; + mutable float m_lastSeparatorPosition; }; class RichTextDrawer::BlockRef diff --git a/include/Nazara/Utility/RichTextDrawer.inl b/include/Nazara/Utility/RichTextDrawer.inl index e2916d475..ef49a0457 100644 --- a/include/Nazara/Utility/RichTextDrawer.inl +++ b/include/Nazara/Utility/RichTextDrawer.inl @@ -148,7 +148,7 @@ namespace Nz m_lines.clear(); m_glyphs.clear(); m_glyphUpdated = true; - m_workingBounds.MakeZero(); //< Compute bounds as float to speedup bounds computation (as casting between floats and integers is costly) + m_bounds.MakeZero(); //< Compute bounds as float to speedup bounds computation (as casting between floats and integers is costly) } inline void RichTextDrawer::ConnectFontSlots() diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index 6404e72e2..304142d6e 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -28,7 +28,7 @@ namespace Nz void Clear() override; - const Recti& GetBounds() const override; + const Rectf& GetBounds() const override; inline unsigned int GetCharacterSize() const; inline const Color& GetColor() const; inline Font* GetFont() const; @@ -38,6 +38,7 @@ namespace Nz std::size_t GetGlyphCount() const override; const Line& GetLine(std::size_t index) const override; std::size_t GetLineCount() const override; + inline float GetLineHeight() const; float GetMaxLineWidth() const override; inline const Color& GetOutlineColor() const; inline float GetOutlineThickness() const; @@ -64,7 +65,7 @@ namespace Nz private: inline void AppendNewLine() const; - void AppendNewLine(std::size_t glyphIndex, unsigned int glyphPosition) const; + void AppendNewLine(std::size_t glyphIndex, float glyphPosition) const; void ClearGlyphs() const; @@ -74,6 +75,8 @@ namespace Nz bool GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, Nz::Color color, int renderOrder, int* advance) const; void GenerateGlyphs(const String& text) const; + inline float GetLineHeight(const Font::SizeInfo& sizeInfo) const; + inline void InvalidateColor(); inline void InvalidateGlyphs(); @@ -94,20 +97,19 @@ namespace Nz NazaraSlot(Font, OnFontRelease, m_fontReleaseSlot); mutable std::size_t m_lastSeparatorGlyph; - mutable unsigned int m_lastSeparatorPosition; mutable std::vector m_glyphs; mutable std::vector m_lines; Color m_color; Color m_outlineColor; FontRef m_font; - mutable Rectf m_workingBounds; - mutable Recti m_bounds; + mutable Rectf m_bounds; String m_text; TextStyleFlags m_style; mutable UInt32 m_previousCharacter; - mutable Vector2ui m_drawPos; + mutable Vector2f m_drawPos; mutable bool m_colorUpdated; mutable bool m_glyphUpdated; + mutable float m_lastSeparatorPosition; float m_maxLineWidth; float m_outlineThickness; unsigned int m_characterSize; diff --git a/include/Nazara/Utility/SimpleTextDrawer.inl b/include/Nazara/Utility/SimpleTextDrawer.inl index 13296c0ae..3f8e1ae52 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.inl +++ b/include/Nazara/Utility/SimpleTextDrawer.inl @@ -61,6 +61,12 @@ namespace Nz return m_font; } + inline float SimpleTextDrawer::GetLineHeight() const + { + NazaraAssert(m_font, "SimpleTextDrawer has no font"); + return GetLineHeight(m_font->GetSizeInfo(m_characterSize)); + } + inline const Color& SimpleTextDrawer::GetOutlineColor() const { return m_outlineColor; @@ -205,7 +211,11 @@ namespace Nz // Update slot pointers (TODO: Improve the way of doing this) ConnectFontSlots(); - drawer.DisconnectFontSlots(); + if (m_font) + { + drawer.DisconnectFontSlots(); + ConnectFontSlots(); + } return *this; } @@ -265,6 +275,27 @@ namespace Nz AppendNewLine(InvalidGlyph, 0); } + inline void SimpleTextDrawer::ConnectFontSlots() + { + m_atlasChangedSlot.Connect(m_font->OnFontAtlasChanged, this, &SimpleTextDrawer::OnFontInvalidated); + m_atlasLayerChangedSlot.Connect(m_font->OnFontAtlasLayerChanged, this, &SimpleTextDrawer::OnFontAtlasLayerChanged); + m_fontReleaseSlot.Connect(m_font->OnFontRelease, this, &SimpleTextDrawer::OnFontRelease); + m_glyphCacheClearedSlot.Connect(m_font->OnFontGlyphCacheCleared, this, &SimpleTextDrawer::OnFontInvalidated); + } + + inline void SimpleTextDrawer::DisconnectFontSlots() + { + m_atlasChangedSlot.Disconnect(); + m_atlasLayerChangedSlot.Disconnect(); + m_fontReleaseSlot.Disconnect(); + m_glyphCacheClearedSlot.Disconnect(); + } + + inline float SimpleTextDrawer::GetLineHeight(const Font::SizeInfo& sizeInfo) const + { + return float(sizeInfo.lineHeight); + } + inline void SimpleTextDrawer::InvalidateColor() { m_colorUpdated = false; diff --git a/src/Nazara/Graphics/TextSprite.cpp b/src/Nazara/Graphics/TextSprite.cpp index a694bb563..f253b5539 100644 --- a/src/Nazara/Graphics/TextSprite.cpp +++ b/src/Nazara/Graphics/TextSprite.cpp @@ -215,9 +215,8 @@ namespace Nz void TextSprite::MakeBoundingVolume() const { - Rectf bounds(m_localBounds); - Vector2f max = m_scale * bounds.GetMaximum(); - Vector2f min = m_scale * bounds.GetMinimum(); + Vector2f max = m_scale * m_localBounds.GetMaximum(); + Vector2f min = m_scale * m_localBounds.GetMinimum(); m_boundingVolume.Set(min.x * Vector3f::Right() + min.y * Vector3f::Down(), max.x * Vector3f::Right() + max.y * Vector3f::Down()); } diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp index 98c145474..75745c543 100644 --- a/src/Nazara/Utility/RichTextDrawer.cpp +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -110,7 +110,7 @@ namespace Nz ClearGlyphs(); } - const Recti& RichTextDrawer::GetBounds() const + const Rectf& RichTextDrawer::GetBounds() const { if (!m_glyphUpdated) UpdateGlyphs(); @@ -260,7 +260,6 @@ namespace Nz m_glyphs = std::move(m_glyphs); m_lines = std::move(m_lines); m_glyphUpdated = std::move(m_glyphUpdated); - m_workingBounds = std::move(m_workingBounds); drawer.DisconnectFontSlots(); ConnectFontSlots(); @@ -268,21 +267,21 @@ namespace Nz return *this; } - void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize, std::size_t glyphIndex, unsigned int glyphPosition) const + void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize, std::size_t glyphIndex, float glyphPosition) const { // Ensure we're appending from last line Line& lastLine = m_lines.back(); const Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); - unsigned int previousDrawPos = m_drawPos.x; + float previousDrawPos = m_drawPos.x; // Reset cursor m_drawPos.x = 0; m_drawPos.y += sizeInfo.lineHeight; m_lastSeparatorGlyph = InvalidGlyph; - m_workingBounds.ExtendTo(lastLine.bounds); + m_bounds.ExtendTo(lastLine.bounds); m_lines.emplace_back(Line{ Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1 }); if (glyphIndex != InvalidGlyph && glyphIndex > lastLine.glyphIndex) @@ -310,10 +309,10 @@ namespace Nz lastLine.bounds.width -= lastLine.bounds.GetMaximum().x - glyphPosition; - // Regenerate working bounds - m_workingBounds.MakeZero(); - for (std::size_t i = 0; i < m_lines.size(); ++i) - m_workingBounds.ExtendTo(m_lines[i].bounds); + // Regenerate bounds + m_bounds.MakeZero(); + for (auto& line : m_lines) + m_bounds.ExtendTo(line.bounds); } } @@ -403,16 +402,16 @@ namespace Nz previousCharacter = character; bool whitespace = true; - int advance = 0; + float advance = 0.f; switch (character) { case ' ': case '\n': - advance = sizeInfo.spaceAdvance; + advance = float(sizeInfo.spaceAdvance); break; case '\t': - advance = sizeInfo.spaceAdvance * 4; + advance = float(sizeInfo.spaceAdvance) * 4.f; break; default: @@ -423,27 +422,26 @@ namespace Nz Glyph glyph; if (!whitespace) { - if (!GenerateGlyph(glyph, character, 0.f, true, font, color, style, characterSize, 0, &advance)) + int iAdvance; + if (!GenerateGlyph(glyph, character, 0.f, true, font, color, style, characterSize, 0, &iAdvance)) continue; // Glyph failed to load, just skip it (can't do much) + advance = float(iAdvance); + if (outlineThickness > 0.f) { Glyph outlineGlyph; if (GenerateGlyph(outlineGlyph, character, outlineThickness, false, font, outlineColor, style, characterSize, -1, nullptr)) - { m_glyphs.push_back(outlineGlyph); - } } } else { - float glyphAdvance = float(advance); - - if (ShouldLineWrap(glyphAdvance)) + if (ShouldLineWrap(advance)) AppendNewLine(font, characterSize, m_lastSeparatorGlyph, m_lastSeparatorPosition); glyph.atlas = nullptr; - glyph.bounds.Set(float(m_drawPos.x), m_lines.back().bounds.y, glyphAdvance, float(sizeInfo.lineHeight)); + glyph.bounds.Set(m_drawPos.x, m_lines.back().bounds.y, advance, float(sizeInfo.lineHeight)); glyph.corners[0].Set(glyph.bounds.GetCorner(RectCorner_LeftTop)); glyph.corners[1].Set(glyph.bounds.GetCorner(RectCorner_RightTop)); @@ -475,9 +473,7 @@ namespace Nz m_glyphs.push_back(glyph); } - m_workingBounds.ExtendTo(m_lines.back().bounds); - - m_bounds.Set(Rectf(std::floor(m_workingBounds.x), std::floor(m_workingBounds.y), std::ceil(m_workingBounds.width), std::ceil(m_workingBounds.height))); + m_bounds.ExtendTo(m_lines.back().bounds); m_glyphUpdated = true; } @@ -553,7 +549,7 @@ namespace Nz else m_lines.emplace_back(Line{ Rectf::Zero(), 0 }); - m_drawPos.Set(0, firstBlock.characterSize); + m_drawPos.Set(0, float(firstBlock.characterSize)); for (const Block& block : m_blocks) { diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 6a9fd3999..48cbe8c1f 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -15,7 +15,7 @@ namespace Nz ClearGlyphs(); } - const Recti& SimpleTextDrawer::GetBounds() const + const Rectf& SimpleTextDrawer::GetBounds() const { if (!m_glyphUpdated) UpdateGlyphs(); @@ -76,22 +76,22 @@ namespace Nz return m_maxLineWidth; } - void SimpleTextDrawer::AppendNewLine(std::size_t glyphIndex, unsigned int glyphPosition) const + void SimpleTextDrawer::AppendNewLine(std::size_t glyphIndex, float glyphPosition) const { // Ensure we're appending from last line Line& lastLine = m_lines.back(); - const Font::SizeInfo& sizeInfo = m_font->GetSizeInfo(m_characterSize); + float previousDrawPos = m_drawPos.x; - unsigned int previousDrawPos = m_drawPos.x; + float lineHeight = GetLineHeight(); // Reset cursor - m_drawPos.x = 0; - m_drawPos.y += sizeInfo.lineHeight; + m_drawPos.x = 0.f; + m_drawPos.y += lineHeight; m_lastSeparatorGlyph = InvalidGlyph; - m_workingBounds.ExtendTo(lastLine.bounds); - m_lines.emplace_back(Line{ Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1 }); + m_bounds.ExtendTo(lastLine.bounds); + m_lines.emplace_back(Line{ Rectf(0.f, lineHeight * m_lines.size(), 0.f, lineHeight), m_glyphs.size() + 1 }); if (glyphIndex != InvalidGlyph && glyphIndex > lastLine.glyphIndex) { @@ -102,12 +102,12 @@ namespace Nz { Glyph& glyph = m_glyphs[i]; glyph.bounds.x -= glyphPosition; - glyph.bounds.y += sizeInfo.lineHeight; + glyph.bounds.y += lineHeight; for (auto& corner : glyph.corners) { corner.x -= glyphPosition; - corner.y += sizeInfo.lineHeight; + corner.y += lineHeight; } newLine.bounds.ExtendTo(glyph.bounds); @@ -118,10 +118,10 @@ namespace Nz lastLine.bounds.width -= lastLine.bounds.GetMaximum().x - glyphPosition; - // Regenerate working bounds - m_workingBounds.MakeZero(); - for (std::size_t i = 0; i < m_lines.size(); ++i) - m_workingBounds.ExtendTo(m_lines[i].bounds); + // Regenerate bounds + m_bounds.MakeZero(); + for (auto& line : m_lines) + m_bounds.ExtendTo(line.bounds); } } @@ -129,36 +129,19 @@ namespace Nz { m_bounds.MakeZero(); m_colorUpdated = true; - m_drawPos.Set(0, m_characterSize); //< Our draw "cursor" + m_drawPos.Set(0, float(m_characterSize)); //< Our draw "cursor" m_lastSeparatorGlyph = InvalidGlyph; m_lines.clear(); m_glyphs.clear(); m_glyphUpdated = true; m_previousCharacter = 0; - m_workingBounds.MakeZero(); //< Compute bounds as float to speedup bounds computation (as casting between floats and integers is costly) if (m_font) - m_lines.emplace_back(Line{Rectf(0.f, 0.f, 0.f, float(m_font->GetSizeInfo(m_characterSize).lineHeight)), 0}); + m_lines.emplace_back(Line{Rectf(0.f, 0.f, 0.f, GetLineHeight()), 0}); else m_lines.emplace_back(Line{Rectf::Zero(), 0}); } - void SimpleTextDrawer::ConnectFontSlots() - { - m_atlasChangedSlot.Connect(m_font->OnFontAtlasChanged, this, &SimpleTextDrawer::OnFontInvalidated); - m_atlasLayerChangedSlot.Connect(m_font->OnFontAtlasLayerChanged, this, &SimpleTextDrawer::OnFontAtlasLayerChanged); - m_fontReleaseSlot.Connect(m_font->OnFontRelease, this, &SimpleTextDrawer::OnFontRelease); - m_glyphCacheClearedSlot.Connect(m_font->OnFontGlyphCacheCleared, this, &SimpleTextDrawer::OnFontInvalidated); - } - - void SimpleTextDrawer::DisconnectFontSlots() - { - m_atlasChangedSlot.Disconnect(); - m_atlasLayerChangedSlot.Disconnect(); - m_fontReleaseSlot.Disconnect(); - m_glyphCacheClearedSlot.Disconnect(); - } - bool SimpleTextDrawer::GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, Nz::Color color, int renderOrder, int* advance) const { const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, outlineThickness, character); @@ -223,16 +206,16 @@ namespace Nz m_previousCharacter = character; bool whitespace = true; - int advance = 0; + float advance = 0.f; switch (character) { case ' ': case '\n': - advance = sizeInfo.spaceAdvance; + advance = float(sizeInfo.spaceAdvance); break; case '\t': - advance = sizeInfo.spaceAdvance * 4; + advance = float(sizeInfo.spaceAdvance) * 4.f; break; default: @@ -243,27 +226,26 @@ namespace Nz Glyph glyph; if (!whitespace) { - if (!GenerateGlyph(glyph, character, 0.f, true, m_color, 0, &advance)) + int iAdvance; + if (!GenerateGlyph(glyph, character, 0.f, true, m_color, 0, &iAdvance)) continue; // Glyph failed to load, just skip it (can't do much) + advance = float(iAdvance); + if (m_outlineThickness > 0.f) { Glyph outlineGlyph; if (GenerateGlyph(outlineGlyph, character, m_outlineThickness, false, m_outlineColor, -1, nullptr)) - { m_glyphs.push_back(outlineGlyph); - } } } else { - float glyphAdvance = advance; - - if (ShouldLineWrap(glyphAdvance)) + if (ShouldLineWrap(advance)) AppendNewLine(m_lastSeparatorGlyph, m_lastSeparatorPosition); glyph.atlas = nullptr; - glyph.bounds.Set(float(m_drawPos.x), m_lines.back().bounds.y, glyphAdvance, float(sizeInfo.lineHeight)); + glyph.bounds.Set(m_drawPos.x, m_lines.back().bounds.y, advance, GetLineHeight(sizeInfo)); glyph.corners[0].Set(glyph.bounds.GetCorner(RectCorner_LeftTop)); glyph.corners[1].Set(glyph.bounds.GetCorner(RectCorner_RightTop)); @@ -295,9 +277,7 @@ namespace Nz m_glyphs.push_back(glyph); } - m_workingBounds.ExtendTo(m_lines.back().bounds); - - m_bounds.Set(Rectf(std::floor(m_workingBounds.x), std::floor(m_workingBounds.y), std::ceil(m_workingBounds.width), std::ceil(m_workingBounds.height))); + m_bounds.ExtendTo(m_lines.back().bounds); m_colorUpdated = true; m_glyphUpdated = true; @@ -316,7 +296,7 @@ namespace Nz #endif // Update atlas layer pointer - // Note: This can happen while updating + // Note: This can happen while updating glyphs for (Glyph& glyph : m_glyphs) { if (glyph.atlas == oldLayer) From 6b825a084cd64ccd4593b0ba1eb7cc6f5288cd3a Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 25 Jan 2020 19:08:36 +0100 Subject: [PATCH 171/192] Utility/SimpleTextDrawer: Add line spacing factor --- include/Nazara/Utility/SimpleTextDrawer.hpp | 6 ++++-- include/Nazara/Utility/SimpleTextDrawer.inl | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index 304142d6e..ef838e6b8 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -39,6 +39,7 @@ namespace Nz const Line& GetLine(std::size_t index) const override; std::size_t GetLineCount() const override; inline float GetLineHeight() const; + inline float GetLineSpacingFactor() const; float GetMaxLineWidth() const override; inline const Color& GetOutlineColor() const; inline float GetOutlineThickness() const; @@ -69,8 +70,8 @@ namespace Nz void ClearGlyphs() const; - void ConnectFontSlots(); - void DisconnectFontSlots(); + inline void ConnectFontSlots(); + inline void DisconnectFontSlots(); bool GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, Nz::Color color, int renderOrder, int* advance) const; void GenerateGlyphs(const String& text) const; @@ -110,6 +111,7 @@ namespace Nz mutable bool m_colorUpdated; mutable bool m_glyphUpdated; mutable float m_lastSeparatorPosition; + float m_lineSpacingFactor; float m_maxLineWidth; float m_outlineThickness; unsigned int m_characterSize; diff --git a/include/Nazara/Utility/SimpleTextDrawer.inl b/include/Nazara/Utility/SimpleTextDrawer.inl index 3f8e1ae52..088664fc8 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.inl +++ b/include/Nazara/Utility/SimpleTextDrawer.inl @@ -13,6 +13,7 @@ namespace Nz m_style(TextStyle_Regular), m_colorUpdated(true), m_glyphUpdated(true), + m_lineSpacingFactor(1.f), m_maxLineWidth(std::numeric_limits::infinity()), m_outlineThickness(0.f), m_characterSize(24) @@ -27,6 +28,7 @@ namespace Nz m_colorUpdated(false), m_glyphUpdated(false), m_outlineColor(drawer.m_outlineColor), + m_lineSpacingFactor(drawer.m_lineSpacingFactor), m_maxLineWidth(drawer.m_maxLineWidth), m_outlineThickness(drawer.m_outlineThickness), m_characterSize(drawer.m_characterSize) @@ -67,6 +69,11 @@ namespace Nz return GetLineHeight(m_font->GetSizeInfo(m_characterSize)); } + inline float SimpleTextDrawer::GetLineSpacingFactor() const + { + return m_lineSpacingFactor; + } + inline const Color& SimpleTextDrawer::GetOutlineColor() const { return m_outlineColor; @@ -122,6 +129,16 @@ namespace Nz } } + inline void SimpleTextDrawer::SetLineSpacingFactor(float factor) + { + if (m_lineSpacingFactor != factor) + { + m_lineSpacingFactor = factor; + + InvalidateGlyphs(); + } + } + inline void SimpleTextDrawer::SetMaxLineWidth(float lineWidth) { if (m_maxLineWidth != lineWidth) @@ -180,6 +197,7 @@ namespace Nz { m_characterSize = drawer.m_characterSize; m_color = drawer.m_color; + m_lineSpacingFactor = drawer.m_lineSpacingFactor; m_maxLineWidth = drawer.m_maxLineWidth; m_outlineColor = drawer.m_outlineColor; m_outlineThickness = drawer.m_outlineThickness; @@ -203,6 +221,7 @@ namespace Nz m_glyphs = std::move(drawer.m_glyphs); m_glyphUpdated = std::move(drawer.m_glyphUpdated); m_font = std::move(drawer.m_font); + m_lineSpacingFactor = drawer.m_lineSpacingFactor; m_maxLineWidth = drawer.m_maxLineWidth; m_outlineColor = std::move(drawer.m_outlineColor); m_outlineThickness = std::move(drawer.m_outlineThickness); @@ -210,7 +229,6 @@ namespace Nz m_text = std::move(drawer.m_text); // Update slot pointers (TODO: Improve the way of doing this) - ConnectFontSlots(); if (m_font) { drawer.DisconnectFontSlots(); From 151b8eb425e0363d0b8bdcb8abb692d527ea925d Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 25 Jan 2020 19:15:25 +0100 Subject: [PATCH 172/192] Fix previous commit --- include/Nazara/Utility/SimpleTextDrawer.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Nazara/Utility/SimpleTextDrawer.inl b/include/Nazara/Utility/SimpleTextDrawer.inl index 088664fc8..77b23467e 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.inl +++ b/include/Nazara/Utility/SimpleTextDrawer.inl @@ -311,7 +311,7 @@ namespace Nz inline float SimpleTextDrawer::GetLineHeight(const Font::SizeInfo& sizeInfo) const { - return float(sizeInfo.lineHeight); + return float(sizeInfo.lineHeight) * m_lineSpacingFactor; } inline void SimpleTextDrawer::InvalidateColor() From b50691d71e737849b1a0041b65c501e39dc980cc Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 25 Jan 2020 19:15:30 +0100 Subject: [PATCH 173/192] Update Core.hpp --- include/Nazara/Core.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/Nazara/Core.hpp b/include/Nazara/Core.hpp index faab3b2f8..bb5e6e682 100644 --- a/include/Nazara/Core.hpp +++ b/include/Nazara/Core.hpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include From 5dd37ed3d889ad8ad166390131d9d6f279cfd4b4 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 25 Jan 2020 19:15:45 +0100 Subject: [PATCH 174/192] Demo: Remove useless line --- examples/Particles/SpacebattleDemo.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/Particles/SpacebattleDemo.cpp b/examples/Particles/SpacebattleDemo.cpp index b799c6237..6f3205b87 100644 --- a/examples/Particles/SpacebattleDemo.cpp +++ b/examples/Particles/SpacebattleDemo.cpp @@ -596,7 +596,6 @@ void SpacebattleExample::Enter(Ndk::StateMachine& fsm) auto colorPtr = mapper.GetComponentPtr(Nz::ParticleComponent_Color); auto lifePtr = mapper.GetComponentPtr(Nz::ParticleComponent_Life); - float velFactor = std::pow(0.9f, elapsedTime / 0.1f); for (unsigned int i = startId; i <= endId; ++i) colorPtr[i].a = static_cast(Nz::Clamp(lifePtr[i] * 255.f, 0.f, 255.f)); })); From 11d51872fa553954323dcab12d7a3cbb00efc90b Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 26 Jan 2020 16:18:28 +0100 Subject: [PATCH 175/192] Utility/SimpleTextDrawer: Add character spacing offset --- include/Nazara/Utility/SimpleTextDrawer.hpp | 3 +++ include/Nazara/Utility/SimpleTextDrawer.inl | 19 +++++++++++++++++++ src/Nazara/Utility/SimpleTextDrawer.cpp | 8 ++++---- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index ef838e6b8..d7a798703 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -29,6 +29,7 @@ namespace Nz void Clear() override; const Rectf& GetBounds() const override; + inline float GetCharacterSpacingOffset() const; inline unsigned int GetCharacterSize() const; inline const Color& GetColor() const; inline Font* GetFont() const; @@ -46,6 +47,7 @@ namespace Nz inline TextStyleFlags GetStyle() const; inline const String& GetText() const; + inline void SetCharacterSpacingOffset(float offset); inline void SetCharacterSize(unsigned int characterSize); inline void SetColor(const Color& color); inline void SetFont(Font* font); @@ -112,6 +114,7 @@ namespace Nz mutable bool m_glyphUpdated; mutable float m_lastSeparatorPosition; float m_lineSpacingFactor; + float m_characterSpacingOffset; float m_maxLineWidth; float m_outlineThickness; unsigned int m_characterSize; diff --git a/include/Nazara/Utility/SimpleTextDrawer.inl b/include/Nazara/Utility/SimpleTextDrawer.inl index 77b23467e..6f94cd8b4 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.inl +++ b/include/Nazara/Utility/SimpleTextDrawer.inl @@ -14,6 +14,7 @@ namespace Nz m_colorUpdated(true), m_glyphUpdated(true), m_lineSpacingFactor(1.f), + m_characterSpacingOffset(0.f), m_maxLineWidth(std::numeric_limits::infinity()), m_outlineThickness(0.f), m_characterSize(24) @@ -29,6 +30,7 @@ namespace Nz m_glyphUpdated(false), m_outlineColor(drawer.m_outlineColor), m_lineSpacingFactor(drawer.m_lineSpacingFactor), + m_characterSpacingOffset(drawer.m_characterSpacingOffset), m_maxLineWidth(drawer.m_maxLineWidth), m_outlineThickness(drawer.m_outlineThickness), m_characterSize(drawer.m_characterSize) @@ -48,6 +50,11 @@ namespace Nz GenerateGlyphs(str); } + inline float SimpleTextDrawer::GetCharacterSpacingOffset() const + { + return m_characterSpacingOffset; + } + inline unsigned int SimpleTextDrawer::GetCharacterSize() const { return m_characterSize; @@ -94,6 +101,16 @@ namespace Nz return m_text; } + inline void SimpleTextDrawer::SetCharacterSpacingOffset(float offset) + { + if (m_characterSpacingOffset != offset) + { + m_characterSpacingOffset = offset; + + InvalidateGlyphs(); + } + } + inline void SimpleTextDrawer::SetCharacterSize(unsigned int characterSize) { if (m_characterSize != characterSize) @@ -196,6 +213,7 @@ namespace Nz inline SimpleTextDrawer& SimpleTextDrawer::operator=(const SimpleTextDrawer& drawer) { m_characterSize = drawer.m_characterSize; + m_characterSpacingOffset = drawer.m_characterSpacingOffset; m_color = drawer.m_color; m_lineSpacingFactor = drawer.m_lineSpacingFactor; m_maxLineWidth = drawer.m_maxLineWidth; @@ -217,6 +235,7 @@ namespace Nz m_bounds = std::move(drawer.m_bounds); m_colorUpdated = std::move(drawer.m_colorUpdated); m_characterSize = std::move(drawer.m_characterSize); + m_characterSpacingOffset = drawer.m_characterSpacingOffset; m_color = std::move(drawer.m_color); m_glyphs = std::move(drawer.m_glyphs); m_glyphUpdated = std::move(drawer.m_glyphUpdated); diff --git a/src/Nazara/Utility/SimpleTextDrawer.cpp b/src/Nazara/Utility/SimpleTextDrawer.cpp index 48cbe8c1f..ebaf28b3a 100644 --- a/src/Nazara/Utility/SimpleTextDrawer.cpp +++ b/src/Nazara/Utility/SimpleTextDrawer.cpp @@ -206,16 +206,16 @@ namespace Nz m_previousCharacter = character; bool whitespace = true; - float advance = 0.f; + float advance = m_characterSpacingOffset; switch (character) { case ' ': case '\n': - advance = float(sizeInfo.spaceAdvance); + advance += float(sizeInfo.spaceAdvance); break; case '\t': - advance = float(sizeInfo.spaceAdvance) * 4.f; + advance += float(sizeInfo.spaceAdvance) * 4.f; break; default: @@ -230,7 +230,7 @@ namespace Nz if (!GenerateGlyph(glyph, character, 0.f, true, m_color, 0, &iAdvance)) continue; // Glyph failed to load, just skip it (can't do much) - advance = float(iAdvance); + advance += float(iAdvance); if (m_outlineThickness > 0.f) { From 977044f59e5777de644951f6c45ef799c70b9e31 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 26 Jan 2020 16:19:06 +0100 Subject: [PATCH 176/192] Utility/SimpleTextDrawer: Replace line spacing factor by line spacing offset --- ChangeLog.md | 1 + include/Nazara/Utility/SimpleTextDrawer.hpp | 6 +++--- include/Nazara/Utility/SimpleTextDrawer.inl | 20 ++++++++++---------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index bc2e3ea88..156a02777 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -219,6 +219,7 @@ Nazara Engine: - On Windows, Thread::Set(Current)Name now uses `SetThreadDescription` Win32 function if possible instead of triggering a debugger exception. MinGW builds will use this if available too. - ⚠ Removed Texture(const Image\*) constructor, use Texture::LoadFromImage instead - ⚠ TextDrawers now use floating-point internally and to exposes their Bounds (AbstractTextDrawer::GetBounds() now returns a Rectf) +- Added SimpleTextDrawer character and line spacing offset properties Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Utility/SimpleTextDrawer.hpp b/include/Nazara/Utility/SimpleTextDrawer.hpp index d7a798703..3ee3b1b25 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.hpp +++ b/include/Nazara/Utility/SimpleTextDrawer.hpp @@ -40,7 +40,7 @@ namespace Nz const Line& GetLine(std::size_t index) const override; std::size_t GetLineCount() const override; inline float GetLineHeight() const; - inline float GetLineSpacingFactor() const; + inline float GetLineSpacingOffset() const; float GetMaxLineWidth() const override; inline const Color& GetOutlineColor() const; inline float GetOutlineThickness() const; @@ -51,7 +51,7 @@ namespace Nz inline void SetCharacterSize(unsigned int characterSize); inline void SetColor(const Color& color); inline void SetFont(Font* font); - inline void SetLineSpacingFactor(float factor); + inline void SetLineSpacingOffset(float offset); inline void SetMaxLineWidth(float lineWidth) override; inline void SetOutlineColor(const Color& color); inline void SetOutlineThickness(float thickness); @@ -113,8 +113,8 @@ namespace Nz mutable bool m_colorUpdated; mutable bool m_glyphUpdated; mutable float m_lastSeparatorPosition; - float m_lineSpacingFactor; float m_characterSpacingOffset; + float m_lineSpacingOffset; float m_maxLineWidth; float m_outlineThickness; unsigned int m_characterSize; diff --git a/include/Nazara/Utility/SimpleTextDrawer.inl b/include/Nazara/Utility/SimpleTextDrawer.inl index 6f94cd8b4..a203bfa8e 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.inl +++ b/include/Nazara/Utility/SimpleTextDrawer.inl @@ -13,8 +13,8 @@ namespace Nz m_style(TextStyle_Regular), m_colorUpdated(true), m_glyphUpdated(true), - m_lineSpacingFactor(1.f), m_characterSpacingOffset(0.f), + m_lineSpacingOffset(0.f), m_maxLineWidth(std::numeric_limits::infinity()), m_outlineThickness(0.f), m_characterSize(24) @@ -29,8 +29,8 @@ namespace Nz m_colorUpdated(false), m_glyphUpdated(false), m_outlineColor(drawer.m_outlineColor), - m_lineSpacingFactor(drawer.m_lineSpacingFactor), m_characterSpacingOffset(drawer.m_characterSpacingOffset), + m_lineSpacingOffset(drawer.m_lineSpacingOffset), m_maxLineWidth(drawer.m_maxLineWidth), m_outlineThickness(drawer.m_outlineThickness), m_characterSize(drawer.m_characterSize) @@ -76,9 +76,9 @@ namespace Nz return GetLineHeight(m_font->GetSizeInfo(m_characterSize)); } - inline float SimpleTextDrawer::GetLineSpacingFactor() const + inline float SimpleTextDrawer::GetLineSpacingOffset() const { - return m_lineSpacingFactor; + return m_lineSpacingOffset; } inline const Color& SimpleTextDrawer::GetOutlineColor() const @@ -146,11 +146,11 @@ namespace Nz } } - inline void SimpleTextDrawer::SetLineSpacingFactor(float factor) + inline void SimpleTextDrawer::SetLineSpacingOffset(float offset) { - if (m_lineSpacingFactor != factor) + if (m_lineSpacingOffset != offset) { - m_lineSpacingFactor = factor; + m_lineSpacingOffset = offset; InvalidateGlyphs(); } @@ -215,7 +215,7 @@ namespace Nz m_characterSize = drawer.m_characterSize; m_characterSpacingOffset = drawer.m_characterSpacingOffset; m_color = drawer.m_color; - m_lineSpacingFactor = drawer.m_lineSpacingFactor; + m_lineSpacingOffset = drawer.m_lineSpacingOffset; m_maxLineWidth = drawer.m_maxLineWidth; m_outlineColor = drawer.m_outlineColor; m_outlineThickness = drawer.m_outlineThickness; @@ -240,7 +240,7 @@ namespace Nz m_glyphs = std::move(drawer.m_glyphs); m_glyphUpdated = std::move(drawer.m_glyphUpdated); m_font = std::move(drawer.m_font); - m_lineSpacingFactor = drawer.m_lineSpacingFactor; + m_lineSpacingOffset = drawer.m_lineSpacingOffset; m_maxLineWidth = drawer.m_maxLineWidth; m_outlineColor = std::move(drawer.m_outlineColor); m_outlineThickness = std::move(drawer.m_outlineThickness); @@ -330,7 +330,7 @@ namespace Nz inline float SimpleTextDrawer::GetLineHeight(const Font::SizeInfo& sizeInfo) const { - return float(sizeInfo.lineHeight) * m_lineSpacingFactor; + return float(sizeInfo.lineHeight) + m_lineSpacingOffset; } inline void SimpleTextDrawer::InvalidateColor() From 8c7301f6497e25e99b9c86ba122fe0f39661fb4b Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 26 Jan 2020 16:57:56 +0100 Subject: [PATCH 177/192] Utility/RichTextDrawer: Add character & line spacing offsets --- ChangeLog.md | 2 +- include/Nazara/Utility/RichTextDrawer.hpp | 27 ++++- include/Nazara/Utility/RichTextDrawer.inl | 121 +++++++++++++++++++++- src/Nazara/Utility/RichTextDrawer.cpp | 45 ++++---- 4 files changed, 162 insertions(+), 33 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 156a02777..c4562182f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -219,7 +219,7 @@ Nazara Engine: - On Windows, Thread::Set(Current)Name now uses `SetThreadDescription` Win32 function if possible instead of triggering a debugger exception. MinGW builds will use this if available too. - ⚠ Removed Texture(const Image\*) constructor, use Texture::LoadFromImage instead - ⚠ TextDrawers now use floating-point internally and to exposes their Bounds (AbstractTextDrawer::GetBounds() now returns a Rectf) -- Added SimpleTextDrawer character and line spacing offset properties +- Added [SimpleTextDrawer|RichTextDrawer] character and line spacing offset properties Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Utility/RichTextDrawer.hpp b/include/Nazara/Utility/RichTextDrawer.hpp index 67f5ec0de..25bd8dcf6 100644 --- a/include/Nazara/Utility/RichTextDrawer.hpp +++ b/include/Nazara/Utility/RichTextDrawer.hpp @@ -33,10 +33,13 @@ namespace Nz inline std::size_t FindBlock(std::size_t glyphIndex) const; inline unsigned int GetBlockCharacterSize(std::size_t index) const; + inline float GetBlockCharacterSpacingOffset(std::size_t index) const; inline const Color& GetBlockColor(std::size_t index) const; inline std::size_t GetBlockCount() const; inline std::size_t GetBlockFirstGlyphIndex(std::size_t index) const; inline const FontRef& GetBlockFont(std::size_t index) const; + inline float GetBlockLineHeight(std::size_t index) const; + inline float GetBlockLineSpacingOffset(std::size_t index) const; inline const Color& GetBlockOutlineColor(std::size_t index) const; inline float GetBlockOutlineThickness(std::size_t index) const; inline TextStyleFlags GetBlockStyle(std::size_t index) const; @@ -45,8 +48,10 @@ namespace Nz inline BlockRef GetBlock(std::size_t index); const Rectf& GetBounds() const override; inline unsigned int GetDefaultCharacterSize() const; + inline float GetDefaultCharacterSpacingOffset() const; inline const Color& GetDefaultColor() const; inline const FontRef& GetDefaultFont() const; + inline float GetDefaultLineSpacingOffset() const; inline const Color& GetDefaultOutlineColor() const; inline float GetDefaultOutlineThickness() const; inline TextStyleFlags GetDefaultStyle() const; @@ -65,16 +70,20 @@ namespace Nz void RemoveBlock(std::size_t index); inline void SetBlockCharacterSize(std::size_t index, unsigned int characterSize); + inline void SetBlockCharacterSpacingOffset(std::size_t index, float offset); inline void SetBlockColor(std::size_t index, const Color& color); inline void SetBlockFont(std::size_t index, FontRef font); + inline void SetBlockLineSpacingOffset(std::size_t index, float offset); inline void SetBlockOutlineColor(std::size_t index, const Color& color); inline void SetBlockOutlineThickness(std::size_t index, float thickness); inline void SetBlockStyle(std::size_t index, TextStyleFlags style); inline void SetBlockText(std::size_t index, String str); inline void SetDefaultCharacterSize(unsigned int characterSize); + inline void SetDefaultCharacterSpacingOffset(float offset); inline void SetDefaultColor(const Color& color); inline void SetDefaultFont(const FontRef& font); + inline void SetDefaultLineSpacingOffset(float offset); inline void SetDefaultOutlineColor(const Color& color); inline void SetDefaultOutlineThickness(float thickness); inline void SetDefaultStyle(TextStyleFlags style); @@ -89,13 +98,15 @@ namespace Nz private: struct Block; - inline void AppendNewLine(const Font* font, unsigned int characterSize) const; - void AppendNewLine(const Font* font, unsigned int characterSize, std::size_t glyphIndex, float glyphPosition) const; + inline void AppendNewLine(const Font* font, unsigned int characterSize, float lineSpacingOffset) const; + void AppendNewLine(const Font* font, unsigned int characterSize, float lineSpacingOffset, std::size_t glyphIndex, float glyphPosition) const; inline void ClearGlyphs() const; inline void ConnectFontSlots(); inline void DisconnectFontSlots(); - bool GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, int renderOrder, int* advance) const; - void GenerateGlyphs(const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, const Color& outlineColor, float outlineThickness, const String& text) const; + bool GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, const Font* font, const Color& color, TextStyleFlags style, float lineSpacingOffset, unsigned int characterSize, int renderOrder, int* advance) const; + void GenerateGlyphs(const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, const Color& outlineColor, float characterSpacingOffset, float lineSpacingOffset, float outlineThickness, const String& text) const; + inline float GetLineHeight(const Block& block) const; + inline float GetLineHeight(float lineSpacingOffset, const Font::SizeInfo& sizeInfo) const; inline std::size_t HandleFontAddition(const FontRef& font); inline void InvalidateGlyphs(); inline void ReleaseFont(std::size_t fontIndex); @@ -117,6 +128,8 @@ namespace Nz Color outlineColor; String text; TextStyleFlags style; + float characterSpacingOffset; + float lineSpacingOffset; float outlineThickness; unsigned int characterSize; }; @@ -145,6 +158,8 @@ namespace Nz mutable Rectf m_bounds; mutable Vector2f m_drawPos; mutable bool m_glyphUpdated; + float m_defaultCharacterSpacingOffset; + float m_defaultLineSpacingOffset; float m_defaultOutlineThickness; float m_maxLineWidth; unsigned int m_defaultCharacterSize; @@ -160,18 +175,22 @@ namespace Nz BlockRef(BlockRef&&) = default; ~BlockRef() = default; + inline float GetCharacterSpacingOffset() const; inline unsigned int GetCharacterSize() const; inline Color GetColor() const; inline std::size_t GetFirstGlyphIndex() const; inline const FontRef& GetFont() const; + inline float GetLineSpacingOffset() const; inline Color GetOutlineColor() const; inline float GetOutlineThickness() const; inline TextStyleFlags GetStyle() const; inline const String& GetText() const; + inline void SetCharacterSpacingOffset(float offset); inline void SetCharacterSize(unsigned int size); inline void SetColor(Color color); inline void SetFont(FontRef font); + inline void SetLineSpacingOffset(float offset); inline void SetOutlineColor(Color color); inline void SetOutlineThickness(float thickness); inline void SetStyle(TextStyleFlags style); diff --git a/include/Nazara/Utility/RichTextDrawer.inl b/include/Nazara/Utility/RichTextDrawer.inl index ef49a0457..38f220198 100644 --- a/include/Nazara/Utility/RichTextDrawer.inl +++ b/include/Nazara/Utility/RichTextDrawer.inl @@ -57,6 +57,12 @@ namespace Nz return m_blocks[index].characterSize; } + inline float RichTextDrawer::GetBlockCharacterSpacingOffset(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].characterSpacingOffset; + } + inline const Color& RichTextDrawer::GetBlockColor(std::size_t index) const { NazaraAssert(index < m_blocks.size(), "Invalid block index"); @@ -82,6 +88,18 @@ namespace Nz return m_fonts[fontIndex].font; } + inline float RichTextDrawer::GetBlockLineHeight(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].lineSpacingOffset; + } + + inline float RichTextDrawer::GetBlockLineSpacingOffset(std::size_t index) const + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + return m_blocks[index].lineSpacingOffset; + } + inline const Color& RichTextDrawer::GetBlockOutlineColor(std::size_t index) const { NazaraAssert(index < m_blocks.size(), "Invalid block index"); @@ -111,6 +129,11 @@ namespace Nz return m_defaultCharacterSize; } + inline float RichTextDrawer::GetDefaultCharacterSpacingOffset() const + { + return m_defaultCharacterSpacingOffset; + } + inline const Color& RichTextDrawer::GetDefaultColor() const { return m_defaultColor; @@ -121,6 +144,11 @@ namespace Nz return m_defaultFont; } + inline float RichTextDrawer::GetDefaultLineSpacingOffset() const + { + return m_defaultLineSpacingOffset; + } + inline const Color& RichTextDrawer::GetDefaultOutlineColor() const { return m_defaultOutlineColor; @@ -136,9 +164,9 @@ namespace Nz return m_defaultStyle; } - inline void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize) const + inline void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize, float lineSpacingOffset) const { - AppendNewLine(font, characterSize, InvalidGlyph, 0); + AppendNewLine(font, characterSize, lineSpacingOffset, InvalidGlyph, 0); } inline void RichTextDrawer::ClearGlyphs() const @@ -173,6 +201,19 @@ namespace Nz } } + inline float RichTextDrawer::GetLineHeight(const Block& block) const + { + assert(block.fontIndex < m_fonts.size()); + const FontData& fontData = m_fonts[block.fontIndex]; + + return GetLineHeight(block.lineSpacingOffset, fontData.font->GetSizeInfo(block.characterSize)); + } + + inline float RichTextDrawer::GetLineHeight(float lineSpacingOffset, const Font::SizeInfo& sizeInfo) const + { + return float(sizeInfo.lineHeight) + lineSpacingOffset; + } + inline std::size_t RichTextDrawer::HandleFontAddition(const FontRef& font) { auto it = m_fontIndexes.find(font); @@ -204,10 +245,10 @@ namespace Nz { // Shift font indexes m_fontIndexes.erase(fontData.font); - for (auto it = m_fontIndexes.begin(); it != m_fontIndexes.end(); ++it) + for (auto& fontIndexe : m_fontIndexes) { - if (it->second > fontIndex) - it->second--; + if (fontIndexe.second > fontIndex) + fontIndexe.second--; } m_fonts.erase(m_fonts.begin() + fontIndex); @@ -235,6 +276,14 @@ namespace Nz InvalidateGlyphs(); } + inline void RichTextDrawer::SetBlockCharacterSpacingOffset(std::size_t index, float offset) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].characterSpacingOffset = offset; + + InvalidateGlyphs(); + } + inline void RichTextDrawer::SetBlockColor(std::size_t index, const Color& color) { NazaraAssert(index < m_blocks.size(), "Invalid block index"); @@ -260,6 +309,14 @@ namespace Nz InvalidateGlyphs(); } + inline void RichTextDrawer::SetBlockLineSpacingOffset(std::size_t index, float offset) + { + NazaraAssert(index < m_blocks.size(), "Invalid block index"); + m_blocks[index].lineSpacingOffset = offset; + + InvalidateGlyphs(); + } + inline void RichTextDrawer::SetBlockOutlineColor(std::size_t index, const Color& color) { NazaraAssert(index < m_blocks.size(), "Invalid block index"); @@ -308,6 +365,11 @@ namespace Nz m_defaultCharacterSize = characterSize; } + inline void RichTextDrawer::SetDefaultCharacterSpacingOffset(float offset) + { + m_defaultCharacterSpacingOffset = offset; + } + inline void RichTextDrawer::SetDefaultColor(const Color& color) { m_defaultColor = color; @@ -318,6 +380,11 @@ namespace Nz m_defaultFont = font; } + inline void RichTextDrawer::SetDefaultLineSpacingOffset(float offset) + { + m_defaultLineSpacingOffset = offset; + } + inline void RichTextDrawer::SetDefaultOutlineColor(const Color& color) { m_defaultOutlineColor = color; @@ -351,6 +418,17 @@ namespace Nz { } + /*! + * Returns the character spacing offset used for the characters of the referenced block + * \return The referenced block character size + * + * \see GetColor, GetFont, GetStyle, GetText, SetCharacterSize + */ + inline float RichTextDrawer::BlockRef::GetCharacterSpacingOffset() const + { + return m_drawer.GetBlockCharacterSpacingOffset(m_blockIndex); + } + /*! * Returns the character size used for the characters of the referenced block * \return The referenced block character size @@ -384,6 +462,17 @@ namespace Nz return m_drawer.GetBlockFont(m_blockIndex); } + /*! + * Returns the line spacing offset used for the characters of the referenced block + * \return The referenced block character size + * + * \see GetColor, GetFont, GetStyle, GetText, SetCharacterSize + */ + inline float RichTextDrawer::BlockRef::GetLineSpacingOffset() const + { + return m_drawer.GetBlockLineSpacingOffset(m_blockIndex); + } + /*! * Returns the outline color used for the characters of the referenced block * \return The referenced block outline color @@ -439,6 +528,17 @@ namespace Nz return m_drawer.GetBlockText(m_blockIndex); } + /*! + * Changes the character spacing offset of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetCharacterSpacingOffset, SetColor, SetFont, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetCharacterSpacingOffset(float offset) + { + m_drawer.SetBlockCharacterSpacingOffset(m_blockIndex, offset); + } + /*! * Changes the character size of the referenced block characters * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. @@ -472,6 +572,17 @@ namespace Nz m_drawer.SetBlockFont(m_blockIndex, std::move(font)); } + /*! + * Changes the line spacing offset of the referenced block characters + * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. + * + * \see GetLineSpacingOffset, SetColor, SetFont, SetStyle, SetText + */ + inline void RichTextDrawer::BlockRef::SetLineSpacingOffset(float offset) + { + m_drawer.SetBlockLineSpacingOffset(m_blockIndex, offset); + } + /*! * Changes the outline color of the referenced block characters * \remark This invalidates the drawer and will force a (complete or partial, depending on the block index) glyph regeneration to occur. diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp index 75745c543..b744d1949 100644 --- a/src/Nazara/Utility/RichTextDrawer.cpp +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -267,7 +267,7 @@ namespace Nz return *this; } - void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize, std::size_t glyphIndex, float glyphPosition) const + void RichTextDrawer::AppendNewLine(const Font* font, unsigned int characterSize, float lineSpacingOffset, std::size_t glyphIndex, float glyphPosition) const { // Ensure we're appending from last line Line& lastLine = m_lines.back(); @@ -276,13 +276,15 @@ namespace Nz float previousDrawPos = m_drawPos.x; + float lineHeight = GetLineHeight(lineSpacingOffset, sizeInfo); + // Reset cursor m_drawPos.x = 0; - m_drawPos.y += sizeInfo.lineHeight; + m_drawPos.y += lineHeight; m_lastSeparatorGlyph = InvalidGlyph; m_bounds.ExtendTo(lastLine.bounds); - m_lines.emplace_back(Line{ Rectf(0.f, float(sizeInfo.lineHeight * m_lines.size()), 0.f, float(sizeInfo.lineHeight)), m_glyphs.size() + 1 }); + m_lines.emplace_back(Line{ Rectf(0.f, lineHeight * m_lines.size(), 0.f, lineHeight), m_glyphs.size() + 1 }); if (glyphIndex != InvalidGlyph && glyphIndex > lastLine.glyphIndex) { @@ -293,12 +295,12 @@ namespace Nz { Glyph& glyph = m_glyphs[i]; glyph.bounds.x -= glyphPosition; - glyph.bounds.y += sizeInfo.lineHeight; + glyph.bounds.y += lineHeight; for (auto& corner : glyph.corners) { corner.x -= glyphPosition; - corner.y += sizeInfo.lineHeight; + corner.y += lineHeight; } newLine.bounds.ExtendTo(glyph.bounds); @@ -316,7 +318,7 @@ namespace Nz } } - bool RichTextDrawer::GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, int renderOrder, int* advance) const + bool RichTextDrawer::GenerateGlyph(Glyph& glyph, char32_t character, float outlineThickness, bool lineWrap, const Font* font, const Color& color, TextStyleFlags style, float lineSpacingOffset, unsigned int characterSize, int renderOrder, int* advance) const { const Font::Glyph& fontGlyph = font->GetGlyph(characterSize, style, outlineThickness, character); if (fontGlyph.valid && fontGlyph.fauxOutlineThickness <= 0.f) @@ -330,7 +332,7 @@ namespace Nz glyph.bounds.Set(fontGlyph.aabb); if (lineWrap && ShouldLineWrap(glyph.bounds.width)) - AppendNewLine(font, characterSize, m_lastSeparatorGlyph, m_lastSeparatorPosition); + AppendNewLine(font, characterSize, lineSpacingOffset, m_lastSeparatorGlyph, m_lastSeparatorPosition); glyph.bounds.x += m_drawPos.x; glyph.bounds.y += m_drawPos.y; @@ -356,7 +358,7 @@ namespace Nz return false; }; - void RichTextDrawer::GenerateGlyphs(const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, const Color& outlineColor, float outlineThickness, const String& text) const + void RichTextDrawer::GenerateGlyphs(const Font* font, const Color& color, TextStyleFlags style, unsigned int characterSize, const Color& outlineColor, float characterSpacingOffset, float lineSpacingOffset, float outlineThickness, const String& text) const { if (text.IsEmpty()) return; @@ -372,8 +374,9 @@ namespace Nz char32_t previousCharacter = 0; const Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); + float lineHeight = GetLineHeight(lineSpacingOffset, sizeInfo); - float heightDifference = sizeInfo.lineHeight - m_lines.back().bounds.height; + float heightDifference = lineHeight - m_lines.back().bounds.height; if (heightDifference > 0.f) { for (std::size_t glyphIndex = m_lines.back().glyphIndex; glyphIndex < m_glyphs.size(); ++glyphIndex) @@ -388,10 +391,6 @@ namespace Nz m_drawPos.y += static_cast(heightDifference); m_lines.back().bounds.height += heightDifference; } - /*if (firstFont.font) - m_lines.emplace_back(Line{ Rectf(0.f, 0.f, 0.f, float(font->GetSizeInfo(firstBlock.characterSize).lineHeight)), 0 }); - else - m_lines.emplace_back(Line{ Rectf::Zero(), 0 });*/ m_glyphs.reserve(m_glyphs.size() + characters.size() * ((outlineThickness > 0.f) ? 2 : 1)); for (char32_t character : characters) @@ -402,16 +401,16 @@ namespace Nz previousCharacter = character; bool whitespace = true; - float advance = 0.f; + float advance = characterSpacingOffset; switch (character) { case ' ': case '\n': - advance = float(sizeInfo.spaceAdvance); + advance += float(sizeInfo.spaceAdvance); break; case '\t': - advance = float(sizeInfo.spaceAdvance) * 4.f; + advance += float(sizeInfo.spaceAdvance) * 4.f; break; default: @@ -423,22 +422,22 @@ namespace Nz if (!whitespace) { int iAdvance; - if (!GenerateGlyph(glyph, character, 0.f, true, font, color, style, characterSize, 0, &iAdvance)) + if (!GenerateGlyph(glyph, character, 0.f, true, font, color, style, lineSpacingOffset, characterSize, 0, &iAdvance)) continue; // Glyph failed to load, just skip it (can't do much) - advance = float(iAdvance); + advance += float(iAdvance); if (outlineThickness > 0.f) { Glyph outlineGlyph; - if (GenerateGlyph(outlineGlyph, character, outlineThickness, false, font, outlineColor, style, characterSize, -1, nullptr)) + if (GenerateGlyph(outlineGlyph, character, outlineThickness, false, font, outlineColor, style, lineSpacingOffset, characterSize, -1, nullptr)) m_glyphs.push_back(outlineGlyph); } } else { if (ShouldLineWrap(advance)) - AppendNewLine(font, characterSize, m_lastSeparatorGlyph, m_lastSeparatorPosition); + AppendNewLine(font, characterSize, lineSpacingOffset, m_lastSeparatorGlyph, m_lastSeparatorPosition); glyph.atlas = nullptr; glyph.bounds.Set(m_drawPos.x, m_lines.back().bounds.y, advance, float(sizeInfo.lineHeight)); @@ -455,7 +454,7 @@ namespace Nz { case '\n': { - AppendNewLine(font, characterSize); + AppendNewLine(font, characterSize, lineSpacingOffset); break; } @@ -545,7 +544,7 @@ namespace Nz const auto& firstFont = m_fonts[firstBlock.fontIndex]; if (firstFont.font) - m_lines.emplace_back(Line{ Rectf(0.f, 0.f, 0.f, float(firstFont.font->GetSizeInfo(firstBlock.characterSize).lineHeight)), 0 }); + m_lines.emplace_back(Line{ Rectf(0.f, 0.f, 0.f, GetLineHeight(firstBlock)), 0 }); else m_lines.emplace_back(Line{ Rectf::Zero(), 0 }); @@ -556,7 +555,7 @@ namespace Nz assert(block.fontIndex < m_fonts.size()); const auto& fontData = m_fonts[block.fontIndex]; - GenerateGlyphs(fontData.font, block.color, block.style, block.characterSize, block.outlineColor, block.outlineThickness, block.text); + GenerateGlyphs(fontData.font, block.color, block.style, block.characterSize, block.outlineColor, block.outlineThickness, block.characterSpacingOffset, block.lineSpacingOffset, block.text); } } else From 1d86d90ca0cb27ca72b9f398280016979b7b531a Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 26 Jan 2020 17:06:39 +0100 Subject: [PATCH 178/192] SDK/(Rich)TextAreaWidget: Add character and line spacing offsets --- ChangeLog.md | 1 + .../NDK/Widgets/RichTextAreaWidget.hpp | 6 ++- .../NDK/Widgets/RichTextAreaWidget.inl | 20 ++++++++++ SDK/include/NDK/Widgets/TextAreaWidget.hpp | 7 +++- SDK/include/NDK/Widgets/TextAreaWidget.inl | 33 ++++++++++++++++ SDK/src/NDK/Widgets/TextAreaWidget.cpp | 38 +++++++++---------- 6 files changed, 83 insertions(+), 22 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index c4562182f..a60af1b03 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -321,6 +321,7 @@ Nazara Development Kit: - Fixed crash when pressing up/down key with no history in the console - (Rich)TextAreaWidget text style is now alterable - Added CameraComponent::SetProjectionScale +- Added (Rich)TextAreaWidget character and line spacing offset properties # 0.4: diff --git a/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp b/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp index 280ed9651..a21a233d2 100644 --- a/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/RichTextAreaWidget.hpp @@ -27,6 +27,8 @@ namespace Ndk void Erase(std::size_t firstGlyph, std::size_t lastGlyph) override; inline unsigned int GetCharacterSize() const; + inline float GetCharacterSpacingOffset() const; + inline float GetLineSpacingOffset() const; inline const Nz::Color& GetTextColor() const; inline Nz::Font* GetTextFont() const; inline const Nz::Color& GetTextOutlineColor() const; @@ -34,6 +36,8 @@ namespace Ndk inline Nz::TextStyleFlags GetTextStyle() const; inline void SetCharacterSize(unsigned int characterSize); + inline void SetCharacterSpacingOffset(float offset); + inline void SetLineSpacingOffset(float offset); inline void SetTextColor(const Nz::Color& color); inline void SetTextFont(Nz::FontRef font); inline void SetTextOutlineColor(const Nz::Color& color); @@ -53,7 +57,7 @@ namespace Ndk void HandleSelectionIndentation(bool add) override; void HandleWordCursorMove(bool left) override; - void UpdateDisplayText(); + void UpdateDisplayText() override; Nz::RichTextDrawer m_drawer; }; diff --git a/SDK/include/NDK/Widgets/RichTextAreaWidget.inl b/SDK/include/NDK/Widgets/RichTextAreaWidget.inl index 01f2dd7a3..4fd7faa10 100644 --- a/SDK/include/NDK/Widgets/RichTextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/RichTextAreaWidget.inl @@ -11,6 +11,16 @@ namespace Ndk return m_drawer.GetDefaultCharacterSize(); } + inline float RichTextAreaWidget::GetCharacterSpacingOffset() const + { + return m_drawer.GetDefaultCharacterSpacingOffset(); + } + + inline float RichTextAreaWidget::GetLineSpacingOffset() const + { + return m_drawer.GetDefaultLineSpacingOffset(); + } + inline const Nz::Color& RichTextAreaWidget::GetTextColor() const { return m_drawer.GetDefaultColor(); @@ -41,6 +51,16 @@ namespace Ndk m_drawer.SetDefaultCharacterSize(characterSize); } + inline void RichTextAreaWidget::SetCharacterSpacingOffset(float offset) + { + m_drawer.SetDefaultCharacterSpacingOffset(offset); + } + + inline void RichTextAreaWidget::SetLineSpacingOffset(float offset) + { + m_drawer.SetDefaultLineSpacingOffset(offset); + } + inline void RichTextAreaWidget::SetTextColor(const Nz::Color& color) { m_drawer.SetDefaultColor(color); diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index dbbac6dad..8b06e7579 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -29,6 +29,8 @@ namespace Ndk inline unsigned int GetCharacterSize() const; inline const Nz::String& GetDisplayText() const; + inline float GetCharacterSpacingOffset() const; + inline float GetLineSpacingOffset() const; inline const Nz::String& GetText() const; inline const Nz::Color& GetTextColor() const; inline Nz::Font* GetTextFont() const; @@ -36,7 +38,9 @@ namespace Ndk inline float GetTextOulineThickness() const; inline Nz::TextStyleFlags GetTextStyle() const; - void SetCharacterSize(unsigned int characterSize); + inline void SetCharacterSize(unsigned int characterSize); + inline void SetCharacterSpacingOffset(float offset); + inline void SetLineSpacingOffset(float offset); inline void SetText(const Nz::String& text); inline void SetTextColor(const Nz::Color& text); inline void SetTextFont(Nz::FontRef font); @@ -61,6 +65,7 @@ namespace Ndk void HandleWordCursorMove(bool left) override; void UpdateDisplayText() override; + void UpdateMinimumSize(); Nz::SimpleTextDrawer m_drawer; Nz::String m_text; diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index 008cb77fa..f63897420 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -16,6 +16,16 @@ namespace Ndk return m_drawer.GetText(); } + inline float TextAreaWidget::GetCharacterSpacingOffset() const + { + return m_drawer.GetCharacterSpacingOffset(); + } + + inline float TextAreaWidget::GetLineSpacingOffset() const + { + return m_drawer.GetLineSpacingOffset(); + } + inline const Nz::String& TextAreaWidget::GetText() const { return m_text; @@ -46,6 +56,29 @@ namespace Ndk return m_drawer.GetStyle(); } + inline void TextAreaWidget::SetCharacterSize(unsigned int characterSize) + { + m_drawer.SetCharacterSize(characterSize); + + UpdateMinimumSize(); + UpdateDisplayText(); + } + + inline void TextAreaWidget::SetCharacterSpacingOffset(float offset) + { + m_drawer.SetCharacterSpacingOffset(offset); + + UpdateMinimumSize(); + UpdateDisplayText(); + } + + inline void TextAreaWidget::SetLineSpacingOffset(float offset) + { + m_drawer.SetLineSpacingOffset(offset); + + UpdateDisplayText(); + } + inline void TextAreaWidget::SetText(const Nz::String& text) { m_text = text; diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index b3068d0a3..4271f43a1 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -91,26 +91,6 @@ namespace Ndk SetText(newText); } - void TextAreaWidget::SetCharacterSize(unsigned int characterSize) - { - m_drawer.SetCharacterSize(characterSize); - - std::size_t fontCount = m_drawer.GetFontCount(); - unsigned int lineHeight = 0; - int spaceAdvance = 0; - for (std::size_t i = 0; i < fontCount; ++i) - { - Nz::Font* font = m_drawer.GetFont(i); - - const Nz::Font::SizeInfo& sizeInfo = font->GetSizeInfo(characterSize); - lineHeight = std::max(lineHeight, sizeInfo.lineHeight); - spaceAdvance = std::max(spaceAdvance, sizeInfo.spaceAdvance); - } - - Nz::Vector2f size = { float(spaceAdvance), float(lineHeight) + 5.f }; - SetMinimumSize(size); - } - void TextAreaWidget::Write(const Nz::String& text, std::size_t glyphPosition) { if (glyphPosition >= m_drawer.GetGlyphCount()) @@ -252,4 +232,22 @@ namespace Ndk SetCursorPosition(m_cursorPositionBegin); //< Refresh cursor position (prevent it from being outside of the text) } + + void TextAreaWidget::UpdateMinimumSize() + { + std::size_t fontCount = m_drawer.GetFontCount(); + float lineHeight = 0; + int spaceAdvance = 0; + for (std::size_t i = 0; i < fontCount; ++i) + { + Nz::Font* font = m_drawer.GetFont(i); + + const Nz::Font::SizeInfo& sizeInfo = font->GetSizeInfo(m_drawer.GetCharacterSize()); + lineHeight = std::max(lineHeight, m_drawer.GetLineHeight()); + spaceAdvance = std::max(spaceAdvance, sizeInfo.spaceAdvance); + } + + Nz::Vector2f size = { float(spaceAdvance), lineHeight + 5.f }; + SetMinimumSize(size); + } } From 468b63bef5f5575c21b985f8e226a9ffc60239fe Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 26 Jan 2020 17:13:52 +0100 Subject: [PATCH 179/192] Aw shit, forgot a lot of things --- src/Nazara/Utility/RichTextDrawer.cpp | 44 +++++++++++++++++++-------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp index b744d1949..e48a1f895 100644 --- a/src/Nazara/Utility/RichTextDrawer.cpp +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -15,6 +15,8 @@ namespace Nz m_defaultStyle(TextStyle_Regular), m_glyphUpdated(false), m_maxLineWidth(std::numeric_limits::infinity()), + m_defaultCharacterSpacingOffset(0.f), + m_defaultLineSpacingOffset(0.f), m_defaultOutlineThickness(0.f), m_defaultCharacterSize(24) { @@ -29,6 +31,8 @@ namespace Nz m_glyphUpdated(false), m_defaultOutlineColor(drawer.m_defaultOutlineColor), m_maxLineWidth(drawer.m_maxLineWidth), + m_defaultCharacterSpacingOffset(drawer.m_defaultCharacterSpacingOffset), + m_defaultLineSpacingOffset(drawer.m_defaultLineSpacingOffset), m_defaultOutlineThickness(drawer.m_defaultOutlineThickness), m_defaultCharacterSize(drawer.m_defaultCharacterSize) { @@ -59,12 +63,14 @@ namespace Nz auto HasDefaultProperties = [&](const Block& block) { - return block.characterSize == m_defaultCharacterSize && - block.color == m_defaultColor && - block.fontIndex == defaultFontIndex && - block.outlineColor == m_defaultOutlineColor && - block.outlineThickness == m_defaultOutlineThickness && - block.style == m_defaultStyle; + return block.characterSize == m_defaultCharacterSize && + block.color == m_defaultColor && + block.fontIndex == defaultFontIndex && + block.characterSpacingOffset == m_defaultCharacterSpacingOffset && + block.lineSpacingOffset == m_defaultLineSpacingOffset && + block.outlineColor == m_defaultOutlineColor && + block.outlineThickness == m_defaultOutlineThickness && + block.style == m_defaultStyle; }; // Check if last block has the same property as default, else create a new block @@ -82,9 +88,11 @@ namespace Nz m_blocks.emplace_back(); Block& newBlock = m_blocks.back(); newBlock.characterSize = m_defaultCharacterSize; + newBlock.characterSpacingOffset = m_defaultCharacterSpacingOffset; newBlock.color = m_defaultColor; newBlock.fontIndex = defaultFontIndex; newBlock.glyphIndex = glyphIndex; + newBlock.lineSpacingOffset = m_defaultLineSpacingOffset; newBlock.outlineColor = m_defaultOutlineColor; newBlock.outlineThickness = m_defaultOutlineThickness; newBlock.style = m_defaultStyle; @@ -172,12 +180,14 @@ namespace Nz { auto TestBlockProperties = [](const Block& lhs, const Block& rhs) { - return lhs.characterSize == rhs.characterSize && - lhs.color == rhs.color && - lhs.fontIndex == rhs.fontIndex && - lhs.outlineColor == rhs.outlineColor && - lhs.outlineThickness == rhs.outlineThickness && - lhs.style == rhs.style; + return lhs.characterSize == rhs.characterSize && + lhs.color == rhs.color && + lhs.fontIndex == rhs.fontIndex && + lhs.characterSpacingOffset == rhs.characterSpacingOffset && + lhs.lineSpacingOffset == rhs.lineSpacingOffset && + lhs.outlineColor == rhs.outlineColor && + lhs.outlineThickness == rhs.outlineThickness && + lhs.style == rhs.style; }; std::size_t previousBlockIndex = 0; @@ -185,6 +195,8 @@ namespace Nz { if (TestBlockProperties(m_blocks[previousBlockIndex], m_blocks[i])) { + m_blocks[previousBlockIndex].text += m_blocks[i].text; + RemoveBlock(i); --i; } @@ -215,7 +227,7 @@ namespace Nz { m_maxLineWidth = lineWidth; - //TODO: Implement max line width + InvalidateGlyphs(); } RichTextDrawer& RichTextDrawer::operator=(const RichTextDrawer& drawer) @@ -224,8 +236,10 @@ namespace Nz m_blocks = drawer.m_blocks; m_defaultCharacterSize = drawer.m_defaultCharacterSize; + m_defaultCharacterSpacingOffset = drawer.m_defaultCharacterSpacingOffset; m_defaultColor = drawer.m_defaultColor; m_defaultFont = drawer.m_defaultFont; + m_defaultLineSpacingOffset = drawer.m_defaultLineSpacingOffset; m_defaultOutlineColor = drawer.m_defaultOutlineColor; m_defaultOutlineThickness = drawer.m_defaultOutlineThickness; m_defaultStyle = drawer.m_defaultStyle; @@ -246,11 +260,15 @@ namespace Nz RichTextDrawer& RichTextDrawer::operator=(RichTextDrawer&& drawer) { + DisconnectFontSlots(); + m_blocks = std::move(drawer.m_blocks); m_bounds = std::move(m_bounds); m_defaultCharacterSize = std::move(drawer.m_defaultCharacterSize); + m_defaultCharacterSpacingOffset = std::move(drawer.m_defaultCharacterSpacingOffset); m_defaultColor = std::move(drawer.m_defaultColor); m_defaultFont = std::move(drawer.m_defaultFont); + m_defaultLineSpacingOffset = std::move(drawer.m_defaultLineSpacingOffset); m_defaultOutlineColor = std::move(drawer.m_defaultOutlineColor); m_defaultOutlineThickness = std::move(drawer.m_defaultOutlineThickness); m_defaultStyle = std::move(drawer.m_defaultStyle); From 63c9cf7b188feebc3fcba64f7eb41bda49a1484e Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 26 Jan 2020 17:29:42 +0100 Subject: [PATCH 180/192] Remove useless cast --- src/Nazara/Utility/RichTextDrawer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp index e48a1f895..58a0180fe 100644 --- a/src/Nazara/Utility/RichTextDrawer.cpp +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -406,7 +406,7 @@ namespace Nz corner.y += heightDifference; } - m_drawPos.y += static_cast(heightDifference); + m_drawPos.y += heightDifference; m_lines.back().bounds.height += heightDifference; } From d435826651972bf0b7bd36f29b3e62efc5cedab9 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 26 Jan 2020 17:30:32 +0100 Subject: [PATCH 181/192] Forgot this --- src/Nazara/Utility/RichTextDrawer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Utility/RichTextDrawer.cpp b/src/Nazara/Utility/RichTextDrawer.cpp index 58a0180fe..87e64c326 100644 --- a/src/Nazara/Utility/RichTextDrawer.cpp +++ b/src/Nazara/Utility/RichTextDrawer.cpp @@ -458,7 +458,7 @@ namespace Nz AppendNewLine(font, characterSize, lineSpacingOffset, m_lastSeparatorGlyph, m_lastSeparatorPosition); glyph.atlas = nullptr; - glyph.bounds.Set(m_drawPos.x, m_lines.back().bounds.y, advance, float(sizeInfo.lineHeight)); + glyph.bounds.Set(m_drawPos.x, m_lines.back().bounds.y, advance, lineHeight); glyph.corners[0].Set(glyph.bounds.GetCorner(RectCorner_LeftTop)); glyph.corners[1].Set(glyph.bounds.GetCorner(RectCorner_RightTop)); From 518b8697de33d06eb1f998a6cc3399f4c82aa374 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 1 Feb 2020 16:36:05 +0100 Subject: [PATCH 182/192] Network/ENetHost: Add AllowsIncomingConnections method --- ChangeLog.md | 1 + include/Nazara/Network/ENetHost.hpp | 4 ++++ include/Nazara/Network/ENetHost.inl | 12 ++++++++++++ 3 files changed, 17 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index a60af1b03..e87ec785e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -220,6 +220,7 @@ Nazara Engine: - ⚠ Removed Texture(const Image\*) constructor, use Texture::LoadFromImage instead - ⚠ TextDrawers now use floating-point internally and to exposes their Bounds (AbstractTextDrawer::GetBounds() now returns a Rectf) - Added [SimpleTextDrawer|RichTextDrawer] character and line spacing offset properties +- Added ENetHost::AllowsIncomingConnections(bool) to disable/re-enable server peers connection Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Network/ENetHost.hpp b/include/Nazara/Network/ENetHost.hpp index 01f59234b..b6af25895 100644 --- a/include/Nazara/Network/ENetHost.hpp +++ b/include/Nazara/Network/ENetHost.hpp @@ -44,6 +44,8 @@ namespace Nz ENetHost(ENetHost&&) = default; inline ~ENetHost(); + inline void AllowsIncomingConnections(bool allow = true); + void Broadcast(UInt8 channelId, ENetPacketFlags flags, NetPacket&& packet); bool CheckEvents(ENetEvent* event); @@ -56,6 +58,8 @@ namespace Nz bool Create(const IpAddress& listenAddress, std::size_t peerCount, std::size_t channelCount, UInt32 incomingBandwidth, UInt32 outgoingBandwidth); inline void Destroy(); + inline bool DoesAllowIncomingConnections() const; + void Flush(); inline IpAddress GetBoundAddress() const; diff --git a/include/Nazara/Network/ENetHost.inl b/include/Nazara/Network/ENetHost.inl index fcb6bf6de..fadcc9fc4 100644 --- a/include/Nazara/Network/ENetHost.inl +++ b/include/Nazara/Network/ENetHost.inl @@ -20,6 +20,13 @@ namespace Nz Destroy(); } + inline void ENetHost::AllowsIncomingConnections(bool allow) + { + NazaraAssert(m_address.IsValid() && !m_address.IsLoopback(), "Only server hosts can allow incoming connections"); + + m_allowsIncomingConnections = allow; + } + inline bool ENetHost::Create(NetProtocol protocol, UInt16 port, std::size_t peerCount, std::size_t channelCount) { NazaraAssert(protocol != NetProtocol_Unknown, "Invalid protocol"); @@ -54,6 +61,11 @@ namespace Nz m_socket.Close(); } + inline bool ENetHost::DoesAllowIncomingConnections() const + { + return m_allowsIncomingConnections; + } + inline IpAddress ENetHost::GetBoundAddress() const { return m_address; From e35caebdcff353385d627dafccb5c32eb90677d2 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 4 Feb 2020 11:42:05 +0100 Subject: [PATCH 183/192] Core: Add ByteArrayPool and PoolByteStream classes --- ChangeLog.md | 1 + include/Nazara/Core/ByteArrayPool.hpp | 43 ++++++++++++++++++++++++ include/Nazara/Core/ByteArrayPool.inl | 44 ++++++++++++++++++++++++ include/Nazara/Core/PoolByteStream.hpp | 46 ++++++++++++++++++++++++++ include/Nazara/Core/PoolByteStream.inl | 30 +++++++++++++++++ src/Nazara/Core/ByteStream.cpp | 6 ++-- src/Nazara/Core/PoolByteStream.cpp | 40 ++++++++++++++++++++++ 7 files changed, 207 insertions(+), 3 deletions(-) create mode 100644 include/Nazara/Core/ByteArrayPool.hpp create mode 100644 include/Nazara/Core/ByteArrayPool.inl create mode 100644 include/Nazara/Core/PoolByteStream.hpp create mode 100644 include/Nazara/Core/PoolByteStream.inl create mode 100644 src/Nazara/Core/PoolByteStream.cpp diff --git a/ChangeLog.md b/ChangeLog.md index e87ec785e..829e42437 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -221,6 +221,7 @@ Nazara Engine: - ⚠ TextDrawers now use floating-point internally and to exposes their Bounds (AbstractTextDrawer::GetBounds() now returns a Rectf) - Added [SimpleTextDrawer|RichTextDrawer] character and line spacing offset properties - Added ENetHost::AllowsIncomingConnections(bool) to disable/re-enable server peers connection +- Added ByteArrayPool and PoolByteStream classes Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/ByteArrayPool.hpp b/include/Nazara/Core/ByteArrayPool.hpp new file mode 100644 index 000000000..e45ceee67 --- /dev/null +++ b/include/Nazara/Core/ByteArrayPool.hpp @@ -0,0 +1,43 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_BYTEARRAYPOOL_HPP +#define NAZARA_BYTEARRAYPOOL_HPP + +#include +#include +#include +#include + +namespace Nz +{ + class AbstractHash; + + class NAZARA_CORE_API ByteArrayPool + { + public: + ByteArrayPool() = default; + ByteArrayPool(const ByteArrayPool&) = delete; + ByteArrayPool(ByteArrayPool&&) = default; + ~ByteArrayPool() = default; + + inline void Clear(); + + inline ByteArray GetByteArray(std::size_t capacity = 0); + + inline void ReturnByteArray(ByteArray byteArray); + + ByteArrayPool& operator=(const ByteArrayPool&) = delete; + ByteArrayPool& operator=(ByteArrayPool&&) = default; + + private: + std::vector m_byteArrays; + }; +} + +#include + +#endif // NAZARA_BYTEARRAYPOOL_HPP diff --git a/include/Nazara/Core/ByteArrayPool.inl b/include/Nazara/Core/ByteArrayPool.inl new file mode 100644 index 000000000..82cf8349c --- /dev/null +++ b/include/Nazara/Core/ByteArrayPool.inl @@ -0,0 +1,44 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + namespace Detail + { + bool SortByteArrayByCapacity(const ByteArray& byteArray, std::size_t refCapacity) + { + return refCapacity > byteArray.GetCapacity(); + } + } + + inline void ByteArrayPool::Clear() + { + m_byteArrays.clear(); + } + + inline ByteArray ByteArrayPool::GetByteArray(std::size_t capacity) + { + ByteArray ret; + + auto it = std::lower_bound(m_byteArrays.begin(), m_byteArrays.end(), capacity, Detail::SortByteArrayByCapacity); + if (it != m_byteArrays.end()) + { + ret = std::move(*it); + m_byteArrays.erase(it); + } + + return ret; + } + + inline void ByteArrayPool::ReturnByteArray(ByteArray byteArray) + { + auto it = std::lower_bound(m_byteArrays.begin(), m_byteArrays.end(), byteArray.GetCapacity(), Detail::SortByteArrayByCapacity); + m_byteArrays.emplace(it, std::move(byteArray)); + } +} + +#include diff --git a/include/Nazara/Core/PoolByteStream.hpp b/include/Nazara/Core/PoolByteStream.hpp new file mode 100644 index 000000000..63150290d --- /dev/null +++ b/include/Nazara/Core/PoolByteStream.hpp @@ -0,0 +1,46 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_POOLBYTESTREAM_HPP +#define NAZARA_POOLBYTESTREAM_HPP + +#include +#include +#include +#include + +namespace Nz +{ + class ByteArrayPool; + + class NAZARA_CORE_API PoolByteStream : public ByteStream + { + friend class Network; + + public: + inline PoolByteStream(ByteArrayPool& pool); + inline PoolByteStream(ByteArrayPool& pool, std::size_t capacity); + PoolByteStream(const PoolByteStream&) = delete; + PoolByteStream(PoolByteStream&& packet) = default; + inline ~PoolByteStream(); + + void Reset(); + void Reset(std::size_t capacity); + + PoolByteStream& operator=(const PoolByteStream&) = delete; + PoolByteStream& operator=(PoolByteStream&&) = delete; + + private: + void OnEmptyStream() override; + + ByteArrayPool& m_pool; + ByteArray m_buffer; + }; +} + +#include + +#endif // NAZARA_POOLBYTESTREAM_HPP diff --git a/include/Nazara/Core/PoolByteStream.inl b/include/Nazara/Core/PoolByteStream.inl new file mode 100644 index 000000000..d786c6a67 --- /dev/null +++ b/include/Nazara/Core/PoolByteStream.inl @@ -0,0 +1,30 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include + +namespace Nz +{ + inline PoolByteStream::PoolByteStream(ByteArrayPool& pool) : + m_pool(pool) + { + } + + inline PoolByteStream::PoolByteStream(ByteArrayPool& pool, std::size_t capacity) : + PoolByteStream(pool) + { + Reset(capacity); + } + + inline PoolByteStream::~PoolByteStream() + { + FlushBits(); //< Needs to be done here as the stream will be freed before ByteStream calls it + Reset(); //< Returns the byte array (if any) to the pool + } +} + +#include diff --git a/src/Nazara/Core/ByteStream.cpp b/src/Nazara/Core/ByteStream.cpp index a61cae520..6559e50fb 100644 --- a/src/Nazara/Core/ByteStream.cpp +++ b/src/Nazara/Core/ByteStream.cpp @@ -68,7 +68,7 @@ namespace Nz void ByteStream::SetStream(ByteArray* byteArray, OpenModeFlags openMode) { - std::unique_ptr stream(new MemoryStream(byteArray, openMode)); + std::unique_ptr stream = std::make_unique(byteArray, openMode); SetStream(stream.get()); // SetStream reset our smart pointer, set it after calling it @@ -86,7 +86,7 @@ namespace Nz void ByteStream::SetStream(void* ptr, Nz::UInt64 size) { - std::unique_ptr stream(new MemoryView(ptr, size)); + std::unique_ptr stream = std::make_unique(ptr, size); SetStream(stream.get()); // SetStream reset our smart pointer, set it after calling it @@ -104,7 +104,7 @@ namespace Nz void ByteStream::SetStream(const void* ptr, Nz::UInt64 size) { - std::unique_ptr stream(new MemoryView(ptr, size)); + std::unique_ptr stream = std::make_unique(ptr, size); SetStream(stream.get()); // SetStream reset our smart pointer, set it after calling it diff --git a/src/Nazara/Core/PoolByteStream.cpp b/src/Nazara/Core/PoolByteStream.cpp new file mode 100644 index 000000000..889fe32ca --- /dev/null +++ b/src/Nazara/Core/PoolByteStream.cpp @@ -0,0 +1,40 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +namespace Nz +{ + /*! + * \ingroup core + * \class Nz::PoolByteStream + * \brief ByteStream allocated using a pool + */ + + void PoolByteStream::Reset() + { + if (m_buffer.GetCapacity() > 0) + { + m_pool.ReturnByteArray(std::move(m_buffer)); + m_buffer.Clear(false); + } + + SetStream(static_cast(nullptr)); + } + + void PoolByteStream::Reset(std::size_t capacity) + { + if (m_buffer.GetCapacity() < capacity) + m_buffer = m_pool.GetByteArray(capacity); + + SetStream(&m_buffer, Nz::OpenMode_ReadWrite); + } + + void PoolByteStream::OnEmptyStream() + { + Reset(0); + } +} From 369e21cafbb6adb0c1679ec1ed8d358222f8aac3 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 4 Feb 2020 11:42:11 +0100 Subject: [PATCH 184/192] Align fix --- src/Nazara/Renderer/Win32/ContextImpl.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Nazara/Renderer/Win32/ContextImpl.cpp b/src/Nazara/Renderer/Win32/ContextImpl.cpp index 9c50faabd..fa975747d 100644 --- a/src/Nazara/Renderer/Win32/ContextImpl.cpp +++ b/src/Nazara/Renderer/Win32/ContextImpl.cpp @@ -67,17 +67,17 @@ namespace Nz UINT numFormats; int attributes[] = { - WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, - WGL_SUPPORT_OPENGL_ARB, GL_TRUE, - WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, - WGL_COLOR_BITS_ARB, (parameters.bitsPerPixel == 32) ? 24 : parameters.bitsPerPixel, - WGL_ALPHA_BITS_ARB, (parameters.bitsPerPixel == 32) ? 8 : 0, - WGL_DEPTH_BITS_ARB, parameters.depthBits, - WGL_STENCIL_BITS_ARB, parameters.stencilBits, - WGL_DOUBLE_BUFFER_ARB, (parameters.doubleBuffered) ? GL_TRUE : GL_FALSE, - WGL_SAMPLE_BUFFERS_ARB, GL_TRUE, - WGL_SAMPLES_ARB, parameters.antialiasingLevel, - 0, 0 + WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, + WGL_SUPPORT_OPENGL_ARB, GL_TRUE, + WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, + WGL_COLOR_BITS_ARB, (parameters.bitsPerPixel == 32) ? 24 : parameters.bitsPerPixel, + WGL_ALPHA_BITS_ARB, (parameters.bitsPerPixel == 32) ? 8 : 0, + WGL_DEPTH_BITS_ARB, parameters.depthBits, + WGL_STENCIL_BITS_ARB, parameters.stencilBits, + WGL_DOUBLE_BUFFER_ARB, (parameters.doubleBuffered) ? GL_TRUE : GL_FALSE, + WGL_SAMPLE_BUFFERS_ARB, GL_TRUE, + WGL_SAMPLES_ARB, parameters.antialiasingLevel, + 0, 0 }; do From 9d88fcd6496a078ec152389fb07ea28617f96df0 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 22 Feb 2020 15:16:22 +0100 Subject: [PATCH 185/192] SDK/Widgets: Inherit parent rendering rect --- SDK/include/NDK/BaseWidget.hpp | 2 ++ SDK/src/NDK/BaseWidget.cpp | 30 +++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index 010abd437..8bdd15584 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -110,6 +110,8 @@ namespace Ndk void InvalidateNode() override; + Nz::Rectf GetScissorRect() const; + virtual bool IsFocusable() const; virtual void OnFocusLost(); virtual void OnFocusReceived(); diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index c887f9402..cb643dc0c 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -164,6 +164,8 @@ namespace Ndk m_renderingRect = renderingRect; UpdatePositionAndSize(); + for (const auto& widgetPtr : m_children) + widgetPtr->UpdatePositionAndSize(); } void BaseWidget::Show(bool show) @@ -244,6 +246,19 @@ namespace Ndk UpdatePositionAndSize(); } + Nz::Rectf BaseWidget::GetScissorRect() const + { + Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition(Nz::CoordSys_Global)); + Nz::Vector2f widgetSize = GetSize(); + + Nz::Rectf widgetRect(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y); + Nz::Rectf widgetRenderingRect(widgetPos.x + m_renderingRect.x, widgetPos.y + m_renderingRect.y, m_renderingRect.width, m_renderingRect.height); + + widgetRect.Intersect(widgetRenderingRect, &widgetRect); + + return widgetRect; + } + bool BaseWidget::IsFocusable() const { return false; @@ -336,16 +351,17 @@ namespace Ndk if (IsRegisteredToCanvas()) m_canvas->NotifyWidgetBoxUpdate(m_canvasIndex); - Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition(Nz::CoordSys_Global)); - Nz::Vector2f widgetSize = GetSize(); + Nz::Rectf scissorRect = GetScissorRect(); - Nz::Rectf widgetRect(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y); - Nz::Rectf widgetRenderingRect(widgetPos.x + m_renderingRect.x, widgetPos.y + m_renderingRect.y, m_renderingRect.width, m_renderingRect.height); + if (m_widgetParent) + { + Nz::Rectf parentScissorRect = m_widgetParent->GetScissorRect(); - Nz::Rectf widgetBounds; - widgetRect.Intersect(widgetRenderingRect, &widgetBounds); + if (!scissorRect.Intersect(parentScissorRect, &scissorRect)) + scissorRect = parentScissorRect; + } - Nz::Recti fullBounds(widgetBounds); + Nz::Recti fullBounds(scissorRect); for (WidgetEntity& widgetEntity : m_entities) { const Ndk::EntityHandle& entity = widgetEntity.handle; From adf1233ef2444da361b6eb97fd34e84c5edefc6c Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 15 Mar 2020 17:48:14 +0100 Subject: [PATCH 186/192] Add BaseWidget::ShowChildren --- SDK/include/NDK/BaseWidget.hpp | 3 +++ SDK/include/NDK/BaseWidget.inl | 5 +++++ SDK/src/NDK/BaseWidget.cpp | 9 +++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index 8bdd15584..917747e17 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -75,6 +75,7 @@ namespace Ndk bool HasFocus() const; + inline void Hide(); inline bool IsVisible() const; void Resize(const Nz::Vector2f& size); @@ -128,6 +129,8 @@ namespace Ndk inline void SetPreferredSize(const Nz::Vector2f& preferredSize); + virtual void ShowChildren(bool show); + private: inline BaseWidget(); diff --git a/SDK/include/NDK/BaseWidget.inl b/SDK/include/NDK/BaseWidget.inl index edff81436..fc8e1f710 100644 --- a/SDK/include/NDK/BaseWidget.inl +++ b/SDK/include/NDK/BaseWidget.inl @@ -172,6 +172,11 @@ namespace Ndk return m_children.size(); } + inline void BaseWidget::Hide() + { + return Show(false); + } + inline bool BaseWidget::IsVisible() const { return m_visible; diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index cb643dc0c..83decf372 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -188,8 +188,7 @@ namespace Ndk } } - for (const auto& widgetPtr : m_children) - widgetPtr->Show(show); + ShowChildren(show); } } @@ -313,6 +312,12 @@ namespace Ndk { } + void BaseWidget::ShowChildren(bool show) + { + for (const auto& widgetPtr : m_children) + widgetPtr->Show(show); + } + void BaseWidget::DestroyChild(BaseWidget* widget) { auto it = std::find_if(m_children.begin(), m_children.end(), [widget] (const std::unique_ptr& widgetPtr) -> bool From 1c9a390d6788cf94e06dabf547c28fbcaab3445c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 19 Mar 2020 18:41:05 +0100 Subject: [PATCH 187/192] Fix std::iterator inheritance --- SDK/include/NDK/EntityList.hpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/SDK/include/NDK/EntityList.hpp b/SDK/include/NDK/EntityList.hpp index 0f89d0cad..3b4f1580a 100644 --- a/SDK/include/NDK/EntityList.hpp +++ b/SDK/include/NDK/EntityList.hpp @@ -55,7 +55,7 @@ namespace Ndk World* m_world; }; - class NDK_API EntityList::iterator : public std::iterator + class NDK_API EntityList::iterator { friend EntityList; @@ -73,6 +73,12 @@ namespace Ndk friend inline void swap(iterator& lhs, iterator& rhs); + using difference_type = std::ptrdiff_t; + using iterator_category = std::forward_iterator_tag; + using pointer = EntityHandle*; + using reference = EntityHandle&; + using value_type = EntityHandle; + private: inline iterator(const EntityList* world, std::size_t nextId); From da5d8bc4c22d67eac2efcd1d49fb9988d98c3dfe Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 20 Mar 2020 20:56:15 +0100 Subject: [PATCH 188/192] Bypass MSVC parser regression --- include/Nazara/Graphics/CullingList.hpp | 8 ++++++++ include/Nazara/Graphics/CullingList.inl | 16 ++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/Nazara/Graphics/CullingList.hpp b/include/Nazara/Graphics/CullingList.hpp index 7feb32362..7eff97852 100644 --- a/include/Nazara/Graphics/CullingList.hpp +++ b/include/Nazara/Graphics/CullingList.hpp @@ -136,6 +136,8 @@ namespace Nz { friend CullingList; + using ParentType = Entry; + public: BoxEntry(); BoxEntry(BoxEntry&&) = default; @@ -154,6 +156,8 @@ namespace Nz { friend CullingList; + using ParentType = Entry; + public: NoTestEntry(); NoTestEntry(NoTestEntry&&) = default; @@ -170,6 +174,8 @@ namespace Nz { friend CullingList; + using ParentType = Entry; + public: SphereEntry(); SphereEntry(SphereEntry&&) = default; @@ -188,6 +194,8 @@ namespace Nz { friend CullingList; + using ParentType = Entry; + public: VolumeEntry(); VolumeEntry(VolumeEntry&&) = default; diff --git a/include/Nazara/Graphics/CullingList.inl b/include/Nazara/Graphics/CullingList.inl index 341508351..aa94bc995 100644 --- a/include/Nazara/Graphics/CullingList.inl +++ b/include/Nazara/Graphics/CullingList.inl @@ -424,13 +424,13 @@ namespace Nz template CullingList::BoxEntry::BoxEntry() : - Entry() + ParentType() { } template CullingList::BoxEntry::BoxEntry(CullingList* parent, std::size_t index) : - Entry(parent, index) + ParentType(parent, index) { } @@ -444,13 +444,13 @@ namespace Nz template CullingList::NoTestEntry::NoTestEntry() : - Entry() + ParentType() { } template CullingList::NoTestEntry::NoTestEntry(CullingList* parent, std::size_t index) : - Entry(parent, index) + ParentType(parent, index) { } @@ -458,13 +458,13 @@ namespace Nz template CullingList::SphereEntry::SphereEntry() : - Entry() + ParentType() { } template CullingList::SphereEntry::SphereEntry(CullingList* parent, std::size_t index) : - Entry(parent, index) + ParentType(parent, index) { } @@ -478,13 +478,13 @@ namespace Nz template CullingList::VolumeEntry::VolumeEntry() : - Entry() + ParentType() { } template CullingList::VolumeEntry::VolumeEntry(CullingList* parent, std::size_t index) : - Entry(parent, index) + ParentType(parent, index) { } From 332f02aab0f255c4176ca7f029123c92e6b2276d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 11 May 2020 11:01:47 +0200 Subject: [PATCH 189/192] Create FUNDING.yml --- .github/FUNDING.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..1eca8dcbd --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: [SirLynix] +custom: ['https://paypal.me/sirlynixvanfrietjes'] From db0b2ba27b61d6022a95bb0d7977b3f1587ecca8 Mon Sep 17 00:00:00 2001 From: ImperatorS79 Date: Sun, 17 May 2020 22:21:21 +0200 Subject: [PATCH 190/192] Fix warning -Wreorder on linux in SimpleTextDrawer --- include/Nazara/Utility/SimpleTextDrawer.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Nazara/Utility/SimpleTextDrawer.inl b/include/Nazara/Utility/SimpleTextDrawer.inl index a203bfa8e..fddb6b893 100644 --- a/include/Nazara/Utility/SimpleTextDrawer.inl +++ b/include/Nazara/Utility/SimpleTextDrawer.inl @@ -24,11 +24,11 @@ namespace Nz inline SimpleTextDrawer::SimpleTextDrawer(const SimpleTextDrawer& drawer) : m_color(drawer.m_color), + m_outlineColor(drawer.m_outlineColor), m_text(drawer.m_text), m_style(drawer.m_style), m_colorUpdated(false), m_glyphUpdated(false), - m_outlineColor(drawer.m_outlineColor), m_characterSpacingOffset(drawer.m_characterSpacingOffset), m_lineSpacingOffset(drawer.m_lineSpacingOffset), m_maxLineWidth(drawer.m_maxLineWidth), From 8d8f44f4b9469e305eed907879825d90051888ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 18 May 2020 17:04:52 +0200 Subject: [PATCH 191/192] Make Windows implementation DPI-Aware (+ fix issue with window position) (#322) * WindowImpl : Fix windows centering on desktop * WindowImpl : Make nazara DPI aware * Refactor dpi stuff * Minor aesthetic stuff * More minor stuff Co-authored-by: HardCPP --- src/Nazara/Platform/Win32/WindowImpl.cpp | 60 ++++++++++++++++++++++-- src/Nazara/Platform/Win32/WindowImpl.hpp | 2 + 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/Nazara/Platform/Win32/WindowImpl.cpp b/src/Nazara/Platform/Win32/WindowImpl.cpp index 6ee3365ac..a8f8a91aa 100644 --- a/src/Nazara/Platform/Win32/WindowImpl.cpp +++ b/src/Nazara/Platform/Win32/WindowImpl.cpp @@ -5,6 +5,7 @@ // Un grand merci à Laurent Gomila pour la SFML qui m'aura bien aidé à réaliser cette implémentation #include +#include #include #include #include @@ -61,7 +62,7 @@ namespace Nz bool async = (style & WindowStyle_Threaded) != 0; bool fullscreen = (style & WindowStyle_Fullscreen) != 0; DWORD win32Style, win32StyleEx; - unsigned int x, y; + int x, y; unsigned int width = mode.width; unsigned int height = mode.height; if (fullscreen) @@ -117,8 +118,14 @@ namespace Nz width = rect.right-rect.left; height = rect.bottom-rect.top; - x = (GetSystemMetrics(SM_CXSCREEN) - width)/2; - y = (GetSystemMetrics(SM_CYSCREEN) - height)/2; + + // Grab desktop rect in order to center our window on the main display + // TODO: Handle multiple displays + RECT desktopRect; + GetClientRect(GetDesktopWindow(), &desktopRect); + + x = (desktopRect.right / 2) - (width / 2); + y = (desktopRect.bottom / 2) - (height / 2); } m_callback = 0; @@ -939,6 +946,9 @@ namespace Nz bool WindowImpl::Initialize() { + if (!SetProcessDpiAware()) + NazaraWarning("failed to make process DPI-aware"); + // Nous devons faire un type Unicode pour que la fenêtre le soit également // http://msdn.microsoft.com/en-us/library/windows/desktop/ms633574(v=vs.85).aspx WNDCLASSW windowClass; @@ -961,6 +971,50 @@ namespace Nz UnregisterClassW(className, GetModuleHandle(nullptr)); } + bool WindowImpl::SetProcessDpiAware() + { + // MSDN : https://docs.microsoft.com/en-us/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process + // This will work only for windows Vista & above + + HINSTANCE shcoreLib = LoadLibraryW(L"SHCore.dll"); + if (shcoreLib) + { + CallOnExit closeLibOnExit([&] { FreeLibrary(shcoreLib); }); + + /// shellscalingapi.h + enum PROCESS_DPI_AWARENESS + { + PROCESS_DPI_UNAWARE, + PROCESS_SYSTEM_DPI_AWARE, + PROCESS_PER_MONITOR_DPI_AWARE + }; + + using SetProcessDpiAwarenessFunc = HRESULT (WINAPI*)(PROCESS_DPI_AWARENESS); + auto SetProcessDpiAwareness = reinterpret_cast(GetProcAddress(shcoreLib, "SetProcessDpiAwareness")); + + if (SetProcessDpiAwareness) + { + HRESULT result = SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE); + + if (result == S_OK || result == E_ACCESSDENIED) //< E_ACCESSDENIED means it has already been set, probably by the .exe manifest + return true; + } + } + + // If SetProcessDpiAwareness doesn't exist, we call old user32 function + HMODULE user32 = GetModuleHandleW(L"user32.dll"); + if (!user32) + return false; //< Shouldn't happen as user32 is linked + + using SetProcessDPIAwareFunc = BOOL (WINAPI*)(); + auto SetProcessDPIAware = reinterpret_cast(GetProcAddress(user32, "SetProcessDPIAware")); + + if (!SetProcessDPIAware || !SetProcessDPIAware()) + return false; + + return true; + } + Keyboard::Key WindowImpl::ConvertVirtualKey(WPARAM key, LPARAM flags) { switch (key) diff --git a/src/Nazara/Platform/Win32/WindowImpl.hpp b/src/Nazara/Platform/Win32/WindowImpl.hpp index e05a86fdf..668108032 100644 --- a/src/Nazara/Platform/Win32/WindowImpl.hpp +++ b/src/Nazara/Platform/Win32/WindowImpl.hpp @@ -84,6 +84,8 @@ namespace Nz bool HandleMessage(HWND window, UINT message, WPARAM wParam, LPARAM lParam); void PrepareWindow(bool fullscreen); + static bool SetProcessDpiAware(); + static Keyboard::Key ConvertVirtualKey(WPARAM key, LPARAM flags); static LRESULT CALLBACK MessageHandler(HWND window, UINT message, WPARAM wParam, LPARAM lParam); static UInt32 RetrieveStyle(HWND window); From ca2425f31076fe9bb7ef6443de8b533dbdca7163 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 24 May 2020 16:01:26 +0200 Subject: [PATCH 192/192] Sdk/Physics2D: Fix copy of PhysicsComponent2D --- SDK/include/NDK/Components/PhysicsComponent2D.inl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index 6e0b0b10f..53e01480e 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -20,7 +20,8 @@ namespace Ndk * * \param physics PhysicsComponent2D to copy */ - inline PhysicsComponent2D::PhysicsComponent2D(const PhysicsComponent2D& physics) + inline PhysicsComponent2D::PhysicsComponent2D(const PhysicsComponent2D& physics) : + m_nodeSynchronizationEnabled(physics.m_nodeSynchronizationEnabled) { CopyPhysicsState(*physics.GetRigidBody()); }