From dc439d69a55a03ab673301e222299ba002e6e53e Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 15 Jan 2017 13:25:12 +0100 Subject: [PATCH 001/352] 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/352] 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/352] 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/352] 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/352] 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/352] 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/352] 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/352] 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/352] 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/352] 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/352] 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/352] 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 41e2d3e448201ed34c12841eeea3578a315c844d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 15 Jun 2018 14:13:18 +0200 Subject: [PATCH 013/352] Graphics/Material: Add EnableVertexColor temporary --- include/Nazara/Graphics/Material.hpp | 2 ++ include/Nazara/Graphics/Material.inl | 28 ++++++++++++++++++++ include/Nazara/Graphics/MaterialPipeline.hpp | 1 + include/Nazara/Graphics/MaterialPipeline.inl | 2 ++ src/Nazara/Graphics/MaterialPipeline.cpp | 2 +- 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/include/Nazara/Graphics/Material.hpp b/include/Nazara/Graphics/Material.hpp index 8baab7e62..9903553a5 100644 --- a/include/Nazara/Graphics/Material.hpp +++ b/include/Nazara/Graphics/Material.hpp @@ -83,6 +83,7 @@ namespace Nz inline void EnableShadowCasting(bool castShadows); inline void EnableShadowReceive(bool receiveShadows); inline void EnableStencilTest(bool stencilTest); + inline void EnableVertexColor(bool vertexColor); inline void EnsurePipelineUpdate() const; @@ -121,6 +122,7 @@ namespace Nz inline bool HasHeightMap() const; inline bool HasNormalMap() const; inline bool HasSpecularMap() const; + inline bool HasVertexColor() const; inline bool IsAlphaTestEnabled() const; inline bool IsBlendingEnabled() const; diff --git a/include/Nazara/Graphics/Material.inl b/include/Nazara/Graphics/Material.inl index 3831519a2..c6e56db84 100644 --- a/include/Nazara/Graphics/Material.inl +++ b/include/Nazara/Graphics/Material.inl @@ -392,6 +392,25 @@ namespace Nz InvalidatePipeline(); } + /*! + * \brief Enable/Disable vertex coloring on this material + * + * This is a temporary option, until the new material pipeline system is ready, allowing to enable vertex coloring. + * This option only works with meshes using vertex colors. + * + * \param vertexColor Defines if this material will use vertex color or not + * + * \remark Invalidates the pipeline + * + * \see HasVertexColor + */ + inline void Material::EnableVertexColor(bool vertexColor) + { + m_pipelineInfo.hasVertexColor = vertexColor; + + InvalidatePipeline(); + } + /*! * \brief Ensures the pipeline gets updated * @@ -756,6 +775,15 @@ namespace Nz return m_specularMap.IsValid(); } + /*! + * \brief Checks whether this material uses vertex coloring + * \return true If it is the case + */ + inline bool Material::HasVertexColor() const + { + return m_pipelineInfo.hasVertexColor; + } + /*! * \brief Checks whether this material has alpha test enabled * \return true If it is the case diff --git a/include/Nazara/Graphics/MaterialPipeline.hpp b/include/Nazara/Graphics/MaterialPipeline.hpp index 75e5731e0..ef3e1eafb 100644 --- a/include/Nazara/Graphics/MaterialPipeline.hpp +++ b/include/Nazara/Graphics/MaterialPipeline.hpp @@ -26,6 +26,7 @@ namespace Nz bool hasHeightMap = false; bool hasNormalMap = false; bool hasSpecularMap = false; + bool hasVertexColor = false; bool reflectionMapping = false; bool shadowReceive = true; diff --git a/include/Nazara/Graphics/MaterialPipeline.inl b/include/Nazara/Graphics/MaterialPipeline.inl index bc7ca1b72..2df585e28 100644 --- a/include/Nazara/Graphics/MaterialPipeline.inl +++ b/include/Nazara/Graphics/MaterialPipeline.inl @@ -71,6 +71,7 @@ namespace Nz NazaraPipelineBoolMember(hasHeightMap); NazaraPipelineBoolMember(hasNormalMap); NazaraPipelineBoolMember(hasSpecularMap); + NazaraPipelineBoolMember(hasVertexColor); NazaraPipelineBoolMember(reflectionMapping); NazaraPipelineBoolMember(shadowReceive); @@ -127,6 +128,7 @@ namespace std NazaraPipelineBoolMember(hasHeightMap); NazaraPipelineBoolMember(hasNormalMap); NazaraPipelineBoolMember(hasSpecularMap); + NazaraPipelineBoolMember(hasVertexColor); NazaraPipelineBoolMember(reflectionMapping); NazaraPipelineBoolMember(shadowReceive); diff --git a/src/Nazara/Graphics/MaterialPipeline.cpp b/src/Nazara/Graphics/MaterialPipeline.cpp index 6f2d5f173..743984783 100644 --- a/src/Nazara/Graphics/MaterialPipeline.cpp +++ b/src/Nazara/Graphics/MaterialPipeline.cpp @@ -98,7 +98,7 @@ namespace Nz list.SetParameter("FLAG_DEFERRED", static_cast((flags & ShaderFlags_Deferred) != 0)); list.SetParameter("FLAG_INSTANCING", static_cast((flags & ShaderFlags_Instancing) != 0)); list.SetParameter("FLAG_TEXTUREOVERLAY", static_cast((flags & ShaderFlags_TextureOverlay) != 0)); - list.SetParameter("FLAG_VERTEXCOLOR", static_cast((flags & ShaderFlags_VertexColor) != 0)); + list.SetParameter("FLAG_VERTEXCOLOR", m_pipelineInfo.hasVertexColor || static_cast((flags & ShaderFlags_VertexColor) != 0)); Instance& instance = m_instances[flags]; instance.uberInstance = m_pipelineInfo.uberShader->Get(list); From 8cdc36c948886518d126361936b9b7d3254d9e71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 15 Jun 2018 14:15:23 +0200 Subject: [PATCH 014/352] Graphics/Material: Add parameter for vertex color --- include/Nazara/Utility/MaterialData.hpp | 1 + src/Nazara/Graphics/Material.cpp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/include/Nazara/Utility/MaterialData.hpp b/include/Nazara/Utility/MaterialData.hpp index c2634d92c..5d82400d7 100644 --- a/include/Nazara/Utility/MaterialData.hpp +++ b/include/Nazara/Utility/MaterialData.hpp @@ -60,6 +60,7 @@ namespace Nz static constexpr const char* StencilTest = "MatStencilTest"; static constexpr const char* StencilZFail = "MatStencilZFail"; static constexpr const char* Transform = "MatTransform"; + static constexpr const char* VertexColor = "MatVertexColor"; }; } diff --git a/src/Nazara/Graphics/Material.cpp b/src/Nazara/Graphics/Material.cpp index e88ad6100..37ab5afd7 100644 --- a/src/Nazara/Graphics/Material.cpp +++ b/src/Nazara/Graphics/Material.cpp @@ -183,6 +183,9 @@ namespace Nz if (matData.GetBooleanParameter(MaterialData::StencilTest, &isEnabled)) EnableStencilTest(isEnabled); + if (matData.GetBooleanParameter(MaterialData::VertexColor, &isEnabled)) + EnableVertexColor(isEnabled); + // Samplers if (matData.GetIntegerParameter(MaterialData::DiffuseAnisotropyLevel, &iValue)) m_diffuseSampler.SetAnisotropyLevel(static_cast(iValue)); @@ -296,6 +299,7 @@ namespace Nz matData->SetParameter(MaterialData::FaceCulling, IsFaceCullingEnabled()); matData->SetParameter(MaterialData::ScissorTest, IsScissorTestEnabled()); matData->SetParameter(MaterialData::StencilTest, IsStencilTestEnabled()); + matData->SetParameter(MaterialData::VertexColor, HasVertexColor()); // Samplers matData->SetParameter(MaterialData::DiffuseAnisotropyLevel, static_cast(GetDiffuseSampler().GetAnisotropicLevel())); From 858d0da5f221f20718b036410e5a53bd7372bdfe Mon Sep 17 00:00:00 2001 From: S6066 Date: Sun, 17 Jun 2018 18:54:02 +0200 Subject: [PATCH 015/352] Fix Sprite & GraphicsComponent copy constructors leaving some members uninitialized (#166) * Fix Sprite copy constructor (corner colors) * Also add change to changelog * [GraphicsComponent] Bugfix: Initialize m_scissorRect in copy ctor * Add change to changelog * Move GraphicsComponent fix change to correct section in Changelog * Use default copy constructor for Sprite --- ChangeLog.md | 2 ++ SDK/include/NDK/Components/GraphicsComponent.inl | 1 + include/Nazara/Graphics/Sprite.hpp | 2 +- include/Nazara/Graphics/Sprite.inl | 15 --------------- 4 files changed, 4 insertions(+), 16 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5eb093e46..1a5abbb6b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -115,6 +115,7 @@ Nazara Engine: - ⚠️ SocketPoller::Wait now returns the number of socket marked as ready, and takes an additional optional parameter allowing to query the last error. - SocketPoller will now silently ignore "interrupt errors" - Added RigidBody2D::ClosestPointQuery +- Fix Sprite copy constructor not copying corner colors Nazara Development Kit: - Added ImageWidget (#139) @@ -166,6 +167,7 @@ Nazara Development Kit: - Add GraphicsComponent:ForEachRenderable method - Fixed GraphicsComponent reflective material count which was not initialized - Added PhysicsComponent2D::ClosestPointQuery +- Fix GraphicsComponent copy constructor not copying scissor rect # 0.4: diff --git a/SDK/include/NDK/Components/GraphicsComponent.inl b/SDK/include/NDK/Components/GraphicsComponent.inl index adf653351..69be82ba0 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.inl +++ b/SDK/include/NDK/Components/GraphicsComponent.inl @@ -26,6 +26,7 @@ namespace Ndk m_reflectiveMaterialCount(0), m_boundingVolume(graphicsComponent.m_boundingVolume), m_transformMatrix(graphicsComponent.m_transformMatrix), + m_scissorRect(graphicsComponent.m_scissorRect), m_boundingVolumeUpdated(graphicsComponent.m_boundingVolumeUpdated), m_transformMatrixUpdated(graphicsComponent.m_transformMatrixUpdated) { diff --git a/include/Nazara/Graphics/Sprite.hpp b/include/Nazara/Graphics/Sprite.hpp index 6548f461a..587060467 100644 --- a/include/Nazara/Graphics/Sprite.hpp +++ b/include/Nazara/Graphics/Sprite.hpp @@ -29,7 +29,7 @@ namespace Nz inline Sprite(); inline Sprite(MaterialRef material); inline Sprite(Texture* texture); - inline Sprite(const Sprite& sprite); + Sprite(const Sprite&) = default; Sprite(Sprite&&) = delete; ~Sprite() = default; diff --git a/include/Nazara/Graphics/Sprite.inl b/include/Nazara/Graphics/Sprite.inl index a296f5d61..7412793b7 100644 --- a/include/Nazara/Graphics/Sprite.inl +++ b/include/Nazara/Graphics/Sprite.inl @@ -50,21 +50,6 @@ namespace Nz SetTexture(texture, true); } - /*! - * \brief Constructs a Sprite object by assignation - * - * \param sprite Sprite to copy into this - */ - - inline Sprite::Sprite(const Sprite& sprite) : - InstancedRenderable(sprite), - m_color(sprite.m_color), - m_textureCoords(sprite.m_textureCoords), - m_size(sprite.m_size), - m_origin(sprite.m_origin) - { - } - /*! * \brief Gets the color of the sprite * From da044bd21ccbae6971321da229809ceabb5f2bae Mon Sep 17 00:00:00 2001 From: S6066 Date: Sun, 17 Jun 2018 19:04:15 +0200 Subject: [PATCH 016/352] Make lua binding for std::vector (#164) * Make LuaImplQueryArg impl for std::vector * Fix shadowed argument * Make unit tests * Bugfix * Bugfix, for real this time * We didn't need these tests anyway * Revert "We didn't need these tests anyway" This reverts commit be88d4496a9cf62beb4d3ce1f30825589a4bacb2. * Add change to changelog * Update ChangeLog.md * Bugfix & use CallOnExit to pop stack --- ChangeLog.md | 2 ++ include/Nazara/Lua/LuaState.inl | 29 +++++++++++++++++++++++++++++ tests/Engine/Lua/LuaState.cpp | 29 +++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 1a5abbb6b..fea6b4033 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -107,6 +107,8 @@ Nazara Engine: - Added AbstractViewer::Project and AbstractViewer::Unproject methods - Added AbstractViewer::ProjectDepth method - 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. - InstancedRenderable::SetMaterial methods are now public. - Fixed Model copy constructor not copying materials diff --git a/include/Nazara/Lua/LuaState.inl b/include/Nazara/Lua/LuaState.inl index 7dcc4e36f..3d6f5ae1e 100644 --- a/include/Nazara/Lua/LuaState.inl +++ b/include/Nazara/Lua/LuaState.inl @@ -3,6 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include #include #include @@ -159,6 +160,34 @@ namespace Nz return LuaImplQueryArg(instance, index, arg, defValue, TypeTag()); } + template + unsigned int LuaImplQueryArg(const LuaState& instance, int index, std::vector* container, TypeTag>) + { + instance.CheckType(index, Nz::LuaType_Table); + std::size_t pos = 1; + + for (;;) + { + Nz::CallOnExit popStack { [&instance]() { instance.Pop(); } }; + instance.PushInteger(pos++); + + if (instance.GetTable() == Nz::LuaType_Nil) + break; + + T arg {}; + + if (LuaImplQueryArg(instance, -1, &arg, TypeTag()) != 1) + { + instance.Error("Type needs more than one place to be initialized"); + return 0; + } + + container->push_back(arg); + } + + return 1; + } + // Function returns inline int LuaImplReplyVal(const LuaState& instance, bool val, TypeTag) { diff --git a/tests/Engine/Lua/LuaState.cpp b/tests/Engine/Lua/LuaState.cpp index ef2965517..430927d98 100644 --- a/tests/Engine/Lua/LuaState.cpp +++ b/tests/Engine/Lua/LuaState.cpp @@ -183,5 +183,34 @@ SCENARIO("LuaState", "[LUA][LUASTATE]") CHECK(luaInstance.ToNumber(1) == Approx(-4.09).margin(0.1)); } } + + WHEN("We push a std::vector locally") + { + std::vector vec { 1, 5, -8, 6, -4 }; + luaInstance.Push(std::vector { vec }); + + THEN("We can retrieve it with correct values") + { + int index = 1; + std::vector otherVec = luaInstance.Check>(&index); + + for (std::size_t i {}; i < otherVec.size(); ++i) + CHECK(otherVec[i] == vec[i]); + } + } + + WHEN("We push a std::vector globally") + { + std::vector vec { 1, 5, -8, 6, -4 }; + luaInstance.PushGlobal("vector", std::vector { vec }); + + THEN("We can retrieve it with correct values") + { + std::vector otherVec = luaInstance.CheckGlobal>("vector"); + + for (std::size_t i {}; i < otherVec.size(); ++i) + CHECK(otherVec[i] == vec[i]); + } + } } } From 456a9258da67477cae71ba6b4d48ac71614e6228 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 24 Jun 2018 20:29:20 +0200 Subject: [PATCH 017/352] Lua/LuaState: Fix std::vector query code --- include/Nazara/Lua/LuaState.inl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/Nazara/Lua/LuaState.inl b/include/Nazara/Lua/LuaState.inl index 3d6f5ae1e..136220bf7 100644 --- a/include/Nazara/Lua/LuaState.inl +++ b/include/Nazara/Lua/LuaState.inl @@ -166,12 +166,13 @@ namespace Nz instance.CheckType(index, Nz::LuaType_Table); std::size_t pos = 1; + container->clear(); for (;;) { Nz::CallOnExit popStack { [&instance]() { instance.Pop(); } }; instance.PushInteger(pos++); - if (instance.GetTable() == Nz::LuaType_Nil) + if (instance.GetTable(index) == Nz::LuaType_Nil) break; T arg {}; From bf37688b1151101f049211151b3a1ebfef6c5a5e Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 24 Jun 2018 21:49:51 +0200 Subject: [PATCH 018/352] Lua/LuaState: Fix std::vector query for good --- include/Nazara/Lua/LuaState.inl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/Nazara/Lua/LuaState.inl b/include/Nazara/Lua/LuaState.inl index 136220bf7..97a0827b0 100644 --- a/include/Nazara/Lua/LuaState.inl +++ b/include/Nazara/Lua/LuaState.inl @@ -172,11 +172,11 @@ namespace Nz Nz::CallOnExit popStack { [&instance]() { instance.Pop(); } }; instance.PushInteger(pos++); - if (instance.GetTable(index) == Nz::LuaType_Nil) + int tableIndex = (index < 0) ? index - 1 : index; + if (instance.GetTable(tableIndex) == Nz::LuaType_Nil) break; - T arg {}; - + T arg; if (LuaImplQueryArg(instance, -1, &arg, TypeTag()) != 1) { instance.Error("Type needs more than one place to be initialized"); From 78adc11323a540b6c3163d469cfe5bc8eea6b3d5 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 24 Jun 2018 22:04:48 +0200 Subject: [PATCH 019/352] Graphics/TileMap: Fix warning --- include/Nazara/Graphics/TileMap.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Nazara/Graphics/TileMap.hpp b/include/Nazara/Graphics/TileMap.hpp index 6648a6598..b096b5948 100644 --- a/include/Nazara/Graphics/TileMap.hpp +++ b/include/Nazara/Graphics/TileMap.hpp @@ -29,7 +29,7 @@ namespace Nz struct Tile; inline TileMap(const Nz::Vector2ui& mapSize, const Nz::Vector2f& tileSize, std::size_t materialCount = 1); - TileMap(const TileMap& TileMap) = default; + TileMap(const TileMap&) = default; TileMap(TileMap&&) = delete; ~TileMap() = default; From f9c5867d72bca57380d04712029af0f3f62f66e6 Mon Sep 17 00:00:00 2001 From: S6066 Date: Thu, 28 Jun 2018 16:11:54 +0200 Subject: [PATCH 020/352] Fix cursor when switching demo in DemoParticles (#168) * fix cursor * whoopsie --- examples/Particles/SpacebattleDemo.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/Particles/SpacebattleDemo.cpp b/examples/Particles/SpacebattleDemo.cpp index 8fa72bfff..0fe08d8f3 100644 --- a/examples/Particles/SpacebattleDemo.cpp +++ b/examples/Particles/SpacebattleDemo.cpp @@ -669,6 +669,8 @@ void SpacebattleExample::Enter(Ndk::StateMachine& fsm) void SpacebattleExample::Leave(Ndk::StateMachine& fsm) { m_ambientMusic.Stop(); + m_onMouseMoved.Disconnect(); + m_shared.target->SetCursor(Nz::SystemCursor_Default); m_shared.world3D->RemoveSystem(); m_shared.world3D->RemoveSystem(); m_turretFireSound.Stop(); From 217d971fe72b250a085a1b7843a879893bf1f6cd Mon Sep 17 00:00:00 2001 From: Faymoon Date: Thu, 28 Jun 2018 16:12:12 +0200 Subject: [PATCH 021/352] fix launch error for premake (#167) * fix error of launch for premake * fix launch error for premake * fix launch error for premake * fix launch error for premake * fix launch error for premake * fix launch error for premake * Update Generate_UnicodeData.bat * fix launch error for premake * fix launch error for premake * fix launch error for premake --- build/Build_CodeBlocks.bat | 2 +- build/Build_CodeLite.bat | 2 +- build/Build_VS2015.bat | 2 +- build/Build_VS2017.bat | 2 +- build/EncodeResources.bat | 4 ++-- build/Generate_GlobalIncludes.bat | 4 ++-- build/Generate_UnicodeData.bat | 4 ++-- build/Package_AutoDetect.bat | 4 ++-- build/Package_MSVC.bat | 4 ++-- build/Package_MinGW.bat | 4 ++-- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build/Build_CodeBlocks.bat b/build/Build_CodeBlocks.bat index 5e6c23c44..f660c144d 100644 --- a/build/Build_CodeBlocks.bat +++ b/build/Build_CodeBlocks.bat @@ -1 +1 @@ -premake5 codeblocks \ No newline at end of file +.\premake5.exe codeblocks diff --git a/build/Build_CodeLite.bat b/build/Build_CodeLite.bat index 170e7a451..2a1634776 100644 --- a/build/Build_CodeLite.bat +++ b/build/Build_CodeLite.bat @@ -1 +1 @@ -premake5 codelite \ No newline at end of file +.\premake5.exe codelite diff --git a/build/Build_VS2015.bat b/build/Build_VS2015.bat index 6d0726faf..c74550817 100644 --- a/build/Build_VS2015.bat +++ b/build/Build_VS2015.bat @@ -1 +1 @@ -premake5 vs2015 \ No newline at end of file +.\premake5.exe vs2015 diff --git a/build/Build_VS2017.bat b/build/Build_VS2017.bat index b569c559d..51c0417d0 100644 --- a/build/Build_VS2017.bat +++ b/build/Build_VS2017.bat @@ -1 +1 @@ -premake5 vs2017 \ No newline at end of file +.\premake5.exe vs2017 diff --git a/build/EncodeResources.bat b/build/EncodeResources.bat index 8e4abde48..b7dc0f860 100644 --- a/build/EncodeResources.bat +++ b/build/EncodeResources.bat @@ -1,2 +1,2 @@ -premake5 encoderesources -pause \ No newline at end of file +.\premake5.exe encoderesources +pause diff --git a/build/Generate_GlobalIncludes.bat b/build/Generate_GlobalIncludes.bat index a78069501..df132e9ad 100644 --- a/build/Generate_GlobalIncludes.bat +++ b/build/Generate_GlobalIncludes.bat @@ -1,2 +1,2 @@ -premake5 generateheaders -pause \ No newline at end of file +.\premake5.exe generateheaders +pause diff --git a/build/Generate_UnicodeData.bat b/build/Generate_UnicodeData.bat index 75ef2d7da..cff81bd31 100644 --- a/build/Generate_UnicodeData.bat +++ b/build/Generate_UnicodeData.bat @@ -1,2 +1,2 @@ -premake5 parseunicode -pause \ No newline at end of file +.\premake5.exe parseunicode +pause diff --git a/build/Package_AutoDetect.bat b/build/Package_AutoDetect.bat index 32a52470b..f86a8c6e5 100644 --- a/build/Package_AutoDetect.bat +++ b/build/Package_AutoDetect.bat @@ -1,2 +1,2 @@ -premake5 package -pause \ No newline at end of file +.\premake5.exe package +pause diff --git a/build/Package_MSVC.bat b/build/Package_MSVC.bat index 0367ff7df..c39f1cd6c 100644 --- a/build/Package_MSVC.bat +++ b/build/Package_MSVC.bat @@ -1,2 +1,2 @@ -premake5 --pack-libdir=msvc package -pause \ No newline at end of file +.\premake5.exe --pack-libdir=msvc package +pause diff --git a/build/Package_MinGW.bat b/build/Package_MinGW.bat index 823c5e4ce..21d4c01fc 100644 --- a/build/Package_MinGW.bat +++ b/build/Package_MinGW.bat @@ -1,2 +1,2 @@ -premake5 --pack-libdir=mingw package -pause \ No newline at end of file +.\premake5.exe --pack-libdir=mingw package +pause From eeaaebb15c871f31eac3b8c3a3387b177d8c9c22 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 1 Jul 2018 00:36:59 +0200 Subject: [PATCH 022/352] Core: Add ObjectLibrary::Clear --- ChangeLog.md | 1 + include/Nazara/Core/ObjectLibrary.hpp | 2 ++ include/Nazara/Core/ObjectLibrary.inl | 14 ++++++++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index fea6b4033..17a0a1521 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -118,6 +118,7 @@ Nazara Engine: - SocketPoller will now silently ignore "interrupt errors" - Added RigidBody2D::ClosestPointQuery - Fix Sprite copy constructor not copying corner colors +- Added ObjectLibrary::Clear method Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/ObjectLibrary.hpp b/include/Nazara/Core/ObjectLibrary.hpp index a13fbc3e6..8528f358d 100644 --- a/include/Nazara/Core/ObjectLibrary.hpp +++ b/include/Nazara/Core/ObjectLibrary.hpp @@ -23,6 +23,8 @@ namespace Nz ObjectLibrary() = delete; ~ObjectLibrary() = delete; + static void Clear(); + static ObjectRef Get(const String& name); static bool Has(const String& name); diff --git a/include/Nazara/Core/ObjectLibrary.inl b/include/Nazara/Core/ObjectLibrary.inl index b5384a2a7..83686e04f 100644 --- a/include/Nazara/Core/ObjectLibrary.inl +++ b/include/Nazara/Core/ObjectLibrary.inl @@ -2,6 +2,7 @@ // 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 @@ -9,10 +10,19 @@ namespace Nz { /*! * \ingroup core - * \class Nz::ObjectRef - * \brief Core class that represents a reference to an object + * \class Nz::ObjectLibrary + * \brief Core class containing a collection of objects */ + /*! + * \brief Clears the library, freeing every object it contains + */ + template + void ObjectLibrary::Clear() + { + Type::s_library.clear(); + } + /*! * \brief Gets the ObjectRef object by name * \return Optional reference From ea572520819e2eb00e29a0d0d162eea6aebf4db6 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 1 Jul 2018 20:36:42 +0200 Subject: [PATCH 023/352] Graphics/Model: Fix material copy for good --- include/Nazara/Graphics/Model.inl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/Nazara/Graphics/Model.inl b/include/Nazara/Graphics/Model.inl index 1b0055cf3..ee0ce7a41 100644 --- a/include/Nazara/Graphics/Model.inl +++ b/include/Nazara/Graphics/Model.inl @@ -25,6 +25,14 @@ namespace Nz InstancedRenderable(model) { SetMesh(model.m_mesh); + + // Since SetMesh does reset materials, we need reapply them + SetSkinCount(model.GetSkinCount()); + for (std::size_t skin = 0; skin < model.GetSkinCount(); ++skin) + { + for (std::size_t matIndex = 0; matIndex < model.GetMaterialCount(); ++matIndex) + SetMaterial(skin, matIndex, model.GetMaterial(skin, matIndex)); + } } /*! From bb0456ffed9210382cea58a12244a2d6eb0a14ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 2 Jul 2018 17:48:51 +0200 Subject: [PATCH 024/352] Remove useless namespace prefix --- include/Nazara/Network/NetPacket.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Nazara/Network/NetPacket.inl b/include/Nazara/Network/NetPacket.inl index eb68d1e53..7cd78b529 100644 --- a/include/Nazara/Network/NetPacket.inl +++ b/include/Nazara/Network/NetPacket.inl @@ -195,7 +195,7 @@ namespace Nz * \param packet NetPacket to move in this */ - inline NetPacket& Nz::NetPacket::operator=(NetPacket&& packet) + inline NetPacket& NetPacket::operator=(NetPacket&& packet) { FreeStream(); From 2fcea6b79fa426d6965202424a6c37085a1c3f5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 2 Jul 2018 17:53:49 +0200 Subject: [PATCH 025/352] Core/StackArray: Moved StackArray class to its own header --- ChangeLog.md | 2 + include/Nazara/Core/MemoryHelper.hpp | 75 +-------- include/Nazara/Core/MemoryHelper.inl | 183 --------------------- include/Nazara/Core/StackArray.hpp | 93 +++++++++++ include/Nazara/Core/StackArray.inl | 208 ++++++++++++++++++++++++ src/Nazara/Core/Posix/DirectoryImpl.cpp | 4 +- src/Nazara/Network/Posix/SocketImpl.cpp | 6 +- src/Nazara/Network/Win32/SocketImpl.cpp | 6 +- src/Nazara/Physics2D/PhysWorld2D.cpp | 4 +- src/Nazara/Physics3D/PhysWorld3D.cpp | 4 +- src/Nazara/Renderer/Renderer.cpp | 4 +- 11 files changed, 318 insertions(+), 271 deletions(-) create mode 100644 include/Nazara/Core/StackArray.hpp create mode 100644 include/Nazara/Core/StackArray.inl diff --git a/ChangeLog.md b/ChangeLog.md index 17a0a1521..8690c48e0 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -119,6 +119,8 @@ Nazara Engine: - Added RigidBody2D::ClosestPointQuery - Fix Sprite copy constructor not copying corner colors - Added ObjectLibrary::Clear method +- ⚠️ StackArray class and macro was moved from Core/MemoryHelper.hpp to Core/StackArray.hpp +- ⚠️ Renamed NazaraStackAllocation[NoInit] macro to NazaraStackArray[NoInit] Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/MemoryHelper.hpp b/include/Nazara/Core/MemoryHelper.hpp index 6452c7562..9d4a71ee4 100644 --- a/include/Nazara/Core/MemoryHelper.hpp +++ b/include/Nazara/Core/MemoryHelper.hpp @@ -16,6 +16,7 @@ #define NAZARA_ALLOCA_SUPPORT #elif defined(NAZARA_COMPILER_CLANG) || defined(NAZARA_COMPILER_GCC) || defined(NAZARA_COMPILER_INTEL) + #include // with Clang/GCC, using alloca with a size of zero does nothing good @@ -24,16 +25,7 @@ #endif -#ifdef NAZARA_ALLOCA_SUPPORT - #define NazaraStackAllocation(T, size) Nz::StackArray(static_cast(NAZARA_ALLOCA((size) * sizeof(T))), size) - #define NazaraStackAllocationNoInit(T, size) Nz::StackArray(static_cast(NAZARA_ALLOCA((size) * sizeof(T))), size, Nz::NoInitTag()) -#else - #define NazaraStackAllocation(T, size) Nz::StackArray(static_cast(Nz::OperatorNew((size) * sizeof(T))), size) - #define NazaraStackAllocationNoInit(T, size) Nz::StackArray(static_cast(Nz::OperatorNew((size) * sizeof(T))), size, Nz::NoInitTag()) -#endif - #include -#include namespace Nz { @@ -45,71 +37,6 @@ namespace Nz template void PlacementDestroy(T* ptr); - - struct NoInitTag {}; - - template - class StackArray - { - public: - using value_type = T; - using const_iterator = const value_type*; - using const_pointer = const value_type*; - using const_reference = const value_type&; - using const_reverse_iterator = std::reverse_iterator; - using difference_type = std::ptrdiff_t; - using iterator = value_type*; - using pointer = value_type*; - using reference = value_type&; - using reverse_iterator = std::reverse_iterator; - using size_type = std::size_t; - - StackArray(T* stackMemory, std::size_t size); - StackArray(T* stackMemory, std::size_t size, NoInitTag); - ~StackArray(); - - reference back(); - const_reference back() const; - - iterator begin() noexcept; - const_iterator begin() const noexcept; - - const_iterator cbegin() const noexcept; - const_iterator cend() const noexcept; - const_reverse_iterator crbegin() const noexcept; - const_reverse_iterator crend() const noexcept; - - T* data() noexcept; - const T* data() const noexcept; - - bool empty() const noexcept; - - iterator end() noexcept; - const_iterator end() const noexcept; - - void fill(const T& value); - - reference front() noexcept; - const_reference front() const noexcept; - - size_type max_size() const noexcept; - - reverse_iterator rbegin() noexcept; - const_reverse_iterator rbegin() const noexcept; - - reverse_iterator rend() noexcept; - const_reverse_iterator rend() const noexcept; - - size_type size() const noexcept; - - reference operator[](size_type pos); - const_reference operator[](size_type pos) const; - - private: - std::size_t m_size; - T* m_ptr; - }; - } #include diff --git a/include/Nazara/Core/MemoryHelper.inl b/include/Nazara/Core/MemoryHelper.inl index dfab05f15..afe2eca6b 100644 --- a/include/Nazara/Core/MemoryHelper.inl +++ b/include/Nazara/Core/MemoryHelper.inl @@ -11,10 +11,8 @@ #include #include -#include #include #include -#include #include namespace Nz @@ -79,187 +77,6 @@ namespace Nz if (ptr) ptr->~T(); } - - /*! - * \ingroup core - * \class Nz::StackArray - * \brief Core class that represents a stack-allocated (if alloca is present) array - */ - - template - StackArray::StackArray(T* stackMemory, std::size_t size) : - m_size(size), - m_ptr(stackMemory) - { - for (std::size_t i = 0; i < m_size; ++i) - PlacementNew(&m_ptr[i]); - } - - template - StackArray::StackArray(T* stackMemory, std::size_t size, NoInitTag) : - m_size(size), - m_ptr(stackMemory) - { - } - - template - StackArray::~StackArray() - { - for (std::size_t i = 0; i < m_size; ++i) - m_ptr[i].~T(); - - #ifndef NAZARA_ALLOCA_SUPPORT - OperatorDelete(m_ptr); - #endif - } - - template - typename StackArray::reference StackArray::back() - { - assert(m_size != 0); - return m_ptr[m_size - 1]; - } - - template - typename StackArray::const_reference StackArray::back() const - { - assert(m_size != 0); - return m_ptr[m_size - 1]; - } - - template - typename StackArray::iterator StackArray::begin() noexcept - { - return iterator(&m_ptr[0]); - } - - template - typename StackArray::const_iterator StackArray::begin() const noexcept - { - return const_iterator(&m_ptr[0]); - } - - template - typename StackArray::const_iterator StackArray::cbegin() const noexcept - { - return const_iterator(&m_ptr[0]); - } - - template - typename StackArray::const_iterator StackArray::cend() const noexcept - { - return const_iterator(&m_ptr[m_size]); - } - - template - typename StackArray::const_reverse_iterator StackArray::crbegin() const noexcept - { - return const_reverse_iterator(&m_ptr[m_size]); - } - - template - typename StackArray::const_reverse_iterator StackArray::crend() const noexcept - { - return const_reverse_iterator(&m_ptr[0]); - } - - template - T* StackArray::data() noexcept - { - return m_ptr; - } - - template - const T* StackArray::data() const noexcept - { - return m_ptr; - } - - template - bool StackArray::empty() const noexcept - { - return m_size == 0; - } - - template - typename StackArray::iterator StackArray::end() noexcept - { - return iterator(&m_ptr[m_size]); - } - - template - typename StackArray::const_iterator StackArray::end() const noexcept - { - return const_iterator(&m_ptr[m_size]); - } - - template - void StackArray::fill(const T& value) - { - std::fill(begin(), end(), value); - } - - template - typename StackArray::reference StackArray::front() noexcept - { - return m_ptr[0]; - } - - template - typename StackArray::const_reference StackArray::front() const noexcept - { - return m_ptr[0]; - } - - template - typename StackArray::size_type StackArray::max_size() const noexcept - { - return size(); - } - - template - typename StackArray::reverse_iterator StackArray::rbegin() noexcept - { - return reverse_iterator(&m_ptr[m_size]); - } - - template - typename StackArray::const_reverse_iterator StackArray::rbegin() const noexcept - { - return reverse_iterator(&m_ptr[m_size]); - } - - template - typename StackArray::reverse_iterator StackArray::rend() noexcept - { - return reverse_iterator(&m_ptr[0]); - } - - template - typename StackArray::const_reverse_iterator StackArray::rend() const noexcept - { - return reverse_iterator(&m_ptr[0]); - } - - template - typename StackArray::size_type StackArray::size() const noexcept - { - return m_size; - } - - template - typename StackArray::reference StackArray::operator[](size_type pos) - { - assert(pos < m_size); - return m_ptr[pos]; - } - - template - typename StackArray::const_reference StackArray::operator[](size_type pos) const - { - assert(pos < m_size); - return m_ptr[pos]; - } } #include diff --git a/include/Nazara/Core/StackArray.hpp b/include/Nazara/Core/StackArray.hpp new file mode 100644 index 000000000..1bed2b16c --- /dev/null +++ b/include/Nazara/Core/StackArray.hpp @@ -0,0 +1,93 @@ +// 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_STACKARRAY_HPP +#define NAZARA_STACKARRAY_HPP + +#include + +#ifdef NAZARA_ALLOCA_SUPPORT + #define NazaraStackArray(T, size) Nz::StackArray(static_cast(NAZARA_ALLOCA((size) * sizeof(T))), size) + #define NazaraStackArrayNoInit(T, size) Nz::StackArray(static_cast(NAZARA_ALLOCA((size) * sizeof(T))), size, typename Nz::StackArray::NoInitTag()) +#else + #define NazaraStackArray(T, size) Nz::StackArray(static_cast(Nz::OperatorNew((size) * sizeof(T))), size) + #define NazaraStackArrayNoInit(T, size) Nz::StackArray(static_cast(Nz::OperatorNew((size) * sizeof(T))), size, typename Nz::StackArray::NoInitTag()) +#endif + +#include +#include + +namespace Nz +{ + template + class StackArray + { + public: + struct NoInitTag {}; + + using value_type = T; + using const_iterator = const value_type*; + using const_pointer = const value_type*; + using const_reference = const value_type&; + using const_reverse_iterator = std::reverse_iterator; + using difference_type = std::ptrdiff_t; + using iterator = value_type*; + using pointer = value_type*; + using reference = value_type&; + using reverse_iterator = std::reverse_iterator; + using size_type = std::size_t; + + StackArray(T* stackMemory, std::size_t size); + StackArray(T* stackMemory, std::size_t size, NoInitTag); + ~StackArray(); + + reference back(); + const_reference back() const; + + iterator begin() noexcept; + const_iterator begin() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + T* data() noexcept; + const T* data() const noexcept; + + bool empty() const noexcept; + + iterator end() noexcept; + const_iterator end() const noexcept; + + void fill(const T& value); + + reference front() noexcept; + const_reference front() const noexcept; + + size_type max_size() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + size_type size() const noexcept; + + reference operator[](size_type pos); + const_reference operator[](size_type pos) const; + + private: + std::size_t m_size; + T* m_ptr; + }; + +} + +#include + +#endif // NAZARA_STACKARRAY_HPP diff --git a/include/Nazara/Core/StackArray.inl b/include/Nazara/Core/StackArray.inl new file mode 100644 index 000000000..989ffdf88 --- /dev/null +++ b/include/Nazara/Core/StackArray.inl @@ -0,0 +1,208 @@ +// 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 + +// I'm not proud of those five following lines but ti's hard to do with another way now +#ifdef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION + #define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION_DEFINED +#else + #define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION +#endif + +#include +#include +#include +#include +#include +#include +#include + +namespace Nz +{ + /*! + * \ingroup core + * \class Nz::StackArray + * \brief Core class that represents a stack-allocated (if alloca is present) array + */ + template + StackArray::StackArray(T* stackMemory, std::size_t size) : + m_size(size), + m_ptr(stackMemory) + { + for (std::size_t i = 0; i < m_size; ++i) + PlacementNew(&m_ptr[i]); + } + + template + StackArray::StackArray(T* stackMemory, std::size_t size, NoInitTag) : + m_size(size), + m_ptr(stackMemory) + { + } + + template + StackArray::~StackArray() + { + for (std::size_t i = 0; i < m_size; ++i) + PlacementDestroy(&m_ptr[i]); + + #ifndef NAZARA_ALLOCA_SUPPORT + OperatorDelete(m_ptr); + #endif + } + + template + typename StackArray::reference StackArray::back() + { + assert(m_size != 0); + return m_ptr[m_size - 1]; + } + + template + typename StackArray::const_reference StackArray::back() const + { + assert(m_size != 0); + return m_ptr[m_size - 1]; + } + + template + typename StackArray::iterator StackArray::begin() noexcept + { + return iterator(&m_ptr[0]); + } + + template + typename StackArray::const_iterator StackArray::begin() const noexcept + { + return const_iterator(&m_ptr[0]); + } + + template + typename StackArray::const_iterator StackArray::cbegin() const noexcept + { + return const_iterator(&m_ptr[0]); + } + + template + typename StackArray::const_iterator StackArray::cend() const noexcept + { + return const_iterator(&m_ptr[m_size]); + } + + template + typename StackArray::const_reverse_iterator StackArray::crbegin() const noexcept + { + return const_reverse_iterator(&m_ptr[m_size]); + } + + template + typename StackArray::const_reverse_iterator StackArray::crend() const noexcept + { + return const_reverse_iterator(&m_ptr[0]); + } + + template + T* StackArray::data() noexcept + { + return m_ptr; + } + + template + const T* StackArray::data() const noexcept + { + return m_ptr; + } + + template + bool StackArray::empty() const noexcept + { + return m_size == 0; + } + + template + typename StackArray::iterator StackArray::end() noexcept + { + return iterator(&m_ptr[m_size]); + } + + template + typename StackArray::const_iterator StackArray::end() const noexcept + { + return const_iterator(&m_ptr[m_size]); + } + + template + void StackArray::fill(const T& value) + { + std::fill(begin(), end(), value); + } + + template + typename StackArray::reference StackArray::front() noexcept + { + return m_ptr[0]; + } + + template + typename StackArray::const_reference StackArray::front() const noexcept + { + return m_ptr[0]; + } + + template + typename StackArray::size_type StackArray::max_size() const noexcept + { + return size(); + } + + template + typename StackArray::reverse_iterator StackArray::rbegin() noexcept + { + return reverse_iterator(&m_ptr[m_size]); + } + + template + typename StackArray::const_reverse_iterator StackArray::rbegin() const noexcept + { + return reverse_iterator(&m_ptr[m_size]); + } + + template + typename StackArray::reverse_iterator StackArray::rend() noexcept + { + return reverse_iterator(&m_ptr[0]); + } + + template + typename StackArray::const_reverse_iterator StackArray::rend() const noexcept + { + return reverse_iterator(&m_ptr[0]); + } + + template + typename StackArray::size_type StackArray::size() const noexcept + { + return m_size; + } + + template + typename StackArray::reference StackArray::operator[](size_type pos) + { + assert(pos < m_size); + return m_ptr[pos]; + } + + template + typename StackArray::const_reference StackArray::operator[](size_type pos) const + { + assert(pos < m_size); + return m_ptr[pos]; + } +} + +#include + +// If we have defined the constant, then we have to undefine it (to avoid bloating in the engine) +#ifndef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION_DEFINED + #undef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION +#endif diff --git a/src/Nazara/Core/Posix/DirectoryImpl.cpp b/src/Nazara/Core/Posix/DirectoryImpl.cpp index e688aabf6..e0a7968f0 100644 --- a/src/Nazara/Core/Posix/DirectoryImpl.cpp +++ b/src/Nazara/Core/Posix/DirectoryImpl.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include #include @@ -39,7 +39,7 @@ namespace Nz std::size_t resultNameSize = std::strlen(m_result->d_name); std::size_t fullNameSize = pathSize + 1 + resultNameSize; - StackArray fullName = NazaraStackAllocationNoInit(char, fullNameSize + 1); + StackArray fullName = NazaraStackArrayNoInit(char, fullNameSize + 1); std::memcpy(&fullName[0], path.GetConstBuffer(), pathSize * sizeof(char)); fullName[pathSize] = '/'; std::memcpy(&fullName[pathSize + 1], m_result->d_name, resultNameSize * sizeof(char)); diff --git a/src/Nazara/Network/Posix/SocketImpl.cpp b/src/Nazara/Network/Posix/SocketImpl.cpp index c8140f019..7f94f5a9d 100644 --- a/src/Nazara/Network/Posix/SocketImpl.cpp +++ b/src/Nazara/Network/Posix/SocketImpl.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include #include @@ -574,7 +574,7 @@ namespace Nz NazaraAssert(handle != InvalidHandle, "Invalid handle"); NazaraAssert(buffers && bufferCount > 0, "Invalid buffers"); - StackArray sysBuffers = NazaraStackAllocation(iovec, bufferCount); + StackArray sysBuffers = NazaraStackArray(iovec, bufferCount); for (std::size_t i = 0; i < bufferCount; ++i) { sysBuffers[i].iov_base = buffers[i].data; @@ -698,7 +698,7 @@ namespace Nz NazaraAssert(handle != InvalidHandle, "Invalid handle"); NazaraAssert(buffers && bufferCount > 0, "Invalid buffers"); - StackArray sysBuffers = NazaraStackAllocation(iovec, bufferCount); + StackArray sysBuffers = NazaraStackArray(iovec, bufferCount); for (std::size_t i = 0; i < bufferCount; ++i) { sysBuffers[i].iov_base = buffers[i].data; diff --git a/src/Nazara/Network/Win32/SocketImpl.cpp b/src/Nazara/Network/Win32/SocketImpl.cpp index 6d2e33f7f..15b89801b 100644 --- a/src/Nazara/Network/Win32/SocketImpl.cpp +++ b/src/Nazara/Network/Win32/SocketImpl.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include // Some compilers (older versions of MinGW) lack Mstcpip.h which defines some structs/defines @@ -615,7 +615,7 @@ namespace Nz IpAddress senderIp; - StackArray winBuffers = NazaraStackAllocation(WSABUF, bufferCount); + StackArray winBuffers = NazaraStackArray(WSABUF, bufferCount); for (std::size_t i = 0; i < bufferCount; ++i) { winBuffers[i].buf = static_cast(buffers[i].data); @@ -714,7 +714,7 @@ namespace Nz IpAddressImpl::SockAddrBuffer nameBuffer; int bufferLength = IpAddressImpl::ToSockAddr(to, nameBuffer.data()); - StackArray winBuffers = NazaraStackAllocation(WSABUF, bufferCount); + StackArray winBuffers = NazaraStackArray(WSABUF, bufferCount); for (std::size_t i = 0; i < bufferCount; ++i) { winBuffers[i].buf = static_cast(buffers[i].data); diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp index ea648b197..b967e63e5 100644 --- a/src/Nazara/Physics2D/PhysWorld2D.cpp +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -3,7 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include -#include +#include #include #include @@ -44,7 +44,7 @@ namespace Nz { //TODO: constexpr if to prevent copy/cast if sizeof(cpVect) == sizeof(Vector2f) - StackArray nVertices = NazaraStackAllocation(Vector2f, vertexCount); + StackArray nVertices = NazaraStackArray(Vector2f, vertexCount); for (int i = 0; i < vertexCount; ++i) nVertices[i].Set(float(vertices[i].x), float(vertices[i].y)); diff --git a/src/Nazara/Physics3D/PhysWorld3D.cpp b/src/Nazara/Physics3D/PhysWorld3D.cpp index e85ddcf0b..225c28b9e 100644 --- a/src/Nazara/Physics3D/PhysWorld3D.cpp +++ b/src/Nazara/Physics3D/PhysWorld3D.cpp @@ -3,7 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include -#include +#include #include #include #include @@ -173,7 +173,7 @@ namespace Nz using ContactJoint = void*; // Query all joints first, to prevent removing a joint from the list while iterating on it - StackArray contacts = NazaraStackAllocationNoInit(ContactJoint, NewtonContactJointGetContactCount(contactJoint)); + StackArray contacts = NazaraStackArray(ContactJoint, NewtonContactJointGetContactCount(contactJoint)); std::size_t contactIndex = 0; for (ContactJoint contact = NewtonContactJointGetFirstContact(contactJoint); contact; contact = NewtonContactJointGetNextContact(contactJoint, contact)) { diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index d2a3ed7e1..57f90ea3d 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -8,8 +8,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -1762,7 +1762,7 @@ namespace Nz glGetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxLength); maxLength++; - StackArray nameBuffer = NazaraStackAllocation(GLchar, maxLength + 1); + StackArray nameBuffer = NazaraStackArray(GLchar, maxLength + 1); for (GLint i = 0; i < count; i++) { GLint size; From 7da0fffe07e3ce4d4bd5cb0ea140d3092de4ca65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 2 Jul 2018 17:56:27 +0200 Subject: [PATCH 026/352] Core: Add StackVector class --- include/Nazara/Core/StackVector.hpp | 112 +++++++++ include/Nazara/Core/StackVector.inl | 334 +++++++++++++++++++++++++++ src/Nazara/Physics3D/PhysWorld3D.cpp | 10 +- tests/Engine/Core/StackVector.cpp | 175 ++++++++++++++ 4 files changed, 624 insertions(+), 7 deletions(-) create mode 100644 include/Nazara/Core/StackVector.hpp create mode 100644 include/Nazara/Core/StackVector.inl create mode 100644 tests/Engine/Core/StackVector.cpp diff --git a/include/Nazara/Core/StackVector.hpp b/include/Nazara/Core/StackVector.hpp new file mode 100644 index 000000000..18d7e7437 --- /dev/null +++ b/include/Nazara/Core/StackVector.hpp @@ -0,0 +1,112 @@ +// 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_STACKVECTOR_HPP +#define NAZARA_STACKVECTOR_HPP + +#include + +#ifdef NAZARA_ALLOCA_SUPPORT + #define NazaraStackVector(T, capacity) Nz::StackVector(static_cast(NAZARA_ALLOCA((capacity) * sizeof(T))), capacity) +#else + #define NazaraStackVector(T, capacity) Nz::StackVector(static_cast(Nz::OperatorNew((capacity) * sizeof(T))), capacity) +#endif + +#include +#include +#include + +namespace Nz +{ + template + class StackVector + { + public: + using value_type = T; + using const_iterator = const value_type*; + using const_pointer = const value_type*; + using const_reference = const value_type&; + using const_reverse_iterator = std::reverse_iterator; + using difference_type = std::ptrdiff_t; + using iterator = value_type*; + using pointer = value_type*; + using reference = value_type&; + using reverse_iterator = std::reverse_iterator; + using size_type = std::size_t; + + StackVector(T* stackMemory, std::size_t capacity); + ~StackVector(); + + reference back(); + const_reference back() const; + + iterator begin() noexcept; + const_iterator begin() const noexcept; + + size_type capacity() const noexcept; + + void clear() noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + T* data() noexcept; + const T* data() const noexcept; + + template + iterator emplace(const_iterator pos, Args&&... args); + + template + reference emplace_back(Args&&... args); + + bool empty() const noexcept; + + iterator end() noexcept; + const_iterator end() const noexcept; + + iterator erase(const_iterator pos); + iterator erase(const_iterator first, const_iterator last); + + reference front() noexcept; + const_reference front() const noexcept; + + iterator insert(const_iterator pos, const T& value); + iterator insert(const_iterator pos, T&& value); + + size_type max_size() const noexcept; + + reference push_back(const T& value) noexcept(std::is_nothrow_copy_constructible::value); + reference push_back(T&& value) noexcept(std::is_nothrow_move_constructible::value); + + void pop_back(); + + void resize(size_type count); + void resize(size_type count, const value_type& value); + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + size_type size() const noexcept; + + reference operator[](size_type pos); + const_reference operator[](size_type pos) const; + + private: + std::size_t m_capacity; + std::size_t m_size; + T* m_ptr; + }; + +} + +#include + +#endif // NAZARA_STACKVECTOR_HPP diff --git a/include/Nazara/Core/StackVector.inl b/include/Nazara/Core/StackVector.inl new file mode 100644 index 000000000..e2012fe32 --- /dev/null +++ b/include/Nazara/Core/StackVector.inl @@ -0,0 +1,334 @@ +// 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 + +// I'm not proud of those five following lines but ti's hard to do with another way now +#ifdef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION + #define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION_DEFINED +#else + #define NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION +#endif + +#include +#include +#include +#include +#include +#include +#include + +namespace Nz +{ + /*! + * \ingroup core + * \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(T* stackMemory, std::size_t capacity) : + m_capacity(capacity), + m_size(0), + m_ptr(stackMemory) + { + } + + template + StackVector::~StackVector() + { + clear(); + + #ifndef NAZARA_ALLOCA_SUPPORT + OperatorDelete(m_ptr); + #endif + } + + template + typename StackVector::reference StackVector::back() + { + assert(m_size != 0); + return m_ptr[m_size - 1]; + } + + template + typename StackVector::const_reference StackVector::back() const + { + assert(m_size != 0); + return m_ptr[m_size - 1]; + } + + template + typename StackVector::iterator StackVector::begin() noexcept + { + return iterator(&m_ptr[0]); + } + + template + typename StackVector::const_iterator StackVector::begin() const noexcept + { + return const_iterator(&m_ptr[0]); + } + + template + typename StackVector::size_type StackVector::capacity() const noexcept + { + return m_capacity; + } + + template + void StackVector::clear() noexcept + { + resize(0); + } + + template + typename StackVector::const_iterator StackVector::cbegin() const noexcept + { + return const_iterator(&m_ptr[0]); + } + + template + typename StackVector::const_iterator StackVector::cend() const noexcept + { + return const_iterator(&m_ptr[m_size]); + } + + template + typename StackVector::const_reverse_iterator StackVector::crbegin() const noexcept + { + return const_reverse_iterator(&m_ptr[m_size]); + } + + template + typename StackVector::const_reverse_iterator StackVector::crend() const noexcept + { + return const_reverse_iterator(&m_ptr[0]); + } + + template + T* StackVector::data() noexcept + { + return m_ptr; + } + + template + const T* StackVector::data() const noexcept + { + return m_ptr; + } + + template + template + typename StackVector::iterator StackVector::emplace(const_iterator pos, Args&& ...args) + { + assert(m_size < m_capacity); + assert(pos >= begin() && pos <= end()); + + std::size_t index = std::distance(begin(), 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]); + } + m_size++; + + return PlacementNew(&m_ptr[index], std::forward(args)...); + } + + template + template + typename StackVector::reference Nz::StackVector::emplace_back(Args&&... args) + { + assert(m_size < m_capacity); + return *PlacementNew(&m_ptr[m_size++], std::forward(args)...); + } + + template + bool StackVector::empty() const noexcept + { + return m_size == 0; + } + + template + typename StackVector::iterator StackVector::end() noexcept + { + return iterator(&m_ptr[m_size]); + } + + template + typename StackVector::const_iterator StackVector::end() const noexcept + { + return const_iterator(&m_ptr[m_size]); + } + + template + 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); + pop_back(); + + return iterator(&m_ptr[index]); + } + + template + typename StackVector::iterator StackVector::erase(const_iterator first, const_iterator last) + { + if (first == last) + return first; + + 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)); + + return iterator(&m_ptr[index]); + } + + template + typename StackVector::reference StackVector::front() noexcept + { + return m_ptr[0]; + } + + template + typename StackVector::const_reference StackVector::front() const noexcept + { + return m_ptr[0]; + } + + template + typename StackVector::iterator StackVector::insert(const_iterator pos, const T& value) + { + return emplace(pos, value); + } + + template + typename StackVector::iterator StackVector::insert(const_iterator pos, T&& value) + { + return emplace(pos, std::move(value)); + } + + template + typename StackVector::size_type StackVector::max_size() const noexcept + { + return capacity(); + } + + template + typename StackVector::reference StackVector::push_back(const T& value) noexcept(std::is_nothrow_copy_constructible::value) + { + assert(m_size < m_capacity); + return *PlacementNew(&m_ptr[m_size++], value); + } + + template + typename StackVector::reference StackVector::push_back(T&& value) noexcept(std::is_nothrow_move_constructible::value) + { + assert(m_size < m_capacity); + return *PlacementNew(&m_ptr[m_size++], std::move(value)); + } + + template + void StackVector::pop_back() + { + assert(!empty()); + PlacementDestroy(&m_ptr[--m_size]); + } + + template + void StackVector::resize(size_type count) + { + assert(count < m_capacity); + if (count > m_size) + { + for (std::size_t i = m_size; i < count; ++i) + PlacementNew(&m_ptr[i]); + + m_size = count; + } + else if (count < m_size) + { + for (std::size_t i = count; i < m_size; ++i) + PlacementNew(&m_ptr[i]); + + m_size = count; + } + } + + template + void StackVector::resize(size_type count, const value_type& value) + { + assert(count < m_capacity); + if (count > m_size) + { + for (std::size_t i = m_size; i < count; ++i) + PlacementNew(&m_ptr[i], value); + + m_size = count; + } + else if (count < m_size) + { + for (std::size_t i = count; i < m_size; ++i) + PlacementDestroy(&m_ptr[i]); + + m_size = count; + } + } + + template + typename StackVector::reverse_iterator StackVector::rbegin() noexcept + { + return reverse_iterator(&m_ptr[m_size]); + } + + template + typename StackVector::const_reverse_iterator StackVector::rbegin() const noexcept + { + return reverse_iterator(&m_ptr[m_size]); + } + + template + typename StackVector::reverse_iterator StackVector::rend() noexcept + { + return reverse_iterator(&m_ptr[0]); + } + + template + typename StackVector::const_reverse_iterator StackVector::rend() const noexcept + { + return reverse_iterator(&m_ptr[0]); + } + + template + typename StackVector::size_type StackVector::size() const noexcept + { + return m_size; + } + + template + typename StackVector::reference StackVector::operator[](size_type pos) + { + assert(pos < m_size); + return m_ptr[pos]; + } + + template + typename StackVector::const_reference StackVector::operator[](size_type pos) const + { + assert(pos < m_size); + return m_ptr[pos]; + } +} + +#include + +// If we have defined the constant, then we have to undefine it (to avoid bloating in the engine) +#ifndef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION_DEFINED + #undef NAZARA_DEBUG_NEWREDEFINITION_DISABLE_REDEFINITION +#endif diff --git a/src/Nazara/Physics3D/PhysWorld3D.cpp b/src/Nazara/Physics3D/PhysWorld3D.cpp index 225c28b9e..01ed2226b 100644 --- a/src/Nazara/Physics3D/PhysWorld3D.cpp +++ b/src/Nazara/Physics3D/PhysWorld3D.cpp @@ -3,7 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include -#include +#include #include #include #include @@ -173,13 +173,9 @@ namespace Nz using ContactJoint = void*; // Query all joints first, to prevent removing a joint from the list while iterating on it - StackArray contacts = NazaraStackArray(ContactJoint, NewtonContactJointGetContactCount(contactJoint)); - std::size_t contactIndex = 0; + StackVector contacts = NazaraStackVector(ContactJoint, NewtonContactJointGetContactCount(contactJoint)); for (ContactJoint contact = NewtonContactJointGetFirstContact(contactJoint); contact; contact = NewtonContactJointGetNextContact(contactJoint, contact)) - { - assert(contactIndex < contacts.size()); - contacts[contactIndex++] = contact; - } + contacts.push_back(contact); for (ContactJoint contact : contacts) { diff --git a/tests/Engine/Core/StackVector.cpp b/tests/Engine/Core/StackVector.cpp new file mode 100644 index 000000000..ceb36da89 --- /dev/null +++ b/tests/Engine/Core/StackVector.cpp @@ -0,0 +1,175 @@ +#include +#include +#include +#include + +SCENARIO("StackVector", "[CORE][STACKVECTOR]") +{ + GIVEN("A StackVector to contain multiple int") + { + volatile std::size_t capacity = 50; + Nz::StackVector vector = NazaraStackVector(int, capacity); + + 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) + { + int val = int(i); + CHECK(vector.emplace_back(val) == val); + } + + 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) + { + int val = int(i); + CHECK(vector.push_back(val) == val); + } + + 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 }; + 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); + } + } + } + + WHEN("We generate its content will iota") + { + vector.resize(10); + std::iota(vector.begin(), vector.end(), -5); + + std::array expectedValues = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4 }; + 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) + { + int val = int(i); + CHECK(*vector.emplace(vector.end(), val) == val); + } + + 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) + { + int val = int(i); + CHECK(*vector.emplace(vector.begin(), val) == val); + } + + 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) + { + int val = int(i); + CHECK(*vector.emplace(vector.begin() + i / 2, val) == val); + } + + 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) + { + int val = int(i); + CHECK(*vector.insert(vector.end(), val) == val); + } + + 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) + { + int val = int(i); + CHECK(*vector.insert(vector.begin(), val) == val); + } + + 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) + { + int val = int(i); + CHECK(*vector.insert(vector.begin() + i / 2, val) == val); + } + + 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())); + } + } +} From e4b67019cb504f37aefb831f1ddec93e36e89707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 2 Jul 2018 18:13:14 +0200 Subject: [PATCH 027/352] Math/Vector[2|3]: Removed Distancef and made Distance templated --- ChangeLog.md | 3 +++ include/Nazara/Math/Vector2.hpp | 5 ++-- include/Nazara/Math/Vector2.inl | 36 +++++++++++++++----------- include/Nazara/Math/Vector3.hpp | 7 +++--- include/Nazara/Math/Vector3.inl | 39 +++++------------------------ tests/Engine/Core/AlgorithmCore.cpp | 6 ++--- 6 files changed, 39 insertions(+), 57 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8690c48e0..167062f6c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -121,6 +121,9 @@ Nazara Engine: - Added ObjectLibrary::Clear method - ⚠️ StackArray class and macro was moved from Core/MemoryHelper.hpp to Core/StackArray.hpp - ⚠️ Renamed NazaraStackAllocation[NoInit] macro to NazaraStackArray[NoInit] +- Added StackVector class +- ⚠️ Removed Vector[2|3]::Distancef method and made Distance method templated +- Added Vector2::Distance static method Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Math/Vector2.hpp b/include/Nazara/Math/Vector2.hpp index 6a7f925f6..28985305e 100644 --- a/include/Nazara/Math/Vector2.hpp +++ b/include/Nazara/Math/Vector2.hpp @@ -33,8 +33,8 @@ namespace Nz T AbsDotProduct(const Vector2& vec) const; T AngleBetween(const Vector2& vec) const; - T Distance(const Vector2& vec) const; - float Distancef(const Vector2& vec) const; + template + U Distance(const Vector2& vec) const; T DotProduct(const Vector2& vec) const; T GetLength() const; @@ -92,6 +92,7 @@ namespace Nz bool operator>(const Vector2& vec) const; bool operator>=(const Vector2& vec) const; + template static U Distance(const Vector2& vec1, const Vector2& vec2); static T DotProduct(const Vector2& vec1, const Vector2& vec2); static Vector2 Lerp(const Vector2& from, const Vector2& to, T interpolation); static Vector2 Normalize(const Vector2& vec); diff --git a/include/Nazara/Math/Vector2.inl b/include/Nazara/Math/Vector2.inl index c33af8102..15739b024 100644 --- a/include/Nazara/Math/Vector2.inl +++ b/include/Nazara/Math/Vector2.inl @@ -124,22 +124,10 @@ namespace Nz */ template - T Vector2::Distance(const Vector2& vec) const + template + U Vector2::Distance(const Vector2& vec) const { - return std::sqrt(SquaredDistance(vec)); - } - - /*! - * \brief Calculates the distance between two vectors - * \return The metric distance in float between two vectors with euclidean norm - * - * \param vec The other vector to measure the distance with - */ - - template - float Vector2::Distancef(const Vector2& vec) const - { - return std::sqrt(static_cast(SquaredDistance(vec))); + return static_cast(std::sqrt(SquaredDistance(vec))); } /*! @@ -835,6 +823,24 @@ namespace Nz return !operator<(vec); } + /*! + * \brief Measure the distance between two points + * Shorthand for vec1.Distance(vec2) + * + * param vec1 the first point + * param vec2 the second point + * + * \return The distance between the two vectors + * + * \see SquaredDistance + */ + template + template + U Vector2::Distance(const Vector2& vec1, const Vector2& vec2) + { + return vec1.Distance(vec2); + } + /*! * \brief Calculates the dot (scalar) product with two vectors * \return The value of the dot product diff --git a/include/Nazara/Math/Vector3.hpp b/include/Nazara/Math/Vector3.hpp index 7aed07d6a..4bd026acf 100644 --- a/include/Nazara/Math/Vector3.hpp +++ b/include/Nazara/Math/Vector3.hpp @@ -36,8 +36,8 @@ namespace Nz Vector3 CrossProduct(const Vector3& vec) const; - T Distance(const Vector3& vec) const; - float Distancef(const Vector3& vec) const; + template + U Distance(const Vector3& vec) const; T DotProduct(const Vector3& vec) const; T GetLength() const; @@ -106,8 +106,7 @@ namespace Nz static Vector3 Backward(); static Vector3 CrossProduct(const Vector3& vec1, const Vector3& vec2); static T DotProduct(const Vector3& vec1, const Vector3& vec2); - static T Distance(const Vector3& vec1, const Vector3& vec2); - static float Distancef(const Vector3& vec1, const Vector3& vec2); + template static U Distance(const Vector3& vec1, const Vector3& vec2); static Vector3 Down(); static Vector3 Forward(); static Vector3 Left(); diff --git a/include/Nazara/Math/Vector3.inl b/include/Nazara/Math/Vector3.inl index 8ed7c6977..5a77c8e05 100644 --- a/include/Nazara/Math/Vector3.inl +++ b/include/Nazara/Math/Vector3.inl @@ -162,21 +162,10 @@ namespace Nz * \see SquaredDistance */ template - T Vector3::Distance(const Vector3& vec) const + template + U Vector3::Distance(const Vector3& vec) const { - return std::sqrt(SquaredDistance(vec)); - } - - /*! - * \brief Calculates the distance between two vectors - * \return The metric distance in float between two vectors with euclidean norm - * - * \param vec The other vector to measure the distance with - */ - template - float Vector3::Distancef(const Vector3& vec) const - { - return std::sqrt(static_cast(SquaredDistance(vec))); + return static_cast(std::sqrt(SquaredDistance(vec))); } /*! @@ -1014,26 +1003,10 @@ namespace Nz * \see SquaredDistance */ template - T Vector3::Distance(const Vector3& vec1, const Vector3& vec2) + template + U Vector3::Distance(const Vector3& vec1, const Vector3& vec2) { - return vec1.Distance(vec2); - } - - /*! - * \brief Measure the distance between two points as a float - * Shorthand for vec1.Distancef(vec2) - * - * param vec1 the first point - * param vec2 the second point - * - * \return The distance between the two vectors as a float - * - * \see SquaredDistancef - */ - template - float Vector3::Distancef(const Vector3& vec1, const Vector3& vec2) - { - return vec1.Distancef(vec2); + return vec1.Distance(vec2); } /*! diff --git a/tests/Engine/Core/AlgorithmCore.cpp b/tests/Engine/Core/AlgorithmCore.cpp index 39e06c566..59ac435bb 100644 --- a/tests/Engine/Core/AlgorithmCore.cpp +++ b/tests/Engine/Core/AlgorithmCore.cpp @@ -18,14 +18,14 @@ TEST_CASE("Apply", "[CORE][ALGORITHM]") REQUIRE(result == (Nz::Vector2::Unit() * 2)); } - SECTION("Apply member function to vector2") + /*SECTION("Apply member function to vector2") { Nz::Vector2 vector = Nz::Vector2::Unit(); - int result = Nz::Apply(vector, &Nz::Vector2::Distance, std::make_tuple(vector)); + int result = Nz::Apply(vector, (int(Nz::Vector2::*)(const Nz::Vector2&)) &Nz::Vector2::Distance, std::make_tuple(vector)); REQUIRE(result == 0); - } + }*/ } TEST_CASE("ComputeHash", "[CORE][ALGORITHM]") From aafb79f06c419d92c380ae95af7326093d4f062a Mon Sep 17 00:00:00 2001 From: S6066 Date: Fri, 6 Jul 2018 10:42:23 +0200 Subject: [PATCH 028/352] Fix: destroy instead of constructing (#169) --- include/Nazara/Core/StackVector.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Nazara/Core/StackVector.inl b/include/Nazara/Core/StackVector.inl index e2012fe32..c8b71a5cb 100644 --- a/include/Nazara/Core/StackVector.inl +++ b/include/Nazara/Core/StackVector.inl @@ -255,7 +255,7 @@ namespace Nz else if (count < m_size) { for (std::size_t i = count; i < m_size; ++i) - PlacementNew(&m_ptr[i]); + PlacementDestroy(&m_ptr[i]); m_size = count; } From cb6885d6a96a1d826a6bbb27410fcfc31a1d94ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 6 Jul 2018 15:24:30 +0200 Subject: [PATCH 029/352] Graphics/CullingList: Fix compilation errors on MSVC with /permissive- --- ChangeLog.md | 1 + .../NDK/Components/GraphicsComponent.inl | 4 +-- include/Nazara/Graphics/CullingList.hpp | 24 +++++++++++---- include/Nazara/Graphics/CullingList.inl | 30 ++++++++----------- 4 files changed, 34 insertions(+), 25 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 167062f6c..6ec9c8c54 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -124,6 +124,7 @@ Nazara Engine: - Added StackVector class - ⚠️ Removed Vector[2|3]::Distancef method and made Distance method templated - Added Vector2::Distance static method +- ⚠️ Fixed compilation error on MSVC with flag /permissive- on CullingList class Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/include/NDK/Components/GraphicsComponent.inl b/SDK/include/NDK/Components/GraphicsComponent.inl index 69be82ba0..8ddd3e223 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.inl +++ b/SDK/include/NDK/Components/GraphicsComponent.inl @@ -37,10 +37,10 @@ namespace Ndk inline void GraphicsComponent::AddToCullingList(GraphicsComponentCullingList* cullingList) const { - m_volumeCullingEntries.emplace_back(VolumeCullingEntry{}); + m_volumeCullingEntries.emplace_back(); VolumeCullingEntry& entry = m_volumeCullingEntries.back(); entry.cullingListReleaseSlot.Connect(cullingList->OnCullingListRelease, this, &GraphicsComponent::RemoveFromCullingList); - entry.listEntry = cullingList->RegisterVolumeTest(this); + cullingList->RegisterVolumeTest(this, &entry.listEntry); InvalidateBoundingVolume(); } diff --git a/include/Nazara/Graphics/CullingList.hpp b/include/Nazara/Graphics/CullingList.hpp index 7232e9cdb..85b4ce2f9 100644 --- a/include/Nazara/Graphics/CullingList.hpp +++ b/include/Nazara/Graphics/CullingList.hpp @@ -41,9 +41,9 @@ namespace Nz std::size_t Cull(const Frustumf& frustum, bool* forceInvalidation = nullptr); - NoTestEntry RegisterNoTest(const T* renderable); - SphereEntry RegisterSphereTest(const T* renderable); - VolumeEntry RegisterVolumeTest(const T* renderable); + void RegisterNoTest(const T* renderable, NoTestEntry* entry); + void RegisterSphereTest(const T* renderable, SphereEntry* entry); + void RegisterVolumeTest(const T* renderable, VolumeEntry* entry); CullingList& operator=(const CullingList& renderable) = delete; CullingList& operator=(CullingList&& renderable) = delete; @@ -135,41 +135,53 @@ namespace Nz }; template - class CullingList::NoTestEntry : public CullingList::template Entry + class CullingList::NoTestEntry : public CullingList::template Entry { friend CullingList; public: NoTestEntry(); + NoTestEntry(NoTestEntry&&) = default; + ~NoTestEntry() = default; + + NoTestEntry& operator=(NoTestEntry&&) = default; private: NoTestEntry(CullingList* parent, std::size_t index); }; template - class CullingList::SphereEntry : public CullingList::template Entry + class CullingList::SphereEntry : public CullingList::template Entry { friend CullingList; public: SphereEntry(); + SphereEntry(SphereEntry&&) = default; + ~SphereEntry() = default; void UpdateSphere(const Spheref& sphere); + SphereEntry& operator=(SphereEntry&&) = default; + private: SphereEntry(CullingList* parent, std::size_t index); }; template - class CullingList::VolumeEntry : public CullingList::template Entry + class CullingList::VolumeEntry : public CullingList::template Entry { friend CullingList; public: VolumeEntry(); + VolumeEntry(VolumeEntry&&) = default; + ~VolumeEntry() = default; void UpdateVolume(const BoundingVolumef& sphere); + VolumeEntry& operator=(VolumeEntry&&) = default; + private: VolumeEntry(CullingList* parent, std::size_t index); }; diff --git a/include/Nazara/Graphics/CullingList.inl b/include/Nazara/Graphics/CullingList.inl index 238468b47..71cb57fe3 100644 --- a/include/Nazara/Graphics/CullingList.inl +++ b/include/Nazara/Graphics/CullingList.inl @@ -71,30 +71,26 @@ namespace Nz } template - typename CullingList::NoTestEntry CullingList::RegisterNoTest(const T* renderable) + void CullingList::RegisterNoTest(const T* renderable, NoTestEntry* entry) { - NoTestEntry entry(this, m_noTestList.size()); - m_noTestList.emplace_back(NoTestVisibilityEntry{&entry, renderable, false}); //< Address of entry will be updated when moving + *entry = NoTestEntry(this, m_noTestList.size()); + m_noTestList.emplace_back(NoTestVisibilityEntry{entry, renderable, false}); //< Address of entry will be updated when moving + } + + template + void CullingList::RegisterSphereTest(const T* renderable, SphereEntry* entry) + { + *entry = SphereEntry(this, m_sphereTestList.size()); + m_sphereTestList.emplace_back(SphereVisibilityEntry{Nz::Spheref(), entry, renderable, false}); //< Address of entry will be updated when moving return entry; } template - typename CullingList::SphereEntry CullingList::RegisterSphereTest(const T* renderable) + void CullingList::RegisterVolumeTest(const T* renderable, VolumeEntry* entry) { - SphereEntry entry(this, m_sphereTestList.size()); - m_sphereTestList.emplace_back(SphereVisibilityEntry{Nz::Spheref(), &entry, renderable, false}); //< Address of entry will be updated when moving - - return entry; - } - - template - typename CullingList::VolumeEntry CullingList::RegisterVolumeTest(const T* renderable) - { - VolumeEntry entry(this, m_volumeTestList.size()); - m_volumeTestList.emplace_back(VolumeVisibilityEntry{Nz::BoundingVolumef(), &entry, renderable, false}); //< Address of entry will be updated when moving - - return entry; + *entry = VolumeEntry(this, m_volumeTestList.size()); + m_volumeTestList.emplace_back(VolumeVisibilityEntry{Nz::BoundingVolumef(), entry, renderable, false}); //< Address of entry will be updated when moving } // Interface STD From 6390da95d39e4c6fb6eae98581e96baac2149555 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 7 Jul 2018 14:35:11 +0200 Subject: [PATCH 030/352] Fix previous commit crash --- .../NDK/Components/GraphicsComponent.inl | 2 +- include/Nazara/Graphics/CullingList.hpp | 6 ++--- include/Nazara/Graphics/CullingList.inl | 24 +++++++++++-------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/SDK/include/NDK/Components/GraphicsComponent.inl b/SDK/include/NDK/Components/GraphicsComponent.inl index 8ddd3e223..08dc3c867 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.inl +++ b/SDK/include/NDK/Components/GraphicsComponent.inl @@ -40,7 +40,7 @@ namespace Ndk m_volumeCullingEntries.emplace_back(); VolumeCullingEntry& entry = m_volumeCullingEntries.back(); entry.cullingListReleaseSlot.Connect(cullingList->OnCullingListRelease, this, &GraphicsComponent::RemoveFromCullingList); - cullingList->RegisterVolumeTest(this, &entry.listEntry); + entry.listEntry = cullingList->RegisterVolumeTest(this); InvalidateBoundingVolume(); } diff --git a/include/Nazara/Graphics/CullingList.hpp b/include/Nazara/Graphics/CullingList.hpp index 85b4ce2f9..af48f2542 100644 --- a/include/Nazara/Graphics/CullingList.hpp +++ b/include/Nazara/Graphics/CullingList.hpp @@ -41,9 +41,9 @@ namespace Nz std::size_t Cull(const Frustumf& frustum, bool* forceInvalidation = nullptr); - void RegisterNoTest(const T* renderable, NoTestEntry* entry); - void RegisterSphereTest(const T* renderable, SphereEntry* entry); - void RegisterVolumeTest(const T* renderable, VolumeEntry* entry); + NoTestEntry RegisterNoTest(const T* renderable); + SphereEntry RegisterSphereTest(const T* renderable); + VolumeEntry RegisterVolumeTest(const T* renderable); CullingList& operator=(const CullingList& renderable) = delete; CullingList& operator=(CullingList&& renderable) = delete; diff --git a/include/Nazara/Graphics/CullingList.inl b/include/Nazara/Graphics/CullingList.inl index 71cb57fe3..5580efd8b 100644 --- a/include/Nazara/Graphics/CullingList.inl +++ b/include/Nazara/Graphics/CullingList.inl @@ -71,26 +71,30 @@ namespace Nz } template - void CullingList::RegisterNoTest(const T* renderable, NoTestEntry* entry) + auto CullingList::RegisterNoTest(const T* renderable) -> NoTestEntry { - *entry = NoTestEntry(this, m_noTestList.size()); - m_noTestList.emplace_back(NoTestVisibilityEntry{entry, renderable, false}); //< Address of entry will be updated when moving + NoTestEntry newEntry(this, m_volumeTestList.size()); + m_noTestList.emplace_back(NoTestVisibilityEntry{&newEntry, renderable, false}); //< Address of entry will be updated when moving + + return newEntry; } template - void CullingList::RegisterSphereTest(const T* renderable, SphereEntry* entry) + auto CullingList::RegisterSphereTest(const T* renderable) -> SphereEntry { - *entry = SphereEntry(this, m_sphereTestList.size()); - m_sphereTestList.emplace_back(SphereVisibilityEntry{Nz::Spheref(), entry, renderable, false}); //< Address of entry will be updated when moving + SphereEntry newEntry(this, m_sphereTestList.size() - 1); + m_sphereTestList.emplace_back(SphereVisibilityEntry{Nz::Spheref(), &newEntry, renderable, false}); //< Address of entry will be updated when moving - return entry; + return newEntry; } template - void CullingList::RegisterVolumeTest(const T* renderable, VolumeEntry* entry) + auto CullingList::RegisterVolumeTest(const T* renderable) -> VolumeEntry { - *entry = VolumeEntry(this, m_volumeTestList.size()); - m_volumeTestList.emplace_back(VolumeVisibilityEntry{Nz::BoundingVolumef(), entry, renderable, false}); //< Address of entry will be updated when moving + VolumeEntry newEntry(this, m_volumeTestList.size()); + m_volumeTestList.emplace_back(VolumeVisibilityEntry{Nz::BoundingVolumef(), &newEntry, renderable, false}); //< Address of entry will be updated when moving + + return newEntry; } // Interface STD From a87095476249c6eca4e8135d9510a2799877b746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 9 Jul 2018 18:06:08 +0200 Subject: [PATCH 031/352] Network/ENetPeer: Fix reliable sequence number wrap error --- ChangeLog.md | 3 ++- src/Nazara/Network/ENetPeer.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 6ec9c8c54..39d2b3431 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -124,7 +124,8 @@ Nazara Engine: - Added StackVector class - ⚠️ Removed Vector[2|3]::Distancef method and made Distance method templated - Added Vector2::Distance static method -- ⚠️ Fixed compilation error on MSVC with flag /permissive- on CullingList class +- ⚠️ Fixed compilation errors on MSVC with flag /permissive- on CullingList class +- Fixed bug in ENet implementation causing legit reliable packets to be dropped on sequence number overflow Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Network/ENetPeer.cpp b/src/Nazara/Network/ENetPeer.cpp index 38189361b..a26423bb4 100644 --- a/src/Nazara/Network/ENetPeer.cpp +++ b/src/Nazara/Network/ENetPeer.cpp @@ -347,7 +347,7 @@ namespace Nz { IncomingCommmand& incomingCommand = *currentCommand; - if (incomingCommand.fragmentsRemaining > 0 || incomingCommand.reliableSequenceNumber != (channel.incomingReliableSequenceNumber + 1)) + if (incomingCommand.fragmentsRemaining > 0 || incomingCommand.reliableSequenceNumber != Nz::UInt16(channel.incomingReliableSequenceNumber + 1)) break; channel.incomingReliableSequenceNumber = incomingCommand.reliableSequenceNumber; From 49d33bea55f46d2f61029f0dee9c3dfeb4d7c679 Mon Sep 17 00:00:00 2001 From: S6066 Date: Tue, 10 Jul 2018 14:48:23 +0200 Subject: [PATCH 032/352] Implement LuaImpl* for Vector[2|3] (#170) * Implement LuaImplQueryArg for Vector[2|3]i * Implement LuaImplReplyVal for Vector[2|3]i * Edit changelog * Fix previous commit crash * Network/ENetPeer: Fix reliable sequence number wrap error * Edit changelog * what have I done to changelog --- ChangeLog.md | 1 + SDK/include/NDK/LuaAPI.inl | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 39d2b3431..5bafdd7fc 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -125,6 +125,7 @@ Nazara Engine: - ⚠️ Removed Vector[2|3]::Distancef method and made Distance method templated - Added Vector2::Distance static method - ⚠️ Fixed compilation errors on MSVC with flag /permissive- on CullingList class +- Added LuaImplQueryArg & LuaImplReplyVal functions for Vector[2|3] - Fixed bug in ENet implementation causing legit reliable packets to be dropped on sequence number overflow Nazara Development Kit: diff --git a/SDK/include/NDK/LuaAPI.inl b/SDK/include/NDK/LuaAPI.inl index 318bb6add..40fe33ec7 100644 --- a/SDK/include/NDK/LuaAPI.inl +++ b/SDK/include/NDK/LuaAPI.inl @@ -269,6 +269,15 @@ namespace Nz return ret; } + inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector2i* vec, TypeTag) + { + Vector2d vecDouble; + unsigned int ret = LuaImplQueryArg(state, index, &vecDouble, TypeTag()); + + vec->Set(vecDouble); + return ret; + } + inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector3d* vec, TypeTag) { switch (state.GetType(index)) @@ -308,6 +317,15 @@ namespace Nz return ret; } + inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Vector3i* vec, TypeTag) + { + Vector3d vecDouble; + unsigned int ret = LuaImplQueryArg(state, index, &vecDouble, TypeTag()); + + vec->Set(vecDouble); + return ret; + } + inline unsigned int LuaImplQueryArg(const LuaState& state, int index, Ndk::Entity** handle, TypeTag) { if (!state.IsOfType(index, LuaType_Nil)) @@ -538,6 +556,12 @@ namespace Nz return 1; } + inline int LuaImplReplyVal(const LuaState& state, Vector2i&& val, TypeTag) + { + state.PushInstance("Vector2", val); + return 1; + } + inline int LuaImplReplyVal(const LuaState& state, Vector3d&& val, TypeTag) { state.PushInstance("Vector3", val); @@ -556,6 +580,12 @@ namespace Nz return 1; } + inline int LuaImplReplyVal(const LuaState& state, Vector3i&& val, TypeTag) + { + state.PushInstance("Vector3", val); + return 1; + } + inline int LuaImplReplyVal(const LuaState& state, Ndk::Entity* ptr, TypeTag) { state.PushInstance("Entity", ptr); From 58ce1829833d6d8a0a41d6f17104251b1320fc64 Mon Sep 17 00:00:00 2001 From: S6066 Date: Wed, 11 Jul 2018 19:16:54 +0200 Subject: [PATCH 033/352] Bugfix: invalid variable still used after move (#171) --- include/Nazara/Graphics/Sprite.inl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/include/Nazara/Graphics/Sprite.inl b/include/Nazara/Graphics/Sprite.inl index 7412793b7..a00eae551 100644 --- a/include/Nazara/Graphics/Sprite.inl +++ b/include/Nazara/Graphics/Sprite.inl @@ -280,8 +280,10 @@ namespace Nz else { material->SetDiffuseMap(std::move(texture)); - if (resizeSprite && texture && texture->IsValid()) - SetSize(Vector2f(Vector2ui(texture->GetSize()))); + const TextureRef& newTexture = material->GetDiffuseMap(); + + if (resizeSprite && newTexture && newTexture->IsValid()) + SetSize(Vector2f(Vector2ui(newTexture->GetSize()))); } } From 01ccca433da8ad82fd98528664771bb2b1503383 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 15 Jul 2018 16:46:01 +0200 Subject: [PATCH 034/352] Physics/PhysWorld3D: Add [Get|Set]ThreadCount --- include/Nazara/Physics3D/PhysWorld3D.hpp | 2 ++ src/Nazara/Physics3D/PhysWorld3D.cpp | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/include/Nazara/Physics3D/PhysWorld3D.hpp b/include/Nazara/Physics3D/PhysWorld3D.hpp index 223fce4fe..129c2d89c 100644 --- a/include/Nazara/Physics3D/PhysWorld3D.hpp +++ b/include/Nazara/Physics3D/PhysWorld3D.hpp @@ -45,11 +45,13 @@ namespace Nz int GetMaterial(const String& name); std::size_t GetMaxStepCount() const; float GetStepSize() const; + unsigned int GetThreadCount() const; void SetGravity(const Vector3f& gravity); void SetMaxStepCount(std::size_t maxStepCount); void SetSolverModel(unsigned int model); void SetStepSize(float stepSize); + void SetThreadCount(unsigned int threadCount); void SetMaterialCollisionCallback(int firstMaterial, int secondMaterial, AABBOverlapCallback aabbOverlapCallback, CollisionCallback collisionCallback); void SetMaterialDefaultCollidable(int firstMaterial, int secondMaterial, bool collidable); diff --git a/src/Nazara/Physics3D/PhysWorld3D.cpp b/src/Nazara/Physics3D/PhysWorld3D.cpp index 01ed2226b..bce1f5b6d 100644 --- a/src/Nazara/Physics3D/PhysWorld3D.cpp +++ b/src/Nazara/Physics3D/PhysWorld3D.cpp @@ -76,6 +76,11 @@ namespace Nz return m_stepSize; } + unsigned int PhysWorld3D::GetThreadCount() const + { + return NewtonGetThreadsCount(m_world); + } + void PhysWorld3D::SetGravity(const Vector3f& gravity) { m_gravity = gravity; @@ -96,6 +101,11 @@ namespace Nz m_stepSize = stepSize; } + void PhysWorld3D::SetThreadCount(unsigned int threadCount) + { + NewtonSetThreadsCount(m_world, threadCount); + } + void PhysWorld3D::SetMaterialCollisionCallback(int firstMaterial, int secondMaterial, AABBOverlapCallback aabbOverlapCallback, CollisionCallback collisionCallback) { static_assert(sizeof(UInt64) >= 2 * sizeof(int), "Oops"); From a12c72186f96554941207bcbada74fa29dc53fdb Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 15 Jul 2018 16:46:32 +0200 Subject: [PATCH 035/352] Sdk/DebugSystem: Fix OBB drawing --- SDK/src/NDK/Systems/DebugSystem.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 0da17c352..204737e9a 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -59,7 +59,6 @@ namespace Ndk { NazaraAssert(m_entityOwner, "DebugRenderable has no owner"); - const DebugComponent& entityDebug = m_entityOwner->GetComponent(); const GraphicsComponent& entityGfx = m_entityOwner->GetComponent(); Nz::Boxf aabb = entityGfx.GetBoundingVolume().aabb; @@ -86,16 +85,14 @@ namespace Ndk { NazaraAssert(m_entityOwner, "DebugRenderable has no owner"); - const DebugComponent& entityDebug = m_entityOwner->GetComponent(); const GraphicsComponent& entityGfx = m_entityOwner->GetComponent(); - Nz::Boxf obb = entityGfx.GetBoundingVolume().obb.localBox; + Nz::OrientedBoxf entityObb = entityGfx.GetBoundingVolume().obb; + Nz::Boxf obb(entityObb.GetCorner(Nz::BoxCorner_NearLeftTop), entityObb.GetCorner(Nz::BoxCorner_FarRightBottom)); - Nz::Matrix4f transformMatrix = instanceData.transformMatrix; - Nz::Vector3f obbCenter = transformMatrix.Transform(obb.GetCenter(), 0.f); //< Apply rotation/scale to obb center, to display it at a correct position - - transformMatrix.ApplyScale(obb.GetLengths()); - transformMatrix.ApplyTranslation(obbCenter); + Nz::Matrix4f transformMatrix = Nz::Matrix4f::Identity(); + transformMatrix.SetScale(obb.GetLengths()); + transformMatrix.SetTranslation(obb.GetCenter()); renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect); } From 6dfc866a4d324185a6b209fc7eb048116e5e9d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 17 Jul 2018 09:56:30 +0200 Subject: [PATCH 036/352] Network/ENetPeer: Fix enet stuff --- src/Nazara/Network/ENetPeer.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Nazara/Network/ENetPeer.cpp b/src/Nazara/Network/ENetPeer.cpp index a26423bb4..fbae65e14 100644 --- a/src/Nazara/Network/ENetPeer.cpp +++ b/src/Nazara/Network/ENetPeer.cpp @@ -286,6 +286,8 @@ namespace Nz { UInt32 serviceTime = m_host->GetServiceTime(); + auto insertPosition = m_outgoingReliableCommands.begin(); + auto it = m_sentReliableCommands.begin(); for (; it != m_sentReliableCommands.end();) { @@ -317,17 +319,14 @@ namespace Nz command.roundTripTimeout = m_roundTripTime + 4 * m_roundTripTimeVariance; command.roundTripTimeoutLimit = m_timeoutLimit * command.roundTripTimeout; - m_outgoingReliableCommands.emplace_front(std::move(command)); + m_outgoingReliableCommands.insert(insertPosition, std::move(command)); it = m_sentReliableCommands.erase(it); - // Okay this should just never procs, I don't see how it would be possible - /*if (currentCommand == enet_list_begin(&peer->sentReliableCommands) && - !enet_list_empty(&peer->sentReliableCommands)) + if (it == m_sentReliableCommands.begin() && !m_sentReliableCommands.empty()) { - outgoingCommand = (ENetOutgoingCommand *) currentCommand; - - peer->nextTimeout = outgoingCommand->sentTime + outgoingCommand->roundTripTimeout; - }*/ + OutgoingCommand& outgoingCommand = *it; + m_nextTimeout = outgoingCommand.sentTime + outgoingCommand.roundTripTimeout; + } } return false; From 7b6cc47e03952fd4d4bd9f7f99567fd044eb8230 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 17 Jul 2018 10:51:35 +0200 Subject: [PATCH 037/352] Sdk/Entity: Add IsDying method --- SDK/include/NDK/Entity.hpp | 1 + SDK/include/NDK/World.hpp | 2 ++ SDK/include/NDK/World.inl | 23 ++++++++++++++++++++++- SDK/src/NDK/Entity.cpp | 11 ++++++++++- tests/SDK/NDK/World.cpp | 28 +++++++++++++++++++++++++++- 5 files changed, 62 insertions(+), 3 deletions(-) diff --git a/SDK/include/NDK/Entity.hpp b/SDK/include/NDK/Entity.hpp index 355028fef..3cbe4785c 100644 --- a/SDK/include/NDK/Entity.hpp +++ b/SDK/include/NDK/Entity.hpp @@ -61,6 +61,7 @@ namespace Ndk void Invalidate(); inline bool IsEnabled() const; + bool IsDying() const; inline bool IsValid() const; inline void RemoveAllComponents(); diff --git a/SDK/include/NDK/World.hpp b/SDK/include/NDK/World.hpp index 9b1d4c970..98e6d87ac 100644 --- a/SDK/include/NDK/World.hpp +++ b/SDK/include/NDK/World.hpp @@ -67,6 +67,8 @@ namespace Ndk inline void KillEntity(Entity* entity); inline void KillEntities(const EntityVector& list); + inline bool IsEntityDying(const Entity* entity) const; + inline bool IsEntityDying(EntityId id) const; inline bool IsEntityValid(const Entity* entity) const; inline bool IsEntityIdValid(EntityId id) const; inline bool IsProfilerEnabled() const; diff --git a/SDK/include/NDK/World.inl b/SDK/include/NDK/World.inl index 942ce4d36..860454a0d 100644 --- a/SDK/include/NDK/World.inl +++ b/SDK/include/NDK/World.inl @@ -324,13 +324,34 @@ namespace Ndk KillEntity(entity); } + /*! + * \brief Checks whether or not an entity is dying (has been killed this update) + * \return true If the entity exists and is dying + * + * \param entity Pointer to the entity + */ + inline bool World::IsEntityDying(const Entity* entity) const + { + return entity && IsEntityDying(entity->GetId()); + } + + /*! + * \brief Checks whether or not an entity is dying (has been killed this update) + * \return true If it is the case, false if the entity is alive (and hasn't been killed yet) or if the entity id is invalid + * + * \param id Identifier of the entity + */ + inline bool World::IsEntityDying(EntityId id) const + { + return m_killedEntities.UnboundedTest(id); + } + /*! * \brief Checks whether or not an entity is valid * \return true If it is the case * * \param entity Pointer to the entity */ - inline bool World::IsEntityValid(const Entity* entity) const { return entity && entity->GetWorld() == this && IsEntityIdValid(entity->GetId()); diff --git a/SDK/src/NDK/Entity.cpp b/SDK/src/NDK/Entity.cpp index ffcce07f0..7bc81982d 100644 --- a/SDK/src/NDK/Entity.cpp +++ b/SDK/src/NDK/Entity.cpp @@ -133,13 +133,22 @@ namespace Ndk /*! * \brief Invalidates the entity */ - void Entity::Invalidate() { // We alert everyone that we have been updated m_world->Invalidate(m_id); } + + /*! + * \brief Checks if the entity has been killed this update + * \return True if the entity is currently dying and will be dead at next world refresh + */ + bool Entity::IsDying() const + { + return m_world->IsEntityDying(m_id); + } + /*! * \brief Creates the entity */ diff --git a/tests/SDK/NDK/World.cpp b/tests/SDK/NDK/World.cpp index 4d25db5f6..185717609 100644 --- a/tests/SDK/NDK/World.cpp +++ b/tests/SDK/NDK/World.cpp @@ -100,4 +100,30 @@ SCENARIO("World", "[NDK][WORLD]") } } } -} \ No newline at end of file + + GIVEN("A newly created entity") + { + Ndk::World world(false); + Ndk::EntityHandle entity = world.CreateEntity(); + + REQUIRE(entity.IsValid()); + REQUIRE(entity->IsValid()); + CHECK_FALSE(entity->IsDying()); + + WHEN("We kill it") + { + entity->Kill(); + + CHECK(entity.IsValid()); + CHECK(entity->IsValid()); + CHECK(entity->IsDying()); + + THEN("We refresh the world") + { + world.Refresh(); + + CHECK_FALSE(entity.IsValid()); + } + } + } +} From abedc3074725b8a9684f18b995855880ebb1a511 Mon Sep 17 00:00:00 2001 From: Faymoon Date: Tue, 31 Jul 2018 13:24:19 +0200 Subject: [PATCH 038/352] Add: [Get/Set]AngularDamping for standardization (#173) * Update * Add: [Get/Set]AngularDaming for standardization --- include/Nazara/Physics2D/RigidBody2D.hpp | 4 ++++ include/Nazara/Physics2D/RigidBody2D.inl | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 include/Nazara/Physics2D/RigidBody2D.inl diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index 3b74a1943..f8df42a8a 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -41,6 +41,7 @@ namespace Nz void EnableSimulation(bool simulation); Rectf GetAABB() const; + inline float GetAngularDamping() const; float GetAngularVelocity() const; Vector2f GetCenterOfGravity(CoordSys coordSys = CoordSys_Local) const; const Collider2DRef& GetGeom() const; @@ -59,6 +60,7 @@ namespace Nz bool IsSleeping() const; bool IsStatic() const; + inline void SetAngularDamping(float angularDamping); void SetAngularVelocity(float angularVelocity); void SetGeom(Collider2DRef geom, bool recomputeMoment = true); void SetMass(float mass, bool recomputeMoment = true); @@ -99,4 +101,6 @@ namespace Nz }; } +#include + #endif // NAZARA_RIGIDBODY2D_HPP diff --git a/include/Nazara/Physics2D/RigidBody2D.inl b/include/Nazara/Physics2D/RigidBody2D.inl new file mode 100644 index 000000000..603cc4e57 --- /dev/null +++ b/include/Nazara/Physics2D/RigidBody2D.inl @@ -0,0 +1,21 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 2D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + inline float RigidBody2D::GetAngularDamping() const + { + return GetMomentOfInertia(); + } + + inline void RigidBody2D::SetAngularDamping(float angularDamping) + { + SetMomentOfInertia(angularDamping); + } +} + +#include From d91c48ab5038dc092e5fa76e4b1e6d356ae8198b Mon Sep 17 00:00:00 2001 From: S6066 Date: Tue, 31 Jul 2018 13:24:28 +0200 Subject: [PATCH 039/352] Widgets: Force parent parameter to be present (#172) --- ChangeLog.md | 1 + SDK/include/NDK/Widgets/ButtonWidget.hpp | 2 +- SDK/include/NDK/Widgets/CheckboxWidget.hpp | 2 +- SDK/include/NDK/Widgets/ImageWidget.hpp | 2 +- SDK/include/NDK/Widgets/LabelWidget.hpp | 2 +- SDK/include/NDK/Widgets/ProgressBarWidget.hpp | 4 ++-- SDK/include/NDK/Widgets/TextAreaWidget.hpp | 2 +- 7 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5bafdd7fc..ba7b3e637 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -179,6 +179,7 @@ Nazara Development Kit: - Fixed GraphicsComponent reflective material count which was not initialized - Added PhysicsComponent2D::ClosestPointQuery - Fix GraphicsComponent copy constructor not copying scissor rect +- Force parent parameter to be present in widgets constructor # 0.4: diff --git a/SDK/include/NDK/Widgets/ButtonWidget.hpp b/SDK/include/NDK/Widgets/ButtonWidget.hpp index 12fc12762..01eb4a90a 100644 --- a/SDK/include/NDK/Widgets/ButtonWidget.hpp +++ b/SDK/include/NDK/Widgets/ButtonWidget.hpp @@ -23,7 +23,7 @@ namespace Ndk class NDK_API ButtonWidget : public BaseWidget { public: - ButtonWidget(BaseWidget* parent = nullptr); + ButtonWidget(BaseWidget* parent); ButtonWidget(const ButtonWidget&) = delete; ButtonWidget(ButtonWidget&&) = default; ~ButtonWidget() = default; diff --git a/SDK/include/NDK/Widgets/CheckboxWidget.hpp b/SDK/include/NDK/Widgets/CheckboxWidget.hpp index 9d175fdbe..d8382ba02 100644 --- a/SDK/include/NDK/Widgets/CheckboxWidget.hpp +++ b/SDK/include/NDK/Widgets/CheckboxWidget.hpp @@ -28,7 +28,7 @@ namespace Ndk friend class Sdk; public: - CheckboxWidget(BaseWidget* parent = nullptr); + CheckboxWidget(BaseWidget* parent); CheckboxWidget(const CheckboxWidget&) = delete; CheckboxWidget(CheckboxWidget&&) = default; ~CheckboxWidget() = default; diff --git a/SDK/include/NDK/Widgets/ImageWidget.hpp b/SDK/include/NDK/Widgets/ImageWidget.hpp index 51fe4de87..93169c80d 100644 --- a/SDK/include/NDK/Widgets/ImageWidget.hpp +++ b/SDK/include/NDK/Widgets/ImageWidget.hpp @@ -19,7 +19,7 @@ namespace Ndk class NDK_API ImageWidget : public BaseWidget { public: - ImageWidget(BaseWidget* parent = nullptr); + ImageWidget(BaseWidget* parent); ImageWidget(const ImageWidget&) = delete; ImageWidget(ImageWidget&&) = default; ~ImageWidget() = default; diff --git a/SDK/include/NDK/Widgets/LabelWidget.hpp b/SDK/include/NDK/Widgets/LabelWidget.hpp index f4f43bf1e..f96960e15 100644 --- a/SDK/include/NDK/Widgets/LabelWidget.hpp +++ b/SDK/include/NDK/Widgets/LabelWidget.hpp @@ -21,7 +21,7 @@ namespace Ndk class NDK_API LabelWidget : public BaseWidget { public: - LabelWidget(BaseWidget* parent = nullptr); + LabelWidget(BaseWidget* parent); LabelWidget(const LabelWidget&) = delete; LabelWidget(LabelWidget&&) = default; ~LabelWidget() = default; diff --git a/SDK/include/NDK/Widgets/ProgressBarWidget.hpp b/SDK/include/NDK/Widgets/ProgressBarWidget.hpp index 2faa8093d..6e19aa0cd 100644 --- a/SDK/include/NDK/Widgets/ProgressBarWidget.hpp +++ b/SDK/include/NDK/Widgets/ProgressBarWidget.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Samy Bensaid +// Copyright (C) 2017 Samy Bensaid // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequisites.hpp @@ -23,7 +23,7 @@ namespace Ndk friend class Sdk; public: - ProgressBarWidget(BaseWidget* parent = nullptr); + ProgressBarWidget(BaseWidget* parent); ProgressBarWidget(const ProgressBarWidget&) = delete; ProgressBarWidget(ProgressBarWidget&&) = default; ~ProgressBarWidget() = default; diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index e7cdc2f7a..af5377e6f 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -18,7 +18,7 @@ namespace Ndk class NDK_API TextAreaWidget : public BaseWidget { public: - TextAreaWidget(BaseWidget* parent = nullptr); + TextAreaWidget(BaseWidget* parent); TextAreaWidget(const TextAreaWidget&) = delete; TextAreaWidget(TextAreaWidget&&) = default; ~TextAreaWidget() = default; From 271f7202ed78f33de50b44c0b19d4701fd82025d Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 31 Jul 2018 19:49:51 +0200 Subject: [PATCH 040/352] Core/Unicode: Fix letters category --- src/Nazara/Core/Unicode.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Nazara/Core/Unicode.cpp b/src/Nazara/Core/Unicode.cpp index cec6dbba8..eac37dead 100644 --- a/src/Nazara/Core/Unicode.cpp +++ b/src/Nazara/Core/Unicode.cpp @@ -157,7 +157,7 @@ namespace Nz case 'X': case 'Y': case 'Z': - return Category_Number_DecimalDigit; + return Category_Letter_Uppercase; case '_': return Category_Punctuation_Connector; @@ -192,7 +192,7 @@ namespace Nz case 'x': case 'y': case 'z': - return Category_Number_DecimalDigit; + return Category_Letter_Lowercase; default: break; From 4a09de7e0be6c006131378673f6d75af2c51c7c8 Mon Sep 17 00:00:00 2001 From: S6066 Date: Wed, 1 Aug 2018 23:12:02 +0200 Subject: [PATCH 041/352] String::FindLast/FindWord: Fix bug where index wouldn't be used (#177) * String::FindLast/FindWord: Fix bug where index wouldn't be used * Log change --- ChangeLog.md | 1 + src/Nazara/Core/String.cpp | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index ba7b3e637..149c75d44 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -127,6 +127,7 @@ Nazara Engine: - ⚠️ Fixed compilation errors on MSVC with flag /permissive- on CullingList class - Added LuaImplQueryArg & LuaImplReplyVal functions for Vector[2|3] - Fixed bug in ENet implementation causing legit reliable packets to be dropped on sequence number overflow +- Fixed bug where index wouldn't be used in String::FindLast and String::FindWord Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Core/String.cpp b/src/Nazara/Core/String.cpp index 9e4e2ae32..351b1c91d 100644 --- a/src/Nazara/Core/String.cpp +++ b/src/Nazara/Core/String.cpp @@ -976,7 +976,7 @@ namespace Nz if (pos >= m_sharedString->size) return npos; - char* ptr = &m_sharedString->string[m_sharedString->size-1]; + char* ptr = &m_sharedString->string[pos]; if (flags & CaseInsensitive) { @@ -1751,7 +1751,7 @@ namespace Nz return npos; ///Algo 3.FindWord#3 (Size of the pattern unknown) - const char* ptr = m_sharedString->string.get(); + const char* ptr = &m_sharedString->string[pos]; if (flags & HandleUtf8) { if (utf8::internal::is_trail(*ptr)) @@ -1931,7 +1931,7 @@ namespace Nz if (pos >= m_sharedString->size) return npos; - char* ptr = m_sharedString->string.get(); + char* ptr = &m_sharedString->string[pos]; if (flags & HandleUtf8) { ///Algo 3.FindWord#3 (Iterator too slow for #2) From 2f3f02b2fc8ec97d90e04393ade1b2d872d3eb55 Mon Sep 17 00:00:00 2001 From: Faymoon Date: Thu, 2 Aug 2018 11:25:57 +0200 Subject: [PATCH 042/352] Update Physics2D Component and Body (#178) * Update * Add: [Get/Set]AngularDaming for standardization * Fix: Name error * Add: [Get/Set][AngularDamping/MomentOfInertia] in PhysicsComponent2D * Forgot in last commit * Add: param coordSys in [PhysicsComponent2D/RigidBody2D]::SetMassCenter * Add: Some forgotten inline * Fix little error * Fix: Indentation before case * Move and Change GetCenterOfGravity --- .../NDK/Components/PhysicsComponent2D.hpp | 46 +++++----- .../NDK/Components/PhysicsComponent2D.inl | 85 ++++++++++++++++++- include/Nazara/Physics2D/RigidBody2D.hpp | 6 +- include/Nazara/Physics2D/RigidBody2D.inl | 5 ++ src/Nazara/Physics2D/RigidBody2D.cpp | 38 ++++++--- 5 files changed, 143 insertions(+), 37 deletions(-) diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index efd30602a..c1a741153 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -24,30 +24,36 @@ namespace Ndk PhysicsComponent2D(const PhysicsComponent2D& physics); ~PhysicsComponent2D() = default; - void AddForce(const Nz::Vector2f& force, Nz::CoordSys coordSys = Nz::CoordSys_Global); - void AddForce(const Nz::Vector2f& force, const Nz::Vector2f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global); - void AddImpulse(const Nz::Vector2f& impulse, Nz::CoordSys coordSys = Nz::CoordSys_Global); - void AddImpulse(const Nz::Vector2f& impulse, const Nz::Vector2f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global); - void AddTorque(float torque); + inline void AddForce(const Nz::Vector2f& force, Nz::CoordSys coordSys = Nz::CoordSys_Global); + inline void AddForce(const Nz::Vector2f& force, const Nz::Vector2f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global); + inline void AddImpulse(const Nz::Vector2f& impulse, Nz::CoordSys coordSys = Nz::CoordSys_Global); + inline void AddImpulse(const Nz::Vector2f& impulse, const Nz::Vector2f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global); + inline void AddTorque(float torque); - bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const; + inline bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const; - Nz::Rectf GetAABB() const; - float GetAngularVelocity() const; - Nz::Vector2f GetCenterOfGravity(Nz::CoordSys coordSys = Nz::CoordSys_Local) const; - float GetMass() const; - Nz::Vector2f GetPosition() const; - float GetRotation() const; - Nz::Vector2f GetVelocity() const; + inline Nz::Rectf GetAABB() const; + inline float GetAngularDamping() const; + inline float GetAngularVelocity() const; + NAZARA_DEPRECATED("Name error, please use GetMassCenter") + inline Nz::Vector2f GetCenterOfGravity(Nz::CoordSys coordSys = Nz::CoordSys_Local) const; + inline float GetMass() const; + inline Nz::Vector2f GetMassCenter(Nz::CoordSys coordSys = Nz::CoordSys_Local) const; + inline float GetMomentOfInertia() const; + inline Nz::Vector2f GetPosition() const; + inline float GetRotation() const; + inline Nz::Vector2f GetVelocity() const; - bool IsSleeping() const; + inline bool IsSleeping() const; - void SetAngularVelocity(float angularVelocity); - void SetMass(float mass); - void SetMassCenter(const Nz::Vector2f& center); - void SetPosition(const Nz::Vector2f& position); - void SetRotation(float rotation); - void SetVelocity(const Nz::Vector2f& velocity); + inline void SetAngularDamping(float angularDamping); + inline void SetAngularVelocity(float angularVelocity); + inline void SetMass(float mass); + inline void SetMassCenter(const Nz::Vector2f& center, Nz::CoordSys coordSys = Nz::CoordSys_Local); + inline void SetMomentOfInertia(float moment); + inline void SetPosition(const Nz::Vector2f& position); + inline void SetRotation(float rotation); + inline void SetVelocity(const Nz::Vector2f& velocity); static ComponentIndex componentIndex; diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index b6628467d..3105a85ea 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -128,6 +128,22 @@ namespace Ndk return m_object->GetAABB(); } + /*! + * \brief Gets the angular damping or moment of inertia of the physics object + * \return Angular damping of the object + * + * \remark Produces a NazaraAssert if the physics object is invalid + * + * \see GetMomentOfInertia + */ + + inline float PhysicsComponent2D::GetAngularDamping() const + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->GetAngularDamping(); + } + /*! * \brief Gets the angular velocity of the physics object * \return Angular velocity of the object @@ -172,6 +188,38 @@ namespace Ndk return m_object->GetMass(); } + /*! + * \brief Gets the gravity center of the physics object + * \return Gravity center of the object + * + * \param coordSys System coordinates to consider + * + * \remark Produces a NazaraAssert if the physics object is invalid + */ + + inline Nz::Vector2f PhysicsComponent2D::GetMassCenter(Nz::CoordSys coordSys) const + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->GetMassCenter(coordSys); + } + + /*! + * \brief Gets the angular damping or moment of inertia of the physics object + * \return Moment of inertia of the object + * + * \remark Produces a NazaraAssert if the physics object is invalid + * + * \see GetAngularDamping + */ + + inline float PhysicsComponent2D::GetMomentOfInertia() const + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->GetMomentOfInertia(); + } + /*! * \brief Gets the position of the physics object * \return Position of the object @@ -228,6 +276,23 @@ namespace Ndk return m_object->IsSleeping(); } + /*! + * \brief Sets the angular damping or moment of inertia of the physics object + * + * \param angularDamping Angular damping of the object + * + * \remark Produces a NazaraAssert if the physics object is invalid + * + * \see SetMomentOfInertia + */ + + inline void PhysicsComponent2D::SetAngularDamping(float angularDamping) + { + NazaraAssert(m_object, "Invalid physics object"); + + m_object->SetAngularDamping(angularDamping); + } + /*! * \brief Sets the angular velocity of the physics object * @@ -268,11 +333,27 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent2D::SetMassCenter(const Nz::Vector2f& center) + inline void PhysicsComponent2D::SetMassCenter(const Nz::Vector2f& center, Nz::CoordSys coordSys) { NazaraAssert(m_object, "Invalid physics object"); - m_object->SetMassCenter(center); + m_object->SetMassCenter(center, coordSys); + } + /*! + * \brief Sets the angular damping or moment of inertia of the physics object + * + * \param moment Moment of inertia of the object + * + * \remark Produces a NazaraAssert if the physics object is invalid + * + * \see SetAngularDamping + */ + + inline void PhysicsComponent2D::SetMomentOfInertia(float moment) + { + NazaraAssert(m_object, "Invalid physics object"); + + m_object->SetMomentOfInertia(moment); } /*! diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index f8df42a8a..30eac8f43 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -43,10 +43,12 @@ namespace Nz Rectf GetAABB() const; inline float GetAngularDamping() const; float GetAngularVelocity() const; - Vector2f GetCenterOfGravity(CoordSys coordSys = CoordSys_Local) const; + NAZARA_DEPRECATED("Name error, please use GetMassCenter") + inline Vector2f GetCenterOfGravity(CoordSys coordSys = CoordSys_Local) const; const Collider2DRef& GetGeom() const; cpBody* GetHandle() const; float GetMass() const; + Vector2f GetMassCenter(CoordSys coordSys = CoordSys_Local) const; float GetMomentOfInertia() const; Vector2f GetPosition() const; float GetRotation() const; @@ -64,7 +66,7 @@ namespace Nz void SetAngularVelocity(float angularVelocity); void SetGeom(Collider2DRef geom, bool recomputeMoment = true); void SetMass(float mass, bool recomputeMoment = true); - void SetMassCenter(const Vector2f& center); + void SetMassCenter(const Vector2f& center, CoordSys coordSys = CoordSys_Local); void SetMomentOfInertia(float moment); void SetPosition(const Vector2f& position); void SetRotation(float rotation); diff --git a/include/Nazara/Physics2D/RigidBody2D.inl b/include/Nazara/Physics2D/RigidBody2D.inl index 603cc4e57..faebd017d 100644 --- a/include/Nazara/Physics2D/RigidBody2D.inl +++ b/include/Nazara/Physics2D/RigidBody2D.inl @@ -12,6 +12,11 @@ namespace Nz return GetMomentOfInertia(); } + inline Vector2f RigidBody2D::GetCenterOfGravity(CoordSys coordSys) const + { + return GetMassCenter(coordSys); + } + inline void RigidBody2D::SetAngularDamping(float angularDamping) { SetMomentOfInertia(angularDamping); diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index c2cb31c4f..76844db3b 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -87,7 +87,7 @@ namespace Nz void RigidBody2D::AddForce(const Vector2f& force, CoordSys coordSys) { - return AddForce(force, GetCenterOfGravity(coordSys), coordSys); + return AddForce(force, GetMassCenter(coordSys), coordSys); } void RigidBody2D::AddForce(const Vector2f& force, const Vector2f& point, CoordSys coordSys) @@ -106,7 +106,7 @@ namespace Nz void RigidBody2D::AddImpulse(const Vector2f& impulse, CoordSys coordSys) { - return AddImpulse(impulse, GetCenterOfGravity(coordSys), coordSys); + return AddImpulse(impulse, GetMassCenter(coordSys), coordSys); } void RigidBody2D::AddImpulse(const Vector2f& impulse, const Vector2f& point, CoordSys coordSys) @@ -205,26 +205,26 @@ namespace Nz return m_mass; } - float RigidBody2D::GetMomentOfInertia() const + Vector2f RigidBody2D::GetMassCenter(CoordSys coordSys) const { - return float(cpBodyGetMoment(m_handle)); - } - - Vector2f RigidBody2D::GetCenterOfGravity(CoordSys coordSys) const - { - cpVect cog = cpBodyGetCenterOfGravity(m_handle); + cpVect massCenter = cpBodyGetCenterOfGravity(m_handle); switch (coordSys) { case CoordSys_Global: - cog = cpBodyLocalToWorld(m_handle, cog); + massCenter = cpBodyLocalToWorld(m_handle, massCenter); break; case CoordSys_Local: break; // Nothing to do } - return Vector2f(static_cast(cog.x), static_cast(cog.y)); + return Vector2f(static_cast(massCenter.x), static_cast(massCenter.y)); + } + + float RigidBody2D::GetMomentOfInertia() const + { + return float(cpBodyGetMoment(m_handle)); } Vector2f RigidBody2D::GetPosition() const @@ -362,9 +362,21 @@ namespace Nz m_mass = mass; } - void RigidBody2D::SetMassCenter(const Vector2f& center) + void RigidBody2D::SetMassCenter(const Vector2f& center, CoordSys coordSys) { - cpBodySetCenterOfGravity(m_handle, cpv(center.x, center.y)); + cpVect massCenter = cpv(center.x, center.y); + + switch (coordSys) + { + case CoordSys_Global: + massCenter = cpBodyWorldToLocal(m_handle, massCenter); + break; + + case CoordSys_Local: + break; // Nothing to do + } + + cpBodySetCenterOfGravity(m_handle, massCenter); } void RigidBody2D::SetMomentOfInertia(float moment) From b92e23fcd67a831e873920d17a49f7e07b345308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 2 Aug 2018 15:42:14 +0200 Subject: [PATCH 043/352] Physics2D: Add Arbiter2D --- ChangeLog.md | 1 + include/Nazara/Physics2D/Arbiter2D.hpp | 57 +++++++++++++++ include/Nazara/Physics2D/Arbiter2D.inl | 17 +++++ include/Nazara/Physics2D/PhysWorld2D.hpp | 10 +-- src/Nazara/Physics2D/Arbiter2D.cpp | 89 ++++++++++++++++++++++++ src/Nazara/Physics2D/PhysWorld2D.cpp | 17 +++-- 6 files changed, 183 insertions(+), 8 deletions(-) create mode 100644 include/Nazara/Physics2D/Arbiter2D.hpp create mode 100644 include/Nazara/Physics2D/Arbiter2D.inl create mode 100644 src/Nazara/Physics2D/Arbiter2D.cpp diff --git a/ChangeLog.md b/ChangeLog.md index 149c75d44..4cd68d12a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -128,6 +128,7 @@ Nazara Engine: - Added LuaImplQueryArg & LuaImplReplyVal functions for Vector[2|3] - Fixed bug in ENet implementation causing legit reliable packets to be dropped on sequence number overflow - Fixed bug where index wouldn't be used in String::FindLast and String::FindWord +- Physics 2D contact callbacks now include an arbiter allowing to query/set parameters about the collision Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Physics2D/Arbiter2D.hpp b/include/Nazara/Physics2D/Arbiter2D.hpp new file mode 100644 index 000000000..64c38dd8d --- /dev/null +++ b/include/Nazara/Physics2D/Arbiter2D.hpp @@ -0,0 +1,57 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 2D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_ARBITER2D_HPP +#define NAZARA_ARBITER2D_HPP + +#include +#include +#include +#include + +struct cpArbiter; + +namespace Nz +{ + class NAZARA_PHYSICS2D_API Arbiter2D + { + public: + inline Arbiter2D(cpArbiter* arbiter); + Arbiter2D(const Arbiter2D&) = delete; + Arbiter2D(Arbiter2D&&) = default; + ~Arbiter2D() = default; + + float ComputeTotalKinematicEnergy() const; + Nz::Vector2f ComputeTotalImpulse() const; + + std::size_t GetContactCount() const; + float GetContactDepth(std::size_t i) const; + Nz::Vector2f GetContactPointA(std::size_t i) const; + Nz::Vector2f GetContactPointB(std::size_t i) const; + + float GetElasticity() const; + float GetFriction() const; + Nz::Vector2f GetNormal() const; + Nz::Vector2f GetSurfaceVelocity() const; + + bool IsFirstContact() const; + bool IsRemoval() const; + + void SetElasticity(float elasticity); + void SetFriction(float friction); + void SetSurfaceVelocity(const Nz::Vector2f& surfaceVelocity); + + Arbiter2D& operator=(const Arbiter2D&) = delete; + Arbiter2D& operator=(Arbiter2D&&) = default; + + private: + MovablePtr m_arbiter; + }; +} + +#include + +#endif // NAZARA_ARBITER2D_HPP diff --git a/include/Nazara/Physics2D/Arbiter2D.inl b/include/Nazara/Physics2D/Arbiter2D.inl new file mode 100644 index 000000000..5e6b3edf6 --- /dev/null +++ b/include/Nazara/Physics2D/Arbiter2D.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 2D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +namespace Nz +{ + inline Arbiter2D::Arbiter2D(cpArbiter* arbiter) : + m_arbiter(arbiter) + { + } +} + +#include diff --git a/include/Nazara/Physics2D/PhysWorld2D.hpp b/include/Nazara/Physics2D/PhysWorld2D.hpp index 301e73563..3e726de00 100644 --- a/include/Nazara/Physics2D/PhysWorld2D.hpp +++ b/include/Nazara/Physics2D/PhysWorld2D.hpp @@ -22,14 +22,16 @@ struct cpSpace; namespace Nz { + class Arbiter2D; + class NAZARA_PHYSICS2D_API PhysWorld2D { friend RigidBody2D; - using ContactEndCallback = std::function; - using ContactPreSolveCallback = std::function; - using ContactPostSolveCallback = std::function; - using ContactStartCallback = std::function; + using ContactEndCallback = std::function; + using ContactPreSolveCallback = std::function; + using ContactPostSolveCallback = std::function; + using ContactStartCallback = std::function; using DebugDrawCircleCallback = std::function; using DebugDrawDotCallback = std::function; diff --git a/src/Nazara/Physics2D/Arbiter2D.cpp b/src/Nazara/Physics2D/Arbiter2D.cpp new file mode 100644 index 000000000..8a1243d26 --- /dev/null +++ b/src/Nazara/Physics2D/Arbiter2D.cpp @@ -0,0 +1,89 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 2D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +namespace Nz +{ + float Nz::Arbiter2D::ComputeTotalKinematicEnergy() const + { + return float(cpArbiterTotalKE(m_arbiter)); + } + + Nz::Vector2f Arbiter2D::ComputeTotalImpulse() const + { + cpVect impulse = cpArbiterTotalImpulse(m_arbiter); + return Nz::Vector2f(Nz::Vector2(impulse.x, impulse.y)); + } + + std::size_t Arbiter2D::GetContactCount() const + { + return cpArbiterGetCount(m_arbiter); + } + + float Arbiter2D::GetContactDepth(std::size_t i) const + { + return cpArbiterGetDepth(m_arbiter, int(i)); + } + + Nz::Vector2f Arbiter2D::GetContactPointA(std::size_t i) const + { + cpVect point = cpArbiterGetPointA(m_arbiter, int(i)); + return Nz::Vector2f(Nz::Vector2(point.x, point.y)); + } + + Nz::Vector2f Arbiter2D::GetContactPointB(std::size_t i) const + { + cpVect point = cpArbiterGetPointB(m_arbiter, int(i)); + return Nz::Vector2f(Nz::Vector2(point.x, point.y)); + } + + float Arbiter2D::GetElasticity() const + { + return float(cpArbiterGetRestitution(m_arbiter)); + } + float Arbiter2D::GetFriction() const + { + return float(cpArbiterGetFriction(m_arbiter)); + } + + Nz::Vector2f Arbiter2D::GetNormal() const + { + cpVect normal = cpArbiterGetNormal(m_arbiter); + return Nz::Vector2f(Nz::Vector2(normal.x, normal.y)); + } + + Nz::Vector2f Arbiter2D::GetSurfaceVelocity() const + { + cpVect velocity = cpArbiterGetNormal(m_arbiter); + return Nz::Vector2f(Nz::Vector2(velocity.x, velocity.y)); + } + + bool Arbiter2D::IsFirstContact() const + { + return cpArbiterIsFirstContact(m_arbiter) == cpTrue; + } + + bool Arbiter2D::IsRemoval() const + { + return cpArbiterIsRemoval(m_arbiter) == cpTrue; + } + + void Arbiter2D::SetElasticity(float elasticity) + { + cpArbiterSetRestitution(m_arbiter, elasticity); + } + + void Arbiter2D::SetFriction(float friction) + { + cpArbiterSetFriction(m_arbiter, friction); + } + + void Arbiter2D::SetSurfaceVelocity(const Nz::Vector2f& surfaceVelocity) + { + cpArbiterSetSurfaceVelocity(m_arbiter, cpv(surfaceVelocity.x, surfaceVelocity.y)); + } +} diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp index b967e63e5..764ca1cf8 100644 --- a/src/Nazara/Physics2D/PhysWorld2D.cpp +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -3,6 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include #include #include @@ -358,8 +359,10 @@ namespace Nz RigidBody2D* firstRigidBody = static_cast(cpBodyGetUserData(firstBody)); RigidBody2D* secondRigidBody = static_cast(cpBodyGetUserData(secondBody)); + Arbiter2D arbiter(arb); + const Callback* customCallbacks = static_cast(data); - if (customCallbacks->startCallback(*world, *firstRigidBody, *secondRigidBody, customCallbacks->userdata)) + if (customCallbacks->startCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata)) { cpBool retA = cpArbiterCallWildcardBeginA(arb, space); cpBool retB = cpArbiterCallWildcardBeginB(arb, space); @@ -382,8 +385,10 @@ namespace Nz RigidBody2D* firstRigidBody = static_cast(cpBodyGetUserData(firstBody)); RigidBody2D* secondRigidBody = static_cast(cpBodyGetUserData(secondBody)); + Arbiter2D arbiter(arb); + const Callback* customCallbacks = static_cast(data); - customCallbacks->endCallback(*world, *firstRigidBody, *secondRigidBody, customCallbacks->userdata); + customCallbacks->endCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata); cpArbiterCallWildcardSeparateA(arb, space); cpArbiterCallWildcardSeparateB(arb, space); @@ -402,8 +407,10 @@ namespace Nz RigidBody2D* firstRigidBody = static_cast(cpBodyGetUserData(firstBody)); RigidBody2D* secondRigidBody = static_cast(cpBodyGetUserData(secondBody)); + Arbiter2D arbiter(arb); + const Callback* customCallbacks = static_cast(data); - if (customCallbacks->preSolveCallback(*world, *firstRigidBody, *secondRigidBody, customCallbacks->userdata)) + if (customCallbacks->preSolveCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata)) { cpBool retA = cpArbiterCallWildcardPreSolveA(arb, space); cpBool retB = cpArbiterCallWildcardPreSolveB(arb, space); @@ -426,8 +433,10 @@ namespace Nz RigidBody2D* firstRigidBody = static_cast(cpBodyGetUserData(firstBody)); RigidBody2D* secondRigidBody = static_cast(cpBodyGetUserData(secondBody)); + Arbiter2D arbiter(arb); + const Callback* customCallbacks = static_cast(data); - customCallbacks->postSolveCallback(*world, *firstRigidBody, *secondRigidBody, customCallbacks->userdata); + customCallbacks->postSolveCallback(*world, arbiter, *firstRigidBody, *secondRigidBody, customCallbacks->userdata); cpArbiterCallWildcardPostSolveA(arb, space); cpArbiterCallWildcardPostSolveB(arb, space); From 6ab4a676c253f42cde3b7403210152bfe908096a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 2 Aug 2018 15:43:18 +0200 Subject: [PATCH 044/352] Fix deprecation warning --- SDK/include/NDK/Components/PhysicsComponent2D.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index 3105a85ea..bd550c41b 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -171,7 +171,7 @@ namespace Ndk { NazaraAssert(m_object, "Invalid physics object"); - return m_object->GetCenterOfGravity(coordSys); + return m_object->GetMassCenter(coordSys); } /*! From 46e3de90ed454167c9ed5cd10df5690ec08a6e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 2 Aug 2018 15:49:29 +0200 Subject: [PATCH 045/352] Fix units tests :derp: --- tests/Engine/Physics2D/PhysWorld2D.cpp | 12 ++++++------ tests/Engine/Physics2D/RigidBody2D.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/Engine/Physics2D/PhysWorld2D.cpp b/tests/Engine/Physics2D/PhysWorld2D.cpp index 4f492a9c0..e71c9f2cb 100644 --- a/tests/Engine/Physics2D/PhysWorld2D.cpp +++ b/tests/Engine/Physics2D/PhysWorld2D.cpp @@ -131,29 +131,29 @@ SCENARIO("PhysWorld2D", "[PHYSICS2D][PHYSWORLD2D]") int statusTriggerCollision = 0; Nz::PhysWorld2D::Callback characterTriggerCallback; - characterTriggerCallback.startCallback = [&](Nz::PhysWorld2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) -> bool { + characterTriggerCallback.startCallback = [&](Nz::PhysWorld2D&, Nz::Arbiter2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) -> bool { statusTriggerCollision = statusTriggerCollision | 1 << 0; return true; }; - characterTriggerCallback.preSolveCallback = [&](Nz::PhysWorld2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) -> bool { + characterTriggerCallback.preSolveCallback = [&](Nz::PhysWorld2D&, Nz::Arbiter2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) -> bool { statusTriggerCollision = statusTriggerCollision | 1 << 1; return true; }; - characterTriggerCallback.postSolveCallback = [&](Nz::PhysWorld2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) { + characterTriggerCallback.postSolveCallback = [&](Nz::PhysWorld2D&, Nz::Arbiter2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) { statusTriggerCollision = statusTriggerCollision | 1 << 2; }; - characterTriggerCallback.endCallback = [&](Nz::PhysWorld2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) { + characterTriggerCallback.endCallback = [&](Nz::PhysWorld2D&, Nz::Arbiter2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) { statusTriggerCollision = statusTriggerCollision | 1 << 3; }; world.RegisterCallbacks(CHARACTER_COLLISION_ID, TRIGGER_COLLISION_ID, characterTriggerCallback); int statusWallCollision = 0; Nz::PhysWorld2D::Callback characterWallCallback; - characterWallCallback.startCallback = [&](Nz::PhysWorld2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) -> bool { + characterWallCallback.startCallback = [&](Nz::PhysWorld2D&, Nz::Arbiter2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) -> bool { statusWallCollision = statusWallCollision | 1 << 0; return true; }; - characterWallCallback.endCallback = [&](Nz::PhysWorld2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) { + characterWallCallback.endCallback = [&](Nz::PhysWorld2D&, Nz::Arbiter2D&, Nz::RigidBody2D&, Nz::RigidBody2D&, void*) { statusWallCollision = statusWallCollision | 1 << 1; }; world.RegisterCallbacks(CHARACTER_COLLISION_ID, WALL_COLLISION_ID, characterWallCallback); diff --git a/tests/Engine/Physics2D/RigidBody2D.cpp b/tests/Engine/Physics2D/RigidBody2D.cpp index c2b05438a..0da831cfc 100644 --- a/tests/Engine/Physics2D/RigidBody2D.cpp +++ b/tests/Engine/Physics2D/RigidBody2D.cpp @@ -317,7 +317,7 @@ void EQUALITY(const Nz::RigidBody2D& left, const Nz::RigidBody2D& right) { CHECK(left.GetAABB() == right.GetAABB()); CHECK(left.GetAngularVelocity() == Approx(right.GetAngularVelocity())); - CHECK(left.GetCenterOfGravity() == right.GetCenterOfGravity()); + CHECK(left.GetMassCenter() == right.GetMassCenter()); CHECK(left.GetGeom() == right.GetGeom()); CHECK(left.GetHandle() != right.GetHandle()); CHECK(left.GetMass() == Approx(right.GetMass())); From 05f277deeb8ef72d919a8053cbce3bfa2f484e23 Mon Sep 17 00:00:00 2001 From: S6066 Date: Fri, 3 Aug 2018 08:43:48 +0200 Subject: [PATCH 046/352] Ndk/TextAreaWidget: Add possibility to write only one specific character category (#174) * Ndk/TextAreaWidget: Add possibility to write only one specific character category * Add support for multiple categories * Use a predicate instead of an enum * Log change * String::FindLast/FindWord: Fix bug where index wouldn't be used (#177) * String::FindLast/FindWord: Fix bug where index wouldn't be used * Log change * Update Physics2D Component and Body (#178) * Update * Add: [Get/Set]AngularDaming for standardization * Fix: Name error * Add: [Get/Set][AngularDamping/MomentOfInertia] in PhysicsComponent2D * Forgot in last commit * Add: param coordSys in [PhysicsComponent2D/RigidBody2D]::SetMassCenter * Add: Some forgotten inline * Fix little error * Fix: Indentation before case * Move and Change GetCenterOfGravity * Physics2D: Add Arbiter2D * Fix deprecation warning * Fix units tests :derp: * Fixies --- ChangeLog.md | 5 +++-- SDK/include/NDK/Widgets/TextAreaWidget.hpp | 6 ++++++ SDK/include/NDK/Widgets/TextAreaWidget.inl | 10 ++++++++++ SDK/src/NDK/Widgets/TextAreaWidget.cpp | 3 ++- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 4cd68d12a..f50db11c2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -177,11 +177,12 @@ Nazara Development Kit: - ⚠️ 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. - Fixed EntityOwner move assignment which was losing entity ownership -- Add GraphicsComponent:ForEachRenderable method +- Added GraphicsComponent:ForEachRenderable method - Fixed GraphicsComponent reflective material count which was not initialized - Added PhysicsComponent2D::ClosestPointQuery -- Fix GraphicsComponent copy constructor not copying scissor rect +- Fixed GraphicsComponent copy constructor not copying scissor rect - Force parent parameter to be present in widgets constructor +- Added the possibility to write only specific characters with a predicate in TextAreaWidget # 0.4: diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index af5377e6f..4c3168c4e 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -12,12 +12,15 @@ #include #include #include +#include namespace Ndk { class NDK_API TextAreaWidget : public BaseWidget { public: + using CharacterFilter = std::function; + TextAreaWidget(BaseWidget* parent); TextAreaWidget(const TextAreaWidget&) = delete; TextAreaWidget(TextAreaWidget&&) = default; @@ -33,6 +36,7 @@ namespace Ndk void EraseSelection(); + inline CharacterFilter GetCharacterFilter() const; inline unsigned int GetCharacterSize() const; inline const Nz::Vector2ui& GetCursorPosition() const; inline Nz::Vector2ui GetCursorPosition(std::size_t glyphIndex) const; @@ -54,6 +58,7 @@ namespace Ndk void ResizeToContent() override; + inline void SetCharacterFilter(CharacterFilter filter); inline void SetCharacterSize(unsigned int characterSize); inline void SetCursorPosition(std::size_t glyphIndex); inline void SetCursorPosition(Nz::Vector2ui cursorPosition); @@ -96,6 +101,7 @@ namespace Ndk void RefreshCursor(); void UpdateDisplayText(); + std::function m_characterFilter; EchoMode m_echoMode; EntityHandle m_cursorEntity; EntityHandle m_textEntity; diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index 274d46a02..7b49ddb26 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -23,6 +23,11 @@ namespace Ndk m_multiLineEnabled = enable; } + inline TextAreaWidget::CharacterFilter TextAreaWidget::GetCharacterFilter() const + { + return m_characterFilter; + } + inline unsigned int TextAreaWidget::GetCharacterSize() const { return m_drawer.GetCharacterSize(); @@ -140,6 +145,11 @@ namespace Ndk SetCursorPosition(cursorPosition); } + inline void TextAreaWidget::SetCharacterFilter(CharacterFilter filter) + { + m_characterFilter = filter; + } + inline void TextAreaWidget::SetCharacterSize(unsigned int characterSize) { m_drawer.SetCharacterSize(characterSize); diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index f10f57953..bf35c726e 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -11,6 +11,7 @@ namespace Ndk { TextAreaWidget::TextAreaWidget(BaseWidget* parent) : BaseWidget(parent), + m_characterFilter(), m_echoMode(EchoMode_Normal), m_cursorPositionBegin(0U, 0U), m_cursorPositionEnd(0U, 0U), @@ -394,7 +395,7 @@ namespace Ndk default: { - if (Nz::Unicode::GetCategory(character) == Nz::Unicode::Category_Other_Control) + if (Nz::Unicode::GetCategory(character) == Nz::Unicode::Category_Other_Control || (m_characterFilter && !m_characterFilter(character))) break; if (HasSelection()) From cf24b8abe44969c09f8cc0a69d4833c8681e5f52 Mon Sep 17 00:00:00 2001 From: S6066 Date: Fri, 3 Aug 2018 08:45:42 +0200 Subject: [PATCH 047/352] TextAreaWidget: Implement movement with Ctrl key (#176) * TextAreaWidget: Implement movement with Ctrl key * whoops, remove useless comments * Fixies --- ChangeLog.md | 1 + SDK/src/NDK/Widgets/TextAreaWidget.cpp | 55 ++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f50db11c2..8514bbf26 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -129,6 +129,7 @@ Nazara Engine: - Fixed bug in ENet implementation causing legit reliable packets to be dropped on sequence number overflow - Fixed bug where index wouldn't be used in String::FindLast and String::FindWord - Physics 2D contact callbacks now include an arbiter allowing to query/set parameters about the collision +- Added movement with Ctrl in TextAreaWidget Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index bf35c726e..334a78079 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -225,8 +225,12 @@ namespace Ndk if (ignoreDefaultAction) return true; - const auto& lineInfo = m_drawer.GetLine(m_cursorPositionEnd.y); - SetCursorPosition({ static_cast(m_drawer.GetLineGlyphCount(m_cursorPositionEnd.y)), m_cursorPositionEnd.y }); + 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; } @@ -238,7 +242,7 @@ namespace Ndk if (ignoreDefaultAction) return true; - SetCursorPosition({ 0U, m_cursorPositionEnd.y }); + SetCursorPosition({ 0U, key.control ? 0U : m_cursorPositionEnd.y }); return true; } @@ -252,6 +256,28 @@ namespace Ndk 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); @@ -268,6 +294,29 @@ namespace Ndk 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); From 39d1d3163969169887e762a32caf0b9cbcfe6ee1 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 3 Aug 2018 20:24:56 +0200 Subject: [PATCH 048/352] Core: Integrated Unicode data --- build/scripts/actions/unicode.lua | 233 +- include/Nazara/Core/Config.hpp | 2 +- include/Nazara/Core/Unicode.hpp | 44 +- src/Nazara/Core/Unicode.cpp | 131 +- src/Nazara/Core/UnicodeData.hpp | 36479 ++++++++++++++++++++++++++++ 5 files changed, 36780 insertions(+), 109 deletions(-) create mode 100644 src/Nazara/Core/UnicodeData.hpp diff --git a/build/scripts/actions/unicode.lua b/build/scripts/actions/unicode.lua index 536fb44ec..471c1808b 100644 --- a/build/scripts/actions/unicode.lua +++ b/build/scripts/actions/unicode.lua @@ -48,15 +48,19 @@ local DirectionToString = {} DirectionToString["EN"] = "Direction_European_Number" DirectionToString["ES"] = "Direction_European_Separator" DirectionToString["ET"] = "Direction_European_Terminator" + DirectionToString["FSI"] = "Direction_First_Strong_Isolate" DirectionToString["L"] = "Direction_Left_To_Right" DirectionToString["LRE"] = "Direction_Left_To_Right_Embedding" + DirectionToString["LRI"] = "Direction_Left_To_Right_Isolate" DirectionToString["LRO"] = "Direction_Left_To_Right_Override" DirectionToString["NSM"] = "Direction_Nonspacing_Mark" DirectionToString["ON"] = "Direction_Other_Neutral" DirectionToString["B"] = "Direction_Paragraph_Separator" - DirectionToString["PDF"] = "Direction_Pop_Directional_Format" + DirectionToString["PDF"] = "Direction_Pop_Directional_Formatting" + DirectionToString["PDI"] = "Direction_Pop_Directional_Isolate" DirectionToString["R"] = "Direction_Right_To_Left" DirectionToString["RLE"] = "Direction_Right_To_Left_Embedding" + DirectionToString["RLI"] = "Direction_Right_To_Left_Isolate" DirectionToString["RLO"] = "Direction_Right_To_Left_Override" DirectionToString["S"] = "Direction_Segment_Separator" DirectionToString["WS"] = "Direction_White_Space" @@ -69,7 +73,7 @@ table.maxn = table.maxn or function (tab) -- Compatibilit end end end - + local function getCharacter(tab, first, index) local character = {} character.Category = CategoryToString[tab[3]] or "Category_NoCategory" @@ -83,112 +87,179 @@ end ACTION.Function = function () local unicodeSet = {} + if (not os.isdir("scripts/data") and not os.mkdir("scripts/data")) then + print("Failed to create scripts/data folder") + end - file = io.open ("scripts/data/UnicodeData.txt", "r") + local filepath = "scripts/data/UnicodeData.txt" + + print("Downloading UnicodeData.txt...") + + local t1 = os.clock() + + local result_str, response_code = http.download("https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt", filepath, { + headers = { "From: Premake", "Referer: Premake" } + }) + + if (response_code ~= 200) then + error("Failed to download UnicodeData.txt") + end + + local fileInfo = os.stat(filepath) + + local t2 = os.clock() + + print(string.format("Download succeeded (%.3f MiB) in %fs (%d KiB/s)", fileInfo.size / (1024 * 1024), t2 - t1, math.floor((fileInfo.size / (t2 - t1)) / 1024))) + + file = io.open (filepath, "r") if (not file) then error("Unable to open Unicode Data file") return end - local t1 = os.clock() + local characters = {} + local characterSets = {} + local lowercaseCharacters = {} + local titlecaseCharacters = {} + local uppercaseCharacters = {} + local currentBlock + local currentBlockStartCodepoint + local lineIndex = 1 + + t1 = os.clock() + print("Parsing UnicodeData.txt...") - local first = 0 - local last = 0 - unicodeSet[0] = {} - unicodeSet[0].First = 0 - unicodeSet[0].Characters = {} - local currentSet = 0 - local inblock = false - local blockData = nil - local unusedIndex = 0 - local c = 0 for line in file:lines() do - local old = 0 - local start = string.find(line, ';', old) - local tab = {} - while (start) do - tab[#tab+1] = string.sub(line, old, start-1, old) - old = start+1 - start = string.find(line, ';', old) - end - tab[#tab+1] = string.sub(line, old) - - local index = tonumber(tab[1], 16) - if (index > 0 and not inblock) then - if (index-last > 1000) then - unicodeSet[currentSet].Last = last - currentSet = currentSet + 1 - unicodeSet[currentSet] = {} - unicodeSet[currentSet].First = index - unicodeSet[currentSet].Characters = {} - print("Set detected (Begin at " .. first .. ", end at " .. last .. ")") - first = index + local parts = line:explode(";") + + local codepoint = tonumber(parts[1], 16) + local characterName = parts[2] + local category = parts[3] + local direction = parts[5] + local uppercaseMapping = tonumber(parts[13], 16) + local lowercaseMapping = tonumber(parts[14], 16) + local titlecaseMapping = tonumber(parts[15], 16) + + local blockName, blockId = string.match(characterName, "<(.+), (%w+)>") + if (currentBlock) then + if (blockId ~= "Last") then + error("Parsing error: expected last block at line " .. lineIndex) + end + + print("Detected set " .. blockName .. " from codepoint " .. currentBlockStartCodepoint .. " to " .. codepoint) + + table.insert(characterSets, { + startCodepoint = currentBlockStartCodepoint, + endCodepoint = codepoint, + name = "<" .. blockName .. ">", + category = category, + direction = direction + }) + + currentBlock = nil + else + if (blockName) then + if (blockId ~= "First") then + error("Parsing error: expected first block at line " .. lineIndex) + end + + currentBlock = blockName + currentBlockStartCodepoint = codepoint else - unusedIndex = unusedIndex + index-last-1 - end - end - - local blockName, blockId = string.match(tab[2], "<(.+), (%w+)>") - if (blockName ~= nil and blockId ~= nil) then - if (blockId == "First") then - if (inblock) then - error("Already in block (" .. tab[1] .. ")") + table.insert(characters, { + codepoint = codepoint, + name = characterName, + category = category, + direction = direction, + upper = uppercaseMapping, + lower = lowercaseMapping, + title = titlecaseMapping + }) + + if (lowercaseMapping) then + table.insert(lowercaseCharacters, {codepoint = codepoint, lower = lowercaseMapping}) end - inblock = true - blockCharacter = getCharacter(tab, first) - elseif (blockId == "Last") then - if (not inblock) then - error("Not in block (" .. tab[1] .. ")") + + if (titlecaseMapping) then + table.insert(titlecaseCharacters, {codepoint = codepoint, title = titlecaseMapping}) end - inblock = false - for i=first, index do - unicodeSet[currentSet].Characters[i] = getCharacter(tab, first, i) + + if (uppercaseMapping) then + table.insert(uppercaseCharacters, {codepoint = codepoint, upper = uppercaseMapping}) end end end - unicodeSet[currentSet].Characters[index - first] = getCharacter(tab, first, index) - if (unicodeSet[currentSet].Characters[index - first].LowerCase ~= (index - first) or - unicodeSet[currentSet].Characters[index - first].UpperCase ~= (index - first) or - unicodeSet[currentSet].Characters[index - first].TitleCase ~= (index - first)) then - c = c + 1 - end - - last = index + lineIndex = lineIndex + 1 end - unicodeSet[currentSet].Last = last - print("Set detected (Begin at " .. first .. ", end at " .. last .. ")") - file:close() - print("Parsed " .. last+1 .. " characters in " .. #unicodeSet .. " sets, " .. unusedIndex .. " unused indices (took " .. os.difftime(os.clock(), t1) .. " sec)") + t2 = os.clock() + + print("Parsed " .. #characters .. " characters in " .. (t2 - t1) .. " seconds") + + print("Writting Unicode Data to header...") file = io.open("../src/Nazara/Core/UnicodeData.hpp", "w+") if (not file) then - error("Unable to create Unicode Data header") + error("Failed to open Unicode Data header") return end - print("Writting Unicode Data to header...") - t1 = os.clock() - for i=0, #unicodeSet do - local maxn = table.maxn(unicodeSet[i].Characters) - file:write(string.format("Character unicodeSet%d[%d] = {\n", i, maxn+1)) - for j=0, maxn do - local v = unicodeSet[i].Characters[j] - if (v) then - file:write(string.format("\t{%s,%s,%d,%d,%d},\n", v.Category, v.Direction, v.LowerCase, v.TitleCase, v.UpperCase)) - else - file:write(string.format("\t{Category_NoCategory,Direction_Boundary_Neutral,%d,%d,%d},\n", j, j, j)) - end + file:write(string.format("UnicodeCharacter unicodeCharacters[%d] = {\n", #characters)) + + for _, data in pairs(characters) do + local category = CategoryToString[data.category] + if (not category) then + error("Unknown category " .. data.category .. " for character " .. data.codepoint) end - - file:write("};\n\n") + + local direction = DirectionToString[data.direction] + if (not direction) then + error("Unknown direction " .. data.direction .. " for character " .. data.codepoint) + end + + file:write(string.format("\t{%d, Unicode::%s, Unicode::%s},\n", data.codepoint, category, direction)) end + file:write("};\n\n") + + file:write(string.format("UnicodeSet unicodeSets[%d] = {\n", #characterSets)) + + for _, data in pairs(characterSets) do + local category = CategoryToString[data.category] + if (not category) then + error("Unknown category " .. data.category .. " for character " .. data.codepoint) + end + + local direction = DirectionToString[data.direction] + if (not direction) then + error("Unknown direction " .. data.direction .. " for character " .. data.codepoint) + end + + file:write(string.format("\t{%d, %d, {%d, Unicode::%s, Unicode::%s}},\n", data.startCodepoint, data.endCodepoint, data.startCodepoint, category, direction)) + end + file:write("};\n\n") + + file:write(string.format("UnicodeCharacterSimpleMapping unicodeLower[%d] = {\n", #lowercaseCharacters)) + for _, data in pairs(lowercaseCharacters) do + file:write(string.format("\t{%d, %d},\n", data.codepoint, data.lower)) + end + file:write("};\n\n") + + file:write(string.format("UnicodeCharacterSimpleMapping unicodeTitle[%d] = {\n", #titlecaseCharacters)) + for _, data in pairs(titlecaseCharacters) do + file:write(string.format("\t{%d, %d},\n", data.codepoint, data.title)) + end + file:write("};\n\n") + + file:write(string.format("UnicodeCharacterSimpleMapping unicodeUpper[%d] = {\n", #uppercaseCharacters)) + for _, data in pairs(uppercaseCharacters) do + file:write(string.format("\t{%d, %d},\n", data.codepoint, data.upper)) + end + file:write("};\n\n") + file:close() - print("Took " .. os.difftime(os.clock(), t1) .. "sec.") + print("Succeeded in " .. (os.clock() - t1) .. "sec.") end ---print(string.match("", "<.+, (%w+)>")) - diff --git a/include/Nazara/Core/Config.hpp b/include/Nazara/Core/Config.hpp index 5aa9fccec..976db4512 100644 --- a/include/Nazara/Core/Config.hpp +++ b/include/Nazara/Core/Config.hpp @@ -50,7 +50,7 @@ #define NAZARA_CORE_FILE_BUFFERSIZE 4096 // Incorporate the Unicode Character Data table (Necessary to make it work with the flag String::HandleUTF8) -#define NAZARA_CORE_INCLUDE_UNICODEDATA 0 +#define NAZARA_CORE_INCLUDE_UNICODEDATA 1 // Use the MemoryManager to manage dynamic allocations (can detect memory leak but allocations/frees are slower) #define NAZARA_CORE_MANAGE_MEMORY 0 diff --git a/include/Nazara/Core/Unicode.hpp b/include/Nazara/Core/Unicode.hpp index 056d61f7d..f1c889ecb 100644 --- a/include/Nazara/Core/Unicode.hpp +++ b/include/Nazara/Core/Unicode.hpp @@ -55,7 +55,7 @@ namespace Nz Category_Other_PrivateUse = Category_Other | 0x0800, // Co Category_Other_Surrogate = Category_Other | 0x1000, // Cs - // Ponctuations + // Punctuations Category_Punctuation = 0x10, // P Category_Punctuation_Close = Category_Punctuation | 0x0100, // Pe Category_Punctuation_Connector = Category_Punctuation | 0x0200, // Pc @@ -81,25 +81,29 @@ namespace Nz enum Direction : UInt8 { - Direction_Arabic_Letter, // AL - Direction_Arabic_Number, // AN - Direction_Boundary_Neutral, // BN - Direction_Common_Separator, // CS - Direction_European_Number, // EN - Direction_European_Separator, // ES - Direction_European_Terminator, // ET - Direction_Left_To_Right, // L - Direction_Left_To_Right_Embedding, // LRE - Direction_Left_To_Right_Override, // LRO - Direction_Nonspacing_Mark, // NSM - Direction_Other_Neutral, // ON - Direction_Paragraph_Separator, // B - Direction_Pop_Directional_Format, // PDF - Direction_Right_To_Left, // R - Direction_Right_To_Left_Embedding, // RLE - Direction_Right_To_Left_Override, // RLO - Direction_Segment_Separator, // S - Direction_White_Space // WS + Direction_Arabic_Letter, // AL + Direction_Arabic_Number, // AN + Direction_Boundary_Neutral, // BN + Direction_Common_Separator, // CS + Direction_European_Number, // EN + Direction_European_Separator, // ES + Direction_European_Terminator, // ET + Direction_First_Strong_Isolate, // FSI + Direction_Left_To_Right, // L + Direction_Left_To_Right_Embedding, // LRE + Direction_Left_To_Right_Isolate, // LRI + Direction_Left_To_Right_Override, // LRO + Direction_Nonspacing_Mark, // NSM + Direction_Other_Neutral, // ON + Direction_Paragraph_Separator, // B + Direction_Pop_Directional_Formatting, // PDF + Direction_Pop_Directional_Isolate, // PDI + Direction_Right_To_Left, // R + Direction_Right_To_Left_Embedding, // RLE + Direction_Right_To_Left_Isolate, // RLI + Direction_Right_To_Left_Override, // RLO + Direction_Segment_Separator, // S + Direction_White_Space // WS }; static Category GetCategory(char32_t character); diff --git a/src/Nazara/Core/Unicode.cpp b/src/Nazara/Core/Unicode.cpp index eac37dead..6b5c10aa7 100644 --- a/src/Nazara/Core/Unicode.cpp +++ b/src/Nazara/Core/Unicode.cpp @@ -4,23 +4,140 @@ #include #include +#include #include #if NAZARA_CORE_INCLUDE_UNICODEDATA namespace Nz { - struct Character + struct UnicodeCharacter { - UInt16 category; // The type of the character - UInt8 direction; // The reading way of the character - UInt32 lowerCase; // The corresponding lower character - UInt32 titleCase; // The corresponding title character - UInt32 upperCase; // The corresponding upper character + UInt32 codepoint; + Unicode::Category category; // The type of the character + Unicode::Direction direction; // The reading way of the character + }; + + struct UnicodeSet + { + UInt32 firstCodepoint; + UInt32 lastCodepoint; + UnicodeCharacter character; + }; + + struct UnicodeCharacterSimpleMapping + { + UInt32 codepoint; + UInt32 character; }; -} #include + namespace + { + const UnicodeCharacter* GetCharacter(Nz::UInt32 codepoint) + { + auto it = std::lower_bound(std::begin(unicodeCharacters), std::end(unicodeCharacters), codepoint, [](const UnicodeCharacter& character, Nz::UInt32 codepoint) { return character.codepoint < codepoint; }); + if (it != std::end(unicodeCharacters) && it->codepoint == codepoint) + return &*it; + else + { + // Character is not part of the common character array, search in set + auto itSet = std::lower_bound(std::begin(unicodeSets), std::end(unicodeSets), codepoint, [](const UnicodeSet& character, Nz::UInt32 codepoint) { return character.firstCodepoint < codepoint; }); + if (itSet != std::begin(unicodeSets)) + { + --itSet; + if (itSet != std::end(unicodeSets) && codepoint >= itSet->firstCodepoint && codepoint <= itSet->lastCodepoint) + return &itSet->character; + } + } + + return nullptr; + } + + template + const UnicodeCharacterSimpleMapping* GetCharacterMapping(Nz::UInt32 codepoint, const UnicodeCharacterSimpleMapping(&mapping)[N]) + { + auto it = std::lower_bound(std::begin(mapping), std::end(mapping), codepoint, [](const UnicodeCharacterSimpleMapping& character, Nz::UInt32 codepoint) { return character.codepoint < codepoint; }); + if (it != std::end(mapping) && it->codepoint == codepoint) + return &*it; + else + return nullptr; + } + } + + /*! + * \brief Gets the category of the character + * \return Unicode category + * + * \param character Character to get assignated category + */ + Unicode::Category Unicode::GetCategory(char32_t character) + { + if (const UnicodeCharacter* characterData = GetCharacter(character)) + return characterData->category; + else + return Category_NoCategory; + } + + /*! + * \brief Gets the direction of reading of the character + * \return Unicode direction + * + * \param character Character to get assignated direction + */ + + Unicode::Direction Unicode::GetDirection(char32_t character) + { + if (const UnicodeCharacter* characterData = GetCharacter(character)) + return characterData->direction; + else + return Direction_Boundary_Neutral; + } + + /*! + * \brief Gets the lower case of the character + * \return Unicode lower + * + * \param character Character to get assignated lower case + */ + + char32_t Unicode::GetLowercase(char32_t character) + { + if (const UnicodeCharacterSimpleMapping* characterMapping = GetCharacterMapping(character, unicodeLower)) + return characterMapping->character; + else + return character; + } + + /*! + * \brief Gets the title case of the character + * \return Unicode title + * + * \param character Character to get assignated title case + */ + char32_t Unicode::GetTitlecase(char32_t character) + { + if (const UnicodeCharacterSimpleMapping* characterMapping = GetCharacterMapping(character, unicodeTitle)) + return characterMapping->character; + else + return character; + } + + /*! + * \brief Gets the upper case of the character + * \return Unicode upper + * + * \param character Character to get assignated upper case + */ + char32_t Unicode::GetUppercase(char32_t character) + { + if (const UnicodeCharacterSimpleMapping* characterMapping = GetCharacterMapping(character, unicodeUpper)) + return characterMapping->character; + else + return character; + } +} + #else // Implementation handling ASCII table namespace Nz diff --git a/src/Nazara/Core/UnicodeData.hpp b/src/Nazara/Core/UnicodeData.hpp new file mode 100644 index 000000000..7e8effc89 --- /dev/null +++ b/src/Nazara/Core/UnicodeData.hpp @@ -0,0 +1,36479 @@ +UnicodeCharacter unicodeCharacters[32262] = { + {0, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {1, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {2, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {3, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {4, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {5, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {6, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {7, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {8, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {9, Unicode::Category_Other_Control, Unicode::Direction_Segment_Separator}, + {10, Unicode::Category_Other_Control, Unicode::Direction_Paragraph_Separator}, + {11, Unicode::Category_Other_Control, Unicode::Direction_Segment_Separator}, + {12, Unicode::Category_Other_Control, Unicode::Direction_White_Space}, + {13, Unicode::Category_Other_Control, Unicode::Direction_Paragraph_Separator}, + {14, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {15, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {16, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {17, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {18, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {19, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {20, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {21, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {22, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {23, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {24, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {25, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {26, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {27, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {28, Unicode::Category_Other_Control, Unicode::Direction_Paragraph_Separator}, + {29, Unicode::Category_Other_Control, Unicode::Direction_Paragraph_Separator}, + {30, Unicode::Category_Other_Control, Unicode::Direction_Paragraph_Separator}, + {31, Unicode::Category_Other_Control, Unicode::Direction_Segment_Separator}, + {32, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {33, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {34, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {35, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {36, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {37, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {38, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {39, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {40, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {41, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {42, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {43, Unicode::Category_Symbol_Math, Unicode::Direction_European_Separator}, + {44, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {45, Unicode::Category_Punctuation_Dash, Unicode::Direction_European_Separator}, + {46, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {47, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {48, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {49, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {50, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {51, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {52, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {53, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {54, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {55, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {56, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {57, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {58, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {59, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {60, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {61, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {62, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {63, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {64, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {67, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {68, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {69, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {70, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {72, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {73, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {74, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {75, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {76, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {77, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {78, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {79, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {80, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {81, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {82, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {83, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {84, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {85, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {86, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {87, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {88, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {89, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {90, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {91, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {92, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {93, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {94, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {95, Unicode::Category_Punctuation_Connector, Unicode::Direction_Other_Neutral}, + {96, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {97, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {98, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {99, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {100, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {101, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {102, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {103, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {104, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {105, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {106, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {107, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {108, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {109, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {110, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {111, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {112, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {113, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {114, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {115, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {116, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {117, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {118, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {121, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {122, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {123, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {124, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {125, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {126, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {127, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {128, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {129, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {130, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {131, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {132, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {133, Unicode::Category_Other_Control, Unicode::Direction_Paragraph_Separator}, + {134, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {135, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {136, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {137, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {138, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {139, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {140, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {141, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {142, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {143, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {144, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {145, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {146, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {147, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {148, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {149, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {150, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {151, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {152, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {153, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {154, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {155, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {156, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {157, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {158, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {159, Unicode::Category_Other_Control, Unicode::Direction_Boundary_Neutral}, + {160, Unicode::Category_Separator_Space, Unicode::Direction_Common_Separator}, + {161, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {162, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {163, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {164, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {165, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {166, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {167, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {168, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {169, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {171, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {172, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {173, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {174, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {175, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {176, Unicode::Category_Symbol_Other, Unicode::Direction_European_Terminator}, + {177, Unicode::Category_Symbol_Math, Unicode::Direction_European_Terminator}, + {178, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {179, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {180, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {181, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {182, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {183, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {184, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {185, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {187, Unicode::Category_Punctuation_FinalQuote, Unicode::Direction_Other_Neutral}, + {188, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {189, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {190, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {191, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {192, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {193, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {194, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {195, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {196, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {197, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {198, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {199, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {200, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {201, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {202, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {203, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {204, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {205, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {206, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {207, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {208, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {209, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {210, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {211, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {212, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {213, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {214, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {215, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {216, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {217, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {218, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {219, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {220, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {221, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {222, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {223, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {224, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {225, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {226, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {227, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {228, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {229, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {230, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {231, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {232, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {233, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {234, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {235, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {236, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {237, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {238, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {239, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {240, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {241, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {242, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {243, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {244, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {245, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {246, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {247, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {248, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {249, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {250, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {251, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {252, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {253, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {254, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {255, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {256, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {257, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {258, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {259, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {260, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {261, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {262, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {263, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {264, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {265, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {266, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {267, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {268, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {269, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {270, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {271, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {272, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {273, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {274, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {275, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {276, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {277, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {278, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {279, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {280, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {281, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {282, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {283, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {284, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {285, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {286, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {287, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {288, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {289, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {290, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {291, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {292, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {293, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {294, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {295, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {296, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {297, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {298, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {299, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {300, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {301, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {302, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {303, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {304, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {305, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {306, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {307, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {308, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {309, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {310, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {311, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {312, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {313, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {314, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {315, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {316, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {317, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {318, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {319, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {320, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {321, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {322, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {323, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {324, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {325, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {326, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {327, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {328, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {329, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {330, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {331, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {332, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {333, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {334, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {335, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {336, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {337, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {338, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {339, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {340, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {341, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {342, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {343, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {344, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {345, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {346, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {347, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {348, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {349, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {350, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {351, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {352, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {353, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {354, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {355, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {356, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {357, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {358, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {359, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {360, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {361, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {362, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {363, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {364, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {365, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {366, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {367, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {368, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {369, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {370, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {371, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {372, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {373, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {374, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {375, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {376, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {377, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {378, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {379, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {380, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {381, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {382, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {383, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {384, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {385, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {386, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {387, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {388, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {389, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {390, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {391, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {392, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {393, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {394, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {395, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {396, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {397, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {398, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {399, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {400, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {401, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {402, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {403, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {404, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {405, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {406, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {407, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {408, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {409, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {410, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {411, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {412, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {413, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {414, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {415, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {416, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {417, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {418, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {419, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {420, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {421, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {422, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {423, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {424, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {425, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {426, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {427, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {428, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {429, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {430, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {431, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {432, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {433, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {434, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {435, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {436, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {437, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {438, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {439, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {440, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {441, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {442, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {444, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {445, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {446, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {447, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {452, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {453, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {454, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {455, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {456, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {457, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {458, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {459, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {460, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {461, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {462, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {463, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {464, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {465, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {466, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {467, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {468, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {469, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {470, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {471, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {472, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {473, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {474, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {475, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {476, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {477, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {478, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {479, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {480, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {481, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {482, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {483, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {484, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {485, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {486, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {487, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {488, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {489, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {490, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {491, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {492, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {493, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {494, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {495, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {496, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {497, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {498, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {499, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {500, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {501, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {502, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {503, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {504, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {505, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {506, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {507, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {508, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {509, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {510, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {511, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {512, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {513, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {514, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {515, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {516, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {517, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {518, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {519, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {520, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {521, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {522, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {523, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {524, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {525, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {526, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {527, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {528, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {529, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {530, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {531, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {532, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {533, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {534, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {535, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {536, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {537, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {538, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {539, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {540, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {541, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {542, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {543, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {544, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {545, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {546, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {547, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {548, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {549, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {550, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {551, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {552, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {553, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {554, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {555, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {556, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {557, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {558, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {559, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {560, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {561, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {562, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {563, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {564, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {565, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {566, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {567, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {568, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {569, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {570, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {571, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {572, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {573, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {574, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {575, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {576, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {577, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {578, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {579, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {580, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {581, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {582, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {583, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {584, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {585, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {586, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {587, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {588, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {589, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {590, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {591, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {592, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {593, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {594, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {595, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {596, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {597, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {598, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {599, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {600, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {601, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {602, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {603, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {604, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {605, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {606, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {607, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {608, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {609, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {610, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {611, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {612, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {613, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {614, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {615, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {616, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {617, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {618, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {619, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {620, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {621, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {622, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {623, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {624, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {625, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {626, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {627, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {628, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {629, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {630, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {631, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {632, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {633, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {634, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {635, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {636, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {637, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {638, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {639, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {640, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {641, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {642, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {643, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {644, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {645, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {646, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {647, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {648, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {649, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {650, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {651, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {652, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {653, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {654, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {655, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {656, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {657, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {658, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {659, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {661, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {662, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {663, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {664, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {665, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {666, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {667, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {668, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {669, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {670, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {671, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {672, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {673, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {674, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {675, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {676, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {677, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {678, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {679, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {680, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {681, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {682, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {683, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {684, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {685, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {686, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {687, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {688, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {689, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {690, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {691, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {692, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {693, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {694, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {695, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {696, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {697, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {698, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {699, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {700, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {701, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {702, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {703, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {704, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {705, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {706, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {707, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {708, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {709, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {710, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {711, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {712, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {713, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {714, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {715, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {716, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {717, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {718, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {719, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {720, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {721, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {722, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {723, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {724, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {725, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {726, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {727, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {728, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {729, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {730, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {731, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {732, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {733, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {734, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {735, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {736, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {737, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {738, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {739, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {740, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {741, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {742, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {743, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {744, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {745, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {746, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {747, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {748, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {749, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {750, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {751, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {752, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {753, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {754, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {755, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {756, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {757, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {758, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {759, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {760, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {761, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {762, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {763, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {764, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {765, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {766, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {767, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {768, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {769, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {770, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {771, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {772, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {773, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {774, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {775, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {776, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {777, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {778, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {779, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {780, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {781, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {782, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {783, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {784, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {785, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {786, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {787, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {788, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {789, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {790, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {791, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {792, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {793, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {794, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {795, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {796, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {797, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {798, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {799, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {800, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {801, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {802, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {803, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {804, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {805, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {806, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {807, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {808, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {809, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {810, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {811, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {812, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {813, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {814, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {815, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {816, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {817, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {818, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {819, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {820, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {821, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {822, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {823, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {824, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {825, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {826, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {827, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {828, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {829, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {830, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {831, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {832, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {833, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {834, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {835, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {836, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {837, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {838, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {839, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {840, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {841, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {842, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {843, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {844, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {845, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {846, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {847, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {848, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {849, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {850, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {851, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {852, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {853, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {854, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {855, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {856, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {857, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {858, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {859, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {860, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {861, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {862, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {863, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {864, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {865, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {866, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {867, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {868, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {869, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {870, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {871, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {872, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {873, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {874, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {875, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {876, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {877, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {878, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {879, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {880, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {881, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {882, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {883, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {884, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {885, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {886, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {887, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {890, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {891, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {892, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {893, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {894, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {895, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {900, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {901, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {902, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {903, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {904, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {905, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {906, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {908, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {910, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {911, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {912, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {913, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {914, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {915, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {916, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {917, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {918, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {919, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {920, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {921, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {922, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {923, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {924, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {925, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {926, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {927, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {928, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {929, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {931, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {932, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {933, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {934, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {935, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {936, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {937, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {938, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {939, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {940, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {941, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {942, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {943, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {944, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {945, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {946, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {947, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {948, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {949, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {950, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {951, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {952, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {953, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {954, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {955, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {956, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {957, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {958, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {959, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {960, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {961, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {962, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {963, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {964, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {965, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {966, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {967, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {968, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {969, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {970, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {971, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {972, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {973, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {974, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {975, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {976, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {977, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {978, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {979, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {980, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {981, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {982, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {983, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {984, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {985, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {986, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {987, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {988, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {989, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {990, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {991, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {992, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {993, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {994, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {995, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {996, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {997, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {998, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {999, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1000, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1001, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1002, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1003, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1004, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1005, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1006, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1007, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1008, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1009, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1010, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1011, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1012, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1013, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1014, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {1015, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1016, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1017, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1018, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1019, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1020, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1021, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1022, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1023, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1024, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1025, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1026, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1027, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1028, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1029, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1030, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1031, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1032, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1033, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1034, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1035, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1036, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1037, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1038, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1039, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1040, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1041, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1042, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1043, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1044, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1045, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1046, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1047, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1048, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1049, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1050, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1051, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1052, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1053, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1054, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1055, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1056, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1057, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1058, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1059, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1060, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1061, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1062, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1063, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1064, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1065, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1066, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1067, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1068, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1069, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1070, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1071, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1072, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1073, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1074, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1075, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1076, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1077, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1078, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1079, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1080, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1081, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1082, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1083, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1084, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1085, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1086, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1087, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1088, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1089, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1090, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1091, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1092, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1093, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1094, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1095, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1096, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1097, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1098, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1099, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1100, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1101, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1102, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1103, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1104, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1105, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1106, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1107, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1108, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1109, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1110, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1111, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1112, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1113, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1114, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1115, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1116, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1117, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1118, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1119, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1120, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1121, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1122, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1123, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1124, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1125, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1126, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1127, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1128, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1129, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1130, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1131, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1132, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1133, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1134, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1135, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1136, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1137, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1138, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1139, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1140, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1141, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1142, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1143, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1144, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1145, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1146, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1147, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1148, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1149, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1150, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1151, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1152, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1153, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1154, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {1155, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1156, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1157, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1158, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1159, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1160, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {1161, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {1162, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1163, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1164, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1165, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1166, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1167, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1168, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1169, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1170, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1171, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1172, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1173, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1174, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1175, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1176, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1177, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1178, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1179, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1180, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1181, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1182, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1183, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1184, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1185, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1186, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1187, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1188, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1189, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1190, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1191, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1192, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1193, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1194, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1195, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1196, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1197, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1198, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1199, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1200, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1201, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1202, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1203, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1204, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1205, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1206, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1207, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1208, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1209, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1210, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1211, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1212, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1213, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1214, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1215, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1216, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1217, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1218, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1219, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1220, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1221, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1222, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1223, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1224, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1225, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1226, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1227, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1228, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1229, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1230, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1231, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1232, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1233, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1234, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1235, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1236, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1237, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1238, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1239, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1240, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1241, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1242, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1243, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1244, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1245, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1246, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1247, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1248, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1249, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1250, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1251, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1252, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1253, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1254, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1255, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1256, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1257, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1258, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1259, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1260, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1261, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1262, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1263, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1264, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1265, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1266, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1267, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1268, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1269, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1270, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1271, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1272, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1273, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1274, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1275, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1276, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1277, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1278, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1279, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1280, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1281, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1282, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1283, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1284, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1285, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1286, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1287, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1288, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1289, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1290, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1291, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1292, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1293, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1294, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1295, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1296, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1297, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1298, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1299, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1300, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1301, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1302, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1303, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1304, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1305, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1306, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1307, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1308, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1309, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1310, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1311, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1312, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1313, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1314, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1315, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1316, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1317, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1318, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1319, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1320, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1321, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1322, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1323, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1324, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1325, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1326, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1327, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1329, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1330, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1331, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1332, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1333, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1334, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1335, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1336, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1337, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1338, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1339, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1340, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1341, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1342, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1343, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1344, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1345, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1346, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1347, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1348, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1349, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1350, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1351, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1352, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1353, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1354, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1355, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1356, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1357, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1358, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1359, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1360, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1361, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1362, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1363, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1364, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1365, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1366, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {1369, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {1370, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {1371, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {1372, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {1373, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {1374, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {1375, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {1376, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1377, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1378, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1379, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1380, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1381, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1382, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1383, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1384, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1385, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1386, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1387, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1388, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1389, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1390, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1391, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1392, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1393, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1394, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1395, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1396, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1397, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1398, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1399, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1400, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1401, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1402, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1403, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1404, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1405, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1406, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1407, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1408, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1409, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1410, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1411, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1412, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1413, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1414, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1415, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1416, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {1417, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {1418, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {1421, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {1422, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {1423, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {1425, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1426, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1427, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1428, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1429, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1430, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1431, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1432, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1433, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1434, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1435, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1436, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1437, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1438, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1439, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1440, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1441, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1442, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1443, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1444, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1445, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1446, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1447, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1448, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1449, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1450, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1451, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1452, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1453, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1454, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1455, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1456, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1457, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1458, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1459, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1460, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1461, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1462, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1463, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1464, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1465, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1466, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1467, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1468, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1469, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1470, Unicode::Category_Punctuation_Dash, Unicode::Direction_Right_To_Left}, + {1471, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1472, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {1473, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1474, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1475, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {1476, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1477, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1478, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {1479, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1488, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1489, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1490, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1491, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1492, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1493, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1494, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1495, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1496, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1497, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1498, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1499, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1500, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1501, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1502, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1503, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1504, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1505, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1506, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1507, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1508, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1509, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1510, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1511, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1512, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1513, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1514, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1519, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1520, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1521, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1522, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1523, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {1524, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {1536, Unicode::Category_Other_Format, Unicode::Direction_Arabic_Number}, + {1537, Unicode::Category_Other_Format, Unicode::Direction_Arabic_Number}, + {1538, Unicode::Category_Other_Format, Unicode::Direction_Arabic_Number}, + {1539, Unicode::Category_Other_Format, Unicode::Direction_Arabic_Number}, + {1540, Unicode::Category_Other_Format, Unicode::Direction_Arabic_Number}, + {1541, Unicode::Category_Other_Format, Unicode::Direction_Arabic_Number}, + {1542, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {1543, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {1544, Unicode::Category_Symbol_Math, Unicode::Direction_Arabic_Letter}, + {1545, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {1546, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {1547, Unicode::Category_Symbol_Currency, Unicode::Direction_Arabic_Letter}, + {1548, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {1549, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1550, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {1551, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {1552, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1553, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1554, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1555, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1556, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1557, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1558, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1559, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1560, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1561, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1562, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1563, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1564, Unicode::Category_Other_Format, Unicode::Direction_Arabic_Letter}, + {1566, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1567, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1568, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1569, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1570, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1571, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1572, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1573, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1574, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1575, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1576, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1577, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1578, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1579, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1580, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1581, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1582, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1583, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1584, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1585, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1586, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1587, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1588, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1589, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1590, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1591, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1592, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1593, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1594, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1595, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1596, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1597, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1598, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1599, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1600, Unicode::Category_Letter_Modifier, Unicode::Direction_Arabic_Letter}, + {1601, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1602, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1603, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1604, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1605, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1606, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1607, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1608, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1609, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1610, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1611, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1612, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1613, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1614, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1615, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1616, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1617, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1618, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1619, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1620, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1621, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1622, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1623, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1624, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1625, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1626, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1627, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1628, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1629, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1630, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1631, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1632, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {1633, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {1634, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {1635, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {1636, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {1637, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {1638, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {1639, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {1640, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {1641, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {1642, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {1643, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Number}, + {1644, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Number}, + {1645, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1646, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1647, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1648, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1649, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1650, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1651, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1652, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1653, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1654, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1655, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1656, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1657, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1658, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1659, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1660, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1661, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1662, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1663, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1664, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1665, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1666, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1667, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1668, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1669, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1670, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1671, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1672, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1673, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1674, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1675, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1676, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1677, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1678, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1679, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1680, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1681, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1682, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1683, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1684, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1685, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1686, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1687, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1688, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1689, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1690, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1691, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1692, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1693, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1694, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1695, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1696, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1697, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1698, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1699, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1700, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1701, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1702, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1703, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1704, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1705, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1706, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1707, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1708, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1709, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1710, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1711, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1712, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1713, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1714, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1715, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1716, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1717, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1718, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1719, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1720, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1721, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1722, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1723, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1724, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1725, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1726, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1727, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1728, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1729, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1730, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1731, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1732, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1733, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1734, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1735, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1736, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1737, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1738, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1739, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1740, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1741, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1742, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1743, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1744, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1745, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1746, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1747, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1748, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1749, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1750, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1751, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1752, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1753, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1754, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1755, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1756, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1757, Unicode::Category_Other_Format, Unicode::Direction_Arabic_Number}, + {1758, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {1759, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1760, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1761, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1762, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1763, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1764, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1765, Unicode::Category_Letter_Modifier, Unicode::Direction_Arabic_Letter}, + {1766, Unicode::Category_Letter_Modifier, Unicode::Direction_Arabic_Letter}, + {1767, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1768, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1769, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {1770, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1771, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1772, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1773, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1774, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1775, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1776, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {1777, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {1778, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {1779, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {1780, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {1781, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {1782, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {1783, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {1784, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {1785, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {1786, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1787, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1788, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1789, Unicode::Category_Symbol_Other, Unicode::Direction_Arabic_Letter}, + {1790, Unicode::Category_Symbol_Other, Unicode::Direction_Arabic_Letter}, + {1791, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1792, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1793, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1794, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1795, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1796, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1797, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1798, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1799, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1800, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1801, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1802, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1803, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1804, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1805, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {1807, Unicode::Category_Other_Format, Unicode::Direction_Arabic_Letter}, + {1808, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1809, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1810, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1811, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1812, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1813, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1814, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1815, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1816, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1817, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1818, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1819, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1820, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1821, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1822, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1823, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1824, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1825, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1826, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1827, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1828, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1829, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1830, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1831, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1832, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1833, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1834, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1835, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1836, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1837, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1838, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1839, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1840, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1841, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1842, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1843, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1844, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1845, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1846, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1847, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1848, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1849, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1850, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1851, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1852, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1853, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1854, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1855, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1856, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1857, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1858, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1859, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1860, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1861, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1862, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1863, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1864, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1865, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1866, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1869, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1870, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1871, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1872, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1873, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1874, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1875, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1876, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1877, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1878, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1879, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1880, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1881, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1882, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1883, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1884, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1885, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1886, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1887, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1888, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1889, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1890, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1891, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1892, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1893, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1894, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1895, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1896, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1897, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1898, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1899, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1900, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1901, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1902, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1903, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1904, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1905, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1906, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1907, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1908, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1909, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1910, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1911, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1912, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1913, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1914, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1915, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1916, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1917, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1918, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1919, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1920, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1921, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1922, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1923, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1924, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1925, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1926, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1927, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1928, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1929, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1930, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1931, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1932, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1933, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1934, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1935, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1936, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1937, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1938, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1939, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1940, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1941, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1942, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1943, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1944, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1945, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1946, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1947, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1948, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1949, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1950, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1951, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1952, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1953, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1954, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1955, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1956, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1957, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1958, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1959, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1960, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1961, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1962, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1963, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1964, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1965, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1966, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1967, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1968, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {1969, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {1984, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {1985, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {1986, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {1987, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {1988, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {1989, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {1990, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {1991, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {1992, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {1993, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {1994, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1995, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1996, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1997, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1998, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {1999, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2000, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2001, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2002, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2003, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2004, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2005, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2006, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2007, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2008, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2009, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2010, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2011, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2012, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2013, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2014, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2015, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2016, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2017, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2018, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2019, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2020, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2021, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2022, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2023, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2024, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2025, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2026, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2027, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2028, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2029, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2030, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2031, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2032, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2033, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2034, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2035, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2036, Unicode::Category_Letter_Modifier, Unicode::Direction_Right_To_Left}, + {2037, Unicode::Category_Letter_Modifier, Unicode::Direction_Right_To_Left}, + {2038, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {2039, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {2040, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {2041, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {2042, Unicode::Category_Letter_Modifier, Unicode::Direction_Right_To_Left}, + {2045, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2046, Unicode::Category_Symbol_Currency, Unicode::Direction_Right_To_Left}, + {2047, Unicode::Category_Symbol_Currency, Unicode::Direction_Right_To_Left}, + {2048, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2049, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2050, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2051, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2052, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2053, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2054, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2055, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2056, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2057, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2058, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2059, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2060, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2061, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2062, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2063, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2064, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2065, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2066, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2067, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2068, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2069, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2070, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2071, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2072, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2073, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2074, Unicode::Category_Letter_Modifier, Unicode::Direction_Right_To_Left}, + {2075, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2076, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2077, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2078, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2079, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2080, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2081, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2082, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2083, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2084, Unicode::Category_Letter_Modifier, Unicode::Direction_Right_To_Left}, + {2085, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2086, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2087, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2088, Unicode::Category_Letter_Modifier, Unicode::Direction_Right_To_Left}, + {2089, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2090, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2091, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2092, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2093, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2096, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2097, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2098, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2099, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2100, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2101, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2102, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2103, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2104, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2105, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2106, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2107, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2108, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2109, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2110, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2112, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2113, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2114, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2115, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2116, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2117, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2118, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2119, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2120, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2121, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2122, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2123, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2124, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2125, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2126, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2127, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2128, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2129, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2130, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2131, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2132, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2133, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2134, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2135, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2136, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {2137, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2138, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2139, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2142, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {2144, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2145, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2146, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2147, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2148, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2149, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2150, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2151, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2152, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2153, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2154, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2208, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2209, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2210, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2211, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2212, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2213, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2214, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2215, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2216, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2217, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2218, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2219, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2220, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2221, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2222, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2223, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2224, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2225, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2226, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2227, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2228, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2230, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2231, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2232, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2233, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2234, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2235, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2236, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2237, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {2259, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2260, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2261, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2262, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2263, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2264, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2265, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2266, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2267, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2268, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2269, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2270, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2271, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2272, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2273, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2274, Unicode::Category_Other_Format, Unicode::Direction_Arabic_Number}, + {2275, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2276, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2277, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2278, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2279, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2280, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2281, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2282, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2283, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2284, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2285, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2286, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2287, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2288, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2289, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2290, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2291, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2292, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2293, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2294, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2295, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2296, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2297, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2298, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2299, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2300, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2301, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2302, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2303, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2304, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2305, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2306, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2307, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2362, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2363, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2364, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2366, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2367, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2368, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2369, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2370, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2371, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2372, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2373, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2374, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2375, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2376, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2377, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2378, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2379, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2380, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2381, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2382, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2383, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2385, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2386, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2387, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2388, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2389, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2390, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2391, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2402, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2403, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2404, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {2405, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {2406, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2407, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2408, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2409, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2410, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2411, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2412, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2413, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2414, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2415, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2416, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {2417, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {2418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2433, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2434, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2435, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2492, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2494, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2495, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2496, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2497, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2498, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2499, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2500, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2503, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2504, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2507, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2508, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2509, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2519, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2530, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2531, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2534, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2535, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2536, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2537, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2538, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2539, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2540, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2541, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2542, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2543, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2546, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {2547, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {2548, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2549, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2550, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2551, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2552, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2553, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2554, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {2555, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {2556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2557, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {2558, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2561, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2562, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2563, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2620, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2622, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2623, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2624, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2625, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2626, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2631, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2632, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2635, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2636, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2637, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2641, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2662, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2663, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2664, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2665, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2666, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2667, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2668, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2669, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2670, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2671, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2672, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2673, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2677, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2678, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {2689, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2690, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2691, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2748, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2750, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2751, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2752, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2753, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2754, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2755, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2756, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2757, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2759, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2760, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2761, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2763, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2764, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2765, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2786, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2787, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2790, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2791, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2792, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2793, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2794, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2795, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2796, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2797, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2798, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2799, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2800, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {2801, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {2809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2810, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2811, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2812, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2813, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2814, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2815, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2817, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2818, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2819, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2876, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2878, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2879, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2880, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2881, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2882, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2883, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2884, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2887, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2888, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2891, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2892, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2893, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2902, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2903, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {2908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2914, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2915, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2918, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2919, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2920, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2921, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2922, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2923, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2924, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2925, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2926, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2927, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {2928, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {2929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2930, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2931, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2932, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2933, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2934, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2935, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {2946, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {2947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {2999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3006, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3007, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3008, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3009, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3010, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3014, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3015, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3016, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3018, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3019, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3020, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3021, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3031, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3046, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3047, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3048, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3049, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3050, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3051, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3052, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3053, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3054, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3055, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3056, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3057, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3058, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3059, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {3060, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {3061, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {3062, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {3063, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {3064, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {3065, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {3066, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {3072, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3073, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3074, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3075, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3076, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3134, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3135, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3136, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3137, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3138, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3139, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3140, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3142, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3143, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3144, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3146, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3147, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3148, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3149, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3157, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3158, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3170, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3171, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3174, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3175, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3176, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3177, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3178, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3179, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3180, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3181, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3182, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3183, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3192, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {3193, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {3194, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {3195, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {3196, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {3197, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {3198, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {3199, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3201, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3202, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3203, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3204, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3260, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3262, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3263, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Left_To_Right}, + {3264, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3265, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3266, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3267, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3268, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3270, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Left_To_Right}, + {3271, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3272, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3274, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3275, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3276, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3277, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3285, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3286, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3298, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3299, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3302, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3303, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3304, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3305, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3306, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3307, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3308, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3309, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3310, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3311, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3328, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3329, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3330, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3331, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3387, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3388, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3390, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3391, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3392, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3393, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3394, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3395, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3396, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3398, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3399, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3400, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3402, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3403, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3404, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3405, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3407, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3415, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3416, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3417, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3418, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3419, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3420, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3421, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3422, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3426, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3427, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3430, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3431, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3432, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3433, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3434, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3435, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3436, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3437, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3438, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3439, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3440, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3441, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3442, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3443, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3444, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3445, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3446, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3447, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3448, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3449, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3458, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3459, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3530, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3535, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3536, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3537, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3538, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3539, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3540, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3542, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3544, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3545, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3546, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3547, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3548, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3549, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3550, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3551, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3558, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3559, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3560, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3561, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3562, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3563, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3564, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3565, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3566, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3567, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3570, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3571, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3572, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3633, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3636, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3637, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3638, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3639, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3640, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3641, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3642, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3647, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {3648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3654, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {3655, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3656, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3657, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3658, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3659, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3660, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3661, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3662, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3663, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3664, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3665, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3666, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3667, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3668, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3669, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3670, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3671, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3672, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3673, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3674, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3675, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3761, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3764, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3765, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3766, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3767, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3768, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3769, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3771, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3772, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3782, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {3784, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3785, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3786, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3787, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3788, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3789, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3792, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3793, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3794, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3795, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3796, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3797, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3798, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3799, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3800, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3801, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3841, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3842, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3843, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3844, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3845, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3846, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3847, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3848, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3849, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3850, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3851, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3852, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3853, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3854, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3855, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3856, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3857, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3858, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3859, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3860, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3861, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3862, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3863, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3864, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3865, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3866, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3867, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3868, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3869, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3870, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3871, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3872, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3873, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3874, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3875, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3876, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3877, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3878, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3879, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3880, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3881, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {3882, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3883, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3884, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3885, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3886, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3887, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3888, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3889, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3890, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3891, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {3892, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3893, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3894, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3895, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3896, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {3897, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3898, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {3899, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {3900, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {3901, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {3902, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3903, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3916, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3953, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3954, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3955, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3956, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3957, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3958, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3959, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3960, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3961, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3962, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3963, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3964, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3965, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3966, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3967, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {3968, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3969, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3970, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3971, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3972, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3973, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {3974, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3975, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {3981, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3982, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3983, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3984, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3985, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3986, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3987, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3988, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3989, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3990, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3991, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3993, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3994, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3995, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3996, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3997, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3998, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {3999, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4000, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4001, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4002, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4003, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4004, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4005, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4006, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4007, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4008, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4009, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4010, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4011, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4012, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4013, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4014, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4015, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4016, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4017, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4018, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4019, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4020, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4021, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4022, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4023, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4024, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4025, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4026, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4027, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4028, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4030, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4031, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4032, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4033, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4034, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4035, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4036, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4037, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4038, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4039, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4040, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4041, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4042, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4043, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4044, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4046, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4047, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4048, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4049, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4050, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4051, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4052, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4053, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4054, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4055, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4056, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4057, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4058, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4132, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4134, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4135, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4136, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4137, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4139, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4140, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4141, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4142, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4143, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4144, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4145, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4146, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4147, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4148, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4149, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4150, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4151, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4152, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4153, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4154, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4155, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4156, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4157, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4158, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4160, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4161, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4162, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4163, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4164, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4165, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4166, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4167, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4168, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4169, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4170, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4171, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4172, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4173, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4174, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4175, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4182, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4183, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4184, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4185, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4190, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4191, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4192, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4194, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4195, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4196, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4199, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4200, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4201, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4202, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4203, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4204, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4205, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4209, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4210, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4211, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4212, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4226, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4227, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4228, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4229, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4230, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4231, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4232, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4233, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4234, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4235, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4236, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4237, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4239, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4240, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4241, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4242, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4243, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4244, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4245, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4246, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4247, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4248, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4249, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {4250, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4251, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4252, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {4253, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4254, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4255, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {4256, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4257, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4258, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4259, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4260, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4261, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4262, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4263, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4264, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4265, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4266, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4267, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4268, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4269, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4270, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4271, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4272, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4273, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4274, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4275, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4276, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4277, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4278, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4279, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4280, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4281, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4282, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4283, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4284, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4285, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4286, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4287, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4288, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4289, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4290, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4291, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4292, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4293, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4295, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4301, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {4304, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4305, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4306, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4307, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4308, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4309, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4310, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4311, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4312, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4313, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4314, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4315, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4316, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4317, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4318, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4319, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4320, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4321, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4322, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4323, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4324, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4325, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4326, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4327, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4328, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4329, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4330, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4331, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4332, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4333, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4334, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4335, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4336, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4337, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4338, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4339, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4340, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4341, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4342, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4343, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4344, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4345, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4346, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4347, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4348, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {4349, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4350, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4351, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {4352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4519, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4530, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4531, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4532, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4533, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4534, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4535, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4540, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4541, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4542, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4546, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4547, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4548, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4868, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4879, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4916, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4957, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4958, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4959, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {4960, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4961, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4962, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4963, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4964, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4965, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4966, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4967, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4968, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {4969, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4970, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4971, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4972, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4973, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4974, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4975, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4976, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4977, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4978, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4979, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4980, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4981, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4982, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4983, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4984, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4985, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4986, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4987, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4988, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {4992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {4999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5008, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {5009, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {5010, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {5011, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {5012, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {5013, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {5014, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {5015, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {5016, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {5017, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {5024, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5025, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5026, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5027, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5028, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5029, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5030, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5031, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5032, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5033, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5034, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5035, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5036, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5037, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5038, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5039, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5040, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5041, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5042, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5043, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5044, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5045, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5046, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5047, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5048, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5049, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5050, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5051, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5052, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5053, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5054, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5055, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5056, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5057, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5058, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5059, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5060, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5061, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5062, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5063, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5064, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5065, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5066, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5067, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5068, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5069, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5070, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5071, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5072, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5073, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5074, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5075, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5076, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5077, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5078, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5079, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5080, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5081, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5082, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5083, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5084, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5085, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5086, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5087, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5088, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5089, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5090, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5091, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5092, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5093, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5094, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5095, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5096, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5097, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5098, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5099, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5100, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5101, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5102, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5103, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5104, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5105, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5106, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5107, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5108, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5109, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {5112, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {5113, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {5114, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {5115, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {5116, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {5117, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {5120, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {5121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5132, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5134, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5135, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5136, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5137, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5139, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5140, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5141, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5142, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5143, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5144, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5145, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5146, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5147, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5148, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5149, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5150, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5151, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5152, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5153, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5154, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5155, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5156, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5157, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5158, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5519, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5530, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5531, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5532, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5533, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5534, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5535, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5540, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5541, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5542, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5546, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5547, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5548, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5741, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {5742, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {5743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5760, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {5761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5787, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {5788, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {5792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5801, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5867, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {5868, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {5869, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {5870, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {5871, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {5872, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {5873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5879, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5906, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {5907, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {5908, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {5920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5938, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {5939, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {5940, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {5941, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {5942, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {5952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5970, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {5971, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {5984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {5999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6002, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6003, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6068, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6069, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6070, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6071, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6072, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6073, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6074, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6075, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6076, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6077, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6078, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6079, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6080, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6081, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6082, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6083, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6084, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6085, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6086, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6087, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6088, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6089, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6090, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6091, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6092, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6093, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6094, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6095, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6096, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6097, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6098, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6099, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6100, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6101, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6102, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6103, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {6104, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6105, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6106, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6107, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {6108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6109, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6112, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6113, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6114, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6115, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6116, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6117, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6118, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6119, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6120, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6121, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6128, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {6129, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {6130, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {6131, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {6132, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {6133, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {6134, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {6135, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {6136, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {6137, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {6144, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6145, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6146, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6147, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6148, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6149, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6150, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {6151, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6152, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6153, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6154, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6155, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6156, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6157, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6158, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {6160, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6161, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6162, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6163, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6164, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6165, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6166, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6167, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6168, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6169, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6211, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {6212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6277, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6278, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6313, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6432, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6433, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6434, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6435, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6436, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6437, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6438, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6439, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6440, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6441, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6442, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6443, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6448, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6449, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6450, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6451, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6452, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6453, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6454, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6455, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6456, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6457, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6458, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6459, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6464, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6468, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6469, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {6470, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6471, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6472, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6473, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6474, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6475, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6476, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6477, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6478, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6479, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6530, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6531, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6532, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6533, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6534, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6535, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6540, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6541, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6542, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6546, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6547, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6548, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6608, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6609, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6610, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6611, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6612, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6613, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6614, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6615, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6616, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6617, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6618, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {6622, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6623, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6624, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6625, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6626, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6627, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6628, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6629, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6630, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6631, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6632, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6633, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6634, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6635, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6636, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6637, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6638, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6639, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6640, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6641, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6642, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6643, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6644, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6645, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6646, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6647, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6648, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6649, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6650, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6651, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6652, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6653, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6654, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6655, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {6656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6679, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6680, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6681, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6682, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6683, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6686, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6687, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6741, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6742, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6743, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6744, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6745, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6746, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6747, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6748, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6749, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6750, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6752, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6753, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6754, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6755, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6756, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6757, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6758, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6759, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6760, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6761, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6762, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6763, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6764, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6765, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6766, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6767, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6768, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6769, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6770, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6771, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6772, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6773, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6774, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6775, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6776, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6777, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6778, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6779, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6780, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6783, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6784, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6785, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6786, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6787, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6788, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6789, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6790, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6791, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6792, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6793, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6800, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6801, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6802, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6803, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6804, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6805, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6806, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6807, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6808, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6809, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6816, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6817, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6818, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6819, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6820, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6821, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6822, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6823, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {6824, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6825, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6826, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6827, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6828, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6829, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {6832, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6833, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6834, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6835, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6836, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6837, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6838, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6839, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6840, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6841, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6842, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6843, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6844, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6845, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6846, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {6912, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6913, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6914, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6915, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6916, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6964, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6965, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6966, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6967, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6968, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6969, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6970, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6971, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6972, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6973, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6974, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6975, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6976, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6977, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6978, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {6979, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6980, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {6981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {6992, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6993, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6994, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6995, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6996, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6997, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6998, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {6999, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7000, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7001, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7002, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7003, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7004, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7005, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7006, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7007, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7008, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7009, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7010, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7011, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7012, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7013, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7014, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7015, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7016, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7017, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7018, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7019, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7020, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7021, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7022, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7023, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7024, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7025, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7026, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7027, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7028, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7029, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7030, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7031, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7032, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7033, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7034, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7035, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7036, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {7040, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7041, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7042, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7073, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7074, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7075, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7076, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7077, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7078, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7079, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7080, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7081, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7082, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7083, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7084, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7085, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7088, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7089, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7090, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7091, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7092, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7093, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7094, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7095, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7096, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7097, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7132, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7134, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7135, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7136, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7137, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7139, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7140, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7141, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7142, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7143, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7144, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7145, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7146, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7147, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7148, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7149, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7150, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7151, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7152, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7153, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7154, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7155, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7164, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7165, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7166, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7167, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7204, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7205, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7206, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7207, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7208, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7209, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7210, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7211, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7212, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7213, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7214, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7215, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7216, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7217, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7218, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7219, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7220, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7221, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7222, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7223, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7227, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7228, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7229, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7230, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7231, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7232, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7233, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7234, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7235, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7236, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7237, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7238, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7239, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7240, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7241, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7248, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7249, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7250, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7251, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7252, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7253, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7254, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7255, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7256, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7257, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {7258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7288, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7289, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7290, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7291, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7292, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7293, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7294, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7295, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7296, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7297, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7298, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7299, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7300, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7301, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7302, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7303, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7304, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7312, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7313, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7314, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7315, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7316, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7317, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7318, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7319, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7320, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7321, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7322, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7323, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7324, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7325, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7326, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7327, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7328, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7329, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7330, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7331, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7332, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7333, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7334, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7335, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7336, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7337, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7338, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7339, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7340, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7341, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7342, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7343, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7344, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7345, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7346, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7347, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7348, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7349, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7350, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7351, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7352, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7353, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7354, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7357, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7358, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7359, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7360, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7361, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7362, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7363, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7364, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7365, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7366, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7367, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7376, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7377, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7378, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7379, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {7380, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7381, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7382, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7383, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7384, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7385, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7386, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7387, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7388, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7389, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7390, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7391, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7392, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7393, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7394, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7395, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7396, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7397, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7398, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7399, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7400, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7405, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7410, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7411, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7412, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {7415, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {7416, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7417, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7424, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7425, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7426, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7427, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7428, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7429, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7430, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7431, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7432, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7433, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7434, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7435, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7436, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7437, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7438, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7439, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7440, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7441, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7442, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7443, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7444, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7445, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7446, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7447, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7448, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7449, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7450, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7451, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7452, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7453, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7454, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7455, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7456, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7457, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7458, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7459, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7460, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7461, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7462, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7463, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7464, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7465, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7466, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7467, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7468, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7469, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7470, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7471, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7472, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7473, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7474, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7475, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7476, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7477, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7478, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7479, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7480, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7481, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7482, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7483, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7484, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7485, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7486, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7487, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7488, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7489, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7490, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7491, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7492, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7493, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7494, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7495, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7496, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7497, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7498, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7499, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7500, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7501, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7502, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7503, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7504, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7505, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7506, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7507, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7508, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7509, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7510, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7511, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7512, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7513, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7514, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7515, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7516, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7517, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7518, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7519, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7520, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7521, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7522, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7523, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7524, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7525, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7526, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7527, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7528, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7529, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7530, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7531, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7532, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7533, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7534, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7535, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7536, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7537, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7538, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7539, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7540, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7541, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7542, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7543, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7544, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7545, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7546, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7547, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7548, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7549, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7550, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7551, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7552, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7553, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7554, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7555, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7556, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7557, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7558, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7559, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7560, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7561, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7562, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7563, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7564, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7565, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7566, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7567, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7568, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7569, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7570, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7571, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7572, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7573, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7574, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7575, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7576, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7577, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7578, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7579, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7580, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7581, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7582, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7583, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7584, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7585, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7586, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7587, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7588, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7589, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7590, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7591, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7592, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7593, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7594, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7595, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7596, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7597, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7598, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7599, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7600, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7601, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7602, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7603, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7604, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7605, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7606, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7607, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7608, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7609, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7610, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7611, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7612, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7613, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7614, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7615, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {7616, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7617, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7618, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7619, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7620, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7621, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7622, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7623, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7624, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7625, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7626, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7627, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7628, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7629, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7630, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7631, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7632, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7633, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7634, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7635, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7636, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7637, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7638, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7639, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7640, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7641, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7642, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7643, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7644, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7645, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7646, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7647, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7648, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7649, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7650, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7651, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7652, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7653, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7654, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7655, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7656, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7657, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7658, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7659, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7660, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7661, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7662, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7663, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7664, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7665, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7666, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7667, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7668, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7669, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7670, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7671, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7672, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7673, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7675, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7676, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7677, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7678, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7679, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {7680, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7681, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7682, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7683, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7684, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7685, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7686, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7687, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7688, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7689, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7690, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7691, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7692, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7693, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7694, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7695, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7696, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7697, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7698, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7699, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7700, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7701, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7702, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7703, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7704, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7705, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7706, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7707, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7708, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7709, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7710, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7711, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7712, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7713, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7714, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7715, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7716, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7717, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7718, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7719, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7720, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7721, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7722, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7723, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7724, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7725, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7726, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7727, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7728, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7729, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7730, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7731, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7732, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7733, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7734, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7735, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7736, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7737, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7738, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7739, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7740, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7741, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7742, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7743, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7744, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7745, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7746, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7747, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7748, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7749, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7750, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7751, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7752, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7753, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7754, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7755, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7756, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7757, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7758, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7759, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7760, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7761, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7762, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7763, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7764, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7765, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7766, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7767, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7768, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7769, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7770, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7771, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7772, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7773, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7774, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7775, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7776, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7777, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7778, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7779, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7780, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7781, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7782, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7783, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7784, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7785, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7786, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7787, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7788, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7789, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7790, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7791, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7792, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7793, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7794, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7795, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7796, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7797, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7798, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7799, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7800, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7801, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7802, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7803, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7804, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7805, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7806, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7807, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7808, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7809, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7810, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7811, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7812, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7813, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7814, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7815, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7816, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7817, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7818, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7819, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7820, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7821, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7822, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7823, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7824, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7825, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7826, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7827, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7828, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7829, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7830, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7831, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7832, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7833, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7834, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7835, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7836, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7837, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7838, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7839, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7840, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7841, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7842, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7843, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7844, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7845, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7846, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7847, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7848, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7849, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7850, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7851, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7852, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7853, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7854, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7855, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7856, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7857, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7858, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7859, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7860, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7861, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7862, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7863, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7864, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7865, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7866, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7867, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7868, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7869, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7870, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7871, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7872, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7873, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7874, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7875, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7876, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7877, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7878, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7879, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7880, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7881, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7882, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7883, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7884, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7885, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7886, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7887, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7888, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7889, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7890, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7891, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7892, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7893, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7894, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7895, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7896, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7897, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7898, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7899, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7900, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7901, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7902, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7903, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7904, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7905, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7906, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7907, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7908, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7909, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7910, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7911, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7912, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7913, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7914, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7915, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7916, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7917, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7918, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7919, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7920, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7921, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7922, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7923, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7924, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7925, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7926, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7927, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7928, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7929, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7930, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7931, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7932, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7933, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7934, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7935, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7936, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7937, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7938, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7939, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7940, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7941, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7942, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7943, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7944, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7945, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7946, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7947, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7948, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7949, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7950, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7951, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7952, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7953, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7954, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7955, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7956, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7957, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7960, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7961, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7962, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7963, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7964, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7965, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7968, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7969, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7970, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7971, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7972, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7973, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7974, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7975, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7976, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7977, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7978, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7979, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7980, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7981, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7982, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7983, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7984, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7985, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7986, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7987, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7988, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7989, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7990, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7991, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {7992, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7993, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7994, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7995, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7996, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7997, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7998, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {7999, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8000, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8001, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8002, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8003, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8004, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8005, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8008, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8009, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8010, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8011, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8012, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8013, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8016, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8017, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8018, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8019, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8020, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8021, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8022, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8023, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8025, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8027, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8029, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8031, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8032, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8033, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8034, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8035, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8036, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8037, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8038, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8039, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8040, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8041, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8042, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8043, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8044, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8045, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8046, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8047, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8048, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8049, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8050, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8051, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8052, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8053, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8054, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8055, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8056, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8057, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8058, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8059, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8060, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8061, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8064, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8065, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8066, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8067, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8068, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8069, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8070, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8071, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8072, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8073, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8074, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8075, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8076, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8077, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8078, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8079, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8080, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8081, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8082, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8083, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8084, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8085, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8086, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8087, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8088, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8089, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8090, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8091, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8092, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8093, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8094, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8095, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8096, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8097, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8098, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8099, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8100, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8101, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8102, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8103, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8104, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8105, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8106, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8107, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8108, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8109, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8110, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8111, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8112, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8113, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8114, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8115, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8116, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8118, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8119, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8120, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8121, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8122, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8123, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8124, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8125, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8126, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8127, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8128, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8129, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8130, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8131, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8132, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8134, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8135, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8136, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8137, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8138, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8139, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8140, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8141, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8142, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8143, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8144, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8145, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8146, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8147, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8150, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8151, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8152, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8153, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8154, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8155, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8157, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8158, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8159, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8160, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8161, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8162, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8163, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8164, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8165, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8166, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8167, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8168, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8169, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8170, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8171, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8172, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8173, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8174, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8175, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8178, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8179, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8180, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8182, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8183, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8184, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8185, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8186, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8187, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8188, Unicode::Category_Letter_Titlecase, Unicode::Direction_Left_To_Right}, + {8189, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8190, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {8192, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8193, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8194, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8195, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8196, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8197, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8198, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8199, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8200, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8201, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8202, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8203, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8204, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8205, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8206, Unicode::Category_Other_Format, Unicode::Direction_Left_To_Right}, + {8207, Unicode::Category_Other_Format, Unicode::Direction_Right_To_Left}, + {8208, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {8209, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {8210, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {8211, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {8212, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {8213, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {8214, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8215, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8216, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {8217, Unicode::Category_Punctuation_FinalQuote, Unicode::Direction_Other_Neutral}, + {8218, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {8219, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {8220, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {8221, Unicode::Category_Punctuation_FinalQuote, Unicode::Direction_Other_Neutral}, + {8222, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {8223, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {8224, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8225, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8226, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8227, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8228, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8229, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8230, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8231, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8232, Unicode::Category_Separator_Line, Unicode::Direction_White_Space}, + {8233, Unicode::Category_Separator_Paragraph, Unicode::Direction_Paragraph_Separator}, + {8234, Unicode::Category_Other_Format, Unicode::Direction_Left_To_Right_Embedding}, + {8235, Unicode::Category_Other_Format, Unicode::Direction_Right_To_Left_Embedding}, + {8236, Unicode::Category_Other_Format, Unicode::Direction_Pop_Directional_Formatting}, + {8237, Unicode::Category_Other_Format, Unicode::Direction_Left_To_Right_Override}, + {8238, Unicode::Category_Other_Format, Unicode::Direction_Right_To_Left_Override}, + {8239, Unicode::Category_Separator_Space, Unicode::Direction_Common_Separator}, + {8240, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {8241, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {8242, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {8243, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {8244, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {8245, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8246, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8247, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8248, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8249, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {8250, Unicode::Category_Punctuation_FinalQuote, Unicode::Direction_Other_Neutral}, + {8251, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8252, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8253, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8254, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8255, Unicode::Category_Punctuation_Connector, Unicode::Direction_Other_Neutral}, + {8256, Unicode::Category_Punctuation_Connector, Unicode::Direction_Other_Neutral}, + {8257, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8258, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8259, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8260, Unicode::Category_Symbol_Math, Unicode::Direction_Common_Separator}, + {8261, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {8262, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {8263, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8264, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8265, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8266, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8267, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8268, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8269, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8270, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8271, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8272, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8273, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8274, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8275, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8276, Unicode::Category_Punctuation_Connector, Unicode::Direction_Other_Neutral}, + {8277, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8278, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8279, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8280, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8281, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8282, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8283, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8284, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8285, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8286, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {8287, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {8288, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8289, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8290, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8291, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8292, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8294, Unicode::Category_Other_Format, Unicode::Direction_Left_To_Right_Isolate}, + {8295, Unicode::Category_Other_Format, Unicode::Direction_Right_To_Left_Isolate}, + {8296, Unicode::Category_Other_Format, Unicode::Direction_First_Strong_Isolate}, + {8297, Unicode::Category_Other_Format, Unicode::Direction_Pop_Directional_Isolate}, + {8298, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8299, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8300, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8301, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8302, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8303, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {8304, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8305, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8308, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8309, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8310, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8311, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8312, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8313, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8314, Unicode::Category_Symbol_Math, Unicode::Direction_European_Separator}, + {8315, Unicode::Category_Symbol_Math, Unicode::Direction_European_Separator}, + {8316, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8317, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {8318, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {8319, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8320, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8321, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8322, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8323, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8324, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8325, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8326, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8327, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8328, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8329, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {8330, Unicode::Category_Symbol_Math, Unicode::Direction_European_Separator}, + {8331, Unicode::Category_Symbol_Math, Unicode::Direction_European_Separator}, + {8332, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8333, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {8334, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {8336, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8337, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8338, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8339, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8340, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8341, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8342, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8343, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8344, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8345, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8346, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8347, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8348, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {8352, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8353, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8354, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8355, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8356, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8357, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8358, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8359, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8360, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8361, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8362, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8363, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8364, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8365, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8366, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8367, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8368, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8369, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8370, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8371, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8372, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8373, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8374, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8375, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8376, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8377, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8378, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8379, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8380, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8381, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8382, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8383, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {8400, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8401, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8402, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8403, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8404, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8405, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8406, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8407, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8408, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8409, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8410, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8411, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8412, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8413, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {8414, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {8415, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {8416, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {8417, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8418, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {8419, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {8420, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {8421, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8422, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8423, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8424, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8425, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8426, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8427, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8428, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8429, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8430, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8431, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8432, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {8448, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8449, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8450, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8451, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8452, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8453, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8454, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8455, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8456, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8457, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8458, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8459, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8460, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8461, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8462, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8463, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8464, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8465, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8466, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8467, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8468, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8469, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8470, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8471, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8472, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8473, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8474, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8475, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8476, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8477, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8478, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8479, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8480, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8481, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8482, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8483, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8484, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8485, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8486, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8487, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8488, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8489, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8490, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8491, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8492, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8493, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8494, Unicode::Category_Symbol_Other, Unicode::Direction_European_Terminator}, + {8495, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8496, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8497, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8498, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8499, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8500, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {8502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {8503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {8504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {8505, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8506, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8507, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8508, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8509, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8510, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8511, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8512, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8513, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8514, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8515, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8516, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8517, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8518, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8519, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8520, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8521, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8522, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8523, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8524, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8525, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8526, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8527, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {8528, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8529, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8530, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8531, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8532, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8533, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8534, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8535, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8536, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8537, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8538, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8539, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8540, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8541, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8542, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8543, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8544, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8545, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8546, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8547, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8548, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8549, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8550, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8551, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8552, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8553, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8554, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8555, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8556, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8557, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8558, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8559, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8560, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8561, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8562, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8563, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8564, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8565, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8566, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8567, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8568, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8569, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8570, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8571, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8572, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8573, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8574, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8575, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8576, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8577, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8578, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8579, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {8580, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {8581, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8582, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8583, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8584, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {8585, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {8586, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8587, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8592, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8593, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8594, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8595, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8596, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8597, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8598, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8599, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8600, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8601, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8602, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8603, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8604, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8605, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8606, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8607, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8608, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8609, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8610, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8611, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8612, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8613, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8614, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8615, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8616, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8617, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8618, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8619, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8620, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8621, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8622, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8623, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8624, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8625, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8626, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8627, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8628, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8629, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8630, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8631, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8632, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8633, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8634, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8635, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8636, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8637, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8638, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8639, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8640, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8641, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8642, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8643, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8644, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8645, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8646, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8647, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8648, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8649, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8650, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8651, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8652, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8653, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8654, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8655, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8656, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8657, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8658, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8659, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8660, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8661, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8662, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8663, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8664, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8665, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8666, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8667, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8668, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8669, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8670, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8671, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8672, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8673, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8674, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8675, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8676, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8677, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8678, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8679, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8680, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8681, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8682, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8683, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8684, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8685, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8686, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8687, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8688, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8689, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8690, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8691, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8692, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8693, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8694, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8695, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8696, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8697, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8698, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8699, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8700, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8701, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8702, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8703, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8704, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8705, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8706, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8707, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8708, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8709, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8710, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8711, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8712, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8713, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8714, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8715, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8716, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8717, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8718, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8719, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8720, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8721, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8722, Unicode::Category_Symbol_Math, Unicode::Direction_European_Separator}, + {8723, Unicode::Category_Symbol_Math, Unicode::Direction_European_Terminator}, + {8724, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8725, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8726, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8727, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8728, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8729, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8730, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8731, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8732, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8733, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8734, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8735, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8736, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8737, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8738, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8739, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8740, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8741, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8742, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8743, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8744, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8745, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8746, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8747, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8748, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8749, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8750, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8751, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8752, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8753, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8754, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8755, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8756, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8757, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8758, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8759, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8760, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8761, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8762, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8763, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8764, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8765, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8766, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8767, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8768, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8769, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8770, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8771, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8772, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8773, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8774, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8775, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8776, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8777, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8778, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8779, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8780, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8781, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8782, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8783, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8784, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8785, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8786, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8787, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8788, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8789, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8790, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8791, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8792, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8793, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8794, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8795, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8796, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8797, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8798, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8799, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8800, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8801, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8802, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8803, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8804, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8805, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8806, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8807, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8808, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8809, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8810, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8811, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8812, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8813, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8814, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8815, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8816, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8817, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8818, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8819, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8820, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8821, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8822, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8823, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8824, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8825, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8826, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8827, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8828, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8829, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8830, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8831, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8832, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8833, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8834, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8835, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8836, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8837, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8838, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8839, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8840, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8841, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8842, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8843, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8844, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8845, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8846, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8847, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8848, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8849, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8850, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8851, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8852, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8853, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8854, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8855, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8856, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8857, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8858, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8859, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8860, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8861, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8862, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8863, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8864, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8865, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8866, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8867, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8868, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8869, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8870, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8871, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8872, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8873, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8874, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8875, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8876, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8877, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8878, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8879, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8880, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8881, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8882, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8883, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8884, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8885, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8886, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8887, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8888, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8889, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8890, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8891, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8892, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8893, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8894, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8895, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8896, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8897, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8898, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8899, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8900, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8901, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8902, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8903, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8904, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8905, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8906, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8907, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8908, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8909, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8910, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8911, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8912, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8913, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8914, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8915, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8916, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8917, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8918, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8919, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8920, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8921, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8922, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8923, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8924, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8925, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8926, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8927, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8928, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8929, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8930, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8931, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8932, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8933, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8934, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8935, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8936, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8937, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8938, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8939, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8940, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8941, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8942, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8943, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8944, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8945, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8946, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8947, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8948, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8949, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8950, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8951, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8952, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8953, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8954, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8955, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8956, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8957, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8958, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8959, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8960, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8961, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8962, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8963, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8964, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8965, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8966, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8967, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8968, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {8969, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {8970, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {8971, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {8972, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8973, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8974, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8975, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8976, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8977, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8978, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8979, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8980, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8981, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8982, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8983, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8984, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8985, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8986, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8987, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8988, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8989, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8990, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8991, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8992, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8993, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {8994, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8995, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8996, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8997, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8998, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {8999, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9000, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9001, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {9002, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {9003, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9004, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9005, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9006, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9007, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9008, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9009, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9010, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9011, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9012, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9013, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9014, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9015, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9016, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9017, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9018, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9019, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9020, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9021, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9022, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9023, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9024, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9025, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9026, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9027, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9028, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9029, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9030, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9031, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9032, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9033, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9034, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9035, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9036, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9037, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9038, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9039, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9040, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9041, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9042, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9043, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9044, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9045, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9046, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9047, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9048, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9049, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9050, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9051, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9052, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9053, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9054, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9055, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9056, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9057, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9058, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9059, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9060, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9061, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9062, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9063, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9064, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9065, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9066, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9067, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9068, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9069, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9070, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9071, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9072, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9073, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9074, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9075, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9076, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9077, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9078, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9079, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9080, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9081, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9082, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9083, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9084, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9085, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9086, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9087, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9088, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9089, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9090, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9091, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9092, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9093, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9094, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9095, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9096, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9097, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9098, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9099, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9100, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9101, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9102, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9103, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9104, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9105, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9106, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9107, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9108, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9109, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9110, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9111, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9112, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9113, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9114, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9115, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9116, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9117, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9118, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9119, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9120, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9121, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9122, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9123, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9124, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9125, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9126, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9127, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9128, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9129, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9130, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9131, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9132, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9133, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9134, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9135, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9136, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9137, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9138, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9139, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9140, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9141, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9142, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9143, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9144, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9145, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9146, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9147, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9148, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9149, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9150, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9151, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9152, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9153, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9154, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9155, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9156, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9157, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9158, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9159, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9160, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9161, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9162, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9163, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9164, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9165, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9166, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9167, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9168, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9169, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9170, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9171, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9172, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9173, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9174, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9175, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9176, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9177, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9178, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9179, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9180, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9181, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9182, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9183, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9184, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9185, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9186, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9187, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9188, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9189, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9190, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9191, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9192, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9193, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9194, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9195, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9196, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9197, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9198, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9199, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9200, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9201, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9202, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9203, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9204, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9205, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9206, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9207, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9208, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9209, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9210, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9211, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9212, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9213, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9214, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9215, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9216, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9217, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9218, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9219, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9220, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9221, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9222, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9223, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9224, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9225, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9226, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9227, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9228, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9229, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9230, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9231, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9232, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9233, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9234, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9235, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9236, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9237, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9238, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9239, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9240, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9241, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9242, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9243, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9244, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9245, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9246, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9247, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9248, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9249, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9250, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9251, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9252, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9253, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9254, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9280, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9281, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9282, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9283, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9284, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9285, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9286, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9287, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9288, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9289, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9290, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9312, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9313, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9314, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9315, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9316, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9317, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9318, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9319, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9320, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9321, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9322, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9323, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9324, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9325, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9326, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9327, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9328, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9329, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9330, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9331, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9332, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9333, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9334, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9335, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9336, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9337, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9338, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9339, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9340, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9341, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9342, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9343, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9344, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9345, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9346, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9347, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9348, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9349, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9350, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9351, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9352, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9353, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9354, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9355, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9356, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9357, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9358, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9359, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9360, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9361, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9362, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9363, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9364, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9365, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9366, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9367, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9368, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9369, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9370, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9371, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {9372, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9373, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9374, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9375, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9376, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9377, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9378, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9379, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9380, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9381, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9382, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9383, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9384, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9385, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9386, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9387, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9388, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9389, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9390, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9391, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9392, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9393, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9394, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9395, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9396, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9397, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9398, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9399, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9400, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9401, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9402, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9403, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9404, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9405, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9406, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9407, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9408, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9409, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9410, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9411, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9412, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9413, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9414, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9415, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9416, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9417, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9418, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9419, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9420, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9421, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9422, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9423, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9424, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9425, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9426, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9427, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9428, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9429, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9430, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9431, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9432, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9433, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9434, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9435, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9436, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9437, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9438, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9439, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9440, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9441, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9442, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9443, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9444, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9445, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9446, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9447, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9448, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9449, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9450, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9451, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9452, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9453, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9454, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9455, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9456, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9457, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9458, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9459, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9460, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9461, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9462, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9463, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9464, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9465, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9466, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9467, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9468, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9469, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9470, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9471, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {9472, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9473, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9474, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9475, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9476, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9477, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9478, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9479, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9480, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9481, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9482, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9483, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9484, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9485, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9486, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9487, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9488, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9489, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9490, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9491, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9492, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9493, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9494, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9495, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9496, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9497, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9498, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9499, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9500, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9501, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9502, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9503, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9504, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9505, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9506, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9507, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9508, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9509, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9510, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9511, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9512, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9513, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9514, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9515, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9516, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9517, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9518, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9519, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9520, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9521, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9522, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9523, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9524, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9525, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9526, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9527, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9528, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9529, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9530, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9531, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9532, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9533, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9534, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9535, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9536, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9537, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9538, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9539, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9540, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9541, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9542, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9543, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9544, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9545, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9546, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9547, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9548, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9549, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9550, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9551, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9552, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9553, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9554, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9555, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9556, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9557, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9558, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9559, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9560, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9561, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9562, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9563, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9564, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9565, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9566, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9567, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9568, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9569, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9570, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9571, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9572, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9573, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9574, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9575, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9576, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9577, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9578, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9579, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9580, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9581, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9582, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9583, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9584, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9585, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9586, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9587, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9588, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9589, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9590, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9591, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9592, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9593, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9594, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9595, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9596, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9597, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9598, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9599, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9600, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9601, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9602, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9603, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9604, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9605, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9606, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9607, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9608, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9609, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9610, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9611, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9612, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9613, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9614, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9615, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9616, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9617, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9618, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9619, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9620, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9621, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9622, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9623, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9624, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9625, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9626, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9627, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9628, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9629, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9630, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9631, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9632, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9633, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9634, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9635, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9636, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9637, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9638, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9639, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9640, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9641, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9642, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9643, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9644, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9645, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9646, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9647, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9648, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9649, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9650, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9651, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9652, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9653, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9654, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9655, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9656, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9657, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9658, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9659, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9660, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9661, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9662, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9663, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9664, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9665, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9666, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9667, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9668, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9669, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9670, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9671, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9672, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9673, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9674, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9675, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9676, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9677, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9678, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9679, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9680, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9681, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9682, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9683, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9684, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9685, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9686, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9687, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9688, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9689, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9690, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9691, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9692, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9693, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9694, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9695, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9696, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9697, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9698, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9699, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9700, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9701, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9702, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9703, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9704, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9705, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9706, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9707, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9708, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9709, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9710, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9711, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9712, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9713, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9714, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9715, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9716, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9717, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9718, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9719, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9720, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9721, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9722, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9723, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9724, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9725, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9726, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9727, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9728, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9729, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9730, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9731, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9732, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9733, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9734, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9735, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9736, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9737, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9738, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9739, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9740, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9741, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9742, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9743, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9744, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9745, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9746, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9747, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9748, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9749, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9750, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9751, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9752, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9753, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9754, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9755, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9756, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9757, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9758, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9759, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9760, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9761, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9762, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9763, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9764, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9765, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9766, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9767, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9768, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9769, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9770, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9771, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9772, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9773, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9774, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9775, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9776, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9777, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9778, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9779, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9780, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9781, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9782, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9783, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9784, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9785, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9786, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9787, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9788, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9789, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9790, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9791, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9792, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9793, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9794, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9795, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9796, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9797, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9798, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9799, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9800, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9801, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9802, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9803, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9804, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9805, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9806, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9807, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9808, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9809, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9810, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9811, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9812, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9813, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9814, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9815, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9816, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9817, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9818, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9819, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9820, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9821, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9822, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9823, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9824, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9825, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9826, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9827, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9828, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9829, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9830, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9831, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9832, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9833, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9834, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9835, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9836, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9837, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9838, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9839, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {9840, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9841, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9842, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9843, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9844, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9845, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9846, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9847, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9848, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9849, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9850, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9851, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9852, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9853, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9854, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9855, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9856, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9857, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9858, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9859, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9860, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9861, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9862, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9863, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9864, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9865, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9866, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9867, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9868, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9869, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9870, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9871, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9872, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9873, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9874, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9875, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9876, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9877, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9878, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9879, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9880, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9881, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9882, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9883, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9884, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9885, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9886, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9887, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9888, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9889, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9890, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9891, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9892, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9893, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9894, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9895, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9896, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9897, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9898, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9899, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9900, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {9901, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9902, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9903, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9904, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9905, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9906, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9907, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9908, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9909, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9910, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9911, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9912, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9913, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9914, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9915, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9916, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9917, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9918, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9919, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9920, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9921, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9922, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9923, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9924, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9925, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9926, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9927, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9928, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9929, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9930, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9931, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9932, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9933, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9934, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9935, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9936, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9937, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9938, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9939, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9940, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9941, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9942, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9943, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9944, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9945, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9946, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9947, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9948, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9949, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9950, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9951, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9952, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9953, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9954, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9955, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9956, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9957, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9958, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9959, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9960, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9961, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9962, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9963, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9964, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9965, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9966, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9967, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9968, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9969, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9970, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9971, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9972, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9973, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9974, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9975, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9976, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9977, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9978, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9979, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9980, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9981, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9982, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9983, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9984, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9985, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9986, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9987, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9988, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9989, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9990, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9991, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9992, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9993, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9994, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9995, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9996, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9997, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9998, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {9999, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10000, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10001, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10002, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10003, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10004, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10005, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10006, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10007, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10008, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10009, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10010, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10011, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10012, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10013, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10014, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10015, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10016, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10017, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10018, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10019, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10020, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10021, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10022, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10023, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10024, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10025, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10026, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10027, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10028, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10029, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10030, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10031, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10032, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10033, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10034, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10035, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10036, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10037, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10038, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10039, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10040, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10041, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10042, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10043, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10044, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10045, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10046, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10047, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10048, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10049, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10050, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10051, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10052, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10053, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10054, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10055, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10056, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10057, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10058, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10059, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10060, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10061, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10062, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10063, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10064, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10065, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10066, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10067, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10068, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10069, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10070, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10071, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10072, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10073, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10074, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10075, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10076, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10077, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10078, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10079, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10080, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10081, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10082, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10083, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10084, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10085, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10086, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10087, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10088, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10089, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10090, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10091, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10092, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10093, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10094, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10095, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10096, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10097, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10098, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10099, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10100, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10101, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10102, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10103, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10104, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10105, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10106, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10107, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10108, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10109, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10110, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10111, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10112, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10113, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10114, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10115, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10116, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10117, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10118, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10119, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10120, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10121, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10122, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10123, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10124, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10125, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10126, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10127, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10128, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10129, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10130, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10131, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {10132, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10133, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10134, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10135, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10136, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10137, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10138, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10139, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10140, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10141, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10142, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10143, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10144, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10145, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10146, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10147, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10148, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10149, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10150, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10151, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10152, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10153, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10154, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10155, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10156, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10157, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10158, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10159, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10160, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10161, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10162, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10163, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10164, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10165, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10166, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10167, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10168, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10169, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10170, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10171, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10172, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10173, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10174, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10175, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {10176, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10177, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10178, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10179, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10180, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10181, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10182, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10183, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10184, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10185, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10186, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10187, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10188, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10189, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10190, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10191, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10192, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10193, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10194, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10195, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10196, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10197, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10198, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10199, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10200, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10201, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10202, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10203, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10204, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10205, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10206, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10207, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10208, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10209, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10210, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10211, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10212, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10213, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10214, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10215, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10216, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10217, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10218, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10219, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10220, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10221, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10222, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10223, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10224, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10225, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10226, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10227, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10228, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10229, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10230, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10231, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10232, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10233, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10234, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10235, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10236, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10237, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10238, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10239, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10240, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10241, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10242, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10243, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10244, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10245, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10246, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10247, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10248, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10249, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10250, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10251, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10252, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10253, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10254, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10255, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10256, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10257, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10258, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10259, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10260, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10261, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10262, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10263, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10264, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10265, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10266, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10267, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10268, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10269, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10270, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10271, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10272, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10273, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10274, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10275, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10276, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10277, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10278, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10279, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10280, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10281, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10282, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10283, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10284, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10285, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10286, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10287, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10288, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10289, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10290, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10291, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10292, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10293, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10294, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10295, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10296, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10297, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10298, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10299, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10300, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10301, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10302, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10303, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10304, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10305, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10306, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10307, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10308, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10309, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10310, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10311, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10312, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10313, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10314, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10315, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10316, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10317, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10318, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10319, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10320, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10321, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10322, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10323, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10324, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10325, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10326, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10327, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10328, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10329, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10330, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10331, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10332, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10333, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10334, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10335, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10336, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10337, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10338, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10339, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10340, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10341, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10342, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10343, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10344, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10345, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10346, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10347, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10348, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10349, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10350, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10351, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10352, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10353, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10354, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10355, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10356, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10357, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10358, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10359, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10360, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10361, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10362, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10363, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10364, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10365, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10366, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10367, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10368, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10369, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10370, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10371, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10372, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10373, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10374, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10375, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10376, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10377, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10378, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10379, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10380, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10381, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10382, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10383, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10384, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10385, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10386, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10387, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10388, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10389, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10390, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10391, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10392, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10393, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10394, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10395, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10396, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10397, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10398, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10399, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10400, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10401, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10402, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10403, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10404, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10405, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10406, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10407, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10408, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10409, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10410, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10411, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10412, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10413, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10414, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10415, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10416, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10417, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10418, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10419, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10420, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10421, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10422, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10423, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10424, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10425, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10426, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10427, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10428, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10429, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10430, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10431, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10432, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10433, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10434, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10435, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10436, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10437, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10438, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10439, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10440, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10441, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10442, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10443, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10444, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10445, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10446, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10447, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10448, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10449, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10450, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10451, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10452, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10453, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10454, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10455, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10456, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10457, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10458, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10459, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10460, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10461, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10462, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10463, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10464, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10465, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10466, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10467, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10468, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10469, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10470, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10471, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10472, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10473, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10474, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10475, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10476, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10477, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10478, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10479, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10480, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10481, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10482, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10483, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10484, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10485, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10486, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10487, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10488, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10489, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10490, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10491, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10492, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10493, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10494, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10495, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {10496, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10497, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10498, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10499, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10500, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10501, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10502, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10503, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10504, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10505, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10506, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10507, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10508, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10509, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10510, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10511, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10512, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10513, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10514, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10515, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10516, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10517, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10518, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10519, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10520, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10521, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10522, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10523, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10524, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10525, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10526, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10527, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10528, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10529, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10530, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10531, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10532, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10533, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10534, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10535, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10536, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10537, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10538, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10539, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10540, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10541, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10542, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10543, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10544, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10545, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10546, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10547, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10548, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10549, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10550, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10551, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10552, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10553, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10554, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10555, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10556, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10557, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10558, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10559, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10560, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10561, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10562, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10563, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10564, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10565, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10566, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10567, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10568, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10569, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10570, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10571, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10572, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10573, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10574, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10575, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10576, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10577, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10578, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10579, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10580, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10581, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10582, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10583, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10584, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10585, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10586, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10587, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10588, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10589, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10590, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10591, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10592, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10593, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10594, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10595, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10596, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10597, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10598, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10599, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10600, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10601, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10602, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10603, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10604, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10605, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10606, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10607, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10608, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10609, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10610, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10611, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10612, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10613, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10614, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10615, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10616, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10617, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10618, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10619, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10620, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10621, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10622, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10623, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10624, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10625, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10626, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10627, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10628, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10629, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10630, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10631, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10632, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10633, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10634, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10635, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10636, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10637, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10638, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10639, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10640, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10641, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10642, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10643, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10644, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10645, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10646, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10647, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10648, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10649, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10650, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10651, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10652, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10653, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10654, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10655, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10656, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10657, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10658, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10659, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10660, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10661, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10662, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10663, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10664, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10665, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10666, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10667, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10668, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10669, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10670, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10671, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10672, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10673, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10674, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10675, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10676, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10677, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10678, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10679, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10680, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10681, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10682, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10683, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10684, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10685, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10686, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10687, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10688, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10689, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10690, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10691, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10692, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10693, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10694, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10695, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10696, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10697, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10698, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10699, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10700, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10701, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10702, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10703, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10704, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10705, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10706, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10707, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10708, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10709, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10710, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10711, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10712, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10713, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10714, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10715, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10716, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10717, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10718, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10719, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10720, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10721, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10722, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10723, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10724, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10725, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10726, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10727, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10728, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10729, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10730, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10731, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10732, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10733, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10734, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10735, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10736, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10737, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10738, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10739, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10740, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10741, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10742, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10743, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10744, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10745, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10746, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10747, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10748, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {10749, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {10750, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10751, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10752, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10753, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10754, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10755, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10756, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10757, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10758, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10759, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10760, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10761, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10762, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10763, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10764, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10765, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10766, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10767, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10768, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10769, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10770, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10771, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10772, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10773, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10774, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10775, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10776, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10777, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10778, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10779, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10780, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10781, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10782, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10783, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10784, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10785, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10786, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10787, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10788, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10789, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10790, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10791, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10792, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10793, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10794, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10795, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10796, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10797, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10798, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10799, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10800, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10801, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10802, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10803, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10804, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10805, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10806, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10807, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10808, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10809, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10810, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10811, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10812, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10813, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10814, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10815, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10816, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10817, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10818, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10819, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10820, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10821, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10822, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10823, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10824, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10825, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10826, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10827, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10828, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10829, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10830, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10831, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10832, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10833, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10834, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10835, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10836, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10837, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10838, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10839, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10840, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10841, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10842, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10843, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10844, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10845, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10846, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10847, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10848, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10849, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10850, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10851, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10852, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10853, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10854, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10855, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10856, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10857, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10858, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10859, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10860, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10861, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10862, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10863, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10864, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10865, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10866, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10867, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10868, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10869, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10870, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10871, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10872, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10873, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10874, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10875, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10876, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10877, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10878, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10879, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10880, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10881, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10882, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10883, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10884, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10885, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10886, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10887, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10888, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10889, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10890, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10891, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10892, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10893, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10894, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10895, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10896, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10897, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10898, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10899, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10900, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10901, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10902, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10903, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10904, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10905, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10906, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10907, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10908, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10909, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10910, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10911, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10912, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10913, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10914, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10915, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10916, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10917, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10918, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10919, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10920, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10921, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10922, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10923, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10924, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10925, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10926, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10927, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10928, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10929, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10930, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10931, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10932, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10933, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10934, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10935, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10936, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10937, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10938, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10939, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10940, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10941, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10942, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10943, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10944, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10945, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10946, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10947, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10948, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10949, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10950, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10951, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10952, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10953, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10954, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10955, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10956, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10957, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10958, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10959, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10960, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10961, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10962, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10963, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10964, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10965, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10966, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10967, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10968, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10969, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10970, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10971, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10972, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10973, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10974, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10975, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10976, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10977, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10978, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10979, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10980, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10981, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10982, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10983, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10984, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10985, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10986, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10987, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10988, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10989, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10990, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10991, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10992, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10993, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10994, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10995, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10996, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10997, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10998, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {10999, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11000, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11001, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11002, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11003, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11004, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11005, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11006, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11007, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11008, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11009, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11010, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11011, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11012, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11013, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11014, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11015, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11016, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11017, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11018, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11019, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11020, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11021, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11022, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11023, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11024, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11025, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11026, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11027, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11028, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11029, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11030, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11031, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11032, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11033, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11034, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11035, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11036, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11037, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11038, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11039, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11040, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11041, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11042, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11043, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11044, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11045, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11046, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11047, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11048, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11049, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11050, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11051, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11052, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11053, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11054, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11055, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11056, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11057, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11058, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11059, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11060, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11061, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11062, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11063, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11064, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11065, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11066, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11067, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11068, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11069, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11070, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11071, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11072, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11073, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11074, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11075, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11076, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11077, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11078, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11079, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11080, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11081, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11082, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11083, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11084, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {11085, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11086, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11087, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11088, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11089, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11090, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11091, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11092, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11093, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11094, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11095, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11096, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11097, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11098, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11099, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11100, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11101, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11102, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11103, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11104, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11105, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11106, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11107, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11108, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11109, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11110, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11111, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11112, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11113, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11114, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11115, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11116, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11117, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11118, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11119, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11120, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11121, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11122, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11123, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11126, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11127, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11128, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11129, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11130, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11131, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11132, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11133, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11134, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11135, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11136, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11137, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11138, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11139, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11140, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11141, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11142, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11143, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11144, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11145, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11146, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11147, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11148, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11149, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11150, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11151, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11152, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11153, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11154, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11155, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11156, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11157, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11160, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11161, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11162, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11163, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11164, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11165, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11166, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11167, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11168, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11169, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11170, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11171, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11172, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11173, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11174, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11175, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11176, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11177, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11178, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11179, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11180, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11181, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11182, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11183, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11184, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11185, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11186, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11187, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11188, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11189, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11190, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11191, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11192, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11193, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11194, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11195, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11196, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11197, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11198, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11199, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11200, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11201, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11202, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11203, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11204, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11205, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11206, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11207, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11208, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11210, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11211, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11212, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11213, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11214, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11215, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11216, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11217, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11218, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11219, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11220, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11221, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11222, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11223, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11224, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11225, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11226, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11227, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11228, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11229, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11230, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11231, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11232, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11233, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11234, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11235, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11236, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11237, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11238, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11239, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11240, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11241, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11242, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11243, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11244, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11245, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11246, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11247, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11248, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11249, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11250, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11251, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11252, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11253, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11254, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11255, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11256, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11257, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11258, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11259, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11260, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11261, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11262, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11264, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11265, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11266, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11267, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11268, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11269, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11270, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11271, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11272, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11273, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11274, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11275, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11276, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11277, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11278, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11279, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11280, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11281, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11282, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11283, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11284, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11285, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11286, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11287, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11288, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11289, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11290, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11291, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11292, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11293, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11294, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11295, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11296, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11297, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11298, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11299, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11300, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11301, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11302, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11303, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11304, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11305, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11306, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11307, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11308, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11309, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11310, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11312, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11313, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11314, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11315, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11316, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11317, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11318, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11319, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11320, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11321, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11322, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11323, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11324, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11325, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11326, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11327, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11328, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11329, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11330, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11331, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11332, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11333, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11334, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11335, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11336, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11337, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11338, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11339, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11340, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11341, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11342, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11343, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11344, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11345, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11346, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11347, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11348, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11349, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11350, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11351, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11352, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11353, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11354, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11355, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11356, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11357, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11358, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11360, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11361, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11362, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11363, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11364, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11365, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11366, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11367, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11368, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11369, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11370, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11371, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11372, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11373, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11374, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11375, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11376, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11377, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11378, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11379, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11380, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11381, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11382, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11383, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11384, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11385, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11386, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11387, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11388, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {11389, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {11390, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11391, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11392, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11393, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11394, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11395, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11396, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11397, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11398, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11399, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11400, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11401, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11402, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11403, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11404, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11405, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11406, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11407, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11408, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11409, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11410, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11411, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11412, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11413, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11414, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11415, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11416, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11417, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11418, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11419, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11420, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11421, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11422, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11423, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11424, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11425, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11426, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11427, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11428, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11429, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11430, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11431, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11432, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11433, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11434, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11435, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11436, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11437, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11438, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11439, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11440, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11441, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11442, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11443, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11444, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11445, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11446, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11447, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11448, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11449, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11450, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11451, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11452, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11453, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11454, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11455, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11456, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11457, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11458, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11459, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11460, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11461, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11462, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11463, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11464, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11465, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11466, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11467, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11468, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11469, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11470, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11471, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11472, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11473, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11474, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11475, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11476, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11477, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11478, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11479, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11480, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11481, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11482, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11483, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11484, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11485, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11486, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11487, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11488, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11489, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11490, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11491, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11492, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11493, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11494, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11495, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11496, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11497, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11498, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11499, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11500, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11501, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11502, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11503, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11504, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11505, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11506, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {11507, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11513, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11514, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11515, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11516, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11517, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {11518, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11519, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11520, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11521, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11522, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11523, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11524, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11525, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11526, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11527, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11528, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11529, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11530, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11531, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11532, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11533, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11534, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11535, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11536, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11537, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11538, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11539, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11540, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11541, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11542, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11543, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11544, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11545, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11546, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11547, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11548, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11549, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11550, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11551, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11552, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11553, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11554, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11555, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11556, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11557, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11559, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11565, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {11568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11631, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {11632, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {11647, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {11744, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11745, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11746, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11747, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11748, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11749, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11750, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11751, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11752, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11753, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11754, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11755, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11756, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11757, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11758, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11759, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11760, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11761, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11762, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11763, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11764, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11765, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11766, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11767, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11768, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11769, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11770, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11771, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11772, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11773, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11774, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11775, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {11776, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11777, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11778, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {11779, Unicode::Category_Punctuation_FinalQuote, Unicode::Direction_Other_Neutral}, + {11780, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {11781, Unicode::Category_Punctuation_FinalQuote, Unicode::Direction_Other_Neutral}, + {11782, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11783, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11784, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11785, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {11786, Unicode::Category_Punctuation_FinalQuote, Unicode::Direction_Other_Neutral}, + {11787, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11788, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {11789, Unicode::Category_Punctuation_FinalQuote, Unicode::Direction_Other_Neutral}, + {11790, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11791, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11792, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11793, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11794, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11795, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11796, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11797, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11798, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11799, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {11800, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11801, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11802, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {11803, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11804, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {11805, Unicode::Category_Punctuation_FinalQuote, Unicode::Direction_Other_Neutral}, + {11806, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11807, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11808, Unicode::Category_Punctuation_InitialQuote, Unicode::Direction_Other_Neutral}, + {11809, Unicode::Category_Punctuation_FinalQuote, Unicode::Direction_Other_Neutral}, + {11810, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {11811, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {11812, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {11813, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {11814, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {11815, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {11816, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {11817, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {11818, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11819, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11820, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11821, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11822, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11823, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {11824, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11825, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11826, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11827, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11828, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11829, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11830, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11831, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11832, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11833, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11834, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {11835, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {11836, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11837, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11838, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11839, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11840, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {11841, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11842, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {11843, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11844, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11845, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11846, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11847, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11848, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11849, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11850, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11851, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11852, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11853, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11854, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {11904, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11905, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11906, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11907, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11908, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11909, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11910, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11911, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11912, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11913, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11914, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11915, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11916, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11917, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11918, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11919, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11920, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11921, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11922, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11923, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11924, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11925, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11926, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11927, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11928, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11929, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11931, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11932, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11933, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11934, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11935, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11936, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11937, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11938, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11939, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11940, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11941, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11942, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11943, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11944, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11945, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11946, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11947, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11948, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11949, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11950, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11951, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11952, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11953, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11954, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11955, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11956, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11957, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11958, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11959, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11960, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11961, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11962, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11963, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11964, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11965, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11966, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11967, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11968, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11969, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11970, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11971, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11972, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11973, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11974, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11975, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11976, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11977, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11978, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11979, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11980, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11981, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11982, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11983, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11984, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11985, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11986, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11987, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11988, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11989, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11990, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11991, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11992, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11993, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11994, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11995, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11996, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11997, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11998, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {11999, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12000, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12001, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12002, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12003, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12004, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12005, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12006, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12007, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12008, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12009, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12010, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12011, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12012, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12013, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12014, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12015, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12016, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12017, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12018, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12019, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12032, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12033, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12034, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12035, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12036, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12037, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12038, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12039, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12040, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12041, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12042, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12043, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12044, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12045, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12046, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12047, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12048, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12049, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12050, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12051, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12052, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12053, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12054, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12055, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12056, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12057, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12058, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12059, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12060, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12061, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12062, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12063, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12064, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12065, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12066, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12067, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12068, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12069, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12070, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12071, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12072, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12073, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12074, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12075, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12076, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12077, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12078, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12079, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12080, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12081, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12082, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12083, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12084, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12085, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12086, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12087, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12088, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12089, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12090, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12091, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12092, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12093, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12094, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12095, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12096, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12097, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12098, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12099, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12100, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12101, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12102, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12103, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12104, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12105, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12106, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12107, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12108, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12109, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12110, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12111, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12112, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12113, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12114, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12115, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12116, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12117, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12118, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12119, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12120, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12121, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12122, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12123, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12124, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12125, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12126, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12127, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12128, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12129, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12130, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12131, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12132, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12133, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12134, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12135, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12136, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12137, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12138, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12139, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12140, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12141, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12142, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12143, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12144, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12145, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12146, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12147, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12148, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12149, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12150, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12151, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12152, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12153, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12154, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12155, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12156, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12157, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12158, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12159, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12160, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12161, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12162, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12163, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12164, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12165, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12166, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12167, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12168, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12169, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12170, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12171, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12172, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12173, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12174, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12175, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12176, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12177, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12178, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12179, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12180, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12181, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12182, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12183, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12184, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12185, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12186, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12187, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12188, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12189, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12190, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12191, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12192, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12193, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12194, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12195, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12196, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12197, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12198, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12199, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12200, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12201, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12202, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12203, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12204, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12205, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12206, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12207, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12208, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12209, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12210, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12211, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12212, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12213, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12214, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12215, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12216, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12217, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12218, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12219, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12220, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12221, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12222, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12223, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12224, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12225, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12226, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12227, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12228, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12229, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12230, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12231, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12232, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12233, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12234, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12235, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12236, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12237, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12238, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12239, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12240, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12241, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12242, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12243, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12244, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12245, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12272, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12273, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12274, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12275, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12276, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12277, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12278, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12279, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12280, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12281, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12282, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12283, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12288, Unicode::Category_Separator_Space, Unicode::Direction_White_Space}, + {12289, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {12290, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {12291, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {12292, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12293, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12295, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12296, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {12297, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12298, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {12299, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12300, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {12301, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12302, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {12303, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12304, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {12305, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12306, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12307, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12308, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {12309, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12310, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {12311, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12312, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {12313, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12314, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {12315, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12316, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {12317, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {12318, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12319, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {12320, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12321, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12322, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12323, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12324, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12325, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12326, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12327, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12328, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12329, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12330, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {12331, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {12332, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {12333, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {12334, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {12335, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {12336, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {12337, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12338, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12339, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12340, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12341, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12342, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12343, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12344, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12345, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12346, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {12347, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12349, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {12350, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12351, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12441, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {12442, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {12443, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {12444, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {12445, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12446, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12448, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {12449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12519, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12530, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12531, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12532, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12533, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12534, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12535, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12539, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {12540, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12541, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12542, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {12543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12688, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12689, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12690, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12691, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12692, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12693, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12694, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12695, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12696, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12697, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12698, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12699, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12700, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12701, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12702, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12703, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12736, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12737, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12738, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12739, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12740, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12741, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12742, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12743, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12744, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12745, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12746, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12747, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12748, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12749, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12750, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12751, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12752, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12753, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12754, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12755, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12756, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12757, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12758, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12759, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12760, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12761, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12762, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12763, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12764, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12765, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12766, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12767, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12768, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12769, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12770, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12771, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12791, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {12800, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12801, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12802, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12803, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12804, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12805, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12806, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12807, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12808, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12809, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12810, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12811, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12812, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12813, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12814, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12815, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12816, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12817, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12818, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12819, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12820, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12821, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12822, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12823, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12824, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12825, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12826, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12827, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12828, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12829, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12830, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12832, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12833, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12834, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12835, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12836, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12837, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12838, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12839, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12840, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12841, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12842, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12843, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12844, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12845, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12846, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12847, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12848, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12849, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12850, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12851, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12852, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12853, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12854, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12855, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12856, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12857, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12858, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12859, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12860, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12861, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12862, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12863, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12864, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12865, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12866, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12867, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12868, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12869, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12870, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12871, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12872, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12873, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12874, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12875, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12876, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12877, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12878, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12879, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12880, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12881, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12882, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12883, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12884, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12885, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12886, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12887, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12888, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12889, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12890, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12891, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12892, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12893, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12894, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12895, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12896, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12897, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12898, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12899, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12900, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12901, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12902, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12903, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12904, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12905, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12906, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12907, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12908, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12909, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12910, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12911, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12912, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12913, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12914, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12915, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12916, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12917, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12918, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12919, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12920, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12921, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12922, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12923, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12924, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12925, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12926, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {12927, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12928, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12929, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12930, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12931, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12932, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12933, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12934, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12935, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12936, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12937, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {12938, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12939, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12940, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12941, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12942, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12943, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12944, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12945, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12946, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12947, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12948, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12949, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12950, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12951, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12952, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12953, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12954, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12955, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12956, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12957, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12958, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12959, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12960, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12961, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12962, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12963, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12964, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12965, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12966, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12967, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12968, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12969, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12970, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12971, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12972, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12973, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12974, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12975, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12976, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12977, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12978, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12979, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12980, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12981, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12982, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12983, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12984, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12985, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12986, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12987, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12988, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12989, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12990, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12991, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {12992, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12993, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12994, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12995, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12996, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12997, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12998, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {12999, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13000, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13001, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13002, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13003, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13004, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {13005, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {13006, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {13007, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {13008, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13009, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13010, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13011, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13012, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13013, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13014, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13015, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13016, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13017, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13018, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13019, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13020, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13021, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13022, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13023, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13024, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13025, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13026, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13027, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13028, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13029, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13030, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13031, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13032, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13033, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13034, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13035, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13036, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13037, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13038, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13039, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13040, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13041, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13042, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13043, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13044, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13045, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13046, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13047, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13048, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13049, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13050, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13051, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13052, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13053, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13054, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13056, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13057, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13058, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13059, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13060, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13061, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13062, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13063, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13064, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13065, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13066, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13067, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13068, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13069, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13070, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13071, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13072, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13073, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13074, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13075, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13076, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13077, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13078, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13079, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13080, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13081, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13082, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13083, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13084, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13085, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13086, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13087, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13088, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13089, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13090, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13091, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13092, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13093, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13094, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13095, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13096, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13097, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13098, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13099, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13100, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13101, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13102, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13103, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13104, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13105, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13106, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13107, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13108, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13109, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13110, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13111, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13112, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13113, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13114, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13115, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13116, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13117, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13118, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13119, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13120, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13121, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13122, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13123, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13124, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13125, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13126, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13127, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13128, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13129, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13130, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13131, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13132, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13133, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13134, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13135, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13136, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13137, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13138, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13139, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13140, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13141, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13142, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13143, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13144, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13145, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13146, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13147, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13148, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13149, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13150, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13151, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13152, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13153, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13154, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13155, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13156, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13157, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13158, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13159, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13160, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13161, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13162, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13163, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13164, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13165, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13166, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13167, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13168, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13169, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13170, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13171, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13172, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13173, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13174, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13175, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {13176, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {13177, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {13178, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {13179, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13180, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13181, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13182, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13183, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13184, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13185, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13186, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13187, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13188, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13189, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13190, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13191, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13192, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13193, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13194, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13195, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13196, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13197, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13198, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13199, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13200, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13201, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13202, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13203, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13204, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13205, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13206, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13207, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13208, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13209, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13210, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13211, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13212, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13213, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13214, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13215, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13216, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13217, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13218, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13219, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13220, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13221, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13222, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13223, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13224, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13225, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13226, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13227, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13228, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13229, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13230, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13231, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13232, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13233, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13234, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13235, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13236, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13237, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13238, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13239, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13240, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13241, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13242, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13243, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13244, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13245, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13246, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13247, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13248, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13249, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13250, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13251, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13252, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13253, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13254, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13255, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13256, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13257, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13258, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13259, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13260, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13261, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13262, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13263, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13264, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13265, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13266, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13267, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13268, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13269, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13270, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13271, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13272, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13273, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13274, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13275, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13276, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13277, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13278, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {13279, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {13280, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13281, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13282, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13283, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13284, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13285, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13286, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13287, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13288, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13289, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13290, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13291, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13292, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13293, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13294, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13295, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13296, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13297, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13298, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13299, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13300, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13301, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13302, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13303, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13304, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13305, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13306, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13307, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13308, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13309, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13310, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {13311, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19904, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19905, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19906, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19907, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19908, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19909, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19910, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19911, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19912, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19913, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19914, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19915, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19916, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19917, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19918, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19919, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19920, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19921, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19922, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19923, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19924, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19925, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19926, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19927, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19928, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19929, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19930, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19931, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19932, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19933, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19934, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19935, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19936, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19937, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19938, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19939, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19940, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19941, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19942, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19943, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19944, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19945, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19946, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19947, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19948, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19949, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19950, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19951, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19952, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19953, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19954, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19955, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19956, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19957, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19958, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19959, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19960, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19961, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19962, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19963, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19964, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19965, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19966, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {19967, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {40960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40981, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {40982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {40999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41132, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41134, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41135, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41136, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41137, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41139, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41140, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41141, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41142, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41143, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41144, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41145, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41146, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41147, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41148, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41149, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41150, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41151, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41152, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41153, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41154, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41155, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41156, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41157, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41158, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41519, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41530, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41531, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41532, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41533, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41534, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41535, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41540, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41541, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41542, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41546, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41547, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41548, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41791, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41801, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41868, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41879, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41881, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41886, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41887, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41916, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {41999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42128, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42129, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42130, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42131, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42132, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42133, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42134, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42135, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42136, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42137, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42138, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42139, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42140, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42141, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42142, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42143, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42144, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42145, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42146, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42147, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42148, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42149, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42150, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42151, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42152, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42153, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42154, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42155, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42156, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42157, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42158, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42159, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42160, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42161, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42162, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42163, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42164, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42165, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42166, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42167, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42168, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42169, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42170, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42171, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42172, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42173, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42174, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42175, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42176, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42177, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42178, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42179, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42180, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42181, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42182, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {42192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42232, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {42233, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {42234, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {42235, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {42236, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {42237, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {42238, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {42239, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {42240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42508, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {42509, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {42510, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {42511, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {42512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42519, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42528, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {42529, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {42530, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {42531, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {42532, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {42533, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {42534, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {42535, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {42536, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {42537, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {42538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42560, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42561, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42562, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42563, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42564, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42565, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42566, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42567, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42568, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42569, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42570, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42571, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42572, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42573, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42574, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42575, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42576, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42577, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42578, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42579, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42580, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42581, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42582, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42583, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42584, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42585, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42586, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42587, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42588, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42589, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42590, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42591, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42592, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42593, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42594, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42595, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42596, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42597, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42598, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42599, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42600, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42601, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42602, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42603, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42604, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42605, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42607, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42608, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {42609, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {42610, Unicode::Category_Mark_Enclosing, Unicode::Direction_Nonspacing_Mark}, + {42611, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {42612, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42613, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42614, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42615, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42616, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42617, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42618, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42619, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42620, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42621, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42622, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {42623, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42624, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42625, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42626, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42627, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42628, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42629, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42630, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42631, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42632, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42633, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42634, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42635, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42636, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42637, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42638, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42639, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42640, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42641, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42642, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42643, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42644, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42645, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42646, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42647, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42648, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42649, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42650, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42651, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42652, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {42653, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {42654, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42655, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42726, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {42727, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {42728, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {42729, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {42730, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {42731, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {42732, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {42733, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {42734, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {42735, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {42736, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42737, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {42738, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {42739, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {42740, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {42741, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {42742, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {42743, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {42752, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42753, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42754, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42755, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42756, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42757, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42758, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42759, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42760, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42761, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42762, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42763, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42764, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42765, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42766, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42767, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42768, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42769, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42770, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42771, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42772, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42773, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42774, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42775, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42776, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42777, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42778, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42779, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42780, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42781, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42782, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42783, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42784, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42785, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {42786, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42787, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42788, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42789, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42790, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42791, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42792, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42793, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42794, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42795, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42796, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42797, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42798, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42799, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42800, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42801, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42802, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42803, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42804, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42805, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42806, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42807, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42808, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42809, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42810, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42811, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42812, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42813, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42814, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42815, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42816, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42817, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42818, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42819, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42820, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42821, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42822, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42823, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42824, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42825, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42826, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42827, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42828, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42829, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42830, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42831, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42832, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42833, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42834, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42835, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42836, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42837, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42838, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42839, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42840, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42841, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42842, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42843, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42844, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42845, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42846, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42847, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42848, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42849, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42850, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42851, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42852, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42853, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42854, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42855, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42856, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42857, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42858, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42859, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42860, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42861, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42862, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42863, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42864, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {42865, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42866, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42867, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42868, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42869, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42870, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42871, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42872, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42873, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42874, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42875, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42876, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42877, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42878, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42879, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42880, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42881, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42882, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42883, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42884, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42885, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42886, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42887, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42888, Unicode::Category_Letter_Modifier, Unicode::Direction_Other_Neutral}, + {42889, Unicode::Category_Symbol_Modifier, Unicode::Direction_Left_To_Right}, + {42890, Unicode::Category_Symbol_Modifier, Unicode::Direction_Left_To_Right}, + {42891, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42892, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42893, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42894, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {42896, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42897, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42898, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42899, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42900, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42901, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42902, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42903, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42904, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42905, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42906, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42907, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42908, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42909, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42910, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42911, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42912, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42913, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42914, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42915, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42916, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42917, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42918, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42919, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42920, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42921, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42922, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42923, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42924, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42925, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42926, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42927, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42928, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42929, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42930, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42931, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42932, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42933, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42934, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42935, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42936, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {42937, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {42999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43000, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43001, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43002, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43010, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43014, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43019, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43043, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43044, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43045, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43046, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43047, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43048, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {43049, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {43050, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {43051, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {43056, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {43057, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {43058, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {43059, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {43060, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {43061, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {43062, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {43063, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {43064, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {43065, Unicode::Category_Symbol_Other, Unicode::Direction_European_Terminator}, + {43072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43124, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {43125, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {43126, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {43127, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {43136, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43137, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43139, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43140, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43141, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43142, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43143, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43144, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43145, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43146, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43147, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43148, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43149, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43150, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43151, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43152, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43153, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43154, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43155, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43156, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43157, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43158, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43188, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43189, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43190, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43191, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43192, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43193, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43194, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43195, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43196, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43197, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43198, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43199, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43200, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43201, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43202, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43203, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43204, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43205, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43214, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43215, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43216, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43217, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43218, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43219, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43220, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43221, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43222, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43223, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43224, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43225, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43232, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43233, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43234, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43235, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43236, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43237, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43238, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43239, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43240, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43241, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43242, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43243, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43244, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43245, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43246, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43247, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43248, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43249, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43256, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43257, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43258, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43260, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43263, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43264, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43265, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43266, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43267, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43268, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43269, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43270, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43271, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43272, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43273, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43302, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43303, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43304, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43305, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43306, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43307, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43308, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43309, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43310, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43311, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43335, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43336, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43337, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43338, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43339, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43340, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43341, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43342, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43343, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43344, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43345, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43346, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43347, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43359, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43392, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43393, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43394, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43395, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43443, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43444, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43445, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43446, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43447, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43448, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43449, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43450, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43451, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43452, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43453, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43454, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43455, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43456, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43457, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43458, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43459, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43460, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43461, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43462, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43463, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43464, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43465, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43466, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43467, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43468, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43469, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43471, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43472, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43473, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43474, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43475, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43476, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43477, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43478, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43479, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43480, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43481, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43486, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43487, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43493, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43494, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43504, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43505, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43506, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43507, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43508, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43509, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43510, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43511, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43512, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43513, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43530, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43531, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43532, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43533, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43534, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43535, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43540, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43541, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43542, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43546, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43547, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43548, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43561, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43562, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43563, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43564, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43565, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43566, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43567, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43568, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43569, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43570, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43571, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43572, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43573, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43574, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43587, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43596, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43597, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43600, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43601, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43602, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43603, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43604, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43605, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43606, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43607, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43608, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43609, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {43612, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43613, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43614, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43615, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43632, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43639, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {43640, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {43641, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {43642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43643, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43644, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43645, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43696, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43698, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43699, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43700, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43703, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43704, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43710, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43711, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43713, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43741, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43742, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43743, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43755, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43756, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43757, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43758, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43759, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43760, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43761, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {43762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43763, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43764, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43765, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {43766, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {43777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43824, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43825, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43826, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43827, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43828, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43829, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43830, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43831, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43832, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43833, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43834, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43835, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43836, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43837, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43838, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43839, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43840, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43841, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43842, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43843, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43844, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43845, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43846, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43847, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43848, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43849, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43850, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43851, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43852, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43853, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43854, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43855, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43856, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43857, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43858, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43859, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43860, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43861, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43862, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43863, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43864, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43865, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43866, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43867, Unicode::Category_Symbol_Modifier, Unicode::Direction_Left_To_Right}, + {43868, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43869, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43870, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43871, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {43872, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43873, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43874, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43875, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43876, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43877, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43888, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43889, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43890, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43891, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43892, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43893, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43894, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43895, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43896, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43897, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43898, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43899, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43900, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43901, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43902, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43903, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43904, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43905, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43906, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43907, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43908, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43909, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43910, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43911, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43912, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43913, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43914, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43915, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43916, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43917, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43918, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43919, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43920, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43921, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43922, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43923, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43924, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43925, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43926, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43927, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43928, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43929, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43930, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43931, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43932, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43933, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43934, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43935, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43936, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43937, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43938, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43939, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43940, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43941, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43942, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43943, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43944, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43945, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43946, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43947, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43948, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43949, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43950, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43951, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43952, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43953, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43954, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43955, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43956, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43957, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43958, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43959, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43960, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43961, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43962, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43963, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43964, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43965, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43966, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43967, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {43968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {43999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {44000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {44001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {44002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {44003, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {44004, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {44005, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {44006, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {44007, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {44008, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {44009, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {44010, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {44011, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {44012, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {44013, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {44016, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {44017, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {44018, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {44019, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {44020, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {44021, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {44022, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {44023, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {44024, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {44025, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {55216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {55291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63791, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63801, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63868, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63879, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63881, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63886, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63887, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63916, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {63999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64132, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64134, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64135, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64136, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64137, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64139, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64140, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64141, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64142, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64143, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64144, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64145, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64146, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64147, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64148, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64149, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64150, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64151, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64152, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64153, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64154, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64155, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64156, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64157, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64158, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {64256, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64257, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64258, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64259, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64260, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64261, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64262, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64275, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64276, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64277, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64278, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64279, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {64285, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64286, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {64287, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64288, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64289, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64290, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64291, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64292, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64293, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64294, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64295, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64296, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64297, Unicode::Category_Symbol_Math, Unicode::Direction_European_Separator}, + {64298, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64299, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64300, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64301, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64302, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64303, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64304, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64305, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64306, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64307, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64308, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64309, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64310, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64312, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64313, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64314, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64315, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64316, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64318, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64320, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64321, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64323, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64324, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64326, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64327, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64328, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64329, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64330, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64331, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64332, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64333, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64334, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64335, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {64336, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64337, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64338, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64339, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64340, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64341, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64342, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64343, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64344, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64345, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64346, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64347, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64348, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64349, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64350, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64351, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64352, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64353, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64354, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64355, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64356, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64357, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64358, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64359, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64360, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64361, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64362, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64363, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64364, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64365, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64366, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64367, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64368, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64369, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64370, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64371, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64372, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64373, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64374, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64375, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64376, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64377, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64378, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64379, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64380, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64381, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64382, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64383, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64384, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64385, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64386, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64387, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64388, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64389, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64390, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64391, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64392, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64393, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64394, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64395, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64396, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64397, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64398, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64399, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64400, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64401, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64402, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64403, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64404, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64405, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64406, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64407, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64408, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64409, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64410, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64411, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64412, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64413, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64414, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64415, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64416, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64417, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64418, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64419, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64420, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64421, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64422, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64423, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64424, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64425, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64426, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64427, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64428, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64429, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64430, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64431, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64432, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64433, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64434, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64435, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64436, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64437, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64438, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64439, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64440, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64441, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64442, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64443, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64444, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64445, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64446, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64447, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64448, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64449, Unicode::Category_Symbol_Modifier, Unicode::Direction_Arabic_Letter}, + {64467, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64468, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64469, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64470, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64471, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64472, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64473, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64474, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64475, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64476, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64477, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64478, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64479, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64480, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64481, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64482, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64483, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64484, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64485, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64486, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64487, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64488, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64489, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64490, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64491, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64492, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64493, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64494, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64495, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64496, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64497, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64498, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64499, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64500, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64501, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64502, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64503, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64504, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64505, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64506, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64507, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64508, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64509, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64510, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64511, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64512, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64513, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64514, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64515, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64516, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64517, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64518, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64519, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64520, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64521, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64522, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64523, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64524, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64525, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64526, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64527, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64528, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64529, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64530, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64531, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64532, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64533, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64534, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64535, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64536, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64537, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64538, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64539, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64540, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64541, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64542, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64543, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64544, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64545, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64546, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64547, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64548, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64549, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64550, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64551, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64552, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64553, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64554, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64555, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64556, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64557, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64558, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64559, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64560, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64561, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64562, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64563, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64564, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64565, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64566, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64567, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64568, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64569, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64570, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64571, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64572, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64573, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64574, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64575, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64576, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64577, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64578, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64579, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64580, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64581, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64582, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64583, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64584, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64585, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64586, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64587, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64588, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64589, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64590, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64591, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64592, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64593, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64594, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64595, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64596, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64597, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64598, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64599, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64600, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64601, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64602, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64603, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64604, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64605, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64606, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64607, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64608, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64609, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64610, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64611, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64612, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64613, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64614, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64615, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64616, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64617, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64618, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64619, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64620, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64621, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64622, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64623, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64624, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64625, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64626, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64627, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64628, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64629, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64630, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64631, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64632, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64633, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64634, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64635, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64636, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64637, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64638, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64639, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64640, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64641, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64642, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64643, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64644, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64645, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64646, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64647, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64648, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64649, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64650, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64651, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64652, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64653, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64654, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64655, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64656, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64657, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64658, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64659, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64660, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64661, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64662, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64663, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64664, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64665, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64666, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64667, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64668, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64669, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64670, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64671, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64672, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64673, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64674, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64675, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64676, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64677, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64678, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64679, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64680, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64681, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64682, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64683, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64684, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64685, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64686, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64687, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64688, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64689, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64690, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64691, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64692, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64693, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64694, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64695, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64696, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64697, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64698, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64699, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64700, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64701, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64702, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64703, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64704, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64705, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64706, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64707, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64708, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64709, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64710, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64711, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64712, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64713, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64714, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64715, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64716, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64717, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64718, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64719, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64720, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64721, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64722, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64723, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64724, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64725, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64726, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64727, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64728, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64729, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64730, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64731, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64732, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64733, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64734, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64735, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64736, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64737, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64738, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64739, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64740, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64741, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64742, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64743, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64744, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64745, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64746, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64747, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64748, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64749, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64750, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64751, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64752, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64753, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64754, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64755, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64756, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64757, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64758, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64759, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64760, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64761, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64762, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64763, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64764, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64765, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64766, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64767, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64768, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64769, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64770, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64771, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64772, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64773, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64774, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64775, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64776, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64777, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64778, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64779, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64780, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64781, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64782, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64783, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64784, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64785, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64786, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64787, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64788, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64789, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64790, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64791, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64792, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64793, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64794, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64795, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64796, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64797, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64798, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64799, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64800, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64801, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64802, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64803, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64804, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64805, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64806, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64807, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64808, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64809, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64810, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64811, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64812, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64813, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64814, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64815, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64816, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64817, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64818, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64819, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64820, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64821, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64822, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64823, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64824, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64825, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64826, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64827, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64828, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64829, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64830, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {64831, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {64848, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64849, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64850, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64851, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64852, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64853, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64854, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64855, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64856, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64857, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64858, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64859, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64860, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64861, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64862, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64863, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64864, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64865, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64866, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64867, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64868, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64869, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64870, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64871, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64872, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64873, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64874, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64875, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64876, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64877, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64878, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64879, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64880, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64881, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64882, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64883, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64884, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64885, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64886, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64887, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64888, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64889, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64890, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64891, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64892, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64893, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64894, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64895, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64896, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64897, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64898, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64899, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64900, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64901, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64902, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64903, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64904, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64905, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64906, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64907, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64908, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64909, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64910, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64911, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64914, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64915, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64916, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64917, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64918, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64919, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64920, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64921, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64922, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64923, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64924, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64925, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64926, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64927, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64928, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64929, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64930, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64931, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64932, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64933, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64934, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64935, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64936, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64937, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64938, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64939, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64940, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64941, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64942, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64943, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64944, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64945, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64946, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64947, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64948, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64949, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64950, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64951, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64952, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64953, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64954, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64955, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64956, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64957, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64958, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64959, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64960, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64961, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64962, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64963, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64964, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64965, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64966, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {64967, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65008, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65009, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65010, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65011, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65012, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65013, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65014, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65015, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65016, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65017, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65018, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65019, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65020, Unicode::Category_Symbol_Currency, Unicode::Direction_Arabic_Letter}, + {65021, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65024, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65025, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65026, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65027, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65028, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65029, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65030, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65031, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65032, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65033, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65034, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65035, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65036, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65037, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65038, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65039, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65040, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65041, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65042, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65043, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65044, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65045, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65046, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65047, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65048, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65049, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65056, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65057, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65058, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65059, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65060, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65061, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65062, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65063, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65064, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65065, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65066, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65067, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65068, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65069, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65070, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65071, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {65072, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65073, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {65074, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {65075, Unicode::Category_Punctuation_Connector, Unicode::Direction_Other_Neutral}, + {65076, Unicode::Category_Punctuation_Connector, Unicode::Direction_Other_Neutral}, + {65077, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65078, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65079, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65080, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65081, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65082, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65083, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65084, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65085, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65086, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65087, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65088, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65089, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65090, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65091, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65092, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65093, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65094, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65095, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65096, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65097, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65098, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65099, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65100, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65101, Unicode::Category_Punctuation_Connector, Unicode::Direction_Other_Neutral}, + {65102, Unicode::Category_Punctuation_Connector, Unicode::Direction_Other_Neutral}, + {65103, Unicode::Category_Punctuation_Connector, Unicode::Direction_Other_Neutral}, + {65104, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {65105, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65106, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {65108, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65109, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {65110, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65111, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65112, Unicode::Category_Punctuation_Dash, Unicode::Direction_Other_Neutral}, + {65113, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65114, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65115, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65116, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65117, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65118, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65119, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {65120, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65121, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65122, Unicode::Category_Symbol_Math, Unicode::Direction_European_Separator}, + {65123, Unicode::Category_Punctuation_Dash, Unicode::Direction_European_Separator}, + {65124, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65125, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65126, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65128, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65129, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {65130, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {65131, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65136, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65137, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65138, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65139, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65140, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65142, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65143, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65144, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65145, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65146, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65147, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65148, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65149, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65150, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65151, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65152, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65153, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65154, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65155, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65156, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65157, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65158, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65159, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65160, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65161, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65162, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65163, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65164, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65165, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65166, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65167, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65168, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65169, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65170, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65171, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65172, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65173, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65174, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65175, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65176, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65177, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65178, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65179, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65180, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65181, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65182, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65183, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65184, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65185, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65186, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65187, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65188, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65189, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65190, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65191, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65192, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65193, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65194, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65195, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65196, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65197, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65198, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65199, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65200, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65201, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65202, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65203, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65204, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65205, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65206, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65207, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65208, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65209, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65210, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65211, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65212, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65213, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65214, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65215, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65216, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65217, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65218, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65219, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65220, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65221, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65222, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65223, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65224, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65225, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65226, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65227, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65228, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65229, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65230, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65231, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65232, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65233, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65234, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65235, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65236, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65237, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65238, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65239, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65240, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65241, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65242, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65243, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65244, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65245, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65246, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65247, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65248, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65249, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65250, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65251, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65252, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65253, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65254, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65255, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65256, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65257, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65258, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65259, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65260, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65261, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65262, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65263, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65264, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65265, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65266, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65267, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65268, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65269, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65270, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65271, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65272, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65273, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65274, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65275, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65276, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {65279, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {65281, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65282, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65283, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {65284, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {65285, Unicode::Category_Punctuation_Other, Unicode::Direction_European_Terminator}, + {65286, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65287, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65288, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65289, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65290, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65291, Unicode::Category_Symbol_Math, Unicode::Direction_European_Separator}, + {65292, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {65293, Unicode::Category_Punctuation_Dash, Unicode::Direction_European_Separator}, + {65294, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {65295, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {65296, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {65297, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {65298, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {65299, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {65300, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {65301, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {65302, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {65303, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {65304, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {65305, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {65306, Unicode::Category_Punctuation_Other, Unicode::Direction_Common_Separator}, + {65307, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65308, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65309, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65310, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65311, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65312, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65313, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65314, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65315, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65316, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65317, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65318, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65319, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65320, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65321, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65322, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65323, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65324, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65325, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65326, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65327, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65328, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65329, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65330, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65331, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65332, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65333, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65334, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65335, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65336, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65337, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65338, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {65339, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65340, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65341, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65342, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {65343, Unicode::Category_Punctuation_Connector, Unicode::Direction_Other_Neutral}, + {65344, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {65345, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65346, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65347, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65348, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65349, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65350, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65351, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65352, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65353, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65354, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65355, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65356, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65357, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65358, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65359, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65360, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65361, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65362, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65363, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65364, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65365, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65366, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65367, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65368, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65369, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65370, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {65371, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65372, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65373, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65374, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65375, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65376, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65377, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65378, Unicode::Category_Punctuation_Open, Unicode::Direction_Other_Neutral}, + {65379, Unicode::Category_Punctuation_Close, Unicode::Direction_Other_Neutral}, + {65380, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65381, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65392, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {65393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65438, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {65439, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {65440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65504, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {65505, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {65506, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65507, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {65508, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65509, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {65510, Unicode::Category_Symbol_Currency, Unicode::Direction_European_Terminator}, + {65512, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65513, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65514, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65515, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65516, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {65517, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65518, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65529, Unicode::Category_Other_Format, Unicode::Direction_Other_Neutral}, + {65530, Unicode::Category_Other_Format, Unicode::Direction_Other_Neutral}, + {65531, Unicode::Category_Other_Format, Unicode::Direction_Other_Neutral}, + {65532, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65533, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65540, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65541, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65542, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65546, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65547, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {65792, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {65793, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {65794, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {65799, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65800, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65801, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65802, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65803, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65804, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65805, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65806, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65807, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65808, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65809, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65810, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65811, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65812, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65813, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65814, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65815, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65816, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65817, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65818, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65819, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65820, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65821, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65822, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65823, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65824, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65825, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65826, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65827, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65828, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65829, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65830, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65831, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65832, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65833, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65834, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65835, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65836, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65837, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65838, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65839, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65840, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65841, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65842, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65843, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {65847, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65848, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65849, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65850, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65851, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65852, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65853, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65854, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65855, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65856, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65857, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65858, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65859, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65860, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65861, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65862, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65863, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65864, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65865, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65866, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65867, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65868, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65869, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65870, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65871, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65872, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65873, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65874, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65875, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65876, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65877, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65878, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65879, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65880, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65881, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65882, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65883, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65884, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65885, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65886, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65887, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65888, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65889, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65890, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65891, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65892, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65893, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65894, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65895, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65896, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65897, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65898, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65899, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65900, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65901, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65902, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65903, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65904, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65905, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65906, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65907, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65908, Unicode::Category_Number_Letter, Unicode::Direction_Other_Neutral}, + {65909, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {65910, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {65911, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {65912, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {65913, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65914, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65915, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65916, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65917, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65918, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65919, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65920, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65921, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65922, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65923, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65924, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65925, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65926, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65927, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65928, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65929, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65930, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {65931, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {65932, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65933, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65934, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {65936, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65937, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65938, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65939, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65940, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65941, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65942, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65943, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65944, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65945, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65946, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65947, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {65952, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {66000, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66001, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66002, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66003, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66004, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66005, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66006, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66007, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66008, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66009, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66010, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66011, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66012, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66013, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66014, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66015, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66016, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66017, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66018, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66019, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66020, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66021, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66022, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66023, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66024, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66025, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66026, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66027, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66028, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66029, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66030, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66031, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66032, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66033, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66034, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66035, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66036, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66037, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66038, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66039, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66040, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66041, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66042, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66043, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66044, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {66045, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {66176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66272, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {66273, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66274, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66275, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66276, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66277, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66278, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66279, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66280, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66281, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66282, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66283, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66284, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66285, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66286, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66287, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66288, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66289, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66290, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66291, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66292, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66293, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66294, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66295, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66296, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66297, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66298, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66299, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {66304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66336, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {66337, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {66338, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {66339, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {66349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66369, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {66370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66378, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {66384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66422, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {66423, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {66424, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {66425, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {66426, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {66432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66463, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {66464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66512, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {66513, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {66514, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {66515, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {66516, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {66517, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {66560, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66561, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66562, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66563, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66564, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66565, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66566, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66567, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66568, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66569, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66570, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66571, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66572, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66573, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66574, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66575, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66576, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66577, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66578, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66579, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66580, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66581, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66582, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66583, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66584, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66585, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66586, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66587, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66588, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66589, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66590, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66591, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66592, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66593, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66594, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66595, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66596, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66597, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66598, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66599, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66600, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66601, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66602, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66603, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66604, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66605, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66606, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66607, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66608, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66609, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66610, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66611, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66612, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66613, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66614, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66615, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66616, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66617, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66618, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66619, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66620, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66621, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66622, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66623, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66624, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66625, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66626, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66627, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66628, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66629, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66630, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66631, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66632, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66633, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66634, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66635, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66636, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66637, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66638, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66639, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66720, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {66721, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {66722, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {66723, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {66724, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {66725, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {66726, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {66727, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {66728, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {66729, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {66736, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66737, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66738, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66739, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66740, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66741, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66742, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66743, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66744, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66745, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66746, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66747, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66748, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66749, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66750, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66751, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66752, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66753, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66754, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66755, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66756, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66757, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66758, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66759, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66760, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66761, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66762, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66763, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66764, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66765, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66766, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66767, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66768, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66769, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66770, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66771, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {66776, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66777, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66778, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66779, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66780, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66781, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66782, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66783, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66784, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66785, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66786, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66787, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66788, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66789, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66790, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66791, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66792, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66793, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66794, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66795, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66796, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66797, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66798, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66799, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66800, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66801, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66802, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66803, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66804, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66805, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66806, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66807, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66808, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66809, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66810, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66811, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {66816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66868, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66879, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66881, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66886, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66887, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {66927, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {67072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67132, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67134, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67135, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67136, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67137, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67139, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67140, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67141, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67142, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67143, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67144, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67145, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67146, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67147, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67148, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67149, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67150, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67151, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67152, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67153, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67154, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67155, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67156, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67157, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67158, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {67584, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67585, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67586, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67587, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67588, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67589, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67592, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67594, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67595, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67596, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67597, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67598, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67599, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67600, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67601, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67602, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67603, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67604, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67605, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67606, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67607, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67608, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67609, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67610, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67611, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67612, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67613, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67614, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67615, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67616, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67617, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67618, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67619, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67620, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67621, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67622, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67623, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67624, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67625, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67626, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67627, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67628, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67629, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67630, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67631, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67632, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67633, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67634, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67635, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67636, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67637, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67639, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67640, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67644, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67647, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67648, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67649, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67650, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67651, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67652, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67653, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67654, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67655, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67656, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67657, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67658, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67659, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67660, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67661, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67662, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67663, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67664, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67665, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67666, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67667, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67668, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67669, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67671, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {67672, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67673, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67674, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67675, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67676, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67677, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67678, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67679, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67680, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67681, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67682, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67683, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67684, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67685, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67686, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67687, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67688, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67689, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67690, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67691, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67692, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67693, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67694, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67695, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67696, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67697, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67698, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67699, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67700, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67701, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67702, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67703, Unicode::Category_Symbol_Other, Unicode::Direction_Right_To_Left}, + {67704, Unicode::Category_Symbol_Other, Unicode::Direction_Right_To_Left}, + {67705, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67706, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67707, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67708, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67709, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67710, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67711, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67712, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67713, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67714, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67715, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67716, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67717, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67718, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67719, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67720, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67721, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67722, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67723, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67724, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67725, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67726, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67727, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67728, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67729, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67730, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67731, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67732, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67733, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67734, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67735, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67736, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67737, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67738, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67739, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67740, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67741, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67742, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67751, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67752, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67753, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67754, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67755, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67756, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67757, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67758, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67759, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67808, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67809, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67810, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67811, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67812, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67813, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67814, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67815, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67816, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67817, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67818, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67819, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67820, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67821, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67822, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67823, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67824, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67825, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67826, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67828, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67829, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67835, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67836, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67837, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67838, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67839, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67840, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67841, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67842, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67843, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67844, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67845, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67846, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67847, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67848, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67849, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67850, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67851, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67852, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67853, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67854, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67855, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67856, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67857, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67858, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67859, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67860, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67861, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67862, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67863, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67864, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67865, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67866, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67867, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {67871, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {67872, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67873, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67874, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67875, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67876, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67877, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67878, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67879, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67880, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67881, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67882, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67883, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67884, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67885, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67886, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67887, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67888, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67889, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67890, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67891, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67892, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67893, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67894, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67895, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67896, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67897, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67903, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {67968, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67969, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67970, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67971, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67972, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67973, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67974, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67975, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67976, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67977, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67978, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67979, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67980, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67981, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67982, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67983, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67984, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67985, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67986, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67987, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67988, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67989, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67990, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67991, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67992, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67993, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67994, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67995, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67996, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67997, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67998, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {67999, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68000, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68001, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68002, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68003, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68004, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68005, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68006, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68007, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68008, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68009, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68010, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68011, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68012, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68013, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68014, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68015, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68016, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68017, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68018, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68019, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68020, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68021, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68022, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68023, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68028, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68029, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68030, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68031, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68032, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68033, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68034, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68035, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68036, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68037, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68038, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68039, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68040, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68041, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68042, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68043, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68044, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68045, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68046, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68047, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68050, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68051, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68052, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68053, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68054, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68055, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68056, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68057, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68058, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68059, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68060, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68061, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68062, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68063, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68064, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68065, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68066, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68067, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68068, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68069, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68070, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68071, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68072, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68073, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68074, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68075, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68076, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68077, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68078, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68079, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68080, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68081, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68082, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68083, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68084, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68085, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68086, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68087, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68088, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68089, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68090, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68091, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68092, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68093, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68094, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68095, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68096, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68097, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68098, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68099, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68101, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68102, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68108, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68109, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68110, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68111, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68112, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68113, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68114, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68115, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68117, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68118, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68119, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68121, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68122, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68123, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68124, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68125, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68126, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68127, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68128, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68129, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68130, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68131, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68132, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68133, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68134, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68135, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68136, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68137, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68138, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68139, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68140, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68141, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68142, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68143, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68144, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68145, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68146, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68147, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68148, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68149, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68152, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68153, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68154, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68159, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68160, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68161, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68162, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68163, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68164, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68165, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68166, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68167, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68168, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68176, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68177, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68178, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68179, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68180, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68181, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68182, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68183, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68184, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68192, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68193, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68194, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68195, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68196, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68197, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68198, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68199, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68200, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68201, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68202, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68203, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68204, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68205, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68206, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68207, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68208, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68209, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68210, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68211, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68212, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68213, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68214, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68215, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68216, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68217, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68218, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68219, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68220, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68221, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68222, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68223, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68224, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68225, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68226, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68227, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68228, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68229, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68230, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68231, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68232, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68233, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68234, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68235, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68236, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68237, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68238, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68239, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68240, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68241, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68242, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68243, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68244, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68245, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68246, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68247, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68248, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68249, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68250, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68251, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68252, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68253, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68254, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68255, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68288, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68289, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68290, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68291, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68292, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68293, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68294, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68295, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68296, Unicode::Category_Symbol_Other, Unicode::Direction_Right_To_Left}, + {68297, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68298, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68299, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68300, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68301, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68302, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68303, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68304, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68305, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68306, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68307, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68308, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68309, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68310, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68311, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68312, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68313, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68314, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68315, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68316, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68317, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68318, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68319, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68320, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68321, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68322, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68323, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68324, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68325, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68326, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68331, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68332, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68333, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68334, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68335, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68336, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68337, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68338, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68339, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68340, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68341, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68342, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68352, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68353, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68354, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68355, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68356, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68357, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68358, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68359, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68360, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68361, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68362, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68363, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68364, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68365, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68366, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68367, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68368, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68369, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68370, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68371, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68372, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68373, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68374, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68375, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68376, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68377, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68378, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68379, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68380, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68381, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68382, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68383, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68384, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68385, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68386, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68387, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68388, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68389, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68390, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68391, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68392, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68393, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68394, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68395, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68396, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68397, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68398, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68399, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68400, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68401, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68402, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68403, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68404, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68405, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68409, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {68410, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {68411, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {68412, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {68413, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {68414, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {68415, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {68416, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68417, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68418, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68419, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68420, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68421, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68422, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68423, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68424, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68425, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68426, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68427, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68428, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68429, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68430, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68431, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68432, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68433, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68434, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68435, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68436, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68437, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68440, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68441, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68442, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68443, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68444, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68445, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68446, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68447, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68448, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68449, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68450, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68451, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68452, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68453, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68454, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68455, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68456, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68457, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68458, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68459, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68460, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68461, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68462, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68463, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68464, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68465, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68466, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68472, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68473, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68474, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68475, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68476, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68477, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68478, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68479, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68480, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68481, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68482, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68483, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68484, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68485, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68486, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68487, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68488, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68489, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68490, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68491, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68492, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68493, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68494, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68495, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68496, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68497, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68505, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68506, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68507, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68508, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {68521, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68522, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68523, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68524, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68525, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68526, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68527, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68608, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68609, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68610, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68611, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68612, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68613, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68614, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68615, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68616, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68617, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68618, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68619, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68620, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68621, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68622, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68623, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68624, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68625, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68626, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68627, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68628, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68629, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68630, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68631, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68632, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68633, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68634, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68635, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68636, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68637, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68638, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68639, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68640, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68641, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68642, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68643, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68644, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68645, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68646, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68647, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68648, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68649, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68650, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68651, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68652, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68653, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68654, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68655, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68656, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68657, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68658, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68659, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68660, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68661, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68662, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68663, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68664, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68665, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68666, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68667, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68668, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68669, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68670, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68671, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68672, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68673, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68674, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68675, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68676, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68677, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68678, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68679, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68680, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {68736, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68737, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68738, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68739, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68740, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68741, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68742, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68743, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68744, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68745, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68746, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68747, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68748, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68749, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68750, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68751, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68752, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68753, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68754, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68755, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68756, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68757, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68758, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68759, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68760, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68761, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68762, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68763, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68764, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68765, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68766, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68767, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68768, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68769, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68770, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68771, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68772, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68773, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68774, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68775, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68776, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68777, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68778, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68779, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68780, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68781, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68782, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68783, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68784, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68785, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68786, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {68800, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68801, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68802, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68803, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68804, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68805, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68806, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68807, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68808, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68809, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68810, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68811, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68812, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68813, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68814, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68815, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68816, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68817, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68818, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68819, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68820, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68821, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68822, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68823, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68824, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68825, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68826, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68827, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68828, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68829, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68830, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68831, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68832, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68833, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68834, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68835, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68836, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68837, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68838, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68839, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68840, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68841, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68842, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68843, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68844, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68845, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68846, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68847, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68848, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68849, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68850, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {68858, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68859, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68860, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68861, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68862, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68863, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {68864, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68865, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68866, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68867, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68868, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68869, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68870, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68871, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68872, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68873, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68874, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68875, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68876, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68877, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68878, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68879, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68880, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68881, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68882, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68883, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68884, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68885, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68886, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68887, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68888, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68889, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68890, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68891, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68892, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68893, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68894, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68895, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68896, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68897, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68898, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68899, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {68900, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68901, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68902, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68903, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {68912, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {68913, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {68914, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {68915, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {68916, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {68917, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {68918, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {68919, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {68920, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {68921, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Arabic_Number}, + {69216, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69217, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69218, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69219, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69220, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69221, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69222, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69223, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69224, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69225, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69226, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69227, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69228, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69229, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69230, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69231, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69232, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69233, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69234, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69235, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69236, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69237, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69238, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69239, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69240, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69241, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69242, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69243, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69244, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69245, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69246, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Number}, + {69376, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69377, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69378, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69379, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69380, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69381, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69382, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69383, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69384, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69385, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69386, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69387, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69388, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69389, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69390, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69391, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69392, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69393, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69394, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69395, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69396, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69397, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69398, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69399, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69400, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69401, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69402, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69403, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69404, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69405, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {69406, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {69407, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {69408, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {69409, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {69410, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {69411, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {69412, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {69413, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {69414, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {69415, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {69424, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69425, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69426, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69427, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69428, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69429, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69430, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69431, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69432, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69433, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69434, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69435, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69436, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69437, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69438, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69439, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69440, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69441, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69442, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69443, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69444, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69445, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {69446, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69447, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69448, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69449, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69450, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69451, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69452, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69453, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69454, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69455, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69456, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69457, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {69458, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {69459, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {69460, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {69461, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {69462, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {69463, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {69464, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {69465, Unicode::Category_Punctuation_Other, Unicode::Direction_Arabic_Letter}, + {69632, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69633, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69634, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69688, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69689, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69690, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69691, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69692, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69693, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69694, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69695, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69696, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69697, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69698, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69699, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69700, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69701, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69702, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69703, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69704, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69705, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69706, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69707, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69708, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69709, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69714, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69715, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69716, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69717, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69718, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69719, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69720, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69721, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69722, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69723, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69724, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69725, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69726, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69727, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69728, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69729, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69730, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69731, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69732, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69733, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {69734, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69735, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69736, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69737, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69738, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69739, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69740, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69741, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69742, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69743, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69759, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69760, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69761, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69762, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69791, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69801, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69808, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69809, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69810, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69811, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69812, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69813, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69814, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69815, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69816, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69817, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69818, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69819, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69820, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69821, Unicode::Category_Other_Format, Unicode::Direction_Left_To_Right}, + {69822, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69823, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69824, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69825, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69837, Unicode::Category_Other_Format, Unicode::Direction_Left_To_Right}, + {69840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69872, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69873, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69874, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69875, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69876, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69877, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69878, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69879, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69880, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69881, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69888, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69889, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69890, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69916, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69927, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69928, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69929, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69930, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69931, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69932, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69933, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69934, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69935, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69936, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69937, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69938, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69939, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69940, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {69942, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69943, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69944, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69945, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69946, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69947, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69948, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69949, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69950, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69951, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {69952, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69953, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69954, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69955, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {69956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69957, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69958, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {69968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {69999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70003, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70004, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70005, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70016, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70017, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70018, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70067, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70068, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70069, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70070, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70071, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70072, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70073, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70074, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70075, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70076, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70077, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70078, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70079, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70080, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70085, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70086, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70087, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70088, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70089, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70090, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70091, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70092, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70093, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70096, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70097, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70098, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70099, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70100, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70101, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70102, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70103, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70104, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70105, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70107, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70109, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70110, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70111, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70113, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70114, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70115, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70116, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70117, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70118, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70119, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70120, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70121, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70122, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70123, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70124, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70125, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70126, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70127, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70128, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70129, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70130, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70131, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70132, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {70144, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70145, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70146, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70147, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70148, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70149, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70150, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70151, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70152, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70153, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70154, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70155, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70156, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70157, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70158, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70188, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70189, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70190, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70191, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70192, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70193, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70194, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70195, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70196, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70197, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70198, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70199, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70200, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70201, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70202, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70203, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70204, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70205, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70206, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70313, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70367, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70368, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70369, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70370, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70371, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70372, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70373, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70374, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70375, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70376, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70377, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70378, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70384, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70385, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70386, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70387, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70388, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70389, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70390, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70391, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70392, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70393, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70400, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70401, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70402, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70403, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70459, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70460, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70462, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70463, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70464, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70465, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70466, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70467, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70468, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70471, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70472, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70475, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70476, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70477, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70487, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70498, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70499, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70502, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70503, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70504, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70505, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70506, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70507, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70508, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70512, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70513, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70514, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70515, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70516, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70709, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70710, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70711, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70712, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70713, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70714, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70715, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70716, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70717, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70718, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70719, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70720, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70721, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70722, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70723, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70724, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70725, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70726, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70731, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70732, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70733, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70734, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70735, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70736, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70737, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70738, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70739, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70740, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70741, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70742, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70743, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70744, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70745, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70747, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70749, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70750, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70791, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70801, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70832, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70833, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70834, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70835, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70836, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70837, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70838, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70839, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70840, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70841, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70842, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70843, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70844, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70845, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70846, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70847, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70848, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70849, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {70850, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70851, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {70852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70854, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {70855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {70864, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70865, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70866, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70867, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70868, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70869, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70870, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70871, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70872, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {70873, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71087, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71088, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71089, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71090, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71091, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71092, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71093, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71096, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71097, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71098, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71099, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71100, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71101, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71102, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71103, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71104, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71105, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71106, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71107, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71108, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71109, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71110, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71111, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71112, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71113, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71114, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71115, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71116, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71117, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71118, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71119, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71120, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71121, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71122, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71123, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71124, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71125, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71126, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71127, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71132, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71133, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71216, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71217, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71218, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71219, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71220, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71221, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71222, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71223, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71224, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71225, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71226, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71227, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71228, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71229, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71230, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71231, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71232, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71233, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71234, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71235, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71248, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71249, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71250, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71251, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71252, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71253, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71254, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71255, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71256, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71257, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71264, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71265, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71266, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71267, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71268, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71269, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71270, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71271, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71272, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71273, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71274, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71275, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71276, Unicode::Category_Punctuation_Other, Unicode::Direction_Other_Neutral}, + {71296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71339, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71340, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71341, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71342, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71343, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71344, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71345, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71346, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71347, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71348, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71349, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71350, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71351, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71360, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71361, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71362, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71363, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71364, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71365, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71366, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71367, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71368, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71369, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71453, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71454, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71455, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71456, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71457, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71458, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71459, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71460, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71461, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71462, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71463, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71464, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71465, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71466, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71467, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71472, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71473, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71474, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71475, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71476, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71477, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71478, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71479, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71480, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71481, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71482, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71483, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71484, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71485, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71486, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71487, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {71680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {71724, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71725, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71726, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71727, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71728, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71729, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71730, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71731, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71732, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71733, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71734, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71735, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71736, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {71737, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71738, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {71739, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {71840, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71841, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71842, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71843, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71844, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71845, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71846, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71847, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71848, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71849, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71850, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71851, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71852, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71853, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71854, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71855, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71856, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71857, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71858, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71859, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71860, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71861, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71862, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71863, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71864, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71865, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71866, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71867, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71868, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71869, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71870, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71871, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {71872, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71873, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71874, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71875, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71876, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71877, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71878, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71879, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71880, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71881, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71882, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71883, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71884, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71885, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71886, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71887, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71888, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71889, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71890, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71891, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71892, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71893, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71894, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71895, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71896, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71897, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71898, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71899, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71900, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71901, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71902, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71903, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {71904, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71905, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71906, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71907, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71908, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71909, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71910, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71911, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71912, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71913, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {71914, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71915, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71916, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71917, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71918, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71919, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71920, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71921, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71922, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {71935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72193, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72194, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72195, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72196, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72197, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72198, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72199, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Left_To_Right}, + {72200, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Left_To_Right}, + {72201, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72202, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72243, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72244, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72245, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72246, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72247, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72248, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72249, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {72250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72251, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72252, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72253, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72254, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72255, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72256, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72257, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72258, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72259, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72260, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72261, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72262, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72263, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72273, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72274, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72275, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72276, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72277, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72278, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72279, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {72280, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {72281, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72282, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72283, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72330, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72331, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72332, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72333, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72334, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72335, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72336, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72337, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72338, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72339, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72340, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72341, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72342, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72343, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {72344, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72345, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72346, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72347, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72348, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72350, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72351, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72352, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72353, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72354, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72751, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {72752, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72753, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72754, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72755, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72756, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72757, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72758, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72760, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72761, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72762, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72763, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72764, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72765, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72766, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {72767, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Left_To_Right}, + {72768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72769, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72770, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72771, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72772, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72773, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72784, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {72785, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {72786, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {72787, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {72788, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {72789, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {72790, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {72791, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {72792, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {72793, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {72794, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72795, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72796, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72797, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72798, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72799, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72800, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72801, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72802, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72803, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72804, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72805, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72806, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72807, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72808, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72809, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72810, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72811, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72812, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {72816, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72817, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {72818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72850, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72851, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72852, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72853, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72854, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72855, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72856, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72857, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72858, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72859, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72860, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72861, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72862, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72863, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72864, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72865, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72866, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72867, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72868, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72869, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72870, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72871, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72873, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {72874, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72875, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72876, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72877, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72878, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72879, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72880, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72881, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {72882, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72883, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72884, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {72885, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72886, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {72960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {72999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73009, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73010, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73011, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73012, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73013, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73014, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73018, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73020, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73021, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73023, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73024, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73025, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73026, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73027, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73028, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73029, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73031, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73040, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73041, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73042, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73043, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73044, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73045, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73046, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73047, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73048, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73049, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73098, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {73099, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {73100, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {73101, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {73102, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {73104, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73105, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73107, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {73108, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {73109, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73110, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {73111, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73120, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73121, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73122, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73123, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73124, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73125, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73126, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73127, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73128, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73129, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {73440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73459, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73460, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {73461, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {73462, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {73463, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {73464, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {73728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73791, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73801, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73868, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73879, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73881, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73886, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73887, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73916, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {73999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74132, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74134, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74135, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74136, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74137, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74139, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74140, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74141, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74142, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74143, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74144, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74145, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74146, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74147, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74148, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74149, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74150, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74151, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74152, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74153, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74154, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74155, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74156, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74157, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74158, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74519, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74530, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74531, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74532, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74533, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74534, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74535, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74540, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74541, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74542, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74546, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74547, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74548, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74752, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74753, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74754, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74755, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74756, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74757, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74758, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74759, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74760, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74761, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74762, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74763, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74764, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74765, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74766, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74767, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74768, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74769, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74770, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74771, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74772, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74773, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74774, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74775, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74776, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74777, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74778, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74779, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74780, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74781, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74782, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74783, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74784, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74785, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74786, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74787, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74788, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74789, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74790, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74791, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74792, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74793, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74794, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74795, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74796, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74797, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74798, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74799, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74800, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74801, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74802, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74803, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74804, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74805, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74806, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74807, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74808, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74809, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74810, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74811, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74812, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74813, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74814, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74815, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74816, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74817, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74818, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74819, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74820, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74821, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74822, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74823, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74824, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74825, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74826, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74827, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74828, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74829, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74830, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74831, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74832, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74833, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74834, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74835, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74836, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74837, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74838, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74839, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74840, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74841, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74842, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74843, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74844, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74845, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74846, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74847, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74848, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74849, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74850, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74851, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74852, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74853, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74854, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74855, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74856, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74857, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74858, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74859, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74860, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74861, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74862, Unicode::Category_Number_Letter, Unicode::Direction_Left_To_Right}, + {74864, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {74865, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {74866, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {74867, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {74868, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {74880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74881, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74886, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74887, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74916, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {74999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {75075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77868, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77879, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77881, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77886, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77887, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77916, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {77999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78132, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78134, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78135, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78136, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78137, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78139, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78140, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78141, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78142, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78143, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78144, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78145, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78146, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78147, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78148, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78149, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78150, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78151, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78152, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78153, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78154, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78155, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78156, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78157, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78158, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78519, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78530, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78531, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78532, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78533, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78534, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78535, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78540, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78541, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78542, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78546, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78547, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78548, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78791, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78801, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78868, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78879, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78881, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78886, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78887, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {78894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {82999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83132, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83134, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83135, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83136, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83137, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83139, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83140, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83141, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83142, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83143, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83144, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83145, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83146, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83147, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83148, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83149, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83150, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83151, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83152, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83153, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83154, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83155, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83156, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83157, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83158, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83519, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {83526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92519, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92530, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92531, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92532, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92533, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92534, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92535, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92540, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92541, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92542, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92546, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92547, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92548, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92768, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {92769, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {92770, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {92771, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {92772, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {92773, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {92774, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {92775, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {92776, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {92777, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {92782, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {92783, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {92880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92881, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92886, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92887, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92912, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92913, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92914, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92915, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92916, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92917, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {92928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {92976, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92977, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92978, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92979, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92980, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92981, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92982, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {92983, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {92984, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {92985, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {92986, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {92987, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {92988, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {92989, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {92990, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {92991, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {92992, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {92993, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {92994, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {92995, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {92996, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {92997, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {93008, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {93009, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {93010, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {93011, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {93012, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {93013, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {93014, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {93015, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {93016, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {93017, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Left_To_Right}, + {93019, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93020, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93021, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93022, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93023, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93024, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93025, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93760, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93761, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93762, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93763, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93764, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93765, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93766, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93767, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93768, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93769, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93770, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93771, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93772, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93773, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93774, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93775, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93776, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93777, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93778, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93779, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93780, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93781, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93782, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93783, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93784, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93785, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93786, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93787, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93788, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93789, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93790, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93791, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {93792, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93793, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93794, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93795, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93796, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93797, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93798, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93799, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93800, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93801, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93802, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93803, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93804, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93805, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93806, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93807, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93808, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93809, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93810, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93811, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93812, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93813, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93814, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93815, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93816, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93817, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93818, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93819, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93820, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93821, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93822, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93823, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {93824, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93825, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93826, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93827, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93828, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93829, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93830, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93831, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93832, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93833, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93834, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93835, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93836, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93837, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93838, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93839, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93840, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93841, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93842, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93843, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93844, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93845, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93846, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {93847, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {93848, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {93849, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {93850, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {93952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {93999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {94033, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94034, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94035, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94036, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94037, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94038, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94039, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94040, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94041, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94042, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94043, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94044, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94045, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94046, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94047, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94048, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94049, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94050, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94051, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94052, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94053, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94054, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94055, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94056, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94057, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94058, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94059, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94060, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94061, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94062, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94063, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94064, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94065, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94066, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94067, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94068, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94069, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94070, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94071, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94072, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94073, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94074, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94075, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94076, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94077, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94078, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {94095, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {94096, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {94097, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {94098, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {94099, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94100, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94101, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94102, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94103, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94104, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94105, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94106, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94107, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94108, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94109, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94110, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94111, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94176, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {94177, Unicode::Category_Letter_Modifier, Unicode::Direction_Left_To_Right}, + {100352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100356, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100357, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100358, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100359, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100360, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100361, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100362, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100363, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100364, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100365, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100366, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100367, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100368, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100369, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100370, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100371, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100372, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100373, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100374, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100375, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100376, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100377, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100378, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100379, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100380, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100381, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100382, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100383, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100384, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100385, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100386, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100387, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100388, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100389, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100390, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100391, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100392, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100393, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100394, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100395, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100396, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100397, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100398, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100399, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100400, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100401, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100402, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100403, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100404, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100405, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100406, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100407, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100408, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100409, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100410, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100411, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100412, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100413, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100414, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100415, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100416, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100417, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100418, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100419, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100420, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100421, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100422, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100423, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100424, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100425, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100426, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100427, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100428, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100429, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100430, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100431, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100432, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100433, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100434, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100435, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100436, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100437, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100438, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100439, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100440, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100441, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100442, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100443, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100444, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100445, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100446, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100447, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100448, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100449, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100450, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100451, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100452, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100453, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100454, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100455, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100456, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100457, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100458, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100459, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100460, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100461, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100462, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100463, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100464, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100465, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100466, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100467, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100468, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100469, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100470, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100471, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100472, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100473, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100474, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100475, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100476, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100477, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100478, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100479, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100480, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100481, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100482, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100483, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100484, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100485, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100486, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100487, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100488, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100489, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100490, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100491, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100492, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100493, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100494, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100495, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100496, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100497, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100498, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100499, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100500, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100501, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100502, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100503, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100504, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100505, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100506, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100507, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100508, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100509, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100510, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100511, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100512, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100513, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100514, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100515, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100516, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100517, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100518, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100519, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100520, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100521, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100522, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100523, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100524, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100525, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100526, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100527, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100528, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100529, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100530, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100531, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100532, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100533, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100534, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100535, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100536, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100537, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100538, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100539, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100540, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100541, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100542, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100543, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100544, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100545, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100546, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100547, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100548, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100549, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100550, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100551, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100552, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100553, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100554, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100555, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100556, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100557, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100558, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100559, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100791, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100801, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100868, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100879, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100881, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100886, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100887, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100916, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {100999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {101106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110791, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110801, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110868, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {110999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111102, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111103, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111104, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111105, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111106, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111107, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111108, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111109, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111110, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111111, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111112, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111113, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111114, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111115, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111116, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111117, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111118, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111119, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111120, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111121, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111122, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111123, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111124, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111125, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111126, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111127, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111128, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111129, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111130, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111131, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111132, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111133, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111134, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111135, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111136, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111137, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111138, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111139, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111140, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111141, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111142, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111143, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111144, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111145, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111146, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111147, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111148, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111149, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111150, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111151, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111152, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111153, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111154, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111155, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111156, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111157, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111158, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111159, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111160, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111161, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111162, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111163, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111164, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111165, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111166, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111167, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111168, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111169, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111170, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111171, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111172, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111173, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111174, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111175, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111176, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111177, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111178, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111179, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111180, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111181, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111182, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111183, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111184, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111185, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111186, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111187, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111188, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111189, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111190, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111191, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111192, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111193, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111194, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111195, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111196, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111197, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111198, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111199, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111200, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111201, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111202, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111203, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111204, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111205, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111206, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111207, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111209, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111210, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111211, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111212, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111213, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111214, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111215, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111216, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111217, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111218, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111219, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111220, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111221, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111222, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111223, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111224, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111225, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111226, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111227, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111228, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111229, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111230, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111231, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111232, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111233, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111234, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111235, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111236, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111237, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111238, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111239, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111240, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111241, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111242, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111243, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111244, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111245, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111246, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111247, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111248, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111249, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111250, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111251, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111252, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111253, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111254, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111255, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111256, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111257, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111258, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111259, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111260, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111261, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111262, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111263, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111264, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111265, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111266, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111267, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111268, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111269, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111270, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111271, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111272, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111273, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111274, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111275, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111276, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111277, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111278, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111279, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111280, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111281, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111282, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111283, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111284, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111285, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111286, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111287, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111288, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111289, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111290, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111291, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111292, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111293, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111294, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111295, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111296, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111297, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111298, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111299, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111300, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111301, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111302, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111303, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111304, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111305, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111306, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111307, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111308, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111309, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111310, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111311, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111313, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111314, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111315, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111316, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111317, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111318, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111319, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111320, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111321, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111322, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111323, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111324, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111325, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111326, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111327, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111328, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111329, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111330, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111331, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111332, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111333, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111334, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111335, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111336, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111337, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111338, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111339, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111340, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111341, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111342, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111343, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111344, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111345, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111346, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111347, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111348, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111349, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111350, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111351, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111352, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111353, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111354, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {111355, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {113820, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {113821, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {113822, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {113823, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {113824, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {113825, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {113826, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {113827, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {118784, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118785, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118786, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118787, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118788, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118789, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118790, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118791, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118792, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118793, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118794, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118795, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118796, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118797, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118798, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118799, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118800, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118801, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118802, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118803, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118804, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118805, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118806, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118807, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118808, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118809, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118810, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118811, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118812, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118813, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118814, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118815, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118816, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118817, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118818, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118819, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118820, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118821, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118822, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118823, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118824, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118825, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118826, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118827, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118828, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118829, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118830, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118831, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118832, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118833, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118834, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118835, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118836, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118837, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118838, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118839, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118840, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118841, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118842, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118843, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118844, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118845, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118846, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118847, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118848, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118849, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118850, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118851, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118852, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118853, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118854, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118855, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118856, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118857, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118858, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118859, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118860, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118861, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118862, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118863, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118864, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118865, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118866, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118867, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118868, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118869, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118870, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118871, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118872, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118873, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118874, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118875, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118876, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118877, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118878, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118879, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118880, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118881, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118882, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118883, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118884, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118885, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118886, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118887, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118888, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118889, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118890, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118891, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118892, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118893, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118894, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118895, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118896, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118897, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118898, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118899, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118900, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118901, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118902, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118903, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118904, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118905, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118906, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118907, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118908, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118909, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118910, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118911, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118912, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118913, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118914, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118915, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118916, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118917, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118918, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118919, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118920, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118921, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118922, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118923, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118924, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118925, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118926, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118927, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118928, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118929, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118930, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118931, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118932, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118933, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118934, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118935, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118936, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118937, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118938, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118939, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118940, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118941, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118942, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118943, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118944, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118945, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118946, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118947, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118948, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118949, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118950, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118951, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118952, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118953, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118954, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118955, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118956, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118957, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118958, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118959, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118960, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118961, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118962, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118963, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118964, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118965, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118966, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118967, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118968, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118969, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118970, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118971, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118972, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118973, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118974, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118975, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118976, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118977, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118978, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118979, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118980, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118981, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118982, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118983, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118984, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118985, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118986, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118987, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118988, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118989, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118990, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118991, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118992, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118993, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118994, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118995, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118996, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118997, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118998, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {118999, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119000, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119001, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119002, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119003, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119004, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119005, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119006, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119007, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119008, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119009, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119010, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119011, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119012, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119013, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119014, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119015, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119016, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119017, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119018, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119019, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119020, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119021, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119022, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119023, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119024, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119025, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119026, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119027, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119028, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119029, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119040, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119041, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119042, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119043, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119044, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119045, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119046, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119047, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119048, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119049, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119050, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119051, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119052, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119053, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119054, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119055, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119056, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119057, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119058, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119059, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119060, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119061, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119062, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119063, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119064, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119065, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119066, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119067, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119068, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119069, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119070, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119071, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119072, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119073, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119074, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119075, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119076, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119077, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119078, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119081, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119082, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119083, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119084, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119085, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119086, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119087, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119088, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119089, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119090, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119091, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119092, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119093, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119094, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119095, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119096, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119097, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119098, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119099, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119100, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119101, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119102, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119103, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119104, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119105, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119106, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119107, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119108, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119109, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119110, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119111, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119112, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119113, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119114, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119115, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119116, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119117, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119118, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119119, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119120, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119121, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119122, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119123, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119124, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119125, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119126, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119127, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119128, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119129, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119130, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119131, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119132, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119133, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119134, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119135, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119136, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119137, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119138, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119139, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119140, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119141, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {119142, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {119143, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119144, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119145, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119146, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119147, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119148, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119149, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {119150, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {119151, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {119152, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {119153, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {119154, Unicode::Category_Mark_SpacingCombining, Unicode::Direction_Left_To_Right}, + {119155, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {119156, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {119157, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {119158, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {119159, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {119160, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {119161, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {119162, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {119163, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119164, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119165, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119166, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119167, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119168, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119169, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119170, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119171, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119172, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119173, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119174, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119175, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119176, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119177, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119178, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119179, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119180, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119181, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119182, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119183, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119184, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119185, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119186, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119187, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119188, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119189, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119190, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119191, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119192, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119193, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119194, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119195, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119196, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119197, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119198, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119199, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119200, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119201, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119202, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119203, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119204, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119205, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119206, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119207, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119208, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119209, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119210, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119211, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119212, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119213, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119214, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119215, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119216, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119217, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119218, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119219, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119220, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119221, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119222, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119223, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119224, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119225, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119226, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119227, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119228, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119229, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119230, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119231, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119232, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119233, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119234, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119235, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119236, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119237, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119238, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119239, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119240, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119241, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119242, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119243, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119244, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119245, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119246, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119247, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119248, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119249, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119250, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119251, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119252, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119253, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119254, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119255, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119256, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119257, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119258, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119259, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119260, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119261, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119262, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119263, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119264, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119265, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119266, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119267, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119268, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119269, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119270, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119271, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119272, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {119296, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119297, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119298, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119299, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119300, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119301, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119302, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119303, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119304, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119305, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119306, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119307, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119308, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119309, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119310, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119311, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119312, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119313, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119314, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119315, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119316, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119317, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119318, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119319, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119320, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119321, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119322, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119323, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119324, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119325, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119326, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119327, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119328, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119329, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119330, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119331, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119332, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119333, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119334, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119335, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119336, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119337, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119338, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119339, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119340, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119341, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119342, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119343, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119344, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119345, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119346, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119347, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119348, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119349, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119350, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119351, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119352, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119353, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119354, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119355, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119356, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119357, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119358, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119359, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119360, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119361, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119362, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119363, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119364, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {119365, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119520, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119521, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119522, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119523, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119524, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119525, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119526, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119527, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119528, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119529, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119530, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119531, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119532, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119533, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119534, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119535, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119536, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119537, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119538, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119539, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119552, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119553, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119554, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119555, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119556, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119557, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119558, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119559, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119560, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119561, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119562, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119563, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119564, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119565, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119566, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119567, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119568, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119569, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119570, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119571, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119572, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119573, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119574, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119575, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119576, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119577, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119578, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119579, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119580, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119581, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119582, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119583, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119584, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119585, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119586, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119587, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119588, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119589, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119590, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119591, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119592, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119593, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119594, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119595, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119596, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119597, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119598, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119599, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119600, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119601, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119602, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119603, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119604, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119605, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119606, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119607, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119608, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119609, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119610, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119611, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119612, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119613, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119614, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119615, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119616, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119617, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119618, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119619, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119620, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119621, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119622, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119623, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119624, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119625, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119626, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119627, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119628, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119629, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119630, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119631, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119632, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119633, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119634, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119635, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119636, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119637, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119638, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {119648, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119649, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119650, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119651, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119652, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119653, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119654, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119655, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119656, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119657, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119658, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119659, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119660, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119661, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119662, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119663, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119664, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119665, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119666, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119667, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119668, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119669, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119670, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119671, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119672, Unicode::Category_Number_Other, Unicode::Direction_Left_To_Right}, + {119808, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119809, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119810, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119811, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119812, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119813, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119814, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119815, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119816, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119817, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119818, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119819, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119820, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119821, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119822, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119823, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119824, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119825, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119826, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119827, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119828, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119829, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119830, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119831, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119832, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119833, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119834, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119835, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119836, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119837, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119838, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119839, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119840, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119841, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119842, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119843, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119844, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119845, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119846, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119847, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119848, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119849, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119850, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119851, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119852, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119853, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119854, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119855, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119856, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119857, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119858, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119859, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119860, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119861, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119862, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119863, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119864, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119865, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119866, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119867, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119868, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119869, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119870, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119871, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119872, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119873, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119874, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119875, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119876, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119877, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119878, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119879, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119880, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119881, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119882, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119883, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119884, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119885, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119886, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119887, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119888, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119889, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119890, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119891, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119892, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119894, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119895, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119896, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119897, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119898, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119899, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119900, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119901, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119902, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119903, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119904, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119905, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119906, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119907, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119908, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119909, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119910, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119911, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119912, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119913, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119914, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119915, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119916, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119917, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119918, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119919, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119920, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119921, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119922, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119923, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119924, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119925, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119926, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119927, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119928, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119929, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119930, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119931, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119932, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119933, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119934, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119935, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119936, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119937, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119938, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119939, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119940, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119941, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119942, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119943, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119944, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119945, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119946, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119947, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119948, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119949, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119950, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119951, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119952, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119953, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119954, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119955, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119956, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119957, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119958, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119959, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119960, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119961, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119962, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119963, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119964, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119966, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119967, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119970, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119973, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119974, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119977, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119978, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119979, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119980, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119982, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119983, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119984, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119985, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119986, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119987, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119988, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119989, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {119990, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119991, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119992, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119993, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119995, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119997, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119998, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {119999, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120000, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120001, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120002, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120003, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120005, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120006, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120007, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120008, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120009, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120010, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120011, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120012, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120013, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120014, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120015, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120016, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120017, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120018, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120019, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120020, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120021, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120022, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120023, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120024, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120025, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120026, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120027, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120028, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120029, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120030, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120031, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120032, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120033, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120034, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120035, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120036, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120037, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120038, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120039, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120040, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120041, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120042, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120043, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120044, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120045, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120046, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120047, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120048, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120049, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120050, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120051, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120052, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120053, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120054, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120055, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120056, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120057, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120058, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120059, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120060, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120061, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120062, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120063, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120064, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120065, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120066, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120067, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120068, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120069, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120071, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120072, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120073, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120074, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120077, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120078, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120079, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120080, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120081, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120082, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120083, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120084, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120086, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120087, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120088, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120089, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120090, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120091, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120092, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120094, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120095, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120096, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120097, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120098, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120099, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120100, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120101, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120102, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120103, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120104, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120105, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120106, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120107, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120108, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120109, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120110, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120111, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120112, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120113, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120114, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120115, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120116, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120117, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120118, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120119, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120120, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120121, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120123, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120124, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120125, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120126, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120128, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120129, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120130, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120131, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120132, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120134, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120138, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120139, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120140, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120141, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120142, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120143, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120144, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120146, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120147, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120148, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120149, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120150, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120151, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120152, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120153, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120154, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120155, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120156, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120157, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120158, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120159, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120160, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120161, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120162, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120163, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120164, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120165, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120166, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120167, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120168, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120169, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120170, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120171, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120172, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120173, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120174, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120175, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120176, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120177, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120178, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120179, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120180, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120181, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120182, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120183, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120184, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120185, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120186, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120187, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120188, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120189, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120190, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120191, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120192, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120193, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120194, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120195, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120196, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120197, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120198, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120199, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120200, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120201, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120202, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120203, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120204, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120205, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120206, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120207, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120208, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120209, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120210, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120211, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120212, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120213, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120214, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120215, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120216, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120217, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120218, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120219, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120220, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120221, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120222, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120223, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120224, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120225, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120226, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120227, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120228, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120229, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120230, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120231, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120232, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120233, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120234, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120235, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120236, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120237, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120238, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120239, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120240, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120241, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120242, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120243, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120244, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120245, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120246, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120247, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120248, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120249, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120250, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120251, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120252, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120253, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120254, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120255, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120256, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120257, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120258, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120259, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120260, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120261, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120262, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120263, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120264, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120265, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120266, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120267, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120268, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120269, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120270, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120271, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120272, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120273, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120274, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120275, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120276, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120277, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120278, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120279, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120280, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120281, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120282, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120283, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120284, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120285, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120286, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120287, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120288, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120289, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120290, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120291, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120292, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120293, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120294, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120295, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120296, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120297, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120298, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120299, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120300, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120301, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120302, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120303, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120304, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120305, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120306, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120307, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120308, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120309, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120310, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120311, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120312, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120313, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120314, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120315, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120316, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120317, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120318, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120319, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120320, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120321, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120322, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120323, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120324, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120325, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120326, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120327, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120328, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120329, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120330, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120331, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120332, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120333, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120334, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120335, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120336, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120337, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120338, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120339, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120340, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120341, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120342, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120343, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120344, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120345, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120346, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120347, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120348, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120349, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120350, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120351, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120352, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120353, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120354, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120355, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120356, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120357, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120358, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120359, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120360, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120361, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120362, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120363, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120364, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120365, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120366, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120367, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120368, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120369, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120370, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120371, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120372, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120373, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120374, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120375, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120376, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120377, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120378, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120379, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120380, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120381, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120382, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120383, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120384, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120385, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120386, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120387, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120388, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120389, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120390, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120391, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120392, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120393, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120394, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120395, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120396, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120397, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120398, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120399, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120400, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120401, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120402, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120403, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120404, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120405, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120406, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120407, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120408, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120409, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120410, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120411, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120412, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120413, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120414, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120415, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120416, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120417, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120418, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120419, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120420, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120421, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120422, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120423, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120424, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120425, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120426, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120427, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120428, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120429, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120430, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120431, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120432, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120433, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120434, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120435, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120436, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120437, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120438, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120439, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120440, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120441, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120442, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120443, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120444, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120445, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120446, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120447, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120448, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120449, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120450, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120451, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120452, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120453, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120454, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120455, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120456, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120457, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120458, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120459, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120460, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120461, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120462, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120463, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120464, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120465, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120466, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120467, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120468, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120469, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120470, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120471, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120472, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120473, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120474, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120475, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120476, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120477, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120478, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120479, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120480, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120481, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120482, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120483, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120484, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120485, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120488, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120489, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120490, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120491, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120492, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120493, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120494, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120495, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120496, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120497, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120498, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120499, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120500, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120501, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120502, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120503, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120504, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120505, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120506, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120507, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120508, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120509, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120510, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120511, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120512, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120513, Unicode::Category_Symbol_Math, Unicode::Direction_Left_To_Right}, + {120514, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120515, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120516, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120517, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120518, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120519, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120520, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120521, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120522, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120523, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120524, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120525, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120526, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120527, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120528, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120529, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120530, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120531, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120532, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120533, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120534, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120535, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120536, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120537, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120538, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120539, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {120540, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120541, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120542, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120543, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120544, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120545, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120546, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120547, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120548, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120549, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120550, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120551, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120552, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120553, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120554, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120555, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120556, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120557, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120558, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120559, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120560, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120561, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120562, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120563, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120564, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120565, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120566, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120567, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120568, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120569, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120570, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120571, Unicode::Category_Symbol_Math, Unicode::Direction_Left_To_Right}, + {120572, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120573, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120574, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120575, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120576, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120577, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120578, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120579, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120580, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120581, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120582, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120583, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120584, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120585, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120586, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120587, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120588, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120589, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120590, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120591, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120592, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120593, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120594, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120595, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120596, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120597, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {120598, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120599, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120600, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120601, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120602, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120603, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120604, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120605, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120606, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120607, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120608, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120609, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120610, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120611, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120612, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120613, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120614, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120615, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120616, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120617, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120618, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120619, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120620, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120621, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120622, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120623, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120624, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120625, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120626, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120627, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120628, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120629, Unicode::Category_Symbol_Math, Unicode::Direction_Left_To_Right}, + {120630, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120631, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120632, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120633, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120634, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120635, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120636, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120637, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120638, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120639, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120640, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120641, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120642, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120643, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120644, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120645, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120646, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120647, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120648, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120649, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120650, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120651, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120652, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120653, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120654, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120655, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {120656, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120657, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120658, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120659, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120660, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120661, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120662, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120663, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120664, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120665, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120666, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120667, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120668, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120669, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120670, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120671, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120672, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120673, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120674, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120675, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120676, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120677, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120678, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120679, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120680, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120681, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120682, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120683, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120684, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120685, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120686, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120687, Unicode::Category_Symbol_Math, Unicode::Direction_Left_To_Right}, + {120688, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120689, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120690, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120691, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120692, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120693, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120694, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120695, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120696, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120697, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120698, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120699, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120700, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120701, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120702, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120703, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120704, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120705, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120706, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120707, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120708, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120709, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120710, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120711, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120712, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120713, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {120714, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120715, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120716, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120717, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120718, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120719, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120720, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120721, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120722, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120723, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120724, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120725, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120726, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120727, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120728, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120729, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120730, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120731, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120732, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120733, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120734, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120735, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120736, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120737, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120738, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120739, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120740, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120741, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120742, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120743, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120744, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120745, Unicode::Category_Symbol_Math, Unicode::Direction_Left_To_Right}, + {120746, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120747, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120748, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120749, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120750, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120751, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120752, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120753, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120754, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120755, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120756, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120757, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120758, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120759, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120760, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120761, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120762, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120763, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120764, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120765, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120766, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120767, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120768, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120769, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120770, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120771, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {120772, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120773, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120774, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120775, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120776, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120777, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120778, Unicode::Category_Letter_Uppercase, Unicode::Direction_Left_To_Right}, + {120779, Unicode::Category_Letter_Lowercase, Unicode::Direction_Left_To_Right}, + {120782, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120783, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120784, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120785, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120786, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120787, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120788, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120789, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120790, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120791, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120792, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120793, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120794, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120795, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120796, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120797, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120798, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120799, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120800, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120801, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120802, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120803, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120804, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120805, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120806, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120807, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120808, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120809, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120810, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120811, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120812, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120813, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120814, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120815, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120816, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120817, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120818, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120819, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120820, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120821, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120822, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120823, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120824, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120825, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120826, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120827, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120828, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120829, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120830, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120831, Unicode::Category_Number_DecimalDigit, Unicode::Direction_European_Number}, + {120832, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120833, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120834, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120835, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120836, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120837, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120838, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120839, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120840, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120841, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120842, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120843, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120844, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120845, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120846, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120847, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120848, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120849, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120850, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120851, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120852, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120853, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120854, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120855, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120856, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120857, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120858, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120859, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120860, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120861, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120862, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120863, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120864, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120865, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120866, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120867, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120868, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120869, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120870, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120871, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120872, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120873, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120874, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120875, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120876, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120877, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120878, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120879, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120880, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120881, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120882, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120883, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120884, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120885, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120886, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120887, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120888, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120889, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120890, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120891, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120892, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120893, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120894, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120895, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120896, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120897, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120898, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120899, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120900, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120901, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120902, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120903, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120904, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120905, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120906, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120907, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120908, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120909, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120910, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120911, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120912, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120913, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120914, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120915, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120916, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120917, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120918, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120919, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120920, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120921, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120922, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120923, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120924, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120925, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120926, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120927, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120928, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120929, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120930, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120931, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120932, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120933, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120934, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120935, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120936, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120937, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120938, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120939, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120940, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120941, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120942, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120943, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120944, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120945, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120946, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120947, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120948, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120949, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120950, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120951, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120952, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120953, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120954, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120955, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120956, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120957, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120958, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120959, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120960, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120961, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120962, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120963, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120964, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120965, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120966, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120967, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120968, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120969, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120970, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120971, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120972, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120973, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120974, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120975, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120976, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120977, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120978, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120979, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120980, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120981, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120982, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120983, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120984, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120985, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120986, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120987, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120988, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120989, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120990, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120991, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120992, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120993, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120994, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120995, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120996, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120997, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120998, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {120999, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121000, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121001, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121002, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121003, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121004, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121005, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121006, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121007, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121008, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121009, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121010, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121011, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121012, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121013, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121014, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121015, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121016, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121017, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121018, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121019, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121020, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121021, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121022, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121023, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121024, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121025, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121026, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121027, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121028, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121029, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121030, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121031, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121032, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121033, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121034, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121035, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121036, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121037, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121038, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121039, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121040, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121041, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121042, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121043, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121044, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121045, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121046, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121047, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121048, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121049, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121050, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121051, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121052, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121053, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121054, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121055, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121056, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121057, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121058, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121059, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121060, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121061, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121062, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121063, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121064, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121065, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121066, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121067, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121068, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121069, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121070, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121071, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121072, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121073, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121074, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121075, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121076, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121077, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121078, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121079, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121080, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121081, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121082, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121083, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121084, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121085, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121086, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121087, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121088, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121089, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121090, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121091, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121092, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121093, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121094, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121095, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121096, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121097, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121098, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121099, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121100, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121101, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121102, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121103, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121104, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121105, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121106, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121107, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121108, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121109, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121110, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121111, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121112, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121113, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121114, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121115, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121116, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121117, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121118, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121119, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121120, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121121, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121122, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121123, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121124, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121125, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121126, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121127, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121128, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121129, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121130, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121131, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121132, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121133, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121134, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121135, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121136, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121137, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121138, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121139, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121140, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121141, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121142, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121143, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121144, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121145, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121146, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121147, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121148, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121149, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121150, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121151, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121152, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121153, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121154, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121155, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121156, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121157, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121158, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121159, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121160, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121161, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121162, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121163, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121164, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121165, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121166, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121167, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121168, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121169, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121170, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121171, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121172, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121173, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121174, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121175, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121176, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121177, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121178, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121179, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121180, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121181, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121182, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121183, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121184, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121185, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121186, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121187, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121188, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121189, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121190, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121191, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121192, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121193, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121194, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121195, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121196, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121197, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121198, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121199, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121200, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121201, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121202, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121203, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121204, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121205, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121206, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121207, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121208, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121209, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121210, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121211, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121212, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121213, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121214, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121215, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121216, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121217, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121218, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121219, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121220, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121221, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121222, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121223, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121224, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121225, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121226, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121227, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121228, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121229, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121230, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121231, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121232, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121233, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121234, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121235, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121236, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121237, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121238, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121239, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121240, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121241, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121242, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121243, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121244, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121245, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121246, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121247, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121248, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121249, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121250, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121251, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121252, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121253, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121254, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121255, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121256, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121257, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121258, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121259, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121260, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121261, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121262, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121263, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121264, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121265, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121266, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121267, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121268, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121269, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121270, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121271, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121272, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121273, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121274, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121275, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121276, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121277, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121278, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121279, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121280, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121281, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121282, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121283, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121284, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121285, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121286, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121287, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121288, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121289, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121290, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121291, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121292, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121293, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121294, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121295, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121296, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121297, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121298, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121299, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121300, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121301, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121302, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121303, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121304, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121305, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121306, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121307, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121308, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121309, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121310, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121311, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121312, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121313, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121314, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121315, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121316, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121317, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121318, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121319, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121320, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121321, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121322, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121323, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121324, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121325, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121326, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121327, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121328, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121329, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121330, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121331, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121332, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121333, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121334, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121335, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121336, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121337, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121338, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121339, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121340, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121341, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121342, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121343, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121344, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121345, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121346, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121347, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121348, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121349, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121350, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121351, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121352, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121353, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121354, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121355, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121356, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121357, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121358, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121359, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121360, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121361, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121362, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121363, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121364, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121365, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121366, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121367, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121368, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121369, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121370, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121371, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121372, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121373, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121374, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121375, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121376, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121377, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121378, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121379, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121380, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121381, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121382, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121383, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121384, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121385, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121386, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121387, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121388, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121389, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121390, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121391, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121392, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121393, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121394, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121395, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121396, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121397, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121398, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121399, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121400, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121401, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121402, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121403, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121404, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121405, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121406, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121407, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121408, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121409, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121410, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121411, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121412, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121413, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121414, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121415, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121416, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121417, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121418, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121419, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121420, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121421, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121422, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121423, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121424, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121425, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121426, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121427, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121428, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121429, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121430, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121431, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121432, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121433, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121434, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121435, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121436, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121437, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121438, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121439, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121440, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121441, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121442, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121443, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121444, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121445, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121446, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121447, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121448, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121449, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121450, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121451, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121452, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121453, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121454, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121455, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121456, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121457, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121458, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121459, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121460, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121461, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121462, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121463, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121464, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121465, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121466, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121467, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121468, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121469, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121470, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121471, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121472, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121473, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121474, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121475, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121476, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121477, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121478, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {121479, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {121480, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {121481, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {121482, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {121483, Unicode::Category_Punctuation_Other, Unicode::Direction_Left_To_Right}, + {121499, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121500, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121501, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121502, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121503, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121505, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121506, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121507, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121508, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121509, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121510, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121511, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121512, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121513, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121514, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121515, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121516, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121517, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121518, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {121519, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122880, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122881, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122882, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122883, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122884, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122885, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122886, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122888, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122889, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122890, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122891, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122892, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122893, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122894, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122895, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122896, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122897, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122898, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122899, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122900, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122901, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122902, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122903, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122904, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122907, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122908, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122909, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122910, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122911, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122912, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122913, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122915, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122916, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122918, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122919, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122920, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122921, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {122922, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {124928, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124929, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124930, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124931, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124932, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124933, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124934, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124935, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124936, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124937, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124938, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124939, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124940, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124941, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124942, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124943, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124944, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124945, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124946, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124947, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124948, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124949, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124950, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124951, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124952, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124953, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124954, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124955, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124956, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124957, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124958, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124959, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124960, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124961, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124962, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124963, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124964, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124965, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124966, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124967, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124968, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124969, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124970, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124971, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124972, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124973, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124974, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124975, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124976, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124977, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124978, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124979, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124980, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124981, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124982, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124983, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124984, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124985, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124986, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124987, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124988, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124989, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124990, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124991, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124992, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124993, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124994, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124995, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124996, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124997, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124998, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {124999, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125000, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125001, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125002, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125003, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125004, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125005, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125006, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125007, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125008, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125009, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125010, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125011, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125012, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125013, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125014, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125015, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125016, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125017, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125018, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125019, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125020, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125021, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125022, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125023, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125024, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125025, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125026, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125027, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125028, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125029, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125030, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125031, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125032, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125033, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125034, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125035, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125036, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125037, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125038, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125039, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125040, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125041, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125042, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125043, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125044, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125045, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125046, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125047, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125048, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125049, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125050, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125051, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125052, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125053, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125054, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125055, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125056, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125057, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125058, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125059, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125060, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125061, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125062, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125063, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125064, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125065, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125066, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125067, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125068, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125069, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125070, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125071, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125072, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125073, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125074, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125075, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125076, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125077, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125078, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125079, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125080, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125081, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125082, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125083, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125084, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125085, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125086, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125087, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125088, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125089, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125090, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125091, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125092, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125093, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125094, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125095, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125096, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125097, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125098, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125099, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125100, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125101, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125102, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125103, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125104, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125105, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125106, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125107, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125108, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125109, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125110, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125111, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125112, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125113, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125114, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125115, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125116, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125117, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125118, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125119, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125120, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125121, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125122, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125123, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125124, Unicode::Category_Letter_Other, Unicode::Direction_Right_To_Left}, + {125127, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {125128, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {125129, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {125130, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {125131, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {125132, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {125133, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {125134, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {125135, Unicode::Category_Number_Other, Unicode::Direction_Right_To_Left}, + {125136, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125137, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125138, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125139, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125140, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125141, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125142, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125184, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125185, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125186, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125187, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125188, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125189, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125190, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125191, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125192, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125193, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125194, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125195, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125196, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125197, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125198, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125199, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125200, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125201, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125202, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125203, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125204, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125205, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125206, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125207, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125208, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125209, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125210, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125211, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125212, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125213, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125214, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125215, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125216, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125217, Unicode::Category_Letter_Uppercase, Unicode::Direction_Right_To_Left}, + {125218, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125219, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125220, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125221, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125222, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125223, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125224, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125225, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125226, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125227, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125228, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125229, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125230, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125231, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125232, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125233, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125234, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125235, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125236, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125237, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125238, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125239, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125240, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125241, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125242, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125243, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125244, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125245, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125246, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125247, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125248, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125249, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125250, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125251, Unicode::Category_Letter_Lowercase, Unicode::Direction_Right_To_Left}, + {125252, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125253, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125254, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125255, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125256, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125257, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125258, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {125264, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {125265, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {125266, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {125267, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {125268, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {125269, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {125270, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {125271, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {125272, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {125273, Unicode::Category_Number_DecimalDigit, Unicode::Direction_Right_To_Left}, + {125278, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {125279, Unicode::Category_Punctuation_Other, Unicode::Direction_Right_To_Left}, + {126065, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126066, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126067, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126068, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126069, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126070, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126071, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126072, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126073, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126074, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126075, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126076, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126077, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126078, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126079, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126080, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126081, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126082, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126083, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126084, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126085, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126086, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126087, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126088, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126089, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126090, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126091, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126092, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126093, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126094, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126095, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126096, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126097, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126098, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126099, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126100, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126101, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126102, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126103, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126104, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126105, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126106, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126107, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126108, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126109, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126110, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126111, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126112, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126113, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126114, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126115, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126116, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126117, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126118, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126119, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126120, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126121, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126122, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126123, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126124, Unicode::Category_Symbol_Other, Unicode::Direction_Arabic_Letter}, + {126125, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126126, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126127, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126128, Unicode::Category_Symbol_Currency, Unicode::Direction_Arabic_Letter}, + {126129, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126130, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126131, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126132, Unicode::Category_Number_Other, Unicode::Direction_Arabic_Letter}, + {126464, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126465, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126466, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126467, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126469, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126470, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126471, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126472, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126473, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126474, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126475, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126476, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126477, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126478, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126479, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126480, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126481, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126482, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126483, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126484, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126485, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126486, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126487, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126488, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126489, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126490, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126491, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126492, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126493, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126494, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126495, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126497, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126498, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126500, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126503, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126505, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126506, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126507, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126508, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126509, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126510, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126511, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126512, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126513, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126514, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126516, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126517, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126518, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126519, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126521, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126523, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126530, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126535, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126537, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126539, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126541, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126542, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126543, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126545, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126546, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126548, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126551, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126553, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126555, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126557, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126559, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126561, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126562, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126564, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126567, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126568, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126569, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126570, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126572, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126573, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126574, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126575, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126576, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126577, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126578, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126580, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126581, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126582, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126583, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126585, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126586, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126587, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126588, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126590, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126592, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126593, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126594, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126595, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126596, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126597, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126598, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126599, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126600, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126601, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126603, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126604, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126605, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126606, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126607, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126608, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126609, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126610, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126611, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126612, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126613, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126614, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126615, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126616, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126617, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126618, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126619, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126625, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126626, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126627, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126629, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126630, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126631, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126632, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126633, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126635, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126636, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126637, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126638, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126639, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126640, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126641, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126642, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126643, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126644, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126645, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126646, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126647, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126648, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126649, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126650, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126651, Unicode::Category_Letter_Other, Unicode::Direction_Arabic_Letter}, + {126704, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {126705, Unicode::Category_Symbol_Math, Unicode::Direction_Other_Neutral}, + {126976, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126977, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126978, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126979, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126980, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126981, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126982, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126983, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126984, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126985, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126986, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126987, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126988, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126989, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126990, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126991, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126992, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126993, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126994, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126995, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126996, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126997, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126998, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {126999, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127000, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127001, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127002, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127003, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127004, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127005, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127006, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127007, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127008, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127009, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127010, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127011, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127012, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127013, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127014, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127015, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127016, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127017, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127018, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127019, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127024, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127025, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127026, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127027, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127028, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127029, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127030, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127031, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127032, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127033, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127034, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127035, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127036, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127037, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127038, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127039, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127040, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127041, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127042, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127043, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127044, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127045, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127046, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127047, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127048, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127049, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127050, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127051, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127052, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127053, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127054, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127055, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127056, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127057, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127058, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127059, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127060, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127061, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127062, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127063, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127064, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127065, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127066, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127067, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127068, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127069, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127070, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127071, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127072, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127073, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127074, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127075, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127076, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127077, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127078, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127079, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127080, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127081, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127082, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127083, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127084, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127085, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127086, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127087, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127088, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127089, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127090, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127091, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127092, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127093, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127094, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127095, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127096, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127097, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127098, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127099, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127100, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127101, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127102, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127103, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127104, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127105, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127106, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127107, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127108, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127109, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127110, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127111, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127112, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127113, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127114, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127115, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127116, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127117, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127118, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127119, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127120, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127121, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127122, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127123, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127136, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127137, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127138, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127139, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127140, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127141, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127142, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127143, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127144, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127145, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127146, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127147, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127148, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127149, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127150, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127153, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127154, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127155, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127156, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127157, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127158, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127159, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127160, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127161, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127162, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127163, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127164, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127165, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127166, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127167, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127169, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127170, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127171, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127172, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127173, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127174, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127175, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127176, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127177, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127178, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127179, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127180, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127181, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127182, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127183, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127185, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127186, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127187, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127188, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127189, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127190, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127191, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127192, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127193, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127194, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127195, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127196, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127197, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127198, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127199, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127200, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127201, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127202, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127203, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127204, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127205, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127206, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127207, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127208, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127209, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127210, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127211, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127212, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127213, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127214, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127215, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127216, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127217, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127218, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127219, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127220, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127221, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127232, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127233, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127234, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127235, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127236, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127237, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127238, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127239, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127240, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127241, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127242, Unicode::Category_Number_Other, Unicode::Direction_European_Number}, + {127243, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {127244, Unicode::Category_Number_Other, Unicode::Direction_Other_Neutral}, + {127248, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127249, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127250, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127251, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127252, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127253, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127254, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127255, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127256, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127257, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127258, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127259, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127260, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127261, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127262, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127263, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127264, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127265, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127266, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127267, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127268, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127269, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127270, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127271, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127272, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127273, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127274, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127275, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127276, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127277, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127278, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127279, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127280, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127281, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127282, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127283, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127284, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127285, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127286, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127287, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127288, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127289, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127290, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127291, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127292, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127293, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127294, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127295, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127296, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127297, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127298, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127299, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127300, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127301, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127302, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127303, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127304, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127305, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127306, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127307, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127308, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127309, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127310, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127311, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127312, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127313, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127314, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127315, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127316, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127317, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127318, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127319, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127320, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127321, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127322, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127323, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127324, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127325, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127326, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127327, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127328, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127329, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127330, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127331, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127332, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127333, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127334, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127335, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127336, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127337, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127338, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127339, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127344, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127345, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127346, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127347, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127348, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127349, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127350, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127351, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127352, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127353, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127354, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127355, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127356, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127357, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127358, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127359, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127360, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127361, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127362, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127363, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127364, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127365, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127366, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127367, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127368, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127369, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127370, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127371, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127372, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127373, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127374, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127375, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127376, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127377, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127378, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127379, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127380, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127381, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127382, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127383, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127384, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127385, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127386, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127387, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127388, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127389, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127390, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127391, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127392, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127393, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127394, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127395, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127396, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127397, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127398, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127399, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127400, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127401, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127402, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127403, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127404, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127462, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127463, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127464, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127465, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127466, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127467, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127468, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127469, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127470, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127471, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127472, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127473, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127474, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127475, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127476, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127477, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127478, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127479, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127480, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127481, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127482, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127483, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127484, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127485, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127486, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127487, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127488, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127489, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127490, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127504, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127505, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127506, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127507, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127508, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127509, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127510, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127511, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127512, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127513, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127514, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127515, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127516, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127517, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127518, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127519, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127520, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127521, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127522, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127523, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127524, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127525, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127526, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127527, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127528, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127529, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127530, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127531, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127532, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127533, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127534, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127535, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127536, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127537, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127538, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127539, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127540, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127541, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127542, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127543, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127544, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127545, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127546, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127547, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127552, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127553, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127554, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127555, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127556, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127557, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127558, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127559, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127560, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127568, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127569, Unicode::Category_Symbol_Other, Unicode::Direction_Left_To_Right}, + {127584, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127585, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127586, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127587, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127588, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127589, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127744, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127745, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127746, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127747, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127748, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127749, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127750, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127751, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127752, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127753, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127754, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127755, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127756, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127757, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127758, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127759, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127760, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127761, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127762, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127763, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127764, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127765, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127766, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127767, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127768, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127769, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127770, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127771, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127772, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127773, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127774, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127775, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127776, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127777, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127778, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127779, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127780, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127781, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127782, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127783, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127784, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127785, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127786, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127787, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127788, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127789, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127790, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127791, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127792, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127793, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127794, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127795, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127796, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127797, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127798, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127799, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127800, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127801, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127802, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127803, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127804, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127805, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127806, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127807, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127808, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127809, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127810, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127811, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127812, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127813, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127814, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127815, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127816, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127817, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127818, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127819, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127820, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127821, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127822, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127823, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127824, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127825, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127826, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127827, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127828, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127829, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127830, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127831, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127832, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127833, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127834, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127835, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127836, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127837, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127838, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127839, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127840, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127841, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127842, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127843, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127844, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127845, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127846, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127847, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127848, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127849, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127850, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127851, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127852, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127853, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127854, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127855, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127856, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127857, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127858, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127859, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127860, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127861, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127862, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127863, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127864, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127865, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127866, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127867, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127868, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127869, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127870, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127871, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127872, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127873, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127874, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127875, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127876, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127877, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127878, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127879, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127880, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127881, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127882, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127883, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127884, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127885, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127886, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127887, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127888, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127889, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127890, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127891, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127892, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127893, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127894, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127895, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127896, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127897, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127898, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127899, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127900, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127901, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127902, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127903, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127904, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127905, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127906, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127907, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127908, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127909, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127910, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127911, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127912, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127913, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127914, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127915, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127916, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127917, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127918, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127919, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127920, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127921, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127922, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127923, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127924, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127925, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127926, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127927, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127928, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127929, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127930, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127931, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127932, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127933, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127934, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127935, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127936, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127937, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127938, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127939, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127940, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127941, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127942, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127943, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127944, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127945, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127946, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127947, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127948, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127949, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127950, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127951, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127952, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127953, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127954, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127955, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127956, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127957, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127958, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127959, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127960, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127961, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127962, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127963, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127964, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127965, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127966, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127967, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127968, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127969, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127970, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127971, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127972, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127973, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127974, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127975, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127976, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127977, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127978, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127979, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127980, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127981, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127982, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127983, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127984, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127985, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127986, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127987, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127988, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127989, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127990, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127991, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127992, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127993, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127994, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {127995, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {127996, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {127997, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {127998, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {127999, Unicode::Category_Symbol_Modifier, Unicode::Direction_Other_Neutral}, + {128000, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128001, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128002, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128003, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128004, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128005, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128006, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128007, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128008, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128009, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128010, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128011, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128012, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128013, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128014, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128015, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128016, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128017, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128018, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128019, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128020, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128021, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128022, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128023, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128024, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128025, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128026, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128027, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128028, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128029, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128030, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128031, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128032, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128033, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128034, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128035, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128036, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128037, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128038, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128039, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128040, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128041, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128042, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128043, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128044, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128045, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128046, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128047, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128048, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128049, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128050, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128051, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128052, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128053, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128054, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128055, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128056, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128057, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128058, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128059, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128060, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128061, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128062, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128063, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128064, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128065, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128066, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128067, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128068, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128069, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128070, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128071, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128072, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128073, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128074, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128075, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128076, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128077, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128078, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128079, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128080, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128081, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128082, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128083, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128084, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128085, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128086, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128087, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128088, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128089, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128090, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128091, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128092, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128093, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128094, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128095, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128096, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128097, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128098, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128099, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128100, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128101, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128102, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128103, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128104, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128105, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128106, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128107, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128108, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128109, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128110, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128111, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128112, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128113, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128114, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128115, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128116, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128117, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128118, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128119, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128120, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128121, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128122, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128123, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128124, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128125, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128126, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128127, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128128, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128129, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128130, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128131, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128132, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128133, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128134, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128135, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128136, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128137, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128138, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128139, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128140, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128141, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128142, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128143, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128144, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128145, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128146, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128147, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128148, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128149, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128150, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128151, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128152, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128153, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128154, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128155, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128156, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128157, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128158, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128159, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128160, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128161, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128162, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128163, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128164, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128165, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128166, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128167, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128168, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128169, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128170, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128171, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128172, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128173, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128174, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128175, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128176, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128177, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128178, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128179, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128180, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128181, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128182, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128183, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128184, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128185, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128186, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128187, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128188, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128189, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128190, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128191, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128192, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128193, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128194, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128195, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128196, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128197, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128198, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128199, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128200, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128201, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128202, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128203, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128204, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128205, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128206, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128207, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128208, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128209, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128210, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128211, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128212, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128213, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128214, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128215, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128216, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128217, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128218, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128219, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128220, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128221, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128222, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128223, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128224, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128225, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128226, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128227, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128228, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128229, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128230, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128231, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128232, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128233, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128234, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128235, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128236, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128237, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128238, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128239, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128240, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128241, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128242, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128243, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128244, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128245, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128246, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128247, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128248, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128249, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128250, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128251, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128252, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128253, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128254, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128255, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128256, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128257, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128258, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128259, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128260, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128261, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128262, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128263, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128264, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128265, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128266, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128267, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128268, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128269, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128270, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128271, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128272, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128273, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128274, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128275, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128276, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128277, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128278, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128279, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128280, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128281, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128282, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128283, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128284, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128285, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128286, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128287, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128288, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128289, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128290, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128291, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128292, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128293, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128294, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128295, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128296, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128297, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128298, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128299, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128300, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128301, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128302, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128303, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128304, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128305, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128306, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128307, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128308, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128309, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128310, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128311, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128312, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128313, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128314, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128315, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128316, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128317, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128318, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128319, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128320, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128321, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128322, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128323, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128324, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128325, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128326, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128327, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128328, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128329, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128330, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128331, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128332, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128333, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128334, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128335, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128336, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128337, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128338, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128339, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128340, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128341, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128342, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128343, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128344, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128345, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128346, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128347, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128348, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128349, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128350, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128351, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128352, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128353, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128354, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128355, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128356, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128357, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128358, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128359, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128360, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128361, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128362, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128363, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128364, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128365, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128366, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128367, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128368, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128369, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128370, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128371, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128372, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128373, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128374, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128375, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128376, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128377, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128378, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128379, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128380, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128381, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128382, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128383, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128384, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128385, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128386, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128387, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128388, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128389, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128390, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128391, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128392, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128393, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128394, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128395, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128396, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128397, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128398, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128399, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128400, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128401, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128402, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128403, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128404, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128405, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128406, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128407, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128408, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128409, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128410, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128411, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128412, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128413, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128414, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128415, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128416, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128417, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128418, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128419, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128420, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128421, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128422, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128423, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128424, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128425, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128426, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128427, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128428, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128429, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128430, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128431, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128432, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128433, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128434, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128435, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128436, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128437, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128438, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128439, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128440, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128441, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128442, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128443, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128444, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128445, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128446, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128447, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128448, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128449, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128450, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128451, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128452, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128453, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128454, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128455, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128456, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128457, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128458, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128459, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128460, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128461, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128462, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128463, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128464, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128465, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128466, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128467, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128468, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128469, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128470, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128471, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128472, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128473, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128474, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128475, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128476, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128477, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128478, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128479, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128480, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128481, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128482, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128483, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128484, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128485, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128486, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128487, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128488, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128489, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128490, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128491, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128492, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128493, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128494, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128495, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128496, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128497, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128498, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128499, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128500, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128501, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128502, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128503, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128504, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128505, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128506, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128507, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128508, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128509, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128510, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128511, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128512, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128513, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128514, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128515, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128516, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128517, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128518, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128519, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128520, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128521, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128522, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128523, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128524, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128525, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128526, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128527, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128528, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128529, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128530, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128531, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128532, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128533, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128534, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128535, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128536, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128537, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128538, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128539, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128540, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128541, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128542, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128543, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128544, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128545, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128546, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128547, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128548, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128549, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128550, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128551, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128552, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128553, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128554, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128555, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128556, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128557, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128558, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128559, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128560, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128561, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128562, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128563, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128564, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128565, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128566, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128567, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128568, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128569, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128570, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128571, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128572, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128573, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128574, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128575, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128576, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128577, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128578, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128579, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128580, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128581, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128582, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128583, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128584, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128585, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128586, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128587, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128588, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128589, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128590, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128591, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128592, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128593, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128594, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128595, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128596, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128597, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128598, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128599, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128600, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128601, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128602, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128603, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128604, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128605, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128606, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128607, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128608, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128609, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128610, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128611, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128612, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128613, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128614, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128615, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128616, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128617, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128618, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128619, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128620, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128621, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128622, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128623, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128624, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128625, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128626, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128627, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128628, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128629, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128630, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128631, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128632, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128633, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128634, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128635, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128636, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128637, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128638, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128639, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128640, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128641, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128642, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128643, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128644, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128645, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128646, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128647, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128648, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128649, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128650, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128651, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128652, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128653, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128654, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128655, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128656, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128657, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128658, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128659, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128660, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128661, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128662, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128663, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128664, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128665, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128666, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128667, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128668, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128669, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128670, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128671, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128672, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128673, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128674, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128675, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128676, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128677, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128678, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128679, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128680, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128681, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128682, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128683, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128684, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128685, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128686, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128687, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128688, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128689, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128690, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128691, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128692, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128693, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128694, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128695, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128696, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128697, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128698, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128699, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128700, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128701, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128702, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128703, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128704, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128705, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128706, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128707, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128708, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128709, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128710, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128711, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128712, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128713, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128714, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128715, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128716, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128717, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128718, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128719, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128720, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128721, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128722, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128723, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128724, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128736, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128737, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128738, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128739, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128740, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128741, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128742, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128743, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128744, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128745, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128746, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128747, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128748, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128752, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128753, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128754, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128755, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128756, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128757, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128758, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128759, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128760, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128761, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128768, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128769, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128770, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128771, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128772, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128773, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128774, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128775, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128776, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128777, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128778, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128779, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128780, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128781, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128782, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128783, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128784, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128785, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128786, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128787, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128788, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128789, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128790, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128791, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128792, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128793, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128794, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128795, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128796, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128797, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128798, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128799, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128800, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128801, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128802, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128803, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128804, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128805, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128806, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128807, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128808, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128809, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128810, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128811, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128812, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128813, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128814, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128815, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128816, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128817, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128818, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128819, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128820, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128821, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128822, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128823, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128824, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128825, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128826, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128827, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128828, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128829, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128830, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128831, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128832, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128833, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128834, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128835, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128836, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128837, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128838, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128839, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128840, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128841, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128842, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128843, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128844, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128845, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128846, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128847, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128848, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128849, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128850, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128851, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128852, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128853, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128854, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128855, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128856, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128857, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128858, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128859, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128860, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128861, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128862, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128863, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128864, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128865, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128866, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128867, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128868, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128869, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128870, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128871, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128872, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128873, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128874, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128875, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128876, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128877, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128878, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128879, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128880, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128881, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128882, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128883, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128896, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128897, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128898, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128899, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128900, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128901, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128902, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128903, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128904, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128905, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128906, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128907, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128908, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128909, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128910, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128911, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128912, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128913, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128914, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128915, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128916, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128917, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128918, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128919, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128920, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128921, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128922, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128923, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128924, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128925, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128926, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128927, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128928, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128929, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128930, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128931, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128932, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128933, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128934, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128935, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128936, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128937, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128938, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128939, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128940, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128941, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128942, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128943, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128944, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128945, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128946, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128947, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128948, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128949, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128950, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128951, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128952, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128953, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128954, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128955, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128956, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128957, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128958, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128959, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128960, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128961, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128962, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128963, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128964, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128965, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128966, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128967, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128968, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128969, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128970, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128971, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128972, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128973, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128974, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128975, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128976, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128977, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128978, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128979, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128980, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128981, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128982, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128983, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {128984, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129024, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129025, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129026, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129027, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129028, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129029, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129030, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129031, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129032, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129033, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129034, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129035, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129040, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129041, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129042, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129043, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129044, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129045, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129046, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129047, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129048, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129049, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129050, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129051, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129052, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129053, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129054, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129055, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129056, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129057, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129058, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129059, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129060, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129061, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129062, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129063, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129064, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129065, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129066, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129067, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129068, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129069, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129070, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129071, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129072, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129073, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129074, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129075, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129076, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129077, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129078, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129079, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129080, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129081, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129082, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129083, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129084, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129085, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129086, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129087, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129088, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129089, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129090, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129091, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129092, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129093, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129094, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129095, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129104, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129105, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129106, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129107, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129108, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129109, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129110, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129111, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129112, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129113, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129120, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129121, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129122, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129123, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129124, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129125, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129126, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129127, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129128, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129129, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129130, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129131, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129132, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129133, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129134, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129135, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129136, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129137, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129138, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129139, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129140, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129141, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129142, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129143, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129144, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129145, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129146, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129147, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129148, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129149, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129150, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129151, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129152, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129153, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129154, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129155, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129156, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129157, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129158, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129159, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129168, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129169, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129170, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129171, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129172, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129173, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129174, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129175, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129176, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129177, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129178, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129179, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129180, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129181, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129182, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129183, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129184, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129185, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129186, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129187, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129188, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129189, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129190, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129191, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129192, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129193, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129194, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129195, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129196, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129197, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129280, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129281, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129282, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129283, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129284, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129285, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129286, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129287, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129288, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129289, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129290, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129291, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129296, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129297, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129298, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129299, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129300, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129301, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129302, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129303, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129304, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129305, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129306, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129307, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129308, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129309, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129310, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129311, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129312, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129313, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129314, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129315, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129316, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129317, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129318, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129319, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129320, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129321, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129322, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129323, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129324, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129325, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129326, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129327, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129328, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129329, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129330, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129331, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129332, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129333, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129334, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129335, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129336, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129337, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129338, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129339, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129340, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129341, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129342, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129344, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129345, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129346, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129347, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129348, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129349, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129350, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129351, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129352, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129353, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129354, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129355, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129356, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129357, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129358, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129359, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129360, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129361, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129362, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129363, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129364, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129365, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129366, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129367, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129368, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129369, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129370, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129371, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129372, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129373, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129374, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129375, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129376, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129377, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129378, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129379, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129380, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129381, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129382, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129383, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129384, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129385, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129386, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129387, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129388, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129389, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129390, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129391, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129392, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129395, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129396, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129397, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129398, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129402, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129404, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129405, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129406, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129407, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129408, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129409, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129410, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129411, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129412, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129413, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129414, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129415, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129416, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129417, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129418, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129419, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129420, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129421, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129422, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129423, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129424, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129425, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129426, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129427, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129428, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129429, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129430, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129431, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129432, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129433, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129434, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129435, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129436, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129437, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129438, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129439, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129440, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129441, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129442, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129456, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129457, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129458, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129459, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129460, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129461, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129462, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129463, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129464, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129465, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129472, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129473, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129474, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129488, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129489, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129490, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129491, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129492, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129493, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129494, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129495, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129496, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129497, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129498, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129499, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129500, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129501, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129502, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129503, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129504, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129505, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129506, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129507, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129508, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129509, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129510, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129511, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129512, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129513, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129514, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129515, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129516, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129517, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129518, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129519, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129520, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129521, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129522, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129523, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129524, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129525, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129526, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129527, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129528, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129529, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129530, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129531, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129532, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129533, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129534, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129535, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129632, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129633, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129634, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129635, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129636, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129637, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129638, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129639, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129640, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129641, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129642, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129643, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129644, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {129645, Unicode::Category_Symbol_Other, Unicode::Direction_Other_Neutral}, + {194560, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194561, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194562, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194563, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194564, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194565, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194566, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194567, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194568, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194569, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194570, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194571, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194572, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194573, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194574, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194575, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194576, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194577, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194578, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194579, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194580, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194581, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194582, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194583, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194584, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194585, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194586, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194587, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194588, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194589, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194590, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194591, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194592, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194593, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194594, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194595, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194596, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194597, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194598, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194599, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194600, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194601, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194602, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194603, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194604, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194605, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194606, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194607, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194608, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194609, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194610, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194611, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194612, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194613, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194614, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194615, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194616, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194617, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194618, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194619, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194620, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194621, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194622, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194623, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194624, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194625, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194626, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194627, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194628, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194629, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194630, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194631, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194632, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194633, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194634, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194635, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194636, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194637, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194638, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194639, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194640, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194641, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194642, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194643, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194644, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194645, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194646, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194647, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194648, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194649, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194650, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194651, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194652, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194653, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194654, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194655, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194656, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194657, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194658, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194659, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194660, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194661, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194662, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194663, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194664, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194665, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194666, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194667, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194668, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194669, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194670, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194671, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194672, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194673, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194674, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194675, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194676, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194677, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194678, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194679, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194680, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194681, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194682, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194683, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194684, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194685, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194686, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194687, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194688, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194689, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194690, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194691, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194692, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194693, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194694, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194695, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194696, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194697, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194698, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194699, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194700, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194701, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194702, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194703, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194704, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194705, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194706, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194707, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194708, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194709, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194710, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194711, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194712, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194713, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194714, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194715, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194716, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194717, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194718, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194719, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194720, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194721, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194722, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194723, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194724, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194725, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194726, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194727, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194728, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194729, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194730, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194731, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194732, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194733, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194734, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194735, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194736, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194737, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194738, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194739, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194740, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194741, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194742, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194743, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194744, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194745, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194746, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194747, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194748, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194749, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194750, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194751, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194752, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194753, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194754, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194755, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194756, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194757, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194758, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194759, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194760, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194761, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194762, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194763, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194764, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194765, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194766, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194767, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194768, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194769, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194770, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194771, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194772, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194773, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194774, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194775, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194776, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194777, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194778, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194779, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194780, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194781, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194782, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194783, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194784, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194785, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194786, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194787, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194788, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194789, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194790, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194791, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194792, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194793, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194794, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194795, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194796, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194797, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194798, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194799, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194800, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194801, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194802, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194803, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194804, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194805, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194806, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194807, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194808, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194809, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194810, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194811, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194812, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194813, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194814, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194815, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194816, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194817, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194818, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194819, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194820, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194821, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194822, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194823, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194825, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194826, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194827, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194828, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194829, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194830, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194831, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194832, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194833, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194834, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194835, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194836, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194837, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194838, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194839, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194840, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194841, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194842, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194843, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194844, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194845, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194846, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194847, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194848, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194849, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194850, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194851, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194852, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194853, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194854, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194855, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194856, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194857, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194858, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194859, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194860, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194861, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194862, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194863, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194864, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194865, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194866, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194867, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194868, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194869, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194870, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194871, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194872, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194873, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194874, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194875, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194876, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194877, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194878, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194879, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194880, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194881, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194882, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194883, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194884, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194885, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194886, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194887, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194888, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194889, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194890, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194891, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194892, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194893, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194894, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194895, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194896, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194897, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194898, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194899, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194900, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194901, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194902, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194903, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194904, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194905, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194906, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194907, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194908, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194909, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194910, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194911, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194912, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194913, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194914, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194915, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194916, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194917, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194918, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194919, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194920, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194921, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194922, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194923, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194924, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194925, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194926, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194927, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194928, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194929, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194930, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194931, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194932, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194933, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194934, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194935, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194936, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194937, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194938, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194939, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194940, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194941, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194942, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194943, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194944, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194945, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194946, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194947, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194948, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194949, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194950, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194951, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194952, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194953, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194954, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194955, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194956, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194957, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194958, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194959, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194960, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194961, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194962, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194963, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194964, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194965, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194966, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194967, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194969, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194970, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194971, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194972, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194973, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194974, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194975, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194976, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194977, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194978, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194979, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194980, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194981, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194982, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194983, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194985, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194986, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194987, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194988, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194989, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194990, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194991, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194992, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194993, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194994, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194995, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194996, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194997, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194998, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {194999, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195000, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195001, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195002, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195003, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195004, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195005, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195006, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195007, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195008, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195009, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195010, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195011, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195012, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195013, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195014, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195015, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195016, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195017, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195018, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195019, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195020, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195021, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195022, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195023, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195024, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195025, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195026, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195027, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195028, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195029, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195030, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195031, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195033, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195034, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195035, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195036, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195037, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195038, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195039, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195040, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195041, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195042, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195043, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195044, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195045, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195046, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195047, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195048, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195049, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195050, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195051, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195052, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195053, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195054, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195055, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195056, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195057, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195058, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195059, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195060, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195061, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195062, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195063, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195064, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195065, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195066, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195067, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195068, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195069, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195070, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195071, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195073, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195074, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195075, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195076, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195077, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195078, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195079, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195080, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195081, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195082, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195083, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195084, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195085, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195086, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195087, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195088, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195089, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195090, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195091, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195092, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195093, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195094, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195095, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195096, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195097, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195098, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195099, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195100, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {195101, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}, + {917505, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917536, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917537, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917538, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917539, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917540, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917541, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917542, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917543, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917544, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917545, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917546, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917547, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917548, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917549, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917550, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917551, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917552, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917553, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917554, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917555, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917556, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917557, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917558, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917559, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917560, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917561, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917562, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917563, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917564, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917565, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917566, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917567, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917568, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917569, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917570, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917571, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917572, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917573, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917574, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917575, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917576, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917577, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917578, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917579, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917580, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917581, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917582, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917583, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917584, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917585, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917586, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917587, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917588, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917589, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917590, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917591, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917592, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917593, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917594, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917595, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917596, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917597, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917598, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917599, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917600, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917601, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917602, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917603, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917604, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917605, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917606, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917607, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917608, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917609, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917610, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917611, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917612, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917613, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917614, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917615, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917616, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917617, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917618, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917619, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917620, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917621, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917622, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917623, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917624, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917625, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917626, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917627, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917628, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917629, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917630, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917631, Unicode::Category_Other_Format, Unicode::Direction_Boundary_Neutral}, + {917760, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917761, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917762, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917763, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917764, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917765, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917766, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917767, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917768, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917769, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917770, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917771, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917772, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917773, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917774, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917775, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917776, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917777, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917778, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917779, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917780, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917781, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917782, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917783, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917784, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917785, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917786, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917787, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917788, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917789, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917790, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917791, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917792, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917793, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917794, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917795, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917796, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917797, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917798, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917799, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917800, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917801, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917802, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917803, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917804, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917805, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917806, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917807, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917808, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917809, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917810, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917811, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917812, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917813, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917814, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917815, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917816, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917817, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917818, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917819, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917820, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917821, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917822, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917823, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917824, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917825, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917826, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917827, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917828, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917829, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917830, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917831, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917832, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917833, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917834, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917835, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917836, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917837, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917838, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917839, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917840, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917841, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917842, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917843, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917844, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917845, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917846, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917847, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917848, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917849, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917850, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917851, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917852, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917853, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917854, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917855, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917856, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917857, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917858, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917859, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917860, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917861, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917862, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917863, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917864, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917865, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917866, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917867, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917868, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917869, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917870, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917871, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917872, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917873, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917874, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917875, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917876, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917877, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917878, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917879, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917880, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917881, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917882, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917883, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917884, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917885, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917886, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917887, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917888, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917889, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917890, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917891, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917892, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917893, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917894, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917895, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917896, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917897, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917898, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917899, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917900, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917901, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917902, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917903, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917904, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917905, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917906, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917907, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917908, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917909, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917910, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917911, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917912, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917913, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917914, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917915, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917916, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917917, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917918, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917919, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917920, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917921, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917922, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917923, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917924, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917925, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917926, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917927, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917928, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917929, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917930, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917931, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917932, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917933, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917934, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917935, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917936, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917937, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917938, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917939, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917940, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917941, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917942, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917943, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917944, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917945, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917946, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917947, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917948, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917949, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917950, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917951, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917952, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917953, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917954, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917955, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917956, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917957, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917958, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917959, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917960, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917961, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917962, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917963, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917964, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917965, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917966, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917967, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917968, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917969, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917970, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917971, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917972, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917973, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917974, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917975, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917976, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917977, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917978, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917979, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917980, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917981, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917982, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917983, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917984, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917985, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917986, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917987, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917988, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917989, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917990, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917991, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917992, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917993, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917994, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917995, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917996, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917997, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917998, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, + {917999, Unicode::Category_Mark_NonSpacing, Unicode::Direction_Nonspacing_Mark}, +}; + +UnicodeSet unicodeSets[15] = { + {13312, 19893, {13312, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}}, + {19968, 40943, {19968, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}}, + {44032, 55203, {44032, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}}, + {55296, 56191, {55296, Unicode::Category_Other_Surrogate, Unicode::Direction_Left_To_Right}}, + {56192, 56319, {56192, Unicode::Category_Other_Surrogate, Unicode::Direction_Left_To_Right}}, + {56320, 57343, {56320, Unicode::Category_Other_Surrogate, Unicode::Direction_Left_To_Right}}, + {57344, 63743, {57344, Unicode::Category_Other_PrivateUse, Unicode::Direction_Left_To_Right}}, + {94208, 100337, {94208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}}, + {131072, 173782, {131072, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}}, + {173824, 177972, {173824, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}}, + {177984, 178205, {177984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}}, + {178208, 183969, {178208, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}}, + {183984, 191456, {183984, Unicode::Category_Letter_Other, Unicode::Direction_Left_To_Right}}, + {983040, 1048573, {983040, Unicode::Category_Other_PrivateUse, Unicode::Direction_Left_To_Right}}, + {1048576, 1114109, {1048576, Unicode::Category_Other_PrivateUse, Unicode::Direction_Left_To_Right}}, +}; + +UnicodeCharacterSimpleMapping unicodeLower[1383] = { + {65, 97}, + {66, 98}, + {67, 99}, + {68, 100}, + {69, 101}, + {70, 102}, + {71, 103}, + {72, 104}, + {73, 105}, + {74, 106}, + {75, 107}, + {76, 108}, + {77, 109}, + {78, 110}, + {79, 111}, + {80, 112}, + {81, 113}, + {82, 114}, + {83, 115}, + {84, 116}, + {85, 117}, + {86, 118}, + {87, 119}, + {88, 120}, + {89, 121}, + {90, 122}, + {192, 224}, + {193, 225}, + {194, 226}, + {195, 227}, + {196, 228}, + {197, 229}, + {198, 230}, + {199, 231}, + {200, 232}, + {201, 233}, + {202, 234}, + {203, 235}, + {204, 236}, + {205, 237}, + {206, 238}, + {207, 239}, + {208, 240}, + {209, 241}, + {210, 242}, + {211, 243}, + {212, 244}, + {213, 245}, + {214, 246}, + {216, 248}, + {217, 249}, + {218, 250}, + {219, 251}, + {220, 252}, + {221, 253}, + {222, 254}, + {256, 257}, + {258, 259}, + {260, 261}, + {262, 263}, + {264, 265}, + {266, 267}, + {268, 269}, + {270, 271}, + {272, 273}, + {274, 275}, + {276, 277}, + {278, 279}, + {280, 281}, + {282, 283}, + {284, 285}, + {286, 287}, + {288, 289}, + {290, 291}, + {292, 293}, + {294, 295}, + {296, 297}, + {298, 299}, + {300, 301}, + {302, 303}, + {304, 105}, + {306, 307}, + {308, 309}, + {310, 311}, + {313, 314}, + {315, 316}, + {317, 318}, + {319, 320}, + {321, 322}, + {323, 324}, + {325, 326}, + {327, 328}, + {330, 331}, + {332, 333}, + {334, 335}, + {336, 337}, + {338, 339}, + {340, 341}, + {342, 343}, + {344, 345}, + {346, 347}, + {348, 349}, + {350, 351}, + {352, 353}, + {354, 355}, + {356, 357}, + {358, 359}, + {360, 361}, + {362, 363}, + {364, 365}, + {366, 367}, + {368, 369}, + {370, 371}, + {372, 373}, + {374, 375}, + {376, 255}, + {377, 378}, + {379, 380}, + {381, 382}, + {385, 595}, + {386, 387}, + {388, 389}, + {390, 596}, + {391, 392}, + {393, 598}, + {394, 599}, + {395, 396}, + {398, 477}, + {399, 601}, + {400, 603}, + {401, 402}, + {403, 608}, + {404, 611}, + {406, 617}, + {407, 616}, + {408, 409}, + {412, 623}, + {413, 626}, + {415, 629}, + {416, 417}, + {418, 419}, + {420, 421}, + {422, 640}, + {423, 424}, + {425, 643}, + {428, 429}, + {430, 648}, + {431, 432}, + {433, 650}, + {434, 651}, + {435, 436}, + {437, 438}, + {439, 658}, + {440, 441}, + {444, 445}, + {452, 454}, + {453, 454}, + {455, 457}, + {456, 457}, + {458, 460}, + {459, 460}, + {461, 462}, + {463, 464}, + {465, 466}, + {467, 468}, + {469, 470}, + {471, 472}, + {473, 474}, + {475, 476}, + {478, 479}, + {480, 481}, + {482, 483}, + {484, 485}, + {486, 487}, + {488, 489}, + {490, 491}, + {492, 493}, + {494, 495}, + {497, 499}, + {498, 499}, + {500, 501}, + {502, 405}, + {503, 447}, + {504, 505}, + {506, 507}, + {508, 509}, + {510, 511}, + {512, 513}, + {514, 515}, + {516, 517}, + {518, 519}, + {520, 521}, + {522, 523}, + {524, 525}, + {526, 527}, + {528, 529}, + {530, 531}, + {532, 533}, + {534, 535}, + {536, 537}, + {538, 539}, + {540, 541}, + {542, 543}, + {544, 414}, + {546, 547}, + {548, 549}, + {550, 551}, + {552, 553}, + {554, 555}, + {556, 557}, + {558, 559}, + {560, 561}, + {562, 563}, + {570, 11365}, + {571, 572}, + {573, 410}, + {574, 11366}, + {577, 578}, + {579, 384}, + {580, 649}, + {581, 652}, + {582, 583}, + {584, 585}, + {586, 587}, + {588, 589}, + {590, 591}, + {880, 881}, + {882, 883}, + {886, 887}, + {895, 1011}, + {902, 940}, + {904, 941}, + {905, 942}, + {906, 943}, + {908, 972}, + {910, 973}, + {911, 974}, + {913, 945}, + {914, 946}, + {915, 947}, + {916, 948}, + {917, 949}, + {918, 950}, + {919, 951}, + {920, 952}, + {921, 953}, + {922, 954}, + {923, 955}, + {924, 956}, + {925, 957}, + {926, 958}, + {927, 959}, + {928, 960}, + {929, 961}, + {931, 963}, + {932, 964}, + {933, 965}, + {934, 966}, + {935, 967}, + {936, 968}, + {937, 969}, + {938, 970}, + {939, 971}, + {975, 983}, + {984, 985}, + {986, 987}, + {988, 989}, + {990, 991}, + {992, 993}, + {994, 995}, + {996, 997}, + {998, 999}, + {1000, 1001}, + {1002, 1003}, + {1004, 1005}, + {1006, 1007}, + {1012, 952}, + {1015, 1016}, + {1017, 1010}, + {1018, 1019}, + {1021, 891}, + {1022, 892}, + {1023, 893}, + {1024, 1104}, + {1025, 1105}, + {1026, 1106}, + {1027, 1107}, + {1028, 1108}, + {1029, 1109}, + {1030, 1110}, + {1031, 1111}, + {1032, 1112}, + {1033, 1113}, + {1034, 1114}, + {1035, 1115}, + {1036, 1116}, + {1037, 1117}, + {1038, 1118}, + {1039, 1119}, + {1040, 1072}, + {1041, 1073}, + {1042, 1074}, + {1043, 1075}, + {1044, 1076}, + {1045, 1077}, + {1046, 1078}, + {1047, 1079}, + {1048, 1080}, + {1049, 1081}, + {1050, 1082}, + {1051, 1083}, + {1052, 1084}, + {1053, 1085}, + {1054, 1086}, + {1055, 1087}, + {1056, 1088}, + {1057, 1089}, + {1058, 1090}, + {1059, 1091}, + {1060, 1092}, + {1061, 1093}, + {1062, 1094}, + {1063, 1095}, + {1064, 1096}, + {1065, 1097}, + {1066, 1098}, + {1067, 1099}, + {1068, 1100}, + {1069, 1101}, + {1070, 1102}, + {1071, 1103}, + {1120, 1121}, + {1122, 1123}, + {1124, 1125}, + {1126, 1127}, + {1128, 1129}, + {1130, 1131}, + {1132, 1133}, + {1134, 1135}, + {1136, 1137}, + {1138, 1139}, + {1140, 1141}, + {1142, 1143}, + {1144, 1145}, + {1146, 1147}, + {1148, 1149}, + {1150, 1151}, + {1152, 1153}, + {1162, 1163}, + {1164, 1165}, + {1166, 1167}, + {1168, 1169}, + {1170, 1171}, + {1172, 1173}, + {1174, 1175}, + {1176, 1177}, + {1178, 1179}, + {1180, 1181}, + {1182, 1183}, + {1184, 1185}, + {1186, 1187}, + {1188, 1189}, + {1190, 1191}, + {1192, 1193}, + {1194, 1195}, + {1196, 1197}, + {1198, 1199}, + {1200, 1201}, + {1202, 1203}, + {1204, 1205}, + {1206, 1207}, + {1208, 1209}, + {1210, 1211}, + {1212, 1213}, + {1214, 1215}, + {1216, 1231}, + {1217, 1218}, + {1219, 1220}, + {1221, 1222}, + {1223, 1224}, + {1225, 1226}, + {1227, 1228}, + {1229, 1230}, + {1232, 1233}, + {1234, 1235}, + {1236, 1237}, + {1238, 1239}, + {1240, 1241}, + {1242, 1243}, + {1244, 1245}, + {1246, 1247}, + {1248, 1249}, + {1250, 1251}, + {1252, 1253}, + {1254, 1255}, + {1256, 1257}, + {1258, 1259}, + {1260, 1261}, + {1262, 1263}, + {1264, 1265}, + {1266, 1267}, + {1268, 1269}, + {1270, 1271}, + {1272, 1273}, + {1274, 1275}, + {1276, 1277}, + {1278, 1279}, + {1280, 1281}, + {1282, 1283}, + {1284, 1285}, + {1286, 1287}, + {1288, 1289}, + {1290, 1291}, + {1292, 1293}, + {1294, 1295}, + {1296, 1297}, + {1298, 1299}, + {1300, 1301}, + {1302, 1303}, + {1304, 1305}, + {1306, 1307}, + {1308, 1309}, + {1310, 1311}, + {1312, 1313}, + {1314, 1315}, + {1316, 1317}, + {1318, 1319}, + {1320, 1321}, + {1322, 1323}, + {1324, 1325}, + {1326, 1327}, + {1329, 1377}, + {1330, 1378}, + {1331, 1379}, + {1332, 1380}, + {1333, 1381}, + {1334, 1382}, + {1335, 1383}, + {1336, 1384}, + {1337, 1385}, + {1338, 1386}, + {1339, 1387}, + {1340, 1388}, + {1341, 1389}, + {1342, 1390}, + {1343, 1391}, + {1344, 1392}, + {1345, 1393}, + {1346, 1394}, + {1347, 1395}, + {1348, 1396}, + {1349, 1397}, + {1350, 1398}, + {1351, 1399}, + {1352, 1400}, + {1353, 1401}, + {1354, 1402}, + {1355, 1403}, + {1356, 1404}, + {1357, 1405}, + {1358, 1406}, + {1359, 1407}, + {1360, 1408}, + {1361, 1409}, + {1362, 1410}, + {1363, 1411}, + {1364, 1412}, + {1365, 1413}, + {1366, 1414}, + {4256, 11520}, + {4257, 11521}, + {4258, 11522}, + {4259, 11523}, + {4260, 11524}, + {4261, 11525}, + {4262, 11526}, + {4263, 11527}, + {4264, 11528}, + {4265, 11529}, + {4266, 11530}, + {4267, 11531}, + {4268, 11532}, + {4269, 11533}, + {4270, 11534}, + {4271, 11535}, + {4272, 11536}, + {4273, 11537}, + {4274, 11538}, + {4275, 11539}, + {4276, 11540}, + {4277, 11541}, + {4278, 11542}, + {4279, 11543}, + {4280, 11544}, + {4281, 11545}, + {4282, 11546}, + {4283, 11547}, + {4284, 11548}, + {4285, 11549}, + {4286, 11550}, + {4287, 11551}, + {4288, 11552}, + {4289, 11553}, + {4290, 11554}, + {4291, 11555}, + {4292, 11556}, + {4293, 11557}, + {4295, 11559}, + {4301, 11565}, + {5024, 43888}, + {5025, 43889}, + {5026, 43890}, + {5027, 43891}, + {5028, 43892}, + {5029, 43893}, + {5030, 43894}, + {5031, 43895}, + {5032, 43896}, + {5033, 43897}, + {5034, 43898}, + {5035, 43899}, + {5036, 43900}, + {5037, 43901}, + {5038, 43902}, + {5039, 43903}, + {5040, 43904}, + {5041, 43905}, + {5042, 43906}, + {5043, 43907}, + {5044, 43908}, + {5045, 43909}, + {5046, 43910}, + {5047, 43911}, + {5048, 43912}, + {5049, 43913}, + {5050, 43914}, + {5051, 43915}, + {5052, 43916}, + {5053, 43917}, + {5054, 43918}, + {5055, 43919}, + {5056, 43920}, + {5057, 43921}, + {5058, 43922}, + {5059, 43923}, + {5060, 43924}, + {5061, 43925}, + {5062, 43926}, + {5063, 43927}, + {5064, 43928}, + {5065, 43929}, + {5066, 43930}, + {5067, 43931}, + {5068, 43932}, + {5069, 43933}, + {5070, 43934}, + {5071, 43935}, + {5072, 43936}, + {5073, 43937}, + {5074, 43938}, + {5075, 43939}, + {5076, 43940}, + {5077, 43941}, + {5078, 43942}, + {5079, 43943}, + {5080, 43944}, + {5081, 43945}, + {5082, 43946}, + {5083, 43947}, + {5084, 43948}, + {5085, 43949}, + {5086, 43950}, + {5087, 43951}, + {5088, 43952}, + {5089, 43953}, + {5090, 43954}, + {5091, 43955}, + {5092, 43956}, + {5093, 43957}, + {5094, 43958}, + {5095, 43959}, + {5096, 43960}, + {5097, 43961}, + {5098, 43962}, + {5099, 43963}, + {5100, 43964}, + {5101, 43965}, + {5102, 43966}, + {5103, 43967}, + {5104, 5112}, + {5105, 5113}, + {5106, 5114}, + {5107, 5115}, + {5108, 5116}, + {5109, 5117}, + {7312, 4304}, + {7313, 4305}, + {7314, 4306}, + {7315, 4307}, + {7316, 4308}, + {7317, 4309}, + {7318, 4310}, + {7319, 4311}, + {7320, 4312}, + {7321, 4313}, + {7322, 4314}, + {7323, 4315}, + {7324, 4316}, + {7325, 4317}, + {7326, 4318}, + {7327, 4319}, + {7328, 4320}, + {7329, 4321}, + {7330, 4322}, + {7331, 4323}, + {7332, 4324}, + {7333, 4325}, + {7334, 4326}, + {7335, 4327}, + {7336, 4328}, + {7337, 4329}, + {7338, 4330}, + {7339, 4331}, + {7340, 4332}, + {7341, 4333}, + {7342, 4334}, + {7343, 4335}, + {7344, 4336}, + {7345, 4337}, + {7346, 4338}, + {7347, 4339}, + {7348, 4340}, + {7349, 4341}, + {7350, 4342}, + {7351, 4343}, + {7352, 4344}, + {7353, 4345}, + {7354, 4346}, + {7357, 4349}, + {7358, 4350}, + {7359, 4351}, + {7680, 7681}, + {7682, 7683}, + {7684, 7685}, + {7686, 7687}, + {7688, 7689}, + {7690, 7691}, + {7692, 7693}, + {7694, 7695}, + {7696, 7697}, + {7698, 7699}, + {7700, 7701}, + {7702, 7703}, + {7704, 7705}, + {7706, 7707}, + {7708, 7709}, + {7710, 7711}, + {7712, 7713}, + {7714, 7715}, + {7716, 7717}, + {7718, 7719}, + {7720, 7721}, + {7722, 7723}, + {7724, 7725}, + {7726, 7727}, + {7728, 7729}, + {7730, 7731}, + {7732, 7733}, + {7734, 7735}, + {7736, 7737}, + {7738, 7739}, + {7740, 7741}, + {7742, 7743}, + {7744, 7745}, + {7746, 7747}, + {7748, 7749}, + {7750, 7751}, + {7752, 7753}, + {7754, 7755}, + {7756, 7757}, + {7758, 7759}, + {7760, 7761}, + {7762, 7763}, + {7764, 7765}, + {7766, 7767}, + {7768, 7769}, + {7770, 7771}, + {7772, 7773}, + {7774, 7775}, + {7776, 7777}, + {7778, 7779}, + {7780, 7781}, + {7782, 7783}, + {7784, 7785}, + {7786, 7787}, + {7788, 7789}, + {7790, 7791}, + {7792, 7793}, + {7794, 7795}, + {7796, 7797}, + {7798, 7799}, + {7800, 7801}, + {7802, 7803}, + {7804, 7805}, + {7806, 7807}, + {7808, 7809}, + {7810, 7811}, + {7812, 7813}, + {7814, 7815}, + {7816, 7817}, + {7818, 7819}, + {7820, 7821}, + {7822, 7823}, + {7824, 7825}, + {7826, 7827}, + {7828, 7829}, + {7838, 223}, + {7840, 7841}, + {7842, 7843}, + {7844, 7845}, + {7846, 7847}, + {7848, 7849}, + {7850, 7851}, + {7852, 7853}, + {7854, 7855}, + {7856, 7857}, + {7858, 7859}, + {7860, 7861}, + {7862, 7863}, + {7864, 7865}, + {7866, 7867}, + {7868, 7869}, + {7870, 7871}, + {7872, 7873}, + {7874, 7875}, + {7876, 7877}, + {7878, 7879}, + {7880, 7881}, + {7882, 7883}, + {7884, 7885}, + {7886, 7887}, + {7888, 7889}, + {7890, 7891}, + {7892, 7893}, + {7894, 7895}, + {7896, 7897}, + {7898, 7899}, + {7900, 7901}, + {7902, 7903}, + {7904, 7905}, + {7906, 7907}, + {7908, 7909}, + {7910, 7911}, + {7912, 7913}, + {7914, 7915}, + {7916, 7917}, + {7918, 7919}, + {7920, 7921}, + {7922, 7923}, + {7924, 7925}, + {7926, 7927}, + {7928, 7929}, + {7930, 7931}, + {7932, 7933}, + {7934, 7935}, + {7944, 7936}, + {7945, 7937}, + {7946, 7938}, + {7947, 7939}, + {7948, 7940}, + {7949, 7941}, + {7950, 7942}, + {7951, 7943}, + {7960, 7952}, + {7961, 7953}, + {7962, 7954}, + {7963, 7955}, + {7964, 7956}, + {7965, 7957}, + {7976, 7968}, + {7977, 7969}, + {7978, 7970}, + {7979, 7971}, + {7980, 7972}, + {7981, 7973}, + {7982, 7974}, + {7983, 7975}, + {7992, 7984}, + {7993, 7985}, + {7994, 7986}, + {7995, 7987}, + {7996, 7988}, + {7997, 7989}, + {7998, 7990}, + {7999, 7991}, + {8008, 8000}, + {8009, 8001}, + {8010, 8002}, + {8011, 8003}, + {8012, 8004}, + {8013, 8005}, + {8025, 8017}, + {8027, 8019}, + {8029, 8021}, + {8031, 8023}, + {8040, 8032}, + {8041, 8033}, + {8042, 8034}, + {8043, 8035}, + {8044, 8036}, + {8045, 8037}, + {8046, 8038}, + {8047, 8039}, + {8072, 8064}, + {8073, 8065}, + {8074, 8066}, + {8075, 8067}, + {8076, 8068}, + {8077, 8069}, + {8078, 8070}, + {8079, 8071}, + {8088, 8080}, + {8089, 8081}, + {8090, 8082}, + {8091, 8083}, + {8092, 8084}, + {8093, 8085}, + {8094, 8086}, + {8095, 8087}, + {8104, 8096}, + {8105, 8097}, + {8106, 8098}, + {8107, 8099}, + {8108, 8100}, + {8109, 8101}, + {8110, 8102}, + {8111, 8103}, + {8120, 8112}, + {8121, 8113}, + {8122, 8048}, + {8123, 8049}, + {8124, 8115}, + {8136, 8050}, + {8137, 8051}, + {8138, 8052}, + {8139, 8053}, + {8140, 8131}, + {8152, 8144}, + {8153, 8145}, + {8154, 8054}, + {8155, 8055}, + {8168, 8160}, + {8169, 8161}, + {8170, 8058}, + {8171, 8059}, + {8172, 8165}, + {8184, 8056}, + {8185, 8057}, + {8186, 8060}, + {8187, 8061}, + {8188, 8179}, + {8486, 969}, + {8490, 107}, + {8491, 229}, + {8498, 8526}, + {8544, 8560}, + {8545, 8561}, + {8546, 8562}, + {8547, 8563}, + {8548, 8564}, + {8549, 8565}, + {8550, 8566}, + {8551, 8567}, + {8552, 8568}, + {8553, 8569}, + {8554, 8570}, + {8555, 8571}, + {8556, 8572}, + {8557, 8573}, + {8558, 8574}, + {8559, 8575}, + {8579, 8580}, + {9398, 9424}, + {9399, 9425}, + {9400, 9426}, + {9401, 9427}, + {9402, 9428}, + {9403, 9429}, + {9404, 9430}, + {9405, 9431}, + {9406, 9432}, + {9407, 9433}, + {9408, 9434}, + {9409, 9435}, + {9410, 9436}, + {9411, 9437}, + {9412, 9438}, + {9413, 9439}, + {9414, 9440}, + {9415, 9441}, + {9416, 9442}, + {9417, 9443}, + {9418, 9444}, + {9419, 9445}, + {9420, 9446}, + {9421, 9447}, + {9422, 9448}, + {9423, 9449}, + {11264, 11312}, + {11265, 11313}, + {11266, 11314}, + {11267, 11315}, + {11268, 11316}, + {11269, 11317}, + {11270, 11318}, + {11271, 11319}, + {11272, 11320}, + {11273, 11321}, + {11274, 11322}, + {11275, 11323}, + {11276, 11324}, + {11277, 11325}, + {11278, 11326}, + {11279, 11327}, + {11280, 11328}, + {11281, 11329}, + {11282, 11330}, + {11283, 11331}, + {11284, 11332}, + {11285, 11333}, + {11286, 11334}, + {11287, 11335}, + {11288, 11336}, + {11289, 11337}, + {11290, 11338}, + {11291, 11339}, + {11292, 11340}, + {11293, 11341}, + {11294, 11342}, + {11295, 11343}, + {11296, 11344}, + {11297, 11345}, + {11298, 11346}, + {11299, 11347}, + {11300, 11348}, + {11301, 11349}, + {11302, 11350}, + {11303, 11351}, + {11304, 11352}, + {11305, 11353}, + {11306, 11354}, + {11307, 11355}, + {11308, 11356}, + {11309, 11357}, + {11310, 11358}, + {11360, 11361}, + {11362, 619}, + {11363, 7549}, + {11364, 637}, + {11367, 11368}, + {11369, 11370}, + {11371, 11372}, + {11373, 593}, + {11374, 625}, + {11375, 592}, + {11376, 594}, + {11378, 11379}, + {11381, 11382}, + {11390, 575}, + {11391, 576}, + {11392, 11393}, + {11394, 11395}, + {11396, 11397}, + {11398, 11399}, + {11400, 11401}, + {11402, 11403}, + {11404, 11405}, + {11406, 11407}, + {11408, 11409}, + {11410, 11411}, + {11412, 11413}, + {11414, 11415}, + {11416, 11417}, + {11418, 11419}, + {11420, 11421}, + {11422, 11423}, + {11424, 11425}, + {11426, 11427}, + {11428, 11429}, + {11430, 11431}, + {11432, 11433}, + {11434, 11435}, + {11436, 11437}, + {11438, 11439}, + {11440, 11441}, + {11442, 11443}, + {11444, 11445}, + {11446, 11447}, + {11448, 11449}, + {11450, 11451}, + {11452, 11453}, + {11454, 11455}, + {11456, 11457}, + {11458, 11459}, + {11460, 11461}, + {11462, 11463}, + {11464, 11465}, + {11466, 11467}, + {11468, 11469}, + {11470, 11471}, + {11472, 11473}, + {11474, 11475}, + {11476, 11477}, + {11478, 11479}, + {11480, 11481}, + {11482, 11483}, + {11484, 11485}, + {11486, 11487}, + {11488, 11489}, + {11490, 11491}, + {11499, 11500}, + {11501, 11502}, + {11506, 11507}, + {42560, 42561}, + {42562, 42563}, + {42564, 42565}, + {42566, 42567}, + {42568, 42569}, + {42570, 42571}, + {42572, 42573}, + {42574, 42575}, + {42576, 42577}, + {42578, 42579}, + {42580, 42581}, + {42582, 42583}, + {42584, 42585}, + {42586, 42587}, + {42588, 42589}, + {42590, 42591}, + {42592, 42593}, + {42594, 42595}, + {42596, 42597}, + {42598, 42599}, + {42600, 42601}, + {42602, 42603}, + {42604, 42605}, + {42624, 42625}, + {42626, 42627}, + {42628, 42629}, + {42630, 42631}, + {42632, 42633}, + {42634, 42635}, + {42636, 42637}, + {42638, 42639}, + {42640, 42641}, + {42642, 42643}, + {42644, 42645}, + {42646, 42647}, + {42648, 42649}, + {42650, 42651}, + {42786, 42787}, + {42788, 42789}, + {42790, 42791}, + {42792, 42793}, + {42794, 42795}, + {42796, 42797}, + {42798, 42799}, + {42802, 42803}, + {42804, 42805}, + {42806, 42807}, + {42808, 42809}, + {42810, 42811}, + {42812, 42813}, + {42814, 42815}, + {42816, 42817}, + {42818, 42819}, + {42820, 42821}, + {42822, 42823}, + {42824, 42825}, + {42826, 42827}, + {42828, 42829}, + {42830, 42831}, + {42832, 42833}, + {42834, 42835}, + {42836, 42837}, + {42838, 42839}, + {42840, 42841}, + {42842, 42843}, + {42844, 42845}, + {42846, 42847}, + {42848, 42849}, + {42850, 42851}, + {42852, 42853}, + {42854, 42855}, + {42856, 42857}, + {42858, 42859}, + {42860, 42861}, + {42862, 42863}, + {42873, 42874}, + {42875, 42876}, + {42877, 7545}, + {42878, 42879}, + {42880, 42881}, + {42882, 42883}, + {42884, 42885}, + {42886, 42887}, + {42891, 42892}, + {42893, 613}, + {42896, 42897}, + {42898, 42899}, + {42902, 42903}, + {42904, 42905}, + {42906, 42907}, + {42908, 42909}, + {42910, 42911}, + {42912, 42913}, + {42914, 42915}, + {42916, 42917}, + {42918, 42919}, + {42920, 42921}, + {42922, 614}, + {42923, 604}, + {42924, 609}, + {42925, 620}, + {42926, 618}, + {42928, 670}, + {42929, 647}, + {42930, 669}, + {42931, 43859}, + {42932, 42933}, + {42934, 42935}, + {42936, 42937}, + {65313, 65345}, + {65314, 65346}, + {65315, 65347}, + {65316, 65348}, + {65317, 65349}, + {65318, 65350}, + {65319, 65351}, + {65320, 65352}, + {65321, 65353}, + {65322, 65354}, + {65323, 65355}, + {65324, 65356}, + {65325, 65357}, + {65326, 65358}, + {65327, 65359}, + {65328, 65360}, + {65329, 65361}, + {65330, 65362}, + {65331, 65363}, + {65332, 65364}, + {65333, 65365}, + {65334, 65366}, + {65335, 65367}, + {65336, 65368}, + {65337, 65369}, + {65338, 65370}, + {66560, 66600}, + {66561, 66601}, + {66562, 66602}, + {66563, 66603}, + {66564, 66604}, + {66565, 66605}, + {66566, 66606}, + {66567, 66607}, + {66568, 66608}, + {66569, 66609}, + {66570, 66610}, + {66571, 66611}, + {66572, 66612}, + {66573, 66613}, + {66574, 66614}, + {66575, 66615}, + {66576, 66616}, + {66577, 66617}, + {66578, 66618}, + {66579, 66619}, + {66580, 66620}, + {66581, 66621}, + {66582, 66622}, + {66583, 66623}, + {66584, 66624}, + {66585, 66625}, + {66586, 66626}, + {66587, 66627}, + {66588, 66628}, + {66589, 66629}, + {66590, 66630}, + {66591, 66631}, + {66592, 66632}, + {66593, 66633}, + {66594, 66634}, + {66595, 66635}, + {66596, 66636}, + {66597, 66637}, + {66598, 66638}, + {66599, 66639}, + {66736, 66776}, + {66737, 66777}, + {66738, 66778}, + {66739, 66779}, + {66740, 66780}, + {66741, 66781}, + {66742, 66782}, + {66743, 66783}, + {66744, 66784}, + {66745, 66785}, + {66746, 66786}, + {66747, 66787}, + {66748, 66788}, + {66749, 66789}, + {66750, 66790}, + {66751, 66791}, + {66752, 66792}, + {66753, 66793}, + {66754, 66794}, + {66755, 66795}, + {66756, 66796}, + {66757, 66797}, + {66758, 66798}, + {66759, 66799}, + {66760, 66800}, + {66761, 66801}, + {66762, 66802}, + {66763, 66803}, + {66764, 66804}, + {66765, 66805}, + {66766, 66806}, + {66767, 66807}, + {66768, 66808}, + {66769, 66809}, + {66770, 66810}, + {66771, 66811}, + {68736, 68800}, + {68737, 68801}, + {68738, 68802}, + {68739, 68803}, + {68740, 68804}, + {68741, 68805}, + {68742, 68806}, + {68743, 68807}, + {68744, 68808}, + {68745, 68809}, + {68746, 68810}, + {68747, 68811}, + {68748, 68812}, + {68749, 68813}, + {68750, 68814}, + {68751, 68815}, + {68752, 68816}, + {68753, 68817}, + {68754, 68818}, + {68755, 68819}, + {68756, 68820}, + {68757, 68821}, + {68758, 68822}, + {68759, 68823}, + {68760, 68824}, + {68761, 68825}, + {68762, 68826}, + {68763, 68827}, + {68764, 68828}, + {68765, 68829}, + {68766, 68830}, + {68767, 68831}, + {68768, 68832}, + {68769, 68833}, + {68770, 68834}, + {68771, 68835}, + {68772, 68836}, + {68773, 68837}, + {68774, 68838}, + {68775, 68839}, + {68776, 68840}, + {68777, 68841}, + {68778, 68842}, + {68779, 68843}, + {68780, 68844}, + {68781, 68845}, + {68782, 68846}, + {68783, 68847}, + {68784, 68848}, + {68785, 68849}, + {68786, 68850}, + {71840, 71872}, + {71841, 71873}, + {71842, 71874}, + {71843, 71875}, + {71844, 71876}, + {71845, 71877}, + {71846, 71878}, + {71847, 71879}, + {71848, 71880}, + {71849, 71881}, + {71850, 71882}, + {71851, 71883}, + {71852, 71884}, + {71853, 71885}, + {71854, 71886}, + {71855, 71887}, + {71856, 71888}, + {71857, 71889}, + {71858, 71890}, + {71859, 71891}, + {71860, 71892}, + {71861, 71893}, + {71862, 71894}, + {71863, 71895}, + {71864, 71896}, + {71865, 71897}, + {71866, 71898}, + {71867, 71899}, + {71868, 71900}, + {71869, 71901}, + {71870, 71902}, + {71871, 71903}, + {93760, 93792}, + {93761, 93793}, + {93762, 93794}, + {93763, 93795}, + {93764, 93796}, + {93765, 93797}, + {93766, 93798}, + {93767, 93799}, + {93768, 93800}, + {93769, 93801}, + {93770, 93802}, + {93771, 93803}, + {93772, 93804}, + {93773, 93805}, + {93774, 93806}, + {93775, 93807}, + {93776, 93808}, + {93777, 93809}, + {93778, 93810}, + {93779, 93811}, + {93780, 93812}, + {93781, 93813}, + {93782, 93814}, + {93783, 93815}, + {93784, 93816}, + {93785, 93817}, + {93786, 93818}, + {93787, 93819}, + {93788, 93820}, + {93789, 93821}, + {93790, 93822}, + {93791, 93823}, + {125184, 125218}, + {125185, 125219}, + {125186, 125220}, + {125187, 125221}, + {125188, 125222}, + {125189, 125223}, + {125190, 125224}, + {125191, 125225}, + {125192, 125226}, + {125193, 125227}, + {125194, 125228}, + {125195, 125229}, + {125196, 125230}, + {125197, 125231}, + {125198, 125232}, + {125199, 125233}, + {125200, 125234}, + {125201, 125235}, + {125202, 125236}, + {125203, 125237}, + {125204, 125238}, + {125205, 125239}, + {125206, 125240}, + {125207, 125241}, + {125208, 125242}, + {125209, 125243}, + {125210, 125244}, + {125211, 125245}, + {125212, 125246}, + {125213, 125247}, + {125214, 125248}, + {125215, 125249}, + {125216, 125250}, + {125217, 125251}, +}; + +UnicodeCharacterSimpleMapping unicodeTitle[1404] = { + {97, 65}, + {98, 66}, + {99, 67}, + {100, 68}, + {101, 69}, + {102, 70}, + {103, 71}, + {104, 72}, + {105, 73}, + {106, 74}, + {107, 75}, + {108, 76}, + {109, 77}, + {110, 78}, + {111, 79}, + {112, 80}, + {113, 81}, + {114, 82}, + {115, 83}, + {116, 84}, + {117, 85}, + {118, 86}, + {119, 87}, + {120, 88}, + {121, 89}, + {122, 90}, + {181, 924}, + {224, 192}, + {225, 193}, + {226, 194}, + {227, 195}, + {228, 196}, + {229, 197}, + {230, 198}, + {231, 199}, + {232, 200}, + {233, 201}, + {234, 202}, + {235, 203}, + {236, 204}, + {237, 205}, + {238, 206}, + {239, 207}, + {240, 208}, + {241, 209}, + {242, 210}, + {243, 211}, + {244, 212}, + {245, 213}, + {246, 214}, + {248, 216}, + {249, 217}, + {250, 218}, + {251, 219}, + {252, 220}, + {253, 221}, + {254, 222}, + {255, 376}, + {257, 256}, + {259, 258}, + {261, 260}, + {263, 262}, + {265, 264}, + {267, 266}, + {269, 268}, + {271, 270}, + {273, 272}, + {275, 274}, + {277, 276}, + {279, 278}, + {281, 280}, + {283, 282}, + {285, 284}, + {287, 286}, + {289, 288}, + {291, 290}, + {293, 292}, + {295, 294}, + {297, 296}, + {299, 298}, + {301, 300}, + {303, 302}, + {305, 73}, + {307, 306}, + {309, 308}, + {311, 310}, + {314, 313}, + {316, 315}, + {318, 317}, + {320, 319}, + {322, 321}, + {324, 323}, + {326, 325}, + {328, 327}, + {331, 330}, + {333, 332}, + {335, 334}, + {337, 336}, + {339, 338}, + {341, 340}, + {343, 342}, + {345, 344}, + {347, 346}, + {349, 348}, + {351, 350}, + {353, 352}, + {355, 354}, + {357, 356}, + {359, 358}, + {361, 360}, + {363, 362}, + {365, 364}, + {367, 366}, + {369, 368}, + {371, 370}, + {373, 372}, + {375, 374}, + {378, 377}, + {380, 379}, + {382, 381}, + {383, 83}, + {384, 579}, + {387, 386}, + {389, 388}, + {392, 391}, + {396, 395}, + {402, 401}, + {405, 502}, + {409, 408}, + {410, 573}, + {414, 544}, + {417, 416}, + {419, 418}, + {421, 420}, + {424, 423}, + {429, 428}, + {432, 431}, + {436, 435}, + {438, 437}, + {441, 440}, + {445, 444}, + {447, 503}, + {452, 453}, + {453, 453}, + {454, 453}, + {455, 456}, + {456, 456}, + {457, 456}, + {458, 459}, + {459, 459}, + {460, 459}, + {462, 461}, + {464, 463}, + {466, 465}, + {468, 467}, + {470, 469}, + {472, 471}, + {474, 473}, + {476, 475}, + {477, 398}, + {479, 478}, + {481, 480}, + {483, 482}, + {485, 484}, + {487, 486}, + {489, 488}, + {491, 490}, + {493, 492}, + {495, 494}, + {497, 498}, + {498, 498}, + {499, 498}, + {501, 500}, + {505, 504}, + {507, 506}, + {509, 508}, + {511, 510}, + {513, 512}, + {515, 514}, + {517, 516}, + {519, 518}, + {521, 520}, + {523, 522}, + {525, 524}, + {527, 526}, + {529, 528}, + {531, 530}, + {533, 532}, + {535, 534}, + {537, 536}, + {539, 538}, + {541, 540}, + {543, 542}, + {547, 546}, + {549, 548}, + {551, 550}, + {553, 552}, + {555, 554}, + {557, 556}, + {559, 558}, + {561, 560}, + {563, 562}, + {572, 571}, + {575, 11390}, + {576, 11391}, + {578, 577}, + {583, 582}, + {585, 584}, + {587, 586}, + {589, 588}, + {591, 590}, + {592, 11375}, + {593, 11373}, + {594, 11376}, + {595, 385}, + {596, 390}, + {598, 393}, + {599, 394}, + {601, 399}, + {603, 400}, + {604, 42923}, + {608, 403}, + {609, 42924}, + {611, 404}, + {613, 42893}, + {614, 42922}, + {616, 407}, + {617, 406}, + {618, 42926}, + {619, 11362}, + {620, 42925}, + {623, 412}, + {625, 11374}, + {626, 413}, + {629, 415}, + {637, 11364}, + {640, 422}, + {643, 425}, + {647, 42929}, + {648, 430}, + {649, 580}, + {650, 433}, + {651, 434}, + {652, 581}, + {658, 439}, + {669, 42930}, + {670, 42928}, + {837, 921}, + {881, 880}, + {883, 882}, + {887, 886}, + {891, 1021}, + {892, 1022}, + {893, 1023}, + {940, 902}, + {941, 904}, + {942, 905}, + {943, 906}, + {945, 913}, + {946, 914}, + {947, 915}, + {948, 916}, + {949, 917}, + {950, 918}, + {951, 919}, + {952, 920}, + {953, 921}, + {954, 922}, + {955, 923}, + {956, 924}, + {957, 925}, + {958, 926}, + {959, 927}, + {960, 928}, + {961, 929}, + {962, 931}, + {963, 931}, + {964, 932}, + {965, 933}, + {966, 934}, + {967, 935}, + {968, 936}, + {969, 937}, + {970, 938}, + {971, 939}, + {972, 908}, + {973, 910}, + {974, 911}, + {976, 914}, + {977, 920}, + {981, 934}, + {982, 928}, + {983, 975}, + {985, 984}, + {987, 986}, + {989, 988}, + {991, 990}, + {993, 992}, + {995, 994}, + {997, 996}, + {999, 998}, + {1001, 1000}, + {1003, 1002}, + {1005, 1004}, + {1007, 1006}, + {1008, 922}, + {1009, 929}, + {1010, 1017}, + {1011, 895}, + {1013, 917}, + {1016, 1015}, + {1019, 1018}, + {1072, 1040}, + {1073, 1041}, + {1074, 1042}, + {1075, 1043}, + {1076, 1044}, + {1077, 1045}, + {1078, 1046}, + {1079, 1047}, + {1080, 1048}, + {1081, 1049}, + {1082, 1050}, + {1083, 1051}, + {1084, 1052}, + {1085, 1053}, + {1086, 1054}, + {1087, 1055}, + {1088, 1056}, + {1089, 1057}, + {1090, 1058}, + {1091, 1059}, + {1092, 1060}, + {1093, 1061}, + {1094, 1062}, + {1095, 1063}, + {1096, 1064}, + {1097, 1065}, + {1098, 1066}, + {1099, 1067}, + {1100, 1068}, + {1101, 1069}, + {1102, 1070}, + {1103, 1071}, + {1104, 1024}, + {1105, 1025}, + {1106, 1026}, + {1107, 1027}, + {1108, 1028}, + {1109, 1029}, + {1110, 1030}, + {1111, 1031}, + {1112, 1032}, + {1113, 1033}, + {1114, 1034}, + {1115, 1035}, + {1116, 1036}, + {1117, 1037}, + {1118, 1038}, + {1119, 1039}, + {1121, 1120}, + {1123, 1122}, + {1125, 1124}, + {1127, 1126}, + {1129, 1128}, + {1131, 1130}, + {1133, 1132}, + {1135, 1134}, + {1137, 1136}, + {1139, 1138}, + {1141, 1140}, + {1143, 1142}, + {1145, 1144}, + {1147, 1146}, + {1149, 1148}, + {1151, 1150}, + {1153, 1152}, + {1163, 1162}, + {1165, 1164}, + {1167, 1166}, + {1169, 1168}, + {1171, 1170}, + {1173, 1172}, + {1175, 1174}, + {1177, 1176}, + {1179, 1178}, + {1181, 1180}, + {1183, 1182}, + {1185, 1184}, + {1187, 1186}, + {1189, 1188}, + {1191, 1190}, + {1193, 1192}, + {1195, 1194}, + {1197, 1196}, + {1199, 1198}, + {1201, 1200}, + {1203, 1202}, + {1205, 1204}, + {1207, 1206}, + {1209, 1208}, + {1211, 1210}, + {1213, 1212}, + {1215, 1214}, + {1218, 1217}, + {1220, 1219}, + {1222, 1221}, + {1224, 1223}, + {1226, 1225}, + {1228, 1227}, + {1230, 1229}, + {1231, 1216}, + {1233, 1232}, + {1235, 1234}, + {1237, 1236}, + {1239, 1238}, + {1241, 1240}, + {1243, 1242}, + {1245, 1244}, + {1247, 1246}, + {1249, 1248}, + {1251, 1250}, + {1253, 1252}, + {1255, 1254}, + {1257, 1256}, + {1259, 1258}, + {1261, 1260}, + {1263, 1262}, + {1265, 1264}, + {1267, 1266}, + {1269, 1268}, + {1271, 1270}, + {1273, 1272}, + {1275, 1274}, + {1277, 1276}, + {1279, 1278}, + {1281, 1280}, + {1283, 1282}, + {1285, 1284}, + {1287, 1286}, + {1289, 1288}, + {1291, 1290}, + {1293, 1292}, + {1295, 1294}, + {1297, 1296}, + {1299, 1298}, + {1301, 1300}, + {1303, 1302}, + {1305, 1304}, + {1307, 1306}, + {1309, 1308}, + {1311, 1310}, + {1313, 1312}, + {1315, 1314}, + {1317, 1316}, + {1319, 1318}, + {1321, 1320}, + {1323, 1322}, + {1325, 1324}, + {1327, 1326}, + {1377, 1329}, + {1378, 1330}, + {1379, 1331}, + {1380, 1332}, + {1381, 1333}, + {1382, 1334}, + {1383, 1335}, + {1384, 1336}, + {1385, 1337}, + {1386, 1338}, + {1387, 1339}, + {1388, 1340}, + {1389, 1341}, + {1390, 1342}, + {1391, 1343}, + {1392, 1344}, + {1393, 1345}, + {1394, 1346}, + {1395, 1347}, + {1396, 1348}, + {1397, 1349}, + {1398, 1350}, + {1399, 1351}, + {1400, 1352}, + {1401, 1353}, + {1402, 1354}, + {1403, 1355}, + {1404, 1356}, + {1405, 1357}, + {1406, 1358}, + {1407, 1359}, + {1408, 1360}, + {1409, 1361}, + {1410, 1362}, + {1411, 1363}, + {1412, 1364}, + {1413, 1365}, + {1414, 1366}, + {4304, 4304}, + {4305, 4305}, + {4306, 4306}, + {4307, 4307}, + {4308, 4308}, + {4309, 4309}, + {4310, 4310}, + {4311, 4311}, + {4312, 4312}, + {4313, 4313}, + {4314, 4314}, + {4315, 4315}, + {4316, 4316}, + {4317, 4317}, + {4318, 4318}, + {4319, 4319}, + {4320, 4320}, + {4321, 4321}, + {4322, 4322}, + {4323, 4323}, + {4324, 4324}, + {4325, 4325}, + {4326, 4326}, + {4327, 4327}, + {4328, 4328}, + {4329, 4329}, + {4330, 4330}, + {4331, 4331}, + {4332, 4332}, + {4333, 4333}, + {4334, 4334}, + {4335, 4335}, + {4336, 4336}, + {4337, 4337}, + {4338, 4338}, + {4339, 4339}, + {4340, 4340}, + {4341, 4341}, + {4342, 4342}, + {4343, 4343}, + {4344, 4344}, + {4345, 4345}, + {4346, 4346}, + {4349, 4349}, + {4350, 4350}, + {4351, 4351}, + {5112, 5104}, + {5113, 5105}, + {5114, 5106}, + {5115, 5107}, + {5116, 5108}, + {5117, 5109}, + {7296, 1042}, + {7297, 1044}, + {7298, 1054}, + {7299, 1057}, + {7300, 1058}, + {7301, 1058}, + {7302, 1066}, + {7303, 1122}, + {7304, 42570}, + {7545, 42877}, + {7549, 11363}, + {7681, 7680}, + {7683, 7682}, + {7685, 7684}, + {7687, 7686}, + {7689, 7688}, + {7691, 7690}, + {7693, 7692}, + {7695, 7694}, + {7697, 7696}, + {7699, 7698}, + {7701, 7700}, + {7703, 7702}, + {7705, 7704}, + {7707, 7706}, + {7709, 7708}, + {7711, 7710}, + {7713, 7712}, + {7715, 7714}, + {7717, 7716}, + {7719, 7718}, + {7721, 7720}, + {7723, 7722}, + {7725, 7724}, + {7727, 7726}, + {7729, 7728}, + {7731, 7730}, + {7733, 7732}, + {7735, 7734}, + {7737, 7736}, + {7739, 7738}, + {7741, 7740}, + {7743, 7742}, + {7745, 7744}, + {7747, 7746}, + {7749, 7748}, + {7751, 7750}, + {7753, 7752}, + {7755, 7754}, + {7757, 7756}, + {7759, 7758}, + {7761, 7760}, + {7763, 7762}, + {7765, 7764}, + {7767, 7766}, + {7769, 7768}, + {7771, 7770}, + {7773, 7772}, + {7775, 7774}, + {7777, 7776}, + {7779, 7778}, + {7781, 7780}, + {7783, 7782}, + {7785, 7784}, + {7787, 7786}, + {7789, 7788}, + {7791, 7790}, + {7793, 7792}, + {7795, 7794}, + {7797, 7796}, + {7799, 7798}, + {7801, 7800}, + {7803, 7802}, + {7805, 7804}, + {7807, 7806}, + {7809, 7808}, + {7811, 7810}, + {7813, 7812}, + {7815, 7814}, + {7817, 7816}, + {7819, 7818}, + {7821, 7820}, + {7823, 7822}, + {7825, 7824}, + {7827, 7826}, + {7829, 7828}, + {7835, 7776}, + {7841, 7840}, + {7843, 7842}, + {7845, 7844}, + {7847, 7846}, + {7849, 7848}, + {7851, 7850}, + {7853, 7852}, + {7855, 7854}, + {7857, 7856}, + {7859, 7858}, + {7861, 7860}, + {7863, 7862}, + {7865, 7864}, + {7867, 7866}, + {7869, 7868}, + {7871, 7870}, + {7873, 7872}, + {7875, 7874}, + {7877, 7876}, + {7879, 7878}, + {7881, 7880}, + {7883, 7882}, + {7885, 7884}, + {7887, 7886}, + {7889, 7888}, + {7891, 7890}, + {7893, 7892}, + {7895, 7894}, + {7897, 7896}, + {7899, 7898}, + {7901, 7900}, + {7903, 7902}, + {7905, 7904}, + {7907, 7906}, + {7909, 7908}, + {7911, 7910}, + {7913, 7912}, + {7915, 7914}, + {7917, 7916}, + {7919, 7918}, + {7921, 7920}, + {7923, 7922}, + {7925, 7924}, + {7927, 7926}, + {7929, 7928}, + {7931, 7930}, + {7933, 7932}, + {7935, 7934}, + {7936, 7944}, + {7937, 7945}, + {7938, 7946}, + {7939, 7947}, + {7940, 7948}, + {7941, 7949}, + {7942, 7950}, + {7943, 7951}, + {7952, 7960}, + {7953, 7961}, + {7954, 7962}, + {7955, 7963}, + {7956, 7964}, + {7957, 7965}, + {7968, 7976}, + {7969, 7977}, + {7970, 7978}, + {7971, 7979}, + {7972, 7980}, + {7973, 7981}, + {7974, 7982}, + {7975, 7983}, + {7984, 7992}, + {7985, 7993}, + {7986, 7994}, + {7987, 7995}, + {7988, 7996}, + {7989, 7997}, + {7990, 7998}, + {7991, 7999}, + {8000, 8008}, + {8001, 8009}, + {8002, 8010}, + {8003, 8011}, + {8004, 8012}, + {8005, 8013}, + {8017, 8025}, + {8019, 8027}, + {8021, 8029}, + {8023, 8031}, + {8032, 8040}, + {8033, 8041}, + {8034, 8042}, + {8035, 8043}, + {8036, 8044}, + {8037, 8045}, + {8038, 8046}, + {8039, 8047}, + {8048, 8122}, + {8049, 8123}, + {8050, 8136}, + {8051, 8137}, + {8052, 8138}, + {8053, 8139}, + {8054, 8154}, + {8055, 8155}, + {8056, 8184}, + {8057, 8185}, + {8058, 8170}, + {8059, 8171}, + {8060, 8186}, + {8061, 8187}, + {8064, 8072}, + {8065, 8073}, + {8066, 8074}, + {8067, 8075}, + {8068, 8076}, + {8069, 8077}, + {8070, 8078}, + {8071, 8079}, + {8080, 8088}, + {8081, 8089}, + {8082, 8090}, + {8083, 8091}, + {8084, 8092}, + {8085, 8093}, + {8086, 8094}, + {8087, 8095}, + {8096, 8104}, + {8097, 8105}, + {8098, 8106}, + {8099, 8107}, + {8100, 8108}, + {8101, 8109}, + {8102, 8110}, + {8103, 8111}, + {8112, 8120}, + {8113, 8121}, + {8115, 8124}, + {8126, 921}, + {8131, 8140}, + {8144, 8152}, + {8145, 8153}, + {8160, 8168}, + {8161, 8169}, + {8165, 8172}, + {8179, 8188}, + {8526, 8498}, + {8560, 8544}, + {8561, 8545}, + {8562, 8546}, + {8563, 8547}, + {8564, 8548}, + {8565, 8549}, + {8566, 8550}, + {8567, 8551}, + {8568, 8552}, + {8569, 8553}, + {8570, 8554}, + {8571, 8555}, + {8572, 8556}, + {8573, 8557}, + {8574, 8558}, + {8575, 8559}, + {8580, 8579}, + {9424, 9398}, + {9425, 9399}, + {9426, 9400}, + {9427, 9401}, + {9428, 9402}, + {9429, 9403}, + {9430, 9404}, + {9431, 9405}, + {9432, 9406}, + {9433, 9407}, + {9434, 9408}, + {9435, 9409}, + {9436, 9410}, + {9437, 9411}, + {9438, 9412}, + {9439, 9413}, + {9440, 9414}, + {9441, 9415}, + {9442, 9416}, + {9443, 9417}, + {9444, 9418}, + {9445, 9419}, + {9446, 9420}, + {9447, 9421}, + {9448, 9422}, + {9449, 9423}, + {11312, 11264}, + {11313, 11265}, + {11314, 11266}, + {11315, 11267}, + {11316, 11268}, + {11317, 11269}, + {11318, 11270}, + {11319, 11271}, + {11320, 11272}, + {11321, 11273}, + {11322, 11274}, + {11323, 11275}, + {11324, 11276}, + {11325, 11277}, + {11326, 11278}, + {11327, 11279}, + {11328, 11280}, + {11329, 11281}, + {11330, 11282}, + {11331, 11283}, + {11332, 11284}, + {11333, 11285}, + {11334, 11286}, + {11335, 11287}, + {11336, 11288}, + {11337, 11289}, + {11338, 11290}, + {11339, 11291}, + {11340, 11292}, + {11341, 11293}, + {11342, 11294}, + {11343, 11295}, + {11344, 11296}, + {11345, 11297}, + {11346, 11298}, + {11347, 11299}, + {11348, 11300}, + {11349, 11301}, + {11350, 11302}, + {11351, 11303}, + {11352, 11304}, + {11353, 11305}, + {11354, 11306}, + {11355, 11307}, + {11356, 11308}, + {11357, 11309}, + {11358, 11310}, + {11361, 11360}, + {11365, 570}, + {11366, 574}, + {11368, 11367}, + {11370, 11369}, + {11372, 11371}, + {11379, 11378}, + {11382, 11381}, + {11393, 11392}, + {11395, 11394}, + {11397, 11396}, + {11399, 11398}, + {11401, 11400}, + {11403, 11402}, + {11405, 11404}, + {11407, 11406}, + {11409, 11408}, + {11411, 11410}, + {11413, 11412}, + {11415, 11414}, + {11417, 11416}, + {11419, 11418}, + {11421, 11420}, + {11423, 11422}, + {11425, 11424}, + {11427, 11426}, + {11429, 11428}, + {11431, 11430}, + {11433, 11432}, + {11435, 11434}, + {11437, 11436}, + {11439, 11438}, + {11441, 11440}, + {11443, 11442}, + {11445, 11444}, + {11447, 11446}, + {11449, 11448}, + {11451, 11450}, + {11453, 11452}, + {11455, 11454}, + {11457, 11456}, + {11459, 11458}, + {11461, 11460}, + {11463, 11462}, + {11465, 11464}, + {11467, 11466}, + {11469, 11468}, + {11471, 11470}, + {11473, 11472}, + {11475, 11474}, + {11477, 11476}, + {11479, 11478}, + {11481, 11480}, + {11483, 11482}, + {11485, 11484}, + {11487, 11486}, + {11489, 11488}, + {11491, 11490}, + {11500, 11499}, + {11502, 11501}, + {11507, 11506}, + {11520, 4256}, + {11521, 4257}, + {11522, 4258}, + {11523, 4259}, + {11524, 4260}, + {11525, 4261}, + {11526, 4262}, + {11527, 4263}, + {11528, 4264}, + {11529, 4265}, + {11530, 4266}, + {11531, 4267}, + {11532, 4268}, + {11533, 4269}, + {11534, 4270}, + {11535, 4271}, + {11536, 4272}, + {11537, 4273}, + {11538, 4274}, + {11539, 4275}, + {11540, 4276}, + {11541, 4277}, + {11542, 4278}, + {11543, 4279}, + {11544, 4280}, + {11545, 4281}, + {11546, 4282}, + {11547, 4283}, + {11548, 4284}, + {11549, 4285}, + {11550, 4286}, + {11551, 4287}, + {11552, 4288}, + {11553, 4289}, + {11554, 4290}, + {11555, 4291}, + {11556, 4292}, + {11557, 4293}, + {11559, 4295}, + {11565, 4301}, + {42561, 42560}, + {42563, 42562}, + {42565, 42564}, + {42567, 42566}, + {42569, 42568}, + {42571, 42570}, + {42573, 42572}, + {42575, 42574}, + {42577, 42576}, + {42579, 42578}, + {42581, 42580}, + {42583, 42582}, + {42585, 42584}, + {42587, 42586}, + {42589, 42588}, + {42591, 42590}, + {42593, 42592}, + {42595, 42594}, + {42597, 42596}, + {42599, 42598}, + {42601, 42600}, + {42603, 42602}, + {42605, 42604}, + {42625, 42624}, + {42627, 42626}, + {42629, 42628}, + {42631, 42630}, + {42633, 42632}, + {42635, 42634}, + {42637, 42636}, + {42639, 42638}, + {42641, 42640}, + {42643, 42642}, + {42645, 42644}, + {42647, 42646}, + {42649, 42648}, + {42651, 42650}, + {42787, 42786}, + {42789, 42788}, + {42791, 42790}, + {42793, 42792}, + {42795, 42794}, + {42797, 42796}, + {42799, 42798}, + {42803, 42802}, + {42805, 42804}, + {42807, 42806}, + {42809, 42808}, + {42811, 42810}, + {42813, 42812}, + {42815, 42814}, + {42817, 42816}, + {42819, 42818}, + {42821, 42820}, + {42823, 42822}, + {42825, 42824}, + {42827, 42826}, + {42829, 42828}, + {42831, 42830}, + {42833, 42832}, + {42835, 42834}, + {42837, 42836}, + {42839, 42838}, + {42841, 42840}, + {42843, 42842}, + {42845, 42844}, + {42847, 42846}, + {42849, 42848}, + {42851, 42850}, + {42853, 42852}, + {42855, 42854}, + {42857, 42856}, + {42859, 42858}, + {42861, 42860}, + {42863, 42862}, + {42874, 42873}, + {42876, 42875}, + {42879, 42878}, + {42881, 42880}, + {42883, 42882}, + {42885, 42884}, + {42887, 42886}, + {42892, 42891}, + {42897, 42896}, + {42899, 42898}, + {42903, 42902}, + {42905, 42904}, + {42907, 42906}, + {42909, 42908}, + {42911, 42910}, + {42913, 42912}, + {42915, 42914}, + {42917, 42916}, + {42919, 42918}, + {42921, 42920}, + {42933, 42932}, + {42935, 42934}, + {42937, 42936}, + {43859, 42931}, + {43888, 5024}, + {43889, 5025}, + {43890, 5026}, + {43891, 5027}, + {43892, 5028}, + {43893, 5029}, + {43894, 5030}, + {43895, 5031}, + {43896, 5032}, + {43897, 5033}, + {43898, 5034}, + {43899, 5035}, + {43900, 5036}, + {43901, 5037}, + {43902, 5038}, + {43903, 5039}, + {43904, 5040}, + {43905, 5041}, + {43906, 5042}, + {43907, 5043}, + {43908, 5044}, + {43909, 5045}, + {43910, 5046}, + {43911, 5047}, + {43912, 5048}, + {43913, 5049}, + {43914, 5050}, + {43915, 5051}, + {43916, 5052}, + {43917, 5053}, + {43918, 5054}, + {43919, 5055}, + {43920, 5056}, + {43921, 5057}, + {43922, 5058}, + {43923, 5059}, + {43924, 5060}, + {43925, 5061}, + {43926, 5062}, + {43927, 5063}, + {43928, 5064}, + {43929, 5065}, + {43930, 5066}, + {43931, 5067}, + {43932, 5068}, + {43933, 5069}, + {43934, 5070}, + {43935, 5071}, + {43936, 5072}, + {43937, 5073}, + {43938, 5074}, + {43939, 5075}, + {43940, 5076}, + {43941, 5077}, + {43942, 5078}, + {43943, 5079}, + {43944, 5080}, + {43945, 5081}, + {43946, 5082}, + {43947, 5083}, + {43948, 5084}, + {43949, 5085}, + {43950, 5086}, + {43951, 5087}, + {43952, 5088}, + {43953, 5089}, + {43954, 5090}, + {43955, 5091}, + {43956, 5092}, + {43957, 5093}, + {43958, 5094}, + {43959, 5095}, + {43960, 5096}, + {43961, 5097}, + {43962, 5098}, + {43963, 5099}, + {43964, 5100}, + {43965, 5101}, + {43966, 5102}, + {43967, 5103}, + {65345, 65313}, + {65346, 65314}, + {65347, 65315}, + {65348, 65316}, + {65349, 65317}, + {65350, 65318}, + {65351, 65319}, + {65352, 65320}, + {65353, 65321}, + {65354, 65322}, + {65355, 65323}, + {65356, 65324}, + {65357, 65325}, + {65358, 65326}, + {65359, 65327}, + {65360, 65328}, + {65361, 65329}, + {65362, 65330}, + {65363, 65331}, + {65364, 65332}, + {65365, 65333}, + {65366, 65334}, + {65367, 65335}, + {65368, 65336}, + {65369, 65337}, + {65370, 65338}, + {66600, 66560}, + {66601, 66561}, + {66602, 66562}, + {66603, 66563}, + {66604, 66564}, + {66605, 66565}, + {66606, 66566}, + {66607, 66567}, + {66608, 66568}, + {66609, 66569}, + {66610, 66570}, + {66611, 66571}, + {66612, 66572}, + {66613, 66573}, + {66614, 66574}, + {66615, 66575}, + {66616, 66576}, + {66617, 66577}, + {66618, 66578}, + {66619, 66579}, + {66620, 66580}, + {66621, 66581}, + {66622, 66582}, + {66623, 66583}, + {66624, 66584}, + {66625, 66585}, + {66626, 66586}, + {66627, 66587}, + {66628, 66588}, + {66629, 66589}, + {66630, 66590}, + {66631, 66591}, + {66632, 66592}, + {66633, 66593}, + {66634, 66594}, + {66635, 66595}, + {66636, 66596}, + {66637, 66597}, + {66638, 66598}, + {66639, 66599}, + {66776, 66736}, + {66777, 66737}, + {66778, 66738}, + {66779, 66739}, + {66780, 66740}, + {66781, 66741}, + {66782, 66742}, + {66783, 66743}, + {66784, 66744}, + {66785, 66745}, + {66786, 66746}, + {66787, 66747}, + {66788, 66748}, + {66789, 66749}, + {66790, 66750}, + {66791, 66751}, + {66792, 66752}, + {66793, 66753}, + {66794, 66754}, + {66795, 66755}, + {66796, 66756}, + {66797, 66757}, + {66798, 66758}, + {66799, 66759}, + {66800, 66760}, + {66801, 66761}, + {66802, 66762}, + {66803, 66763}, + {66804, 66764}, + {66805, 66765}, + {66806, 66766}, + {66807, 66767}, + {66808, 66768}, + {66809, 66769}, + {66810, 66770}, + {66811, 66771}, + {68800, 68736}, + {68801, 68737}, + {68802, 68738}, + {68803, 68739}, + {68804, 68740}, + {68805, 68741}, + {68806, 68742}, + {68807, 68743}, + {68808, 68744}, + {68809, 68745}, + {68810, 68746}, + {68811, 68747}, + {68812, 68748}, + {68813, 68749}, + {68814, 68750}, + {68815, 68751}, + {68816, 68752}, + {68817, 68753}, + {68818, 68754}, + {68819, 68755}, + {68820, 68756}, + {68821, 68757}, + {68822, 68758}, + {68823, 68759}, + {68824, 68760}, + {68825, 68761}, + {68826, 68762}, + {68827, 68763}, + {68828, 68764}, + {68829, 68765}, + {68830, 68766}, + {68831, 68767}, + {68832, 68768}, + {68833, 68769}, + {68834, 68770}, + {68835, 68771}, + {68836, 68772}, + {68837, 68773}, + {68838, 68774}, + {68839, 68775}, + {68840, 68776}, + {68841, 68777}, + {68842, 68778}, + {68843, 68779}, + {68844, 68780}, + {68845, 68781}, + {68846, 68782}, + {68847, 68783}, + {68848, 68784}, + {68849, 68785}, + {68850, 68786}, + {71872, 71840}, + {71873, 71841}, + {71874, 71842}, + {71875, 71843}, + {71876, 71844}, + {71877, 71845}, + {71878, 71846}, + {71879, 71847}, + {71880, 71848}, + {71881, 71849}, + {71882, 71850}, + {71883, 71851}, + {71884, 71852}, + {71885, 71853}, + {71886, 71854}, + {71887, 71855}, + {71888, 71856}, + {71889, 71857}, + {71890, 71858}, + {71891, 71859}, + {71892, 71860}, + {71893, 71861}, + {71894, 71862}, + {71895, 71863}, + {71896, 71864}, + {71897, 71865}, + {71898, 71866}, + {71899, 71867}, + {71900, 71868}, + {71901, 71869}, + {71902, 71870}, + {71903, 71871}, + {93792, 93760}, + {93793, 93761}, + {93794, 93762}, + {93795, 93763}, + {93796, 93764}, + {93797, 93765}, + {93798, 93766}, + {93799, 93767}, + {93800, 93768}, + {93801, 93769}, + {93802, 93770}, + {93803, 93771}, + {93804, 93772}, + {93805, 93773}, + {93806, 93774}, + {93807, 93775}, + {93808, 93776}, + {93809, 93777}, + {93810, 93778}, + {93811, 93779}, + {93812, 93780}, + {93813, 93781}, + {93814, 93782}, + {93815, 93783}, + {93816, 93784}, + {93817, 93785}, + {93818, 93786}, + {93819, 93787}, + {93820, 93788}, + {93821, 93789}, + {93822, 93790}, + {93823, 93791}, + {125218, 125184}, + {125219, 125185}, + {125220, 125186}, + {125221, 125187}, + {125222, 125188}, + {125223, 125189}, + {125224, 125190}, + {125225, 125191}, + {125226, 125192}, + {125227, 125193}, + {125228, 125194}, + {125229, 125195}, + {125230, 125196}, + {125231, 125197}, + {125232, 125198}, + {125233, 125199}, + {125234, 125200}, + {125235, 125201}, + {125236, 125202}, + {125237, 125203}, + {125238, 125204}, + {125239, 125205}, + {125240, 125206}, + {125241, 125207}, + {125242, 125208}, + {125243, 125209}, + {125244, 125210}, + {125245, 125211}, + {125246, 125212}, + {125247, 125213}, + {125248, 125214}, + {125249, 125215}, + {125250, 125216}, + {125251, 125217}, +}; + +UnicodeCharacterSimpleMapping unicodeUpper[1400] = { + {97, 65}, + {98, 66}, + {99, 67}, + {100, 68}, + {101, 69}, + {102, 70}, + {103, 71}, + {104, 72}, + {105, 73}, + {106, 74}, + {107, 75}, + {108, 76}, + {109, 77}, + {110, 78}, + {111, 79}, + {112, 80}, + {113, 81}, + {114, 82}, + {115, 83}, + {116, 84}, + {117, 85}, + {118, 86}, + {119, 87}, + {120, 88}, + {121, 89}, + {122, 90}, + {181, 924}, + {224, 192}, + {225, 193}, + {226, 194}, + {227, 195}, + {228, 196}, + {229, 197}, + {230, 198}, + {231, 199}, + {232, 200}, + {233, 201}, + {234, 202}, + {235, 203}, + {236, 204}, + {237, 205}, + {238, 206}, + {239, 207}, + {240, 208}, + {241, 209}, + {242, 210}, + {243, 211}, + {244, 212}, + {245, 213}, + {246, 214}, + {248, 216}, + {249, 217}, + {250, 218}, + {251, 219}, + {252, 220}, + {253, 221}, + {254, 222}, + {255, 376}, + {257, 256}, + {259, 258}, + {261, 260}, + {263, 262}, + {265, 264}, + {267, 266}, + {269, 268}, + {271, 270}, + {273, 272}, + {275, 274}, + {277, 276}, + {279, 278}, + {281, 280}, + {283, 282}, + {285, 284}, + {287, 286}, + {289, 288}, + {291, 290}, + {293, 292}, + {295, 294}, + {297, 296}, + {299, 298}, + {301, 300}, + {303, 302}, + {305, 73}, + {307, 306}, + {309, 308}, + {311, 310}, + {314, 313}, + {316, 315}, + {318, 317}, + {320, 319}, + {322, 321}, + {324, 323}, + {326, 325}, + {328, 327}, + {331, 330}, + {333, 332}, + {335, 334}, + {337, 336}, + {339, 338}, + {341, 340}, + {343, 342}, + {345, 344}, + {347, 346}, + {349, 348}, + {351, 350}, + {353, 352}, + {355, 354}, + {357, 356}, + {359, 358}, + {361, 360}, + {363, 362}, + {365, 364}, + {367, 366}, + {369, 368}, + {371, 370}, + {373, 372}, + {375, 374}, + {378, 377}, + {380, 379}, + {382, 381}, + {383, 83}, + {384, 579}, + {387, 386}, + {389, 388}, + {392, 391}, + {396, 395}, + {402, 401}, + {405, 502}, + {409, 408}, + {410, 573}, + {414, 544}, + {417, 416}, + {419, 418}, + {421, 420}, + {424, 423}, + {429, 428}, + {432, 431}, + {436, 435}, + {438, 437}, + {441, 440}, + {445, 444}, + {447, 503}, + {453, 452}, + {454, 452}, + {456, 455}, + {457, 455}, + {459, 458}, + {460, 458}, + {462, 461}, + {464, 463}, + {466, 465}, + {468, 467}, + {470, 469}, + {472, 471}, + {474, 473}, + {476, 475}, + {477, 398}, + {479, 478}, + {481, 480}, + {483, 482}, + {485, 484}, + {487, 486}, + {489, 488}, + {491, 490}, + {493, 492}, + {495, 494}, + {498, 497}, + {499, 497}, + {501, 500}, + {505, 504}, + {507, 506}, + {509, 508}, + {511, 510}, + {513, 512}, + {515, 514}, + {517, 516}, + {519, 518}, + {521, 520}, + {523, 522}, + {525, 524}, + {527, 526}, + {529, 528}, + {531, 530}, + {533, 532}, + {535, 534}, + {537, 536}, + {539, 538}, + {541, 540}, + {543, 542}, + {547, 546}, + {549, 548}, + {551, 550}, + {553, 552}, + {555, 554}, + {557, 556}, + {559, 558}, + {561, 560}, + {563, 562}, + {572, 571}, + {575, 11390}, + {576, 11391}, + {578, 577}, + {583, 582}, + {585, 584}, + {587, 586}, + {589, 588}, + {591, 590}, + {592, 11375}, + {593, 11373}, + {594, 11376}, + {595, 385}, + {596, 390}, + {598, 393}, + {599, 394}, + {601, 399}, + {603, 400}, + {604, 42923}, + {608, 403}, + {609, 42924}, + {611, 404}, + {613, 42893}, + {614, 42922}, + {616, 407}, + {617, 406}, + {618, 42926}, + {619, 11362}, + {620, 42925}, + {623, 412}, + {625, 11374}, + {626, 413}, + {629, 415}, + {637, 11364}, + {640, 422}, + {643, 425}, + {647, 42929}, + {648, 430}, + {649, 580}, + {650, 433}, + {651, 434}, + {652, 581}, + {658, 439}, + {669, 42930}, + {670, 42928}, + {837, 921}, + {881, 880}, + {883, 882}, + {887, 886}, + {891, 1021}, + {892, 1022}, + {893, 1023}, + {940, 902}, + {941, 904}, + {942, 905}, + {943, 906}, + {945, 913}, + {946, 914}, + {947, 915}, + {948, 916}, + {949, 917}, + {950, 918}, + {951, 919}, + {952, 920}, + {953, 921}, + {954, 922}, + {955, 923}, + {956, 924}, + {957, 925}, + {958, 926}, + {959, 927}, + {960, 928}, + {961, 929}, + {962, 931}, + {963, 931}, + {964, 932}, + {965, 933}, + {966, 934}, + {967, 935}, + {968, 936}, + {969, 937}, + {970, 938}, + {971, 939}, + {972, 908}, + {973, 910}, + {974, 911}, + {976, 914}, + {977, 920}, + {981, 934}, + {982, 928}, + {983, 975}, + {985, 984}, + {987, 986}, + {989, 988}, + {991, 990}, + {993, 992}, + {995, 994}, + {997, 996}, + {999, 998}, + {1001, 1000}, + {1003, 1002}, + {1005, 1004}, + {1007, 1006}, + {1008, 922}, + {1009, 929}, + {1010, 1017}, + {1011, 895}, + {1013, 917}, + {1016, 1015}, + {1019, 1018}, + {1072, 1040}, + {1073, 1041}, + {1074, 1042}, + {1075, 1043}, + {1076, 1044}, + {1077, 1045}, + {1078, 1046}, + {1079, 1047}, + {1080, 1048}, + {1081, 1049}, + {1082, 1050}, + {1083, 1051}, + {1084, 1052}, + {1085, 1053}, + {1086, 1054}, + {1087, 1055}, + {1088, 1056}, + {1089, 1057}, + {1090, 1058}, + {1091, 1059}, + {1092, 1060}, + {1093, 1061}, + {1094, 1062}, + {1095, 1063}, + {1096, 1064}, + {1097, 1065}, + {1098, 1066}, + {1099, 1067}, + {1100, 1068}, + {1101, 1069}, + {1102, 1070}, + {1103, 1071}, + {1104, 1024}, + {1105, 1025}, + {1106, 1026}, + {1107, 1027}, + {1108, 1028}, + {1109, 1029}, + {1110, 1030}, + {1111, 1031}, + {1112, 1032}, + {1113, 1033}, + {1114, 1034}, + {1115, 1035}, + {1116, 1036}, + {1117, 1037}, + {1118, 1038}, + {1119, 1039}, + {1121, 1120}, + {1123, 1122}, + {1125, 1124}, + {1127, 1126}, + {1129, 1128}, + {1131, 1130}, + {1133, 1132}, + {1135, 1134}, + {1137, 1136}, + {1139, 1138}, + {1141, 1140}, + {1143, 1142}, + {1145, 1144}, + {1147, 1146}, + {1149, 1148}, + {1151, 1150}, + {1153, 1152}, + {1163, 1162}, + {1165, 1164}, + {1167, 1166}, + {1169, 1168}, + {1171, 1170}, + {1173, 1172}, + {1175, 1174}, + {1177, 1176}, + {1179, 1178}, + {1181, 1180}, + {1183, 1182}, + {1185, 1184}, + {1187, 1186}, + {1189, 1188}, + {1191, 1190}, + {1193, 1192}, + {1195, 1194}, + {1197, 1196}, + {1199, 1198}, + {1201, 1200}, + {1203, 1202}, + {1205, 1204}, + {1207, 1206}, + {1209, 1208}, + {1211, 1210}, + {1213, 1212}, + {1215, 1214}, + {1218, 1217}, + {1220, 1219}, + {1222, 1221}, + {1224, 1223}, + {1226, 1225}, + {1228, 1227}, + {1230, 1229}, + {1231, 1216}, + {1233, 1232}, + {1235, 1234}, + {1237, 1236}, + {1239, 1238}, + {1241, 1240}, + {1243, 1242}, + {1245, 1244}, + {1247, 1246}, + {1249, 1248}, + {1251, 1250}, + {1253, 1252}, + {1255, 1254}, + {1257, 1256}, + {1259, 1258}, + {1261, 1260}, + {1263, 1262}, + {1265, 1264}, + {1267, 1266}, + {1269, 1268}, + {1271, 1270}, + {1273, 1272}, + {1275, 1274}, + {1277, 1276}, + {1279, 1278}, + {1281, 1280}, + {1283, 1282}, + {1285, 1284}, + {1287, 1286}, + {1289, 1288}, + {1291, 1290}, + {1293, 1292}, + {1295, 1294}, + {1297, 1296}, + {1299, 1298}, + {1301, 1300}, + {1303, 1302}, + {1305, 1304}, + {1307, 1306}, + {1309, 1308}, + {1311, 1310}, + {1313, 1312}, + {1315, 1314}, + {1317, 1316}, + {1319, 1318}, + {1321, 1320}, + {1323, 1322}, + {1325, 1324}, + {1327, 1326}, + {1377, 1329}, + {1378, 1330}, + {1379, 1331}, + {1380, 1332}, + {1381, 1333}, + {1382, 1334}, + {1383, 1335}, + {1384, 1336}, + {1385, 1337}, + {1386, 1338}, + {1387, 1339}, + {1388, 1340}, + {1389, 1341}, + {1390, 1342}, + {1391, 1343}, + {1392, 1344}, + {1393, 1345}, + {1394, 1346}, + {1395, 1347}, + {1396, 1348}, + {1397, 1349}, + {1398, 1350}, + {1399, 1351}, + {1400, 1352}, + {1401, 1353}, + {1402, 1354}, + {1403, 1355}, + {1404, 1356}, + {1405, 1357}, + {1406, 1358}, + {1407, 1359}, + {1408, 1360}, + {1409, 1361}, + {1410, 1362}, + {1411, 1363}, + {1412, 1364}, + {1413, 1365}, + {1414, 1366}, + {4304, 7312}, + {4305, 7313}, + {4306, 7314}, + {4307, 7315}, + {4308, 7316}, + {4309, 7317}, + {4310, 7318}, + {4311, 7319}, + {4312, 7320}, + {4313, 7321}, + {4314, 7322}, + {4315, 7323}, + {4316, 7324}, + {4317, 7325}, + {4318, 7326}, + {4319, 7327}, + {4320, 7328}, + {4321, 7329}, + {4322, 7330}, + {4323, 7331}, + {4324, 7332}, + {4325, 7333}, + {4326, 7334}, + {4327, 7335}, + {4328, 7336}, + {4329, 7337}, + {4330, 7338}, + {4331, 7339}, + {4332, 7340}, + {4333, 7341}, + {4334, 7342}, + {4335, 7343}, + {4336, 7344}, + {4337, 7345}, + {4338, 7346}, + {4339, 7347}, + {4340, 7348}, + {4341, 7349}, + {4342, 7350}, + {4343, 7351}, + {4344, 7352}, + {4345, 7353}, + {4346, 7354}, + {4349, 7357}, + {4350, 7358}, + {4351, 7359}, + {5112, 5104}, + {5113, 5105}, + {5114, 5106}, + {5115, 5107}, + {5116, 5108}, + {5117, 5109}, + {7296, 1042}, + {7297, 1044}, + {7298, 1054}, + {7299, 1057}, + {7300, 1058}, + {7301, 1058}, + {7302, 1066}, + {7303, 1122}, + {7304, 42570}, + {7545, 42877}, + {7549, 11363}, + {7681, 7680}, + {7683, 7682}, + {7685, 7684}, + {7687, 7686}, + {7689, 7688}, + {7691, 7690}, + {7693, 7692}, + {7695, 7694}, + {7697, 7696}, + {7699, 7698}, + {7701, 7700}, + {7703, 7702}, + {7705, 7704}, + {7707, 7706}, + {7709, 7708}, + {7711, 7710}, + {7713, 7712}, + {7715, 7714}, + {7717, 7716}, + {7719, 7718}, + {7721, 7720}, + {7723, 7722}, + {7725, 7724}, + {7727, 7726}, + {7729, 7728}, + {7731, 7730}, + {7733, 7732}, + {7735, 7734}, + {7737, 7736}, + {7739, 7738}, + {7741, 7740}, + {7743, 7742}, + {7745, 7744}, + {7747, 7746}, + {7749, 7748}, + {7751, 7750}, + {7753, 7752}, + {7755, 7754}, + {7757, 7756}, + {7759, 7758}, + {7761, 7760}, + {7763, 7762}, + {7765, 7764}, + {7767, 7766}, + {7769, 7768}, + {7771, 7770}, + {7773, 7772}, + {7775, 7774}, + {7777, 7776}, + {7779, 7778}, + {7781, 7780}, + {7783, 7782}, + {7785, 7784}, + {7787, 7786}, + {7789, 7788}, + {7791, 7790}, + {7793, 7792}, + {7795, 7794}, + {7797, 7796}, + {7799, 7798}, + {7801, 7800}, + {7803, 7802}, + {7805, 7804}, + {7807, 7806}, + {7809, 7808}, + {7811, 7810}, + {7813, 7812}, + {7815, 7814}, + {7817, 7816}, + {7819, 7818}, + {7821, 7820}, + {7823, 7822}, + {7825, 7824}, + {7827, 7826}, + {7829, 7828}, + {7835, 7776}, + {7841, 7840}, + {7843, 7842}, + {7845, 7844}, + {7847, 7846}, + {7849, 7848}, + {7851, 7850}, + {7853, 7852}, + {7855, 7854}, + {7857, 7856}, + {7859, 7858}, + {7861, 7860}, + {7863, 7862}, + {7865, 7864}, + {7867, 7866}, + {7869, 7868}, + {7871, 7870}, + {7873, 7872}, + {7875, 7874}, + {7877, 7876}, + {7879, 7878}, + {7881, 7880}, + {7883, 7882}, + {7885, 7884}, + {7887, 7886}, + {7889, 7888}, + {7891, 7890}, + {7893, 7892}, + {7895, 7894}, + {7897, 7896}, + {7899, 7898}, + {7901, 7900}, + {7903, 7902}, + {7905, 7904}, + {7907, 7906}, + {7909, 7908}, + {7911, 7910}, + {7913, 7912}, + {7915, 7914}, + {7917, 7916}, + {7919, 7918}, + {7921, 7920}, + {7923, 7922}, + {7925, 7924}, + {7927, 7926}, + {7929, 7928}, + {7931, 7930}, + {7933, 7932}, + {7935, 7934}, + {7936, 7944}, + {7937, 7945}, + {7938, 7946}, + {7939, 7947}, + {7940, 7948}, + {7941, 7949}, + {7942, 7950}, + {7943, 7951}, + {7952, 7960}, + {7953, 7961}, + {7954, 7962}, + {7955, 7963}, + {7956, 7964}, + {7957, 7965}, + {7968, 7976}, + {7969, 7977}, + {7970, 7978}, + {7971, 7979}, + {7972, 7980}, + {7973, 7981}, + {7974, 7982}, + {7975, 7983}, + {7984, 7992}, + {7985, 7993}, + {7986, 7994}, + {7987, 7995}, + {7988, 7996}, + {7989, 7997}, + {7990, 7998}, + {7991, 7999}, + {8000, 8008}, + {8001, 8009}, + {8002, 8010}, + {8003, 8011}, + {8004, 8012}, + {8005, 8013}, + {8017, 8025}, + {8019, 8027}, + {8021, 8029}, + {8023, 8031}, + {8032, 8040}, + {8033, 8041}, + {8034, 8042}, + {8035, 8043}, + {8036, 8044}, + {8037, 8045}, + {8038, 8046}, + {8039, 8047}, + {8048, 8122}, + {8049, 8123}, + {8050, 8136}, + {8051, 8137}, + {8052, 8138}, + {8053, 8139}, + {8054, 8154}, + {8055, 8155}, + {8056, 8184}, + {8057, 8185}, + {8058, 8170}, + {8059, 8171}, + {8060, 8186}, + {8061, 8187}, + {8064, 8072}, + {8065, 8073}, + {8066, 8074}, + {8067, 8075}, + {8068, 8076}, + {8069, 8077}, + {8070, 8078}, + {8071, 8079}, + {8080, 8088}, + {8081, 8089}, + {8082, 8090}, + {8083, 8091}, + {8084, 8092}, + {8085, 8093}, + {8086, 8094}, + {8087, 8095}, + {8096, 8104}, + {8097, 8105}, + {8098, 8106}, + {8099, 8107}, + {8100, 8108}, + {8101, 8109}, + {8102, 8110}, + {8103, 8111}, + {8112, 8120}, + {8113, 8121}, + {8115, 8124}, + {8126, 921}, + {8131, 8140}, + {8144, 8152}, + {8145, 8153}, + {8160, 8168}, + {8161, 8169}, + {8165, 8172}, + {8179, 8188}, + {8526, 8498}, + {8560, 8544}, + {8561, 8545}, + {8562, 8546}, + {8563, 8547}, + {8564, 8548}, + {8565, 8549}, + {8566, 8550}, + {8567, 8551}, + {8568, 8552}, + {8569, 8553}, + {8570, 8554}, + {8571, 8555}, + {8572, 8556}, + {8573, 8557}, + {8574, 8558}, + {8575, 8559}, + {8580, 8579}, + {9424, 9398}, + {9425, 9399}, + {9426, 9400}, + {9427, 9401}, + {9428, 9402}, + {9429, 9403}, + {9430, 9404}, + {9431, 9405}, + {9432, 9406}, + {9433, 9407}, + {9434, 9408}, + {9435, 9409}, + {9436, 9410}, + {9437, 9411}, + {9438, 9412}, + {9439, 9413}, + {9440, 9414}, + {9441, 9415}, + {9442, 9416}, + {9443, 9417}, + {9444, 9418}, + {9445, 9419}, + {9446, 9420}, + {9447, 9421}, + {9448, 9422}, + {9449, 9423}, + {11312, 11264}, + {11313, 11265}, + {11314, 11266}, + {11315, 11267}, + {11316, 11268}, + {11317, 11269}, + {11318, 11270}, + {11319, 11271}, + {11320, 11272}, + {11321, 11273}, + {11322, 11274}, + {11323, 11275}, + {11324, 11276}, + {11325, 11277}, + {11326, 11278}, + {11327, 11279}, + {11328, 11280}, + {11329, 11281}, + {11330, 11282}, + {11331, 11283}, + {11332, 11284}, + {11333, 11285}, + {11334, 11286}, + {11335, 11287}, + {11336, 11288}, + {11337, 11289}, + {11338, 11290}, + {11339, 11291}, + {11340, 11292}, + {11341, 11293}, + {11342, 11294}, + {11343, 11295}, + {11344, 11296}, + {11345, 11297}, + {11346, 11298}, + {11347, 11299}, + {11348, 11300}, + {11349, 11301}, + {11350, 11302}, + {11351, 11303}, + {11352, 11304}, + {11353, 11305}, + {11354, 11306}, + {11355, 11307}, + {11356, 11308}, + {11357, 11309}, + {11358, 11310}, + {11361, 11360}, + {11365, 570}, + {11366, 574}, + {11368, 11367}, + {11370, 11369}, + {11372, 11371}, + {11379, 11378}, + {11382, 11381}, + {11393, 11392}, + {11395, 11394}, + {11397, 11396}, + {11399, 11398}, + {11401, 11400}, + {11403, 11402}, + {11405, 11404}, + {11407, 11406}, + {11409, 11408}, + {11411, 11410}, + {11413, 11412}, + {11415, 11414}, + {11417, 11416}, + {11419, 11418}, + {11421, 11420}, + {11423, 11422}, + {11425, 11424}, + {11427, 11426}, + {11429, 11428}, + {11431, 11430}, + {11433, 11432}, + {11435, 11434}, + {11437, 11436}, + {11439, 11438}, + {11441, 11440}, + {11443, 11442}, + {11445, 11444}, + {11447, 11446}, + {11449, 11448}, + {11451, 11450}, + {11453, 11452}, + {11455, 11454}, + {11457, 11456}, + {11459, 11458}, + {11461, 11460}, + {11463, 11462}, + {11465, 11464}, + {11467, 11466}, + {11469, 11468}, + {11471, 11470}, + {11473, 11472}, + {11475, 11474}, + {11477, 11476}, + {11479, 11478}, + {11481, 11480}, + {11483, 11482}, + {11485, 11484}, + {11487, 11486}, + {11489, 11488}, + {11491, 11490}, + {11500, 11499}, + {11502, 11501}, + {11507, 11506}, + {11520, 4256}, + {11521, 4257}, + {11522, 4258}, + {11523, 4259}, + {11524, 4260}, + {11525, 4261}, + {11526, 4262}, + {11527, 4263}, + {11528, 4264}, + {11529, 4265}, + {11530, 4266}, + {11531, 4267}, + {11532, 4268}, + {11533, 4269}, + {11534, 4270}, + {11535, 4271}, + {11536, 4272}, + {11537, 4273}, + {11538, 4274}, + {11539, 4275}, + {11540, 4276}, + {11541, 4277}, + {11542, 4278}, + {11543, 4279}, + {11544, 4280}, + {11545, 4281}, + {11546, 4282}, + {11547, 4283}, + {11548, 4284}, + {11549, 4285}, + {11550, 4286}, + {11551, 4287}, + {11552, 4288}, + {11553, 4289}, + {11554, 4290}, + {11555, 4291}, + {11556, 4292}, + {11557, 4293}, + {11559, 4295}, + {11565, 4301}, + {42561, 42560}, + {42563, 42562}, + {42565, 42564}, + {42567, 42566}, + {42569, 42568}, + {42571, 42570}, + {42573, 42572}, + {42575, 42574}, + {42577, 42576}, + {42579, 42578}, + {42581, 42580}, + {42583, 42582}, + {42585, 42584}, + {42587, 42586}, + {42589, 42588}, + {42591, 42590}, + {42593, 42592}, + {42595, 42594}, + {42597, 42596}, + {42599, 42598}, + {42601, 42600}, + {42603, 42602}, + {42605, 42604}, + {42625, 42624}, + {42627, 42626}, + {42629, 42628}, + {42631, 42630}, + {42633, 42632}, + {42635, 42634}, + {42637, 42636}, + {42639, 42638}, + {42641, 42640}, + {42643, 42642}, + {42645, 42644}, + {42647, 42646}, + {42649, 42648}, + {42651, 42650}, + {42787, 42786}, + {42789, 42788}, + {42791, 42790}, + {42793, 42792}, + {42795, 42794}, + {42797, 42796}, + {42799, 42798}, + {42803, 42802}, + {42805, 42804}, + {42807, 42806}, + {42809, 42808}, + {42811, 42810}, + {42813, 42812}, + {42815, 42814}, + {42817, 42816}, + {42819, 42818}, + {42821, 42820}, + {42823, 42822}, + {42825, 42824}, + {42827, 42826}, + {42829, 42828}, + {42831, 42830}, + {42833, 42832}, + {42835, 42834}, + {42837, 42836}, + {42839, 42838}, + {42841, 42840}, + {42843, 42842}, + {42845, 42844}, + {42847, 42846}, + {42849, 42848}, + {42851, 42850}, + {42853, 42852}, + {42855, 42854}, + {42857, 42856}, + {42859, 42858}, + {42861, 42860}, + {42863, 42862}, + {42874, 42873}, + {42876, 42875}, + {42879, 42878}, + {42881, 42880}, + {42883, 42882}, + {42885, 42884}, + {42887, 42886}, + {42892, 42891}, + {42897, 42896}, + {42899, 42898}, + {42903, 42902}, + {42905, 42904}, + {42907, 42906}, + {42909, 42908}, + {42911, 42910}, + {42913, 42912}, + {42915, 42914}, + {42917, 42916}, + {42919, 42918}, + {42921, 42920}, + {42933, 42932}, + {42935, 42934}, + {42937, 42936}, + {43859, 42931}, + {43888, 5024}, + {43889, 5025}, + {43890, 5026}, + {43891, 5027}, + {43892, 5028}, + {43893, 5029}, + {43894, 5030}, + {43895, 5031}, + {43896, 5032}, + {43897, 5033}, + {43898, 5034}, + {43899, 5035}, + {43900, 5036}, + {43901, 5037}, + {43902, 5038}, + {43903, 5039}, + {43904, 5040}, + {43905, 5041}, + {43906, 5042}, + {43907, 5043}, + {43908, 5044}, + {43909, 5045}, + {43910, 5046}, + {43911, 5047}, + {43912, 5048}, + {43913, 5049}, + {43914, 5050}, + {43915, 5051}, + {43916, 5052}, + {43917, 5053}, + {43918, 5054}, + {43919, 5055}, + {43920, 5056}, + {43921, 5057}, + {43922, 5058}, + {43923, 5059}, + {43924, 5060}, + {43925, 5061}, + {43926, 5062}, + {43927, 5063}, + {43928, 5064}, + {43929, 5065}, + {43930, 5066}, + {43931, 5067}, + {43932, 5068}, + {43933, 5069}, + {43934, 5070}, + {43935, 5071}, + {43936, 5072}, + {43937, 5073}, + {43938, 5074}, + {43939, 5075}, + {43940, 5076}, + {43941, 5077}, + {43942, 5078}, + {43943, 5079}, + {43944, 5080}, + {43945, 5081}, + {43946, 5082}, + {43947, 5083}, + {43948, 5084}, + {43949, 5085}, + {43950, 5086}, + {43951, 5087}, + {43952, 5088}, + {43953, 5089}, + {43954, 5090}, + {43955, 5091}, + {43956, 5092}, + {43957, 5093}, + {43958, 5094}, + {43959, 5095}, + {43960, 5096}, + {43961, 5097}, + {43962, 5098}, + {43963, 5099}, + {43964, 5100}, + {43965, 5101}, + {43966, 5102}, + {43967, 5103}, + {65345, 65313}, + {65346, 65314}, + {65347, 65315}, + {65348, 65316}, + {65349, 65317}, + {65350, 65318}, + {65351, 65319}, + {65352, 65320}, + {65353, 65321}, + {65354, 65322}, + {65355, 65323}, + {65356, 65324}, + {65357, 65325}, + {65358, 65326}, + {65359, 65327}, + {65360, 65328}, + {65361, 65329}, + {65362, 65330}, + {65363, 65331}, + {65364, 65332}, + {65365, 65333}, + {65366, 65334}, + {65367, 65335}, + {65368, 65336}, + {65369, 65337}, + {65370, 65338}, + {66600, 66560}, + {66601, 66561}, + {66602, 66562}, + {66603, 66563}, + {66604, 66564}, + {66605, 66565}, + {66606, 66566}, + {66607, 66567}, + {66608, 66568}, + {66609, 66569}, + {66610, 66570}, + {66611, 66571}, + {66612, 66572}, + {66613, 66573}, + {66614, 66574}, + {66615, 66575}, + {66616, 66576}, + {66617, 66577}, + {66618, 66578}, + {66619, 66579}, + {66620, 66580}, + {66621, 66581}, + {66622, 66582}, + {66623, 66583}, + {66624, 66584}, + {66625, 66585}, + {66626, 66586}, + {66627, 66587}, + {66628, 66588}, + {66629, 66589}, + {66630, 66590}, + {66631, 66591}, + {66632, 66592}, + {66633, 66593}, + {66634, 66594}, + {66635, 66595}, + {66636, 66596}, + {66637, 66597}, + {66638, 66598}, + {66639, 66599}, + {66776, 66736}, + {66777, 66737}, + {66778, 66738}, + {66779, 66739}, + {66780, 66740}, + {66781, 66741}, + {66782, 66742}, + {66783, 66743}, + {66784, 66744}, + {66785, 66745}, + {66786, 66746}, + {66787, 66747}, + {66788, 66748}, + {66789, 66749}, + {66790, 66750}, + {66791, 66751}, + {66792, 66752}, + {66793, 66753}, + {66794, 66754}, + {66795, 66755}, + {66796, 66756}, + {66797, 66757}, + {66798, 66758}, + {66799, 66759}, + {66800, 66760}, + {66801, 66761}, + {66802, 66762}, + {66803, 66763}, + {66804, 66764}, + {66805, 66765}, + {66806, 66766}, + {66807, 66767}, + {66808, 66768}, + {66809, 66769}, + {66810, 66770}, + {66811, 66771}, + {68800, 68736}, + {68801, 68737}, + {68802, 68738}, + {68803, 68739}, + {68804, 68740}, + {68805, 68741}, + {68806, 68742}, + {68807, 68743}, + {68808, 68744}, + {68809, 68745}, + {68810, 68746}, + {68811, 68747}, + {68812, 68748}, + {68813, 68749}, + {68814, 68750}, + {68815, 68751}, + {68816, 68752}, + {68817, 68753}, + {68818, 68754}, + {68819, 68755}, + {68820, 68756}, + {68821, 68757}, + {68822, 68758}, + {68823, 68759}, + {68824, 68760}, + {68825, 68761}, + {68826, 68762}, + {68827, 68763}, + {68828, 68764}, + {68829, 68765}, + {68830, 68766}, + {68831, 68767}, + {68832, 68768}, + {68833, 68769}, + {68834, 68770}, + {68835, 68771}, + {68836, 68772}, + {68837, 68773}, + {68838, 68774}, + {68839, 68775}, + {68840, 68776}, + {68841, 68777}, + {68842, 68778}, + {68843, 68779}, + {68844, 68780}, + {68845, 68781}, + {68846, 68782}, + {68847, 68783}, + {68848, 68784}, + {68849, 68785}, + {68850, 68786}, + {71872, 71840}, + {71873, 71841}, + {71874, 71842}, + {71875, 71843}, + {71876, 71844}, + {71877, 71845}, + {71878, 71846}, + {71879, 71847}, + {71880, 71848}, + {71881, 71849}, + {71882, 71850}, + {71883, 71851}, + {71884, 71852}, + {71885, 71853}, + {71886, 71854}, + {71887, 71855}, + {71888, 71856}, + {71889, 71857}, + {71890, 71858}, + {71891, 71859}, + {71892, 71860}, + {71893, 71861}, + {71894, 71862}, + {71895, 71863}, + {71896, 71864}, + {71897, 71865}, + {71898, 71866}, + {71899, 71867}, + {71900, 71868}, + {71901, 71869}, + {71902, 71870}, + {71903, 71871}, + {93792, 93760}, + {93793, 93761}, + {93794, 93762}, + {93795, 93763}, + {93796, 93764}, + {93797, 93765}, + {93798, 93766}, + {93799, 93767}, + {93800, 93768}, + {93801, 93769}, + {93802, 93770}, + {93803, 93771}, + {93804, 93772}, + {93805, 93773}, + {93806, 93774}, + {93807, 93775}, + {93808, 93776}, + {93809, 93777}, + {93810, 93778}, + {93811, 93779}, + {93812, 93780}, + {93813, 93781}, + {93814, 93782}, + {93815, 93783}, + {93816, 93784}, + {93817, 93785}, + {93818, 93786}, + {93819, 93787}, + {93820, 93788}, + {93821, 93789}, + {93822, 93790}, + {93823, 93791}, + {125218, 125184}, + {125219, 125185}, + {125220, 125186}, + {125221, 125187}, + {125222, 125188}, + {125223, 125189}, + {125224, 125190}, + {125225, 125191}, + {125226, 125192}, + {125227, 125193}, + {125228, 125194}, + {125229, 125195}, + {125230, 125196}, + {125231, 125197}, + {125232, 125198}, + {125233, 125199}, + {125234, 125200}, + {125235, 125201}, + {125236, 125202}, + {125237, 125203}, + {125238, 125204}, + {125239, 125205}, + {125240, 125206}, + {125241, 125207}, + {125242, 125208}, + {125243, 125209}, + {125244, 125210}, + {125245, 125211}, + {125246, 125212}, + {125247, 125213}, + {125248, 125214}, + {125249, 125215}, + {125250, 125216}, + {125251, 125217}, +}; + From a363ae312fc951ba3b9e06e7e67a32bc05e6e879 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 3 Aug 2018 20:26:44 +0200 Subject: [PATCH 049/352] Core/Flags: Make operators |= &= and ^= constexpr --- ChangeLog.md | 3 +++ include/Nazara/Core/Flags.hpp | 6 +++--- include/Nazara/Core/Flags.inl | 6 +++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8514bbf26..7eb3ce88c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -130,6 +130,9 @@ Nazara Engine: - Fixed bug where index wouldn't be used in String::FindLast and String::FindWord - Physics 2D contact callbacks now include an arbiter allowing to query/set parameters about the collision - Added movement with Ctrl in TextAreaWidget +- Added Unicode Data downloader/parser +- Integrated Unicode Data +- Fixed Flags operator |=/&=/^= not being constexpr Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/Flags.hpp b/include/Nazara/Core/Flags.hpp index 92c97de9e..189ec5c9c 100644 --- a/include/Nazara/Core/Flags.hpp +++ b/include/Nazara/Core/Flags.hpp @@ -61,9 +61,9 @@ namespace Nz constexpr bool operator==(const Flags& rhs) const; constexpr bool operator!=(const Flags& rhs) const; - /*constexpr*/ Flags& operator|=(const Flags& rhs); - /*constexpr*/ Flags& operator&=(const Flags& rhs); - /*constexpr*/ Flags& operator^=(const Flags& rhs); + constexpr Flags& operator|=(const Flags& rhs); + constexpr Flags& operator&=(const Flags& rhs); + constexpr Flags& operator^=(const Flags& rhs); static constexpr BitField GetFlagValue(E enumValue); diff --git a/include/Nazara/Core/Flags.inl b/include/Nazara/Core/Flags.inl index 2b57a59a8..f74ae2169 100644 --- a/include/Nazara/Core/Flags.inl +++ b/include/Nazara/Core/Flags.inl @@ -166,7 +166,7 @@ namespace Nz * This will enable flags which are enabled in parameter object and not in Flag object. */ template - /*constexpr*/ Flags& Flags::operator|=(const Flags& rhs) + constexpr Flags& Flags::operator|=(const Flags& rhs) { m_value |= rhs.m_value; @@ -182,7 +182,7 @@ namespace Nz * This will disable flags which are disabled in parameter object and enabled in Flag object (and vice-versa). */ template - /*constexpr*/ Flags& Flags::operator&=(const Flags& rhs) + constexpr Flags& Flags::operator&=(const Flags& rhs) { m_value &= rhs.m_value; @@ -199,7 +199,7 @@ namespace Nz * This will disable flags enabled in both Flags objects and enable those enabled in only one of the Flags objects. */ template - /*constexpr*/ Flags& Flags::operator^=(const Flags& rhs) + constexpr Flags& Flags::operator^=(const Flags& rhs) { m_value ^= rhs.m_value; m_value &= ValueMask; From 72e365efb11fb140d97769e733f309197bd0eb67 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 3 Aug 2018 20:32:49 +0200 Subject: [PATCH 050/352] Fix compilation on Linux --- src/Nazara/Core/Unicode.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Nazara/Core/Unicode.cpp b/src/Nazara/Core/Unicode.cpp index 6b5c10aa7..477a77ff4 100644 --- a/src/Nazara/Core/Unicode.cpp +++ b/src/Nazara/Core/Unicode.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #if NAZARA_CORE_INCLUDE_UNICODEDATA From 49d59d93d8ac4718394a6d7d71083f5657a418b9 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 3 Aug 2018 23:56:52 +0200 Subject: [PATCH 051/352] Revert "Core/Flags: Make operators |= &= and ^= constexpr" This reverts commit a363ae312fc951ba3b9e06e7e67a32bc05e6e879. --- ChangeLog.md | 3 --- include/Nazara/Core/Flags.hpp | 6 +++--- include/Nazara/Core/Flags.inl | 6 +++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7eb3ce88c..8514bbf26 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -130,9 +130,6 @@ Nazara Engine: - Fixed bug where index wouldn't be used in String::FindLast and String::FindWord - Physics 2D contact callbacks now include an arbiter allowing to query/set parameters about the collision - Added movement with Ctrl in TextAreaWidget -- Added Unicode Data downloader/parser -- Integrated Unicode Data -- Fixed Flags operator |=/&=/^= not being constexpr Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/Flags.hpp b/include/Nazara/Core/Flags.hpp index 189ec5c9c..92c97de9e 100644 --- a/include/Nazara/Core/Flags.hpp +++ b/include/Nazara/Core/Flags.hpp @@ -61,9 +61,9 @@ namespace Nz constexpr bool operator==(const Flags& rhs) const; constexpr bool operator!=(const Flags& rhs) const; - constexpr Flags& operator|=(const Flags& rhs); - constexpr Flags& operator&=(const Flags& rhs); - constexpr Flags& operator^=(const Flags& rhs); + /*constexpr*/ Flags& operator|=(const Flags& rhs); + /*constexpr*/ Flags& operator&=(const Flags& rhs); + /*constexpr*/ Flags& operator^=(const Flags& rhs); static constexpr BitField GetFlagValue(E enumValue); diff --git a/include/Nazara/Core/Flags.inl b/include/Nazara/Core/Flags.inl index f74ae2169..2b57a59a8 100644 --- a/include/Nazara/Core/Flags.inl +++ b/include/Nazara/Core/Flags.inl @@ -166,7 +166,7 @@ namespace Nz * This will enable flags which are enabled in parameter object and not in Flag object. */ template - constexpr Flags& Flags::operator|=(const Flags& rhs) + /*constexpr*/ Flags& Flags::operator|=(const Flags& rhs) { m_value |= rhs.m_value; @@ -182,7 +182,7 @@ namespace Nz * This will disable flags which are disabled in parameter object and enabled in Flag object (and vice-versa). */ template - constexpr Flags& Flags::operator&=(const Flags& rhs) + /*constexpr*/ Flags& Flags::operator&=(const Flags& rhs) { m_value &= rhs.m_value; @@ -199,7 +199,7 @@ namespace Nz * This will disable flags enabled in both Flags objects and enable those enabled in only one of the Flags objects. */ template - constexpr Flags& Flags::operator^=(const Flags& rhs) + /*constexpr*/ Flags& Flags::operator^=(const Flags& rhs) { m_value ^= rhs.m_value; m_value &= ValueMask; From b14367375c57b36e95d40ccc1e093afbb433bf56 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 3 Aug 2018 23:57:51 +0200 Subject: [PATCH 052/352] Add missing entries in ChangeLog --- ChangeLog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 8514bbf26..92a2f313a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -130,6 +130,8 @@ Nazara Engine: - Fixed bug where index wouldn't be used in String::FindLast and String::FindWord - Physics 2D contact callbacks now include an arbiter allowing to query/set parameters about the collision - Added movement with Ctrl in TextAreaWidget +- Added Unicode Data downloader/parser +- Integrated Unicode Data Nazara Development Kit: - Added ImageWidget (#139) From f3ea154da46e37180cfca6f9edfaa19a4a1c7eee Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 3 Aug 2018 23:58:43 +0200 Subject: [PATCH 053/352] Try to reenable AppVeyor artifacts --- appveyor.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 73d011778..8c53f2bd8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -41,9 +41,9 @@ after_build: - cd build && "./premake5.exe" package && cd ../package - 7z a NazaraEngine.7z * && cd .. -#artifacts: -# - path: package/NazaraEngine.7z -# name: 'NazaraEngine-$(CONFIGURATION)-$(PLATFORM)-$(APPVEYOR_REPO_COMMIT)' +artifacts: + - path: package/NazaraEngine.7z + name: 'NazaraEngine-$(CONFIGURATION)-$(PLATFORM)-$(APPVEYOR_REPO_COMMIT)' on_success: - cd tests && "./NazaraUnitTestsServer.exe" From 602992609f19d32c8a2978bb4d5cd4da2366b4f1 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 4 Aug 2018 15:38:05 +0200 Subject: [PATCH 054/352] Sdk/RenderSystem: Add EnableCulling method --- ChangeLog.md | 2 ++ SDK/include/NDK/Systems/RenderSystem.hpp | 6 ++++- SDK/include/NDK/Systems/RenderSystem.inl | 32 +++++++++++++++++++++++- SDK/src/NDK/Systems/RenderSystem.cpp | 9 +++++-- include/Nazara/Graphics/CullingList.hpp | 2 ++ include/Nazara/Graphics/CullingList.inl | 27 ++++++++++++++++++++ 6 files changed, 74 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 92a2f313a..d12b740ab 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -132,6 +132,7 @@ Nazara Engine: - Added movement with Ctrl in TextAreaWidget - Added Unicode Data downloader/parser - Integrated Unicode Data +- Added CullingList::FillWithAllEntries method Nazara Development Kit: - Added ImageWidget (#139) @@ -186,6 +187,7 @@ Nazara Development Kit: - Fixed GraphicsComponent copy constructor not copying scissor rect - Force parent parameter to be present in widgets constructor - Added the possibility to write only specific characters with a predicate in TextAreaWidget +- It is now possible to disable object culling in the RenderSystem # 0.4: diff --git a/SDK/include/NDK/Systems/RenderSystem.hpp b/SDK/include/NDK/Systems/RenderSystem.hpp index 1cfa1eabf..3b9d3f239 100644 --- a/SDK/include/NDK/Systems/RenderSystem.hpp +++ b/SDK/include/NDK/Systems/RenderSystem.hpp @@ -25,12 +25,13 @@ namespace Ndk { public: RenderSystem(); - inline RenderSystem(const RenderSystem& renderSystem); ~RenderSystem() = default; template T& ChangeRenderTechnique(); inline Nz::AbstractRenderTechnique& ChangeRenderTechnique(std::unique_ptr&& renderTechnique); + inline void EnableCulling(bool enable); + inline const Nz::BackgroundRef& GetDefaultBackground() const; inline const Nz::Matrix4f& GetCoordinateSystemMatrix() const; inline Nz::Vector3f GetGlobalForward() const; @@ -38,6 +39,8 @@ namespace Ndk inline Nz::Vector3f GetGlobalUp() const; inline Nz::AbstractRenderTechnique& GetRenderTechnique() const; + inline bool IsCullingEnabled() const; + inline void SetDefaultBackground(Nz::BackgroundRef background); inline void SetGlobalForward(const Nz::Vector3f& direction); inline void SetGlobalRight(const Nz::Vector3f& direction); @@ -72,6 +75,7 @@ namespace Ndk Nz::RenderTexture m_shadowRT; bool m_coordinateSystemInvalidated; bool m_forceRenderQueueInvalidation; + bool m_isCullingEnabled; }; } diff --git a/SDK/include/NDK/Systems/RenderSystem.inl b/SDK/include/NDK/Systems/RenderSystem.inl index 7018ceef2..335026f17 100644 --- a/SDK/include/NDK/Systems/RenderSystem.inl +++ b/SDK/include/NDK/Systems/RenderSystem.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 { /*! @@ -26,7 +28,24 @@ namespace Ndk inline Nz::AbstractRenderTechnique& RenderSystem::ChangeRenderTechnique(std::unique_ptr&& renderTechnique) { m_renderTechnique = std::move(renderTechnique); - return *m_renderTechnique.get(); + return *m_renderTechnique; + } + + /*! + * \brief Enables/disables object culling + * + * Object culling is an algorithm used by the render system to detect invisible objects (which will not appear on screen) before they are rendered. + * This includes Frustum Culling and potentially Occlusion Culling. + * + * Disabling this is not recommended, as the system will draw every object in the world which could induce a performance loss. + * + * \param enable Whether to enable or disable culling + * + * \see IsCullingEnabled + */ + inline void RenderSystem::EnableCulling(bool enable) + { + m_isCullingEnabled = enable; } /*! @@ -89,6 +108,17 @@ namespace Ndk return *m_renderTechnique.get(); } + /*! + * \brief Query if culling is enabled (enabled by default) + * \return True if culling is enabled, false otherwise + * + * \see EnableCulling + */ + inline bool RenderSystem::IsCullingEnabled() const + { + return m_isCullingEnabled; + } + /*! * \brief Sets the background used for rendering * diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index 01ae6b2ac..57da4e78a 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -34,7 +34,8 @@ namespace Ndk RenderSystem::RenderSystem() : m_coordinateSystemMatrix(Nz::Matrix4f::Identity()), m_coordinateSystemInvalidated(true), - m_forceRenderQueueInvalidation(false) + m_forceRenderQueueInvalidation(false), + m_isCullingEnabled(true) { ChangeRenderTechnique(); SetDefaultBackground(Nz::ColorBackground::New()); @@ -203,7 +204,11 @@ namespace Ndk bool forceInvalidation = false; - std::size_t visibilityHash = m_drawableCulling.Cull(camComponent.GetFrustum(), &forceInvalidation); + std::size_t visibilityHash; + if (m_isCullingEnabled) + visibilityHash = m_drawableCulling.Cull(camComponent.GetFrustum(), &forceInvalidation); + else + visibilityHash = m_drawableCulling.FillWithAllEntries(); // Always regenerate renderqueue if particle groups are present for now (FIXME) if (!m_lights.empty() || !m_particleGroups.empty()) diff --git a/include/Nazara/Graphics/CullingList.hpp b/include/Nazara/Graphics/CullingList.hpp index af48f2542..df8be7d48 100644 --- a/include/Nazara/Graphics/CullingList.hpp +++ b/include/Nazara/Graphics/CullingList.hpp @@ -41,6 +41,8 @@ namespace Nz std::size_t Cull(const Frustumf& frustum, bool* forceInvalidation = nullptr); + std::size_t FillWithAllEntries(); + NoTestEntry RegisterNoTest(const T* renderable); SphereEntry RegisterSphereTest(const T* renderable); VolumeEntry RegisterVolumeTest(const T* renderable); diff --git a/include/Nazara/Graphics/CullingList.inl b/include/Nazara/Graphics/CullingList.inl index 5580efd8b..55aa8e35c 100644 --- a/include/Nazara/Graphics/CullingList.inl +++ b/include/Nazara/Graphics/CullingList.inl @@ -70,6 +70,33 @@ namespace Nz return visibleHash; } + template + std::size_t CullingList::FillWithAllEntries() + { + m_results.clear(); + + std::size_t visibleHash = 0U; + for (NoTestVisibilityEntry& entry : m_noTestList) + { + m_results.push_back(entry.renderable); + Nz::HashCombine(visibleHash, entry.renderable); + } + + for (SphereVisibilityEntry& entry : m_sphereTestList) + { + m_results.push_back(entry.renderable); + Nz::HashCombine(visibleHash, entry.renderable); + } + + for (VolumeVisibilityEntry& entry : m_volumeTestList) + { + m_results.push_back(entry.renderable); + Nz::HashCombine(visibleHash, entry.renderable); + } + + return visibleHash; + } + template auto CullingList::RegisterNoTest(const T* renderable) -> NoTestEntry { From 5bb16ab016a8dbe88becd5fe38a665f45af5ad26 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 5 Aug 2018 15:09:26 +0200 Subject: [PATCH 055/352] Revert "Sdk/DebugSystem: Fix OBB drawing" This reverts commit a12c72186f96554941207bcbada74fa29dc53fdb. --- SDK/src/NDK/Systems/DebugSystem.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 204737e9a..0da17c352 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -59,6 +59,7 @@ namespace Ndk { NazaraAssert(m_entityOwner, "DebugRenderable has no owner"); + const DebugComponent& entityDebug = m_entityOwner->GetComponent(); const GraphicsComponent& entityGfx = m_entityOwner->GetComponent(); Nz::Boxf aabb = entityGfx.GetBoundingVolume().aabb; @@ -85,14 +86,16 @@ namespace Ndk { NazaraAssert(m_entityOwner, "DebugRenderable has no owner"); + const DebugComponent& entityDebug = m_entityOwner->GetComponent(); const GraphicsComponent& entityGfx = m_entityOwner->GetComponent(); - Nz::OrientedBoxf entityObb = entityGfx.GetBoundingVolume().obb; - Nz::Boxf obb(entityObb.GetCorner(Nz::BoxCorner_NearLeftTop), entityObb.GetCorner(Nz::BoxCorner_FarRightBottom)); + Nz::Boxf obb = entityGfx.GetBoundingVolume().obb.localBox; - Nz::Matrix4f transformMatrix = Nz::Matrix4f::Identity(); - transformMatrix.SetScale(obb.GetLengths()); - transformMatrix.SetTranslation(obb.GetCenter()); + Nz::Matrix4f transformMatrix = instanceData.transformMatrix; + Nz::Vector3f obbCenter = transformMatrix.Transform(obb.GetCenter(), 0.f); //< Apply rotation/scale to obb center, to display it at a correct position + + transformMatrix.ApplyScale(obb.GetLengths()); + transformMatrix.ApplyTranslation(obbCenter); renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect); } From 0a5e9e040d0ac8e6043bbb4123a24c3e487fe767 Mon Sep 17 00:00:00 2001 From: Faymoon Date: Tue, 7 Aug 2018 19:08:01 +0200 Subject: [PATCH 056/352] Update PhysicsSystem2D (#179) * Update * Add: [Get/Set]AngularDaming for standardization * Fix: Name error * Add: [Get/Set][AngularDamping/MomentOfInertia] in PhysicsComponent2D * Forgot in last commit * Add: param coordSys in [PhysicsComponent2D/RigidBody2D]::SetMassCenter * Add: Some forgotten inline * Fix little error * Fix: Indentation before case * Move and Change GetCenterOfGravity * Rename m_world into m_physWorld * Rename GetWorld int GetPhysWorld * Update: PhysicsSystem2D became an interface of PhysWorld2D * Update Collison/PhysicsComponent because GetWorld was renamed * Update tests * Update: Make the interface usable with Entity instead of PhysicsComponent * Update: Make GetPhysWorld private * Update PhysicsSystem2D.hpp * Update: indent * Remove: useless blank line * update order(?) * Update PhysicsSystem2D.hpp --- SDK/include/NDK/Systems/PhysicsSystem2D.hpp | 94 ++++++++- SDK/include/NDK/Systems/PhysicsSystem2D.inl | 89 ++++++++- .../NDK/Components/CollisionComponent2D.cpp | 2 +- SDK/src/NDK/Components/PhysicsComponent2D.cpp | 2 +- SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 186 +++++++++++++++++- tests/SDK/NDK/Systems/PhysicsSystem2D.cpp | 4 +- 6 files changed, 359 insertions(+), 18 deletions(-) diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp index 66c8b1c61..95b6767c4 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp @@ -16,24 +16,112 @@ namespace Ndk { class NDK_API PhysicsSystem2D : public System { + friend class CollisionComponent2D; + friend class PhysicsComponent2D; + + using ContactEndCallback = std::function; + using ContactPreSolveCallback = std::function; + using ContactPostSolveCallback = std::function; + using ContactStartCallback = std::function; + + using DebugDrawCircleCallback = std::function; + using DebugDrawDotCallback = std::function; + using DebugDrawPolygonCallback = std::function; + using DebugDrawSegmentCallback = std::function; + using DebugDrawTickSegmentCallback = std::function; + using DebugDrawGetColorCallback = std::function; + public: + struct Callback; + struct DebugDrawOptions; + struct NearestQueryResult; + struct RaycastHit; + PhysicsSystem2D(); PhysicsSystem2D(const PhysicsSystem2D& system); ~PhysicsSystem2D() = default; - Nz::PhysWorld2D& GetWorld(); - const Nz::PhysWorld2D& GetWorld() const; + void DebugDraw(const DebugDrawOptions& options, bool drawShapes = true, bool drawConstraints = true, bool drawCollisions = true); + + inline float GetDamping() const; + inline Nz::Vector2f GetGravity() const; + inline std::size_t GetIterationCount() const; + inline std::size_t GetMaxStepCount() const; + inline float GetStepSize() const; + + 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); + + 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, std::vector* bodies); + + void RegisterCallbacks(unsigned int collisionId, const Callback& callbacks); + void RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, const Callback& callbacks); + + inline void SetDamping(float dampingValue); + inline void SetGravity(const Nz::Vector2f& gravity); + inline void SetIterationCount(std::size_t iterationCount); + inline void SetMaxStepCount(std::size_t maxStepCount); + inline void SetStepSize(float stepSize); + + inline void UseSpatialHash(float cellSize, std::size_t entityCount); + + struct Callback + { + ContactEndCallback endCallback = nullptr; + ContactPreSolveCallback preSolveCallback = nullptr; + ContactPostSolveCallback postSolveCallback = nullptr; + ContactStartCallback startCallback = nullptr; + void* userdata; + }; + + struct DebugDrawOptions + { + Nz::Color constraintColor; + Nz::Color collisionPointColor; + Nz::Color shapeOutlineColor; + + DebugDrawCircleCallback circleCallback; + DebugDrawGetColorCallback colorCallback; + DebugDrawDotCallback dotCallback; + DebugDrawPolygonCallback polygonCallback; + DebugDrawSegmentCallback segmentCallback; + DebugDrawTickSegmentCallback thickSegmentCallback; + + void* userdata; + }; + + struct NearestQueryResult + { + EntityHandle nearestBody; + Nz::Vector2f closestPoint; + Nz::Vector2f fraction; + float distance; + }; + + struct RaycastHit + { + EntityHandle body; + Nz::Vector2f hitPos; + Nz::Vector2f hitNormal; + float fraction; + }; static SystemIndex systemIndex; private: void CreatePhysWorld() const; + const EntityHandle& GetEntityFromBody(const Nz::RigidBody2D& body) const; + Nz::PhysWorld2D& GetPhysWorld(); + const Nz::PhysWorld2D& GetPhysWorld() const; void OnEntityValidation(Entity* entity, bool justAdded) override; void OnUpdate(float elapsedTime) override; EntityList m_dynamicObjects; EntityList m_staticObjects; - mutable std::unique_ptr m_world; ///TODO: std::optional (Should I make a Nz::Optional class?) + mutable std::unique_ptr m_physWorld; ///TODO: std::optional (Should I make a Nz::Optional class?) }; } diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.inl b/SDK/include/NDK/Systems/PhysicsSystem2D.inl index 5f0755cff..cc1010c1f 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.inl +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.inl @@ -4,17 +4,94 @@ namespace Ndk { + inline float PhysicsSystem2D::GetDamping() const + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + return m_physWorld->GetDamping(); + } + + inline Nz::Vector2f PhysicsSystem2D::GetGravity() const + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + return m_physWorld->GetGravity(); + } + + inline std::size_t PhysicsSystem2D::GetIterationCount() const + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + return m_physWorld->GetIterationCount(); + } + + inline std::size_t PhysicsSystem2D::GetMaxStepCount() const + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + return m_physWorld->GetMaxStepCount(); + } + + inline float PhysicsSystem2D::GetStepSize() const + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + return m_physWorld->GetStepSize(); + } + + inline void PhysicsSystem2D::SetDamping(float dampingValue) + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + m_physWorld->SetDamping(dampingValue); + } + + inline void PhysicsSystem2D::SetGravity(const Nz::Vector2f& gravity) + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + m_physWorld->SetGravity(gravity); + } + + inline void PhysicsSystem2D::SetIterationCount(std::size_t iterationCount) + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + m_physWorld->SetIterationCount(iterationCount); + } + + inline void PhysicsSystem2D::SetMaxStepCount(std::size_t maxStepCount) + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + m_physWorld->SetMaxStepCount(maxStepCount); + } + + inline void PhysicsSystem2D::SetStepSize(float stepSize) + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + m_physWorld->SetStepSize(stepSize); + } + + inline void PhysicsSystem2D::UseSpatialHash(float cellSize, std::size_t entityCount) + { + NazaraAssert(m_physWorld, "Invalid physics world"); + + m_physWorld->UseSpatialHash(cellSize, entityCount); + } + /*! * \brief Gets the physical world * \return A reference to the physical world */ - inline Nz::PhysWorld2D& PhysicsSystem2D::GetWorld() + inline Nz::PhysWorld2D& PhysicsSystem2D::GetPhysWorld() { - if (!m_world) + if (!m_physWorld) CreatePhysWorld(); - return *m_world; + return *m_physWorld; } /*! @@ -22,11 +99,11 @@ namespace Ndk * \return A constant reference to the physical world */ - inline const Nz::PhysWorld2D& PhysicsSystem2D::GetWorld() const + inline const Nz::PhysWorld2D& PhysicsSystem2D::GetPhysWorld() const { - if (!m_world) + if (!m_physWorld) CreatePhysWorld(); - return *m_world; + return *m_physWorld; } } diff --git a/SDK/src/NDK/Components/CollisionComponent2D.cpp b/SDK/src/NDK/Components/CollisionComponent2D.cpp index 9e88f396b..fd78e6c97 100644 --- a/SDK/src/NDK/Components/CollisionComponent2D.cpp +++ b/SDK/src/NDK/Components/CollisionComponent2D.cpp @@ -56,7 +56,7 @@ namespace Ndk NazaraAssert(entityWorld, "Entity must have world"); NazaraAssert(entityWorld->HasSystem(), "World must have a physics system"); - Nz::PhysWorld2D& physWorld = entityWorld->GetSystem().GetWorld(); + Nz::PhysWorld2D& physWorld = entityWorld->GetSystem().GetPhysWorld(); m_staticBody = std::make_unique(&physWorld, 0.f, m_geom); m_staticBody->SetUserdata(reinterpret_cast(static_cast(m_entity->GetId()))); diff --git a/SDK/src/NDK/Components/PhysicsComponent2D.cpp b/SDK/src/NDK/Components/PhysicsComponent2D.cpp index e2e199a22..62cd922a4 100644 --- a/SDK/src/NDK/Components/PhysicsComponent2D.cpp +++ b/SDK/src/NDK/Components/PhysicsComponent2D.cpp @@ -29,7 +29,7 @@ namespace Ndk World* entityWorld = m_entity->GetWorld(); NazaraAssert(entityWorld->HasSystem(), "World must have a 2D physics system"); - Nz::PhysWorld2D& world = entityWorld->GetSystem().GetWorld(); + Nz::PhysWorld2D& world = entityWorld->GetSystem().GetPhysWorld(); Nz::Collider2DRef geom; if (m_entity->HasComponent()) diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index 95c3f426b..ec615b041 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -33,9 +34,108 @@ namespace Ndk void PhysicsSystem2D::CreatePhysWorld() const { - NazaraAssert(!m_world, "Physics world should not be created twice"); + NazaraAssert(!m_physWorld, "Physics world should not be created twice"); - m_world = std::make_unique(); + m_physWorld = std::make_unique(); + } + + void PhysicsSystem2D::DebugDraw(const DebugDrawOptions& options, bool drawShapes, bool drawConstraints, bool drawCollisions) + { + Nz::PhysWorld2D::DebugDrawOptions worldOptions{ options.constraintColor, options.collisionPointColor, options.shapeOutlineColor }; + + if (options.colorCallback) + { + worldOptions.colorCallback = [&options, this](Nz::RigidBody2D& body, std::size_t shapeIndex, void* userdata) + { + return options.colorCallback(GetEntityFromBody(body), shapeIndex, userdata); + }; + } + + worldOptions.circleCallback = options.circleCallback; + worldOptions.dotCallback = options.dotCallback; + worldOptions.polygonCallback = options.polygonCallback; + worldOptions.segmentCallback = options.segmentCallback; + worldOptions.thickSegmentCallback = options.thickSegmentCallback; + + worldOptions.userdata = options.userdata; + + m_physWorld->DebugDraw(worldOptions, drawShapes, drawConstraints, drawCollisions); + } + + const EntityHandle& PhysicsSystem2D::GetEntityFromBody(const Nz::RigidBody2D& body) const + { + auto entityId = static_cast(reinterpret_cast(body.GetUserdata())); + + auto& world = GetWorld(); + + NazaraAssert(world.IsEntityIdValid(entityId), "All Bodies of this world must be part of the physics world by using PhysicsComponent"); + + return world.GetEntity(entityId); + } + + bool PhysicsSystem2D::NearestBodyQuery(const Nz::Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, EntityHandle* nearestBody) + { + Nz::RigidBody2D* body; + bool res = m_physWorld->NearestBodyQuery(from, maxDistance, collisionGroup, categoryMask, collisionMask, &body); + + (*nearestBody) = GetEntityFromBody(*body); + + return res; + } + + 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 = m_physWorld->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; + + return res; + } + + 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; + bool res = m_physWorld->RaycastQuery(from, to, radius, collisionGroup, categoryMask, collisionMask, &queryResult); + + for (auto& hitResult : queryResult) + { + hitInfos->push_back({ + GetEntityFromBody(*hitResult.nearestBody), + std::move(hitResult.hitPos), + std::move(hitResult.hitNormal), + hitResult.fraction + }); + } + + return res; + } + + 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 = m_physWorld->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; + + return res; + } + + void PhysicsSystem2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies) + { + std::vector queryResult; + m_physWorld->RegionQuery(boundingBox, collisionGroup, categoryMask, collisionMask, &queryResult); + + for (auto& body : queryResult) + { + bodies->emplace_back(GetEntityFromBody(*body)); + } } /*! @@ -58,7 +158,7 @@ namespace Ndk auto& entities = (entity->HasComponent()) ? m_dynamicObjects : m_staticObjects; entities.Insert(entity); - if (!m_world) + if (!m_physWorld) CreatePhysWorld(); } @@ -70,10 +170,10 @@ namespace Ndk void PhysicsSystem2D::OnUpdate(float elapsedTime) { - if (!m_world) + if (!m_physWorld) return; - m_world->Step(elapsedTime); + m_physWorld->Step(elapsedTime); for (const Ndk::EntityHandle& entity : m_dynamicObjects) { @@ -124,5 +224,81 @@ namespace Ndk } } + void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionId, const Callback& callbacks) + { + Nz::PhysWorld2D::Callback worldCallbacks; + + if (callbacks.endCallback) + { + worldCallbacks.endCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + { + callbacks.endCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + }; + } + if (callbacks.preSolveCallback) + { + worldCallbacks.preSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + { + return callbacks.preSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + }; + } + if (callbacks.postSolveCallback) + { + worldCallbacks.postSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + { + callbacks.preSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + }; + } + if (callbacks.startCallback) + { + worldCallbacks.startCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + { + return callbacks.startCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + }; + } + + worldCallbacks.userdata = callbacks.userdata; + + m_physWorld->RegisterCallbacks(collisionId, worldCallbacks); + } + + void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, const Callback& callbacks) + { + Nz::PhysWorld2D::Callback worldCallbacks{}; + + if (callbacks.endCallback) + { + worldCallbacks.endCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + { + callbacks.endCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + }; + } + if (callbacks.preSolveCallback) + { + worldCallbacks.preSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + { + return callbacks.preSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + }; + } + if (callbacks.postSolveCallback) + { + worldCallbacks.postSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + { + callbacks.preSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + }; + } + if (callbacks.startCallback) + { + worldCallbacks.startCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + { + return callbacks.startCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + }; + } + + worldCallbacks.userdata = callbacks.userdata; + + m_physWorld->RegisterCallbacks(collisionIdA, collisionIdB, worldCallbacks); + } + SystemIndex PhysicsSystem2D::systemIndex; } diff --git a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp index 53808dc42..3cda3f0f1 100644 --- a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp +++ b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp @@ -21,7 +21,7 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") Ndk::PhysicsComponent2D& physicsComponent2D = movingEntity->AddComponent(); world.GetSystem().SetMaximumUpdateRate(0.f); - world.GetSystem().GetWorld().SetMaxStepCount(std::numeric_limits::max()); + world.GetSystem().SetMaxStepCount(std::numeric_limits::max()); WHEN("We update the world") { @@ -100,7 +100,7 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") WHEN("We put a force on it") { - float stepSize = world.GetSystem().GetWorld().GetStepSize(); + float stepSize = world.GetSystem().GetStepSize(); Nz::Vector2f velocity = Nz::Vector2f::UnitX(); physicsComponent2D.AddForce(velocity / stepSize); world.Update(1.f); From fd2c775d3e606adfff7b4740c434ea16def66a20 Mon Sep 17 00:00:00 2001 From: Faymoon Date: Wed, 8 Aug 2018 10:34:34 +0200 Subject: [PATCH 057/352] Update ChangeLog.md (#180) --- ChangeLog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index d12b740ab..847ddc992 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -188,6 +188,8 @@ Nazara Development Kit: - Force parent parameter to be present in widgets constructor - Added the possibility to write only specific characters with a predicate in TextAreaWidget - It is now possible to disable object culling in the RenderSystem +- Make Nz::PhysWorld2D& Ndk::PhysicsSystem2D::GetWorld private and rename it into GetPhysWorld +- Make Ndk::PhysicsSystem2D an interface of Nz::PhysWorld2D # 0.4: From 9ecfe316371a46422566c4ba69a721e97aeff81d Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 8 Aug 2018 10:35:49 +0200 Subject: [PATCH 058/352] Build: Copy .dll only if host is Windows --- ChangeLog.md | 1 + build/scripts/common.lua | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 847ddc992..9fc275f46 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -17,6 +17,7 @@ Miscellaneous: - NDEBUG is now defined in Release - Replaced typedefs keywords with modern using keywords - When supported, projects are now parts of a virtual "workspace group" according to their kind +- Fixed .dll copy when building Nazara occuring on Linux when targeting Windows (MinGW) 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/build/scripts/common.lua b/build/scripts/common.lua index 5c1298fb1..20472cf0d 100644 --- a/build/scripts/common.lua +++ b/build/scripts/common.lua @@ -608,7 +608,7 @@ function NazaraBuild:LoadConfig() end function NazaraBuild:MakeInstallCommands(infoTable) - if (os.istarget("windows")) then + if (os.ishost("windows")) then filter("kind:SharedLib") postbuildmessage("Copying " .. infoTable.Name .. " library and its dependencies to install/executable directories...") From beca6e7dd565f2e7c281ba6b388fc03498812120 Mon Sep 17 00:00:00 2001 From: Faymoon Date: Tue, 14 Aug 2018 18:44:41 +0200 Subject: [PATCH 059/352] little fixes (#183) * Update * Add: [Get/Set]AngularDaming for standardization * Fix: Name error * Add: [Get/Set][AngularDamping/MomentOfInertia] in PhysicsComponent2D * Forgot in last commit * Add: param coordSys in [PhysicsComponent2D/RigidBody2D]::SetMassCenter * Add: Some forgotten inline * Fix little error * Fix: Indentation before case * Move and Change GetCenterOfGravity * Rename m_world into m_physWorld * Rename GetWorld int GetPhysWorld * Update: PhysicsSystem2D became an interface of PhysWorld2D * Update Collison/PhysicsComponent because GetWorld was renamed * Update tests * Update: Make the interface usable with Entity instead of PhysicsComponent * Update: Make GetPhysWorld private * Update PhysicsSystem2D.hpp * Update: indent * Remove: useless blank line * update order(?) * Update PhysicsSystem2D.hpp * Add calls to GetPhysWorld to attempt a nullptr value * update include * little fix * add some missing inline --- .../NDK/Components/PhysicsComponent3D.hpp | 70 +++++++++---------- SDK/include/NDK/Systems/PhysicsSystem2D.hpp | 4 +- SDK/include/NDK/Systems/PhysicsSystem2D.inl | 44 +++--------- SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 12 ++-- src/Nazara/Network/Win32/SocketImpl.cpp | 2 +- 5 files changed, 55 insertions(+), 77 deletions(-) diff --git a/SDK/include/NDK/Components/PhysicsComponent3D.hpp b/SDK/include/NDK/Components/PhysicsComponent3D.hpp index 98e36079a..d7c9ddd52 100644 --- a/SDK/include/NDK/Components/PhysicsComponent3D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent3D.hpp @@ -23,49 +23,49 @@ namespace Ndk PhysicsComponent3D(const PhysicsComponent3D& physics); ~PhysicsComponent3D() = default; - void AddForce(const Nz::Vector3f& force, Nz::CoordSys coordSys = Nz::CoordSys_Global); - void AddForce(const Nz::Vector3f& force, const Nz::Vector3f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global); - void AddTorque(const Nz::Vector3f& torque, Nz::CoordSys coordSys = Nz::CoordSys_Global); + inline void AddForce(const Nz::Vector3f& force, Nz::CoordSys coordSys = Nz::CoordSys_Global); + inline void AddForce(const Nz::Vector3f& force, const Nz::Vector3f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global); + inline void AddTorque(const Nz::Vector3f& torque, Nz::CoordSys coordSys = Nz::CoordSys_Global); - void EnableAutoSleep(bool autoSleep); - void EnableNodeSynchronization(bool nodeSynchronization); + inline void EnableAutoSleep(bool autoSleep); + inline void EnableNodeSynchronization(bool nodeSynchronization); - Nz::Boxf GetAABB() const; - Nz::Vector3f GetAngularDamping() const; - Nz::Vector3f GetAngularVelocity() const; - float GetGravityFactor() const; - float GetLinearDamping() const; - Nz::Vector3f GetLinearVelocity() const; - float GetMass() const; - Nz::Vector3f GetMassCenter(Nz::CoordSys coordSys = Nz::CoordSys_Local) const; - const Nz::Matrix4f& GetMatrix() const; - Nz::Vector3f GetPosition() const; - Nz::Quaternionf GetRotation() const; + inline Nz::Boxf GetAABB() const; + inline Nz::Vector3f GetAngularDamping() const; + inline Nz::Vector3f GetAngularVelocity() const; + inline float GetGravityFactor() const; + inline float GetLinearDamping() const; + inline Nz::Vector3f GetLinearVelocity() const; + inline float GetMass() const; + inline Nz::Vector3f GetMassCenter(Nz::CoordSys coordSys = Nz::CoordSys_Local) const; + inline const Nz::Matrix4f& GetMatrix() const; + inline Nz::Vector3f GetPosition() const; + inline Nz::Quaternionf GetRotation() const; - bool IsAutoSleepEnabled() const; - bool IsMoveable() const; - bool IsNodeSynchronizationEnabled() const; - bool IsSleeping() const; + inline bool IsAutoSleepEnabled() const; + inline bool IsMoveable() const; + inline bool IsNodeSynchronizationEnabled() const; + inline bool IsSleeping() const; - void SetAngularDamping(const Nz::Vector3f& angularDamping); - void SetAngularVelocity(const Nz::Vector3f& angularVelocity); - void SetGravityFactor(float gravityFactor); - void SetLinearDamping(float damping); - void SetLinearVelocity(const Nz::Vector3f& velocity); - void SetMass(float mass); - void SetMassCenter(const Nz::Vector3f& center); - void SetMaterial(const Nz::String& materialName); - void SetMaterial(int materialIndex); - void SetPosition(const Nz::Vector3f& position); - void SetRotation(const Nz::Quaternionf& rotation); + inline void SetAngularDamping(const Nz::Vector3f& angularDamping); + inline void SetAngularVelocity(const Nz::Vector3f& angularVelocity); + inline void SetGravityFactor(float gravityFactor); + inline void SetLinearDamping(float damping); + inline void SetLinearVelocity(const Nz::Vector3f& velocity); + inline void SetMass(float mass); + inline void SetMassCenter(const Nz::Vector3f& center); + inline void SetMaterial(const Nz::String& materialName); + inline void SetMaterial(int materialIndex); + inline void SetPosition(const Nz::Vector3f& position); + inline void SetRotation(const Nz::Quaternionf& rotation); static ComponentIndex componentIndex; private: - void ApplyPhysicsState(Nz::RigidBody3D& rigidBody) const; - void CopyPhysicsState(const Nz::RigidBody3D& rigidBody); - Nz::RigidBody3D* GetRigidBody(); - const Nz::RigidBody3D& GetRigidBody() const; + inline void ApplyPhysicsState(Nz::RigidBody3D& rigidBody) const; + inline void CopyPhysicsState(const Nz::RigidBody3D& rigidBody); + inline Nz::RigidBody3D* GetRigidBody(); + inline const Nz::RigidBody3D& GetRigidBody() const; void OnAttached() override; void OnComponentAttached(BaseComponent& component) override; diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp index 95b6767c4..1683fc7fb 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp @@ -114,8 +114,8 @@ namespace Ndk private: void CreatePhysWorld() const; const EntityHandle& GetEntityFromBody(const Nz::RigidBody2D& body) const; - Nz::PhysWorld2D& GetPhysWorld(); - const Nz::PhysWorld2D& GetPhysWorld() const; + inline Nz::PhysWorld2D& GetPhysWorld(); + inline const Nz::PhysWorld2D& GetPhysWorld() const; void OnEntityValidation(Entity* entity, bool justAdded) override; void OnUpdate(float elapsedTime) override; diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.inl b/SDK/include/NDK/Systems/PhysicsSystem2D.inl index cc1010c1f..b8e7c61a2 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.inl +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.inl @@ -6,79 +6,57 @@ namespace Ndk { inline float PhysicsSystem2D::GetDamping() const { - NazaraAssert(m_physWorld, "Invalid physics world"); - - return m_physWorld->GetDamping(); + return GetPhysWorld().GetDamping(); } inline Nz::Vector2f PhysicsSystem2D::GetGravity() const { - NazaraAssert(m_physWorld, "Invalid physics world"); - - return m_physWorld->GetGravity(); + return GetPhysWorld().GetGravity(); } inline std::size_t PhysicsSystem2D::GetIterationCount() const { - NazaraAssert(m_physWorld, "Invalid physics world"); - - return m_physWorld->GetIterationCount(); + return GetPhysWorld().GetIterationCount(); } inline std::size_t PhysicsSystem2D::GetMaxStepCount() const { - NazaraAssert(m_physWorld, "Invalid physics world"); - - return m_physWorld->GetMaxStepCount(); + return GetPhysWorld().GetMaxStepCount(); } inline float PhysicsSystem2D::GetStepSize() const { - NazaraAssert(m_physWorld, "Invalid physics world"); - - return m_physWorld->GetStepSize(); + return GetPhysWorld().GetStepSize(); } inline void PhysicsSystem2D::SetDamping(float dampingValue) { - NazaraAssert(m_physWorld, "Invalid physics world"); - - m_physWorld->SetDamping(dampingValue); + GetPhysWorld().SetDamping(dampingValue); } inline void PhysicsSystem2D::SetGravity(const Nz::Vector2f& gravity) { - NazaraAssert(m_physWorld, "Invalid physics world"); - - m_physWorld->SetGravity(gravity); + GetPhysWorld().SetGravity(gravity); } inline void PhysicsSystem2D::SetIterationCount(std::size_t iterationCount) { - NazaraAssert(m_physWorld, "Invalid physics world"); - - m_physWorld->SetIterationCount(iterationCount); + GetPhysWorld().SetIterationCount(iterationCount); } inline void PhysicsSystem2D::SetMaxStepCount(std::size_t maxStepCount) { - NazaraAssert(m_physWorld, "Invalid physics world"); - - m_physWorld->SetMaxStepCount(maxStepCount); + GetPhysWorld().SetMaxStepCount(maxStepCount); } inline void PhysicsSystem2D::SetStepSize(float stepSize) { - NazaraAssert(m_physWorld, "Invalid physics world"); - - m_physWorld->SetStepSize(stepSize); + GetPhysWorld().SetStepSize(stepSize); } inline void PhysicsSystem2D::UseSpatialHash(float cellSize, std::size_t entityCount) { - NazaraAssert(m_physWorld, "Invalid physics world"); - - m_physWorld->UseSpatialHash(cellSize, entityCount); + GetPhysWorld().UseSpatialHash(cellSize, entityCount); } /*! diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index ec615b041..c717fcf80 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -59,7 +59,7 @@ namespace Ndk worldOptions.userdata = options.userdata; - m_physWorld->DebugDraw(worldOptions, drawShapes, drawConstraints, drawCollisions); + GetPhysWorld().DebugDraw(worldOptions, drawShapes, drawConstraints, drawCollisions); } const EntityHandle& PhysicsSystem2D::GetEntityFromBody(const Nz::RigidBody2D& body) const @@ -76,7 +76,7 @@ namespace Ndk bool PhysicsSystem2D::NearestBodyQuery(const Nz::Vector2f& from, float maxDistance, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, EntityHandle* nearestBody) { Nz::RigidBody2D* body; - bool res = m_physWorld->NearestBodyQuery(from, maxDistance, collisionGroup, categoryMask, collisionMask, &body); + bool res = GetPhysWorld().NearestBodyQuery(from, maxDistance, collisionGroup, categoryMask, collisionMask, &body); (*nearestBody) = GetEntityFromBody(*body); @@ -86,7 +86,7 @@ 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 = m_physWorld->NearestBodyQuery(from, maxDistance, collisionGroup, categoryMask, collisionMask, &queryResult); + bool res = GetPhysWorld().NearestBodyQuery(from, maxDistance, collisionGroup, categoryMask, collisionMask, &queryResult); result->nearestBody = GetEntityFromBody(*queryResult.nearestBody); result->closestPoint = std::move(queryResult.closestPoint); @@ -99,7 +99,7 @@ namespace Ndk 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; - bool res = m_physWorld->RaycastQuery(from, to, radius, collisionGroup, categoryMask, collisionMask, &queryResult); + bool res = GetPhysWorld().RaycastQuery(from, to, radius, collisionGroup, categoryMask, collisionMask, &queryResult); for (auto& hitResult : queryResult) { @@ -117,7 +117,7 @@ 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 = m_physWorld->RaycastQueryFirst(from, to, radius, collisionGroup, categoryMask, collisionMask, &queryResult); + bool res = GetPhysWorld().RaycastQueryFirst(from, to, radius, collisionGroup, categoryMask, collisionMask, &queryResult); hitInfo->body = GetEntityFromBody(*queryResult.nearestBody); hitInfo->hitPos = std::move(queryResult.hitPos); @@ -130,7 +130,7 @@ namespace Ndk void PhysicsSystem2D::RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies) { std::vector queryResult; - m_physWorld->RegionQuery(boundingBox, collisionGroup, categoryMask, collisionMask, &queryResult); + GetPhysWorld().RegionQuery(boundingBox, collisionGroup, categoryMask, collisionMask, &queryResult); for (auto& body : queryResult) { diff --git a/src/Nazara/Network/Win32/SocketImpl.cpp b/src/Nazara/Network/Win32/SocketImpl.cpp index 15b89801b..097927dc6 100644 --- a/src/Nazara/Network/Win32/SocketImpl.cpp +++ b/src/Nazara/Network/Win32/SocketImpl.cpp @@ -29,7 +29,7 @@ struct tcp_keepalive #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4) #endif -#include +#include #include From d83c12c2d3e906cb1ff32fbdf4c397982cbd99ea Mon Sep 17 00:00:00 2001 From: S6066 Date: Tue, 14 Aug 2018 20:53:26 +0200 Subject: [PATCH 060/352] TextAreaWidget: Make Tab writable (#175) * TextAreaWidget: Make Tab writable * Implement Tab ena/disabling, disable it by default * Log change * Rename Tab Enabling function * Add useful Write/Delete functions * Finished! * whoops * Fix everything * whoops * I don't know why but it works * whoops * I'M PUSHING. --- ChangeLog.md | 1 + SDK/include/NDK/Widgets/TextAreaWidget.hpp | 12 +- SDK/include/NDK/Widgets/TextAreaWidget.inl | 25 ++++ SDK/src/NDK/Widgets/TextAreaWidget.cpp | 131 +++++++++++++++------ 4 files changed, 128 insertions(+), 41 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 9fc275f46..da3410fb7 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -188,6 +188,7 @@ Nazara Development Kit: - Fixed GraphicsComponent copy constructor not copying scissor rect - Force parent parameter to be present in widgets constructor - Added the possibility to write only specific characters with a predicate in TextAreaWidget +- Enable write of Tab character in TextAreaWidget - It is now possible to disable object culling in the RenderSystem - Make Nz::PhysWorld2D& Ndk::PhysicsSystem2D::GetWorld private and rename it into GetPhysWorld - Make Ndk::PhysicsSystem2D an interface of Nz::PhysWorld2D diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index 4c3168c4e..f57e7a049 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -32,8 +32,12 @@ namespace Ndk //virtual TextAreaWidget* Clone() const = 0; - inline void EnableMultiline(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 CharacterFilter GetCharacterFilter() const; @@ -52,6 +56,7 @@ namespace Ndk inline bool IsMultilineEnabled() const; inline bool IsReadOnly() const; + inline bool IsTabWritingEnabled() const; inline void MoveCursor(int offset); inline void MoveCursor(const Nz::Vector2i& offset); @@ -68,7 +73,9 @@ namespace Ndk inline void SetText(const Nz::String& text); inline void SetTextColor(const Nz::Color& text); - void Write(const Nz::String& text); + 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); TextAreaWidget& operator=(const TextAreaWidget&) = delete; TextAreaWidget& operator=(TextAreaWidget&&) = default; @@ -115,6 +122,7 @@ namespace Ndk 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 7b49ddb26..88be7520a 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -23,6 +23,16 @@ namespace Ndk 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 TextAreaWidget::CharacterFilter TextAreaWidget::GetCharacterFilter() const { return m_characterFilter; @@ -102,6 +112,11 @@ namespace Ndk return m_multiLineEnabled; } + inline bool TextAreaWidget::IsTabWritingEnabled() const + { + return m_tabEnabled; + } + inline bool TextAreaWidget::IsReadOnly() const { return m_readOnly; @@ -233,4 +248,14 @@ namespace Ndk m_textSprite->Update(m_drawer); } + + 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)); + } } diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 334a78079..34ebac579 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -17,7 +17,8 @@ namespace Ndk m_cursorPositionEnd(0U, 0U), m_isMouseButtonDown(false), m_multiLineEnabled(false), - m_readOnly(false) + m_readOnly(false), + m_tabEnabled(false) { m_cursorEntity = CreateEntity(true); m_cursorEntity->AddComponent(); @@ -71,26 +72,41 @@ namespace Ndk OnTextChanged(this, m_text); } + void TextAreaWidget::Erase(std::size_t firstGlyph, std::size_t lastGlyph) + { + if (firstGlyph > lastGlyph) + std::swap(firstGlyph, lastGlyph); + + std::size_t textLength = m_text.GetLength(); + if (firstGlyph > textLength) + return; + + Nz::String newText; + if (firstGlyph > 0) + { + std::size_t characterPosition = m_text.GetCharacterPosition(firstGlyph - 1); + NazaraAssert(characterPosition != Nz::String::npos, "Invalid character position"); + + newText.Append(m_text.SubString(0, characterPosition)); + } + + if (lastGlyph < textLength) + { + std::size_t characterPosition = m_text.GetCharacterPosition(lastGlyph); + NazaraAssert(characterPosition != Nz::String::npos, "Invalid character position"); + + newText.Append(m_text.SubString(characterPosition)); + } + + SetText(newText); + } + void TextAreaWidget::EraseSelection() { if (!HasSelection()) return; - std::size_t cursorGlyphBegin = GetGlyphIndex(m_cursorPositionBegin); - std::size_t cursorGlyphEnd = GetGlyphIndex(m_cursorPositionEnd); - - std::size_t textLength = m_text.GetLength(); - if (cursorGlyphBegin > textLength) - return; - - Nz::String newText; - if (cursorGlyphBegin > 0) - newText.Append(m_text.SubString(0, m_text.GetCharacterPosition(cursorGlyphBegin) - 1)); - - if (cursorGlyphEnd < textLength) - newText.Append(m_text.SubString(m_text.GetCharacterPosition(cursorGlyphEnd))); - - SetText(newText); + Erase(GetGlyphIndex(m_cursorPositionBegin), GetGlyphIndex(m_cursorPositionEnd)); } Nz::Vector2ui TextAreaWidget::GetHoveredGlyph(float x, float y) const @@ -129,21 +145,19 @@ namespace Ndk SetContentSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); } - void TextAreaWidget::Write(const Nz::String& text) + void TextAreaWidget::Write(const Nz::String& text, std::size_t glyphPosition) { - std::size_t cursorGlyph = GetGlyphIndex(m_cursorPositionBegin); - - if (cursorGlyph >= m_drawer.GetGlyphCount()) + if (glyphPosition >= m_drawer.GetGlyphCount()) { AppendText(text); SetCursorPosition(m_drawer.GetGlyphCount()); } else { - m_text.Insert(m_text.GetCharacterPosition(cursorGlyph), text); + m_text.Insert(m_text.GetCharacterPosition(glyphPosition), text); SetText(m_text); - SetCursorPosition(cursorGlyph + text.GetLength()); + SetCursorPosition(glyphPosition + text.GetLength()); } } @@ -181,23 +195,7 @@ namespace Ndk if (HasSelection()) EraseSelection(); else - { - std::size_t cursorGlyphBegin = GetGlyphIndex(m_cursorPositionBegin); - std::size_t cursorGlyphEnd = GetGlyphIndex(m_cursorPositionEnd); - - std::size_t textLength = m_text.GetLength(); - if (cursorGlyphBegin > textLength) - return true; - - Nz::String newText; - if (cursorGlyphBegin > 0) - newText.Append(m_text.SubString(0, m_text.GetCharacterPosition(cursorGlyphBegin) - 1)); - - if (cursorGlyphEnd < textLength) - newText.Append(m_text.SubString(m_text.GetCharacterPosition(cursorGlyphEnd + 1))); - - SetText(newText); - } + Erase(GetGlyphIndex(m_cursorPositionBegin)); return true; } @@ -338,6 +336,58 @@ namespace Ndk 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: return false; } @@ -438,6 +488,9 @@ namespace Ndk if (ignoreDefaultAction || !m_multiLineEnabled) break; + if (HasSelection()) + EraseSelection(); + Write(Nz::String('\n')); break; } From e4d547316dd6eba01ff0d35cbcd99f522a407099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 16 Aug 2018 18:06:02 +0200 Subject: [PATCH 061/352] Core/ObjectHandle: Fix Reset(ObjectHandle&&) not clearing the pointer --- ChangeLog.md | 1 + include/Nazara/Core/ObjectHandle.inl | 2 ++ 2 files changed, 3 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index da3410fb7..60735f783 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -134,6 +134,7 @@ Nazara Engine: - Added Unicode Data downloader/parser - Integrated Unicode Data - Added CullingList::FillWithAllEntries method +- Fixed ObjectHandle movement sometimes not resetting its internal pointer Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/ObjectHandle.inl b/include/Nazara/Core/ObjectHandle.inl index f415f93de..0ba6afc2c 100644 --- a/include/Nazara/Core/ObjectHandle.inl +++ b/include/Nazara/Core/ObjectHandle.inl @@ -140,6 +140,8 @@ namespace Nz handle.m_object = nullptr; object->UpdateHandle(&handle, this); } + else + m_object = nullptr; } /*! From ffc833439deb4cb970fc084b916635d318fbd947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 17 Aug 2018 17:03:49 +0200 Subject: [PATCH 062/352] Physics2D/Collider2D: Add some missing getters --- ChangeLog.md | 4 +++ include/Nazara/Physics2D/Collider2D.hpp | 22 +++++++++------- include/Nazara/Physics2D/Collider2D.inl | 35 ++++++++++++++++++++----- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 60735f783..6acbd19aa 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -135,6 +135,10 @@ Nazara Engine: - Integrated Unicode Data - Added CullingList::FillWithAllEntries method - Fixed ObjectHandle movement sometimes not resetting its internal pointer +- Added BoxCollider2D::GetRadius +- Added CircleCollider2D::GetOffset +- Added ConvexCollider2D::GetVertices +- Added SegmentCollider2D::GetThickness() Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index 78e76d6d6..0ef28c8f3 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -43,19 +43,19 @@ namespace Nz virtual float ComputeMomentOfInertia(float mass) const = 0; - inline Nz::UInt32 GetCategoryMask() const; - inline Nz::UInt32 GetCollisionGroup() const; + inline UInt32 GetCategoryMask() const; + inline UInt32 GetCollisionGroup() const; inline unsigned int GetCollisionId() const; - inline Nz::UInt32 GetCollisionMask() const; + inline UInt32 GetCollisionMask() const; virtual ColliderType2D GetType() const = 0; inline bool IsTrigger() const; - inline void SetCategoryMask(Nz::UInt32 categoryMask); - inline void SetCollisionGroup(Nz::UInt32 groupId); + inline void SetCategoryMask(UInt32 categoryMask); + inline void SetCollisionGroup(UInt32 groupId); inline void SetCollisionId(unsigned int typeId); - inline void SetCollisionMask(Nz::UInt32 mask); + inline void SetCollisionMask(UInt32 mask); inline void SetTrigger(bool trigger); Collider2D& operator=(const Collider2D&) = delete; @@ -68,10 +68,10 @@ namespace Nz virtual void CreateShapes(RigidBody2D* body, std::vector& shapes) const = 0; bool m_trigger; - Nz::UInt32 m_categoryMask; - Nz::UInt32 m_collisionGroup; + UInt32 m_categoryMask; + UInt32 m_collisionGroup; unsigned int m_collisionId; - Nz::UInt32 m_collisionMask; + UInt32 m_collisionMask; private: virtual std::vector GenerateShapes(RigidBody2D* body) const; @@ -92,6 +92,7 @@ namespace Nz float ComputeMomentOfInertia(float mass) const override; + inline float GetRadius() const; inline const Rectf& GetRect() const; inline Vector2f GetSize() const; ColliderType2D GetType() const override; @@ -117,6 +118,7 @@ namespace Nz float ComputeMomentOfInertia(float mass) const override; + inline const Vector2f& GetOffset() const; inline float GetRadius() const; ColliderType2D GetType() const override; @@ -165,6 +167,7 @@ namespace Nz float ComputeMomentOfInertia(float mass) const override; ColliderType2D GetType() const override; + inline const std::vector& GetVertices() const; template static ConvexCollider2DRef New(Args&&... args); @@ -210,6 +213,7 @@ namespace Nz inline const Vector2f& GetFirstPoint() const; inline float GetLength() const; inline const Vector2f& GetSecondPoint() const; + inline float GetThickness() const; ColliderType2D GetType() const override; template static SegmentCollider2DRef New(Args&&... args); diff --git a/include/Nazara/Physics2D/Collider2D.inl b/include/Nazara/Physics2D/Collider2D.inl index 79af0942d..1f149fb3f 100644 --- a/include/Nazara/Physics2D/Collider2D.inl +++ b/include/Nazara/Physics2D/Collider2D.inl @@ -2,6 +2,7 @@ // This file is part of the "Nazara Engine - Physics 2D module" // For conditions of distribution and use, see copyright notice in Config.hpp +#include #include #include @@ -16,12 +17,12 @@ namespace Nz { } - inline Nz::UInt32 Collider2D::GetCategoryMask() const + inline UInt32 Collider2D::GetCategoryMask() const { return m_categoryMask; } - inline Nz::UInt32 Collider2D::GetCollisionGroup() const + inline UInt32 Collider2D::GetCollisionGroup() const { return m_collisionGroup; } @@ -31,7 +32,7 @@ namespace Nz return m_collisionId; } - inline Nz::UInt32 Collider2D::GetCollisionMask() const + inline UInt32 Collider2D::GetCollisionMask() const { return m_collisionMask; } @@ -41,12 +42,12 @@ namespace Nz return m_trigger; } - inline void Collider2D::SetCategoryMask(Nz::UInt32 categoryMask) + inline void Collider2D::SetCategoryMask(UInt32 categoryMask) { m_categoryMask = categoryMask; } - inline void Collider2D::SetCollisionGroup(Nz::UInt32 groupId) + inline void Collider2D::SetCollisionGroup(UInt32 groupId) { m_collisionGroup = groupId; } @@ -56,7 +57,7 @@ namespace Nz m_collisionId = typeId; } - inline void Collider2D::SetCollisionMask(Nz::UInt32 mask) + inline void Collider2D::SetCollisionMask(UInt32 mask) { m_collisionMask = mask; } @@ -66,6 +67,11 @@ namespace Nz m_trigger = trigger; } + inline float BoxCollider2D::GetRadius() const + { + return m_radius; + } + inline const Rectf& BoxCollider2D::GetRect() const { return m_rect; @@ -85,6 +91,11 @@ namespace Nz return object.release(); } + inline const Vector2f& CircleCollider2D::GetOffset() const + { + return m_offset; + } + inline float CircleCollider2D::GetRadius() const { return m_radius; @@ -99,7 +110,7 @@ namespace Nz return object.release(); } - inline const std::vector& Nz::CompoundCollider2D::GetGeoms() const + inline const std::vector& CompoundCollider2D::GetGeoms() const { return m_geoms; } @@ -113,6 +124,11 @@ namespace Nz return object.release(); } + inline const std::vector& ConvexCollider2D::GetVertices() const + { + return m_vertices; + } + template ConvexCollider2DRef ConvexCollider2D::New(Args&&... args) { @@ -153,6 +169,11 @@ namespace Nz return m_second; } + inline float SegmentCollider2D::GetThickness() const + { + return m_thickness; + } + template SegmentCollider2DRef SegmentCollider2D::New(Args&&... args) { From 2db5273d362f37692d9772781ba961231cb8e10e Mon Sep 17 00:00:00 2001 From: Faymoon Date: Thu, 23 Aug 2018 17:29:02 +0200 Subject: [PATCH 063/352] Fix (#184) --- SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index c717fcf80..0d17b27ec 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -246,7 +246,7 @@ namespace Ndk { worldCallbacks.postSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - callbacks.preSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + callbacks.postSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } if (callbacks.startCallback) @@ -284,7 +284,7 @@ namespace Ndk { worldCallbacks.postSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - callbacks.preSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + callbacks.postSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } if (callbacks.startCallback) From b9e36f36e29bafd38610a4c64a170a0c02900020 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 23 Aug 2018 17:46:18 +0200 Subject: [PATCH 064/352] Graphics/TileMap: Fix sprite data corruption with multiple materials --- ChangeLog.md | 3 ++- src/Nazara/Graphics/TileMap.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 6acbd19aa..ca17d7e7a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -138,7 +138,8 @@ Nazara Engine: - Added BoxCollider2D::GetRadius - Added CircleCollider2D::GetOffset - Added ConvexCollider2D::GetVertices -- Added SegmentCollider2D::GetThickness() +- Added SegmentCollider2D::GetThickness +- Fixed vertices generation/render queue submit when using multiples materials on a Tilemap Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Graphics/TileMap.cpp b/src/Nazara/Graphics/TileMap.cpp index 6a30496c3..eb1831bcf 100644 --- a/src/Nazara/Graphics/TileMap.cpp +++ b/src/Nazara/Graphics/TileMap.cpp @@ -31,7 +31,7 @@ namespace Nz std::size_t spriteCount = 0; for (const Layer& layer : m_layers) { - renderQueue->AddSprites(instanceData.renderOrder, GetMaterial(matCount++), &vertices[spriteCount], layer.tiles.size(), scissorRect); + renderQueue->AddSprites(instanceData.renderOrder, GetMaterial(matCount++), &vertices[4 * spriteCount], layer.tiles.size(), scissorRect); spriteCount += layer.tiles.size(); } @@ -63,9 +63,9 @@ namespace Nz spriteCount = 0; for (const Layer& layer : m_layers) { - SparsePtr colorPtr(&vertices[spriteCount].color, sizeof(VertexStruct_XYZ_Color_UV)); - SparsePtr posPtr(&vertices[spriteCount].position, sizeof(VertexStruct_XYZ_Color_UV)); - SparsePtr texCoordPtr(&vertices[spriteCount].uv, sizeof(VertexStruct_XYZ_Color_UV)); + SparsePtr colorPtr(&vertices[4 * spriteCount].color, sizeof(VertexStruct_XYZ_Color_UV)); + SparsePtr posPtr(&vertices[4 * spriteCount].position, sizeof(VertexStruct_XYZ_Color_UV)); + SparsePtr texCoordPtr(&vertices[4 * spriteCount].uv, sizeof(VertexStruct_XYZ_Color_UV)); for (std::size_t tileIndex : layer.tiles) { From 933cb644881d5473d8a325bae75d84f8950384a2 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 24 Aug 2018 16:30:03 +0200 Subject: [PATCH 065/352] Physics2D/Collider2D: Allow to prevent individual colliders properties override --- ChangeLog.md | 1 + include/Nazara/Physics2D/Collider2D.hpp | 6 ++++++ include/Nazara/Physics2D/Collider2D.inl | 10 ++++++++++ src/Nazara/Physics2D/Collider2D.cpp | 20 +++++++++++++++++--- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index ca17d7e7a..866118c41 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -140,6 +140,7 @@ Nazara Engine: - Added ConvexCollider2D::GetVertices - Added SegmentCollider2D::GetThickness - Fixed vertices generation/render queue submit when using multiples materials on a Tilemap +- It is now possible to prevent CompoundCollider2D to override individual colliders properties Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index 0ef28c8f3..249110320 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -143,15 +143,21 @@ namespace Nz float ComputeMomentOfInertia(float mass) const override; + inline bool DoesOverrideCollisionProperties() const; + inline const std::vector& GetGeoms() const; ColliderType2D GetType() const override; + inline void OverridesCollisionProperties(bool shouldOverride); + template static CompoundCollider2DRef New(Args&&... args); private: void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::vector GenerateShapes(RigidBody2D* body) const override; std::vector m_geoms; + bool m_doesOverrideCollisionProperties; }; class ConvexCollider2D; diff --git a/include/Nazara/Physics2D/Collider2D.inl b/include/Nazara/Physics2D/Collider2D.inl index 1f149fb3f..71ae0603c 100644 --- a/include/Nazara/Physics2D/Collider2D.inl +++ b/include/Nazara/Physics2D/Collider2D.inl @@ -110,11 +110,21 @@ namespace Nz return object.release(); } + inline bool Nz::CompoundCollider2D::DoesOverrideCollisionProperties() const + { + return m_doesOverrideCollisionProperties; + } + inline const std::vector& CompoundCollider2D::GetGeoms() const { return m_geoms; } + inline void Nz::CompoundCollider2D::OverridesCollisionProperties(bool shouldOverride) + { + m_doesOverrideCollisionProperties = shouldOverride; + } + template CompoundCollider2DRef CompoundCollider2D::New(Args&&... args) { diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index 95cd633af..463ddf13b 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -13,11 +13,10 @@ namespace Nz std::vector Collider2D::GenerateShapes(RigidBody2D* body) const { - cpShapeFilter filter = cpShapeFilterNew(m_collisionGroup, m_categoryMask, m_collisionMask); - std::vector shapes; CreateShapes(body, shapes); + cpShapeFilter filter = cpShapeFilterNew(m_collisionGroup, m_categoryMask, m_collisionMask); for (cpShape* shape : shapes) { cpShapeSetFilter(shape, filter); @@ -82,7 +81,8 @@ namespace Nz /******************************** CompoundCollider2D *********************************/ CompoundCollider2D::CompoundCollider2D(std::vector geoms) : - m_geoms(std::move(geoms)) + m_geoms(std::move(geoms)), + m_doesOverrideCollisionProperties(true) { } @@ -109,6 +109,20 @@ namespace Nz geom->CreateShapes(body, shapes); } + std::vector CompoundCollider2D::GenerateShapes(RigidBody2D* body) const + { + // This is our parent's default behavior + if (m_doesOverrideCollisionProperties) + return Collider2D::GenerateShapes(body); + else + { + std::vector shapes; + CreateShapes(body, shapes); + + return shapes; + } + } + /******************************** ConvexCollider2D *********************************/ ConvexCollider2D::ConvexCollider2D(SparsePtr vertices, std::size_t vertexCount, float radius) : From a3a4ed89b852b494d050e7a611411bb403e003f9 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 25 Aug 2018 22:41:05 +0200 Subject: [PATCH 066/352] Graphics/Material: Fix reflection mode not being copied --- include/Nazara/Graphics/Material.inl | 3 ++- src/Nazara/Graphics/Material.cpp | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/include/Nazara/Graphics/Material.inl b/include/Nazara/Graphics/Material.inl index c6e56db84..bf96d6bc5 100644 --- a/include/Nazara/Graphics/Material.inl +++ b/include/Nazara/Graphics/Material.inl @@ -72,7 +72,8 @@ namespace Nz */ inline Material::Material(const Material& material) : RefCounted(), - Resource(material) + Resource(material), + m_reflectionMode(ReflectionMode_Skybox) { Copy(material); } diff --git a/src/Nazara/Graphics/Material.cpp b/src/Nazara/Graphics/Material.cpp index 37ab5afd7..81c50ab85 100644 --- a/src/Nazara/Graphics/Material.cpp +++ b/src/Nazara/Graphics/Material.cpp @@ -433,6 +433,8 @@ namespace Nz m_normalMap = material.m_normalMap; m_specularMap = material.m_specularMap; + SetReflectionMode(material.GetReflectionMode()); + InvalidatePipeline(); } From fd9db1b63910cd1cddfbb966a36bbd749bea8f1f Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 25 Aug 2018 22:41:34 +0200 Subject: [PATCH 067/352] Graphics/CullingList: Add forceInvalidation parameter --- SDK/src/NDK/Systems/RenderSystem.cpp | 2 +- include/Nazara/Graphics/CullingList.hpp | 2 +- include/Nazara/Graphics/CullingList.inl | 25 ++++++++++++++++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index 57da4e78a..56c19abfa 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -208,7 +208,7 @@ namespace Ndk if (m_isCullingEnabled) visibilityHash = m_drawableCulling.Cull(camComponent.GetFrustum(), &forceInvalidation); else - visibilityHash = m_drawableCulling.FillWithAllEntries(); + visibilityHash = m_drawableCulling.FillWithAllEntries(&forceInvalidation); // Always regenerate renderqueue if particle groups are present for now (FIXME) if (!m_lights.empty() || !m_particleGroups.empty()) diff --git a/include/Nazara/Graphics/CullingList.hpp b/include/Nazara/Graphics/CullingList.hpp index df8be7d48..edc6e1621 100644 --- a/include/Nazara/Graphics/CullingList.hpp +++ b/include/Nazara/Graphics/CullingList.hpp @@ -41,7 +41,7 @@ namespace Nz std::size_t Cull(const Frustumf& frustum, bool* forceInvalidation = nullptr); - std::size_t FillWithAllEntries(); + std::size_t FillWithAllEntries(bool* forceInvalidation = nullptr); NoTestEntry RegisterNoTest(const T* renderable); SphereEntry RegisterSphereTest(const T* renderable); diff --git a/include/Nazara/Graphics/CullingList.inl b/include/Nazara/Graphics/CullingList.inl index 55aa8e35c..fb278d019 100644 --- a/include/Nazara/Graphics/CullingList.inl +++ b/include/Nazara/Graphics/CullingList.inl @@ -71,29 +71,52 @@ namespace Nz } template - std::size_t CullingList::FillWithAllEntries() + std::size_t CullingList::FillWithAllEntries(bool* forceInvalidation) { m_results.clear(); + bool forcedInvalidation = false; + std::size_t visibleHash = 0U; for (NoTestVisibilityEntry& entry : m_noTestList) { m_results.push_back(entry.renderable); Nz::HashCombine(visibleHash, entry.renderable); + + if (entry.forceInvalidation) + { + forcedInvalidation = true; + entry.forceInvalidation = false; + } } for (SphereVisibilityEntry& entry : m_sphereTestList) { m_results.push_back(entry.renderable); Nz::HashCombine(visibleHash, entry.renderable); + + if (entry.forceInvalidation) + { + forcedInvalidation = true; + entry.forceInvalidation = false; + } } for (VolumeVisibilityEntry& entry : m_volumeTestList) { m_results.push_back(entry.renderable); Nz::HashCombine(visibleHash, entry.renderable); + + if (entry.forceInvalidation) + { + forcedInvalidation = true; + entry.forceInvalidation = false; + } } + if (forceInvalidation) + *forceInvalidation = forcedInvalidation; + return visibleHash; } From cd0647008c96814f84363364085ec7b24b1cbb43 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 28 Aug 2018 21:56:32 +0200 Subject: [PATCH 068/352] SDK/PhysicsSystem2D: Fix temporary taken by reference --- SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index 0d17b27ec..c4ea461f0 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -268,30 +268,33 @@ namespace Ndk if (callbacks.endCallback) { - worldCallbacks.endCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.endCallback = [this, cb = callbacks.endCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - callbacks.endCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } + if (callbacks.preSolveCallback) { - worldCallbacks.preSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.preSolveCallback = [this, cb = callbacks.preSolveCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - return callbacks.preSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + return cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } + if (callbacks.postSolveCallback) { - worldCallbacks.postSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.postSolveCallback = [this, cb = callbacks.postSolveCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - callbacks.postSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } + if (callbacks.startCallback) { - worldCallbacks.startCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.startCallback = [this, cb = callbacks.startCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - return callbacks.startCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + return cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } From 78faacf03fa6f704e24c36566dc6d291d05dd1f3 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 28 Aug 2018 22:05:15 +0200 Subject: [PATCH 069/352] PhysicsSystem2D: Fix RegisterCallbacks for good Allowing move instead of forcing copy Fixing RegisterCallbacks overload --- SDK/include/NDK/Systems/PhysicsSystem2D.hpp | 4 +-- SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 31 +++++++++++---------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp index 1683fc7fb..09dd5c19d 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp @@ -57,8 +57,8 @@ namespace Ndk 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); inline void SetDamping(float dampingValue); inline void SetGravity(const Nz::Vector2f& gravity); diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index c4ea461f0..a5bed6d28 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -224,36 +224,39 @@ namespace Ndk } } - void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionId, const Callback& callbacks) + void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionId, Callback callbacks) { Nz::PhysWorld2D::Callback worldCallbacks; if (callbacks.endCallback) { - worldCallbacks.endCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.endCallback = [this, cb = std::move(callbacks.endCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - callbacks.endCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } + if (callbacks.preSolveCallback) { - worldCallbacks.preSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.preSolveCallback = [this, cb = std::move(callbacks.preSolveCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - return callbacks.preSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + return cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } + if (callbacks.postSolveCallback) { - worldCallbacks.postSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.postSolveCallback = [this, cb = std::move(callbacks.postSolveCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - callbacks.postSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } + if (callbacks.startCallback) { - worldCallbacks.startCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.startCallback = [this, cb = std::move(callbacks.startCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - return callbacks.startCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + return cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } @@ -262,13 +265,13 @@ namespace Ndk m_physWorld->RegisterCallbacks(collisionId, worldCallbacks); } - void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, const Callback& callbacks) + void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, Callback callbacks) { Nz::PhysWorld2D::Callback worldCallbacks{}; if (callbacks.endCallback) { - worldCallbacks.endCallback = [this, cb = callbacks.endCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.endCallback = [this, cb = std::move(callbacks.endCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; @@ -276,7 +279,7 @@ namespace Ndk if (callbacks.preSolveCallback) { - worldCallbacks.preSolveCallback = [this, cb = callbacks.preSolveCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.preSolveCallback = [this, cb = std::move(callbacks.preSolveCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { return cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; @@ -284,7 +287,7 @@ namespace Ndk if (callbacks.postSolveCallback) { - worldCallbacks.postSolveCallback = [this, cb = callbacks.postSolveCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.postSolveCallback = [this, cb = std::move(callbacks.postSolveCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; @@ -292,7 +295,7 @@ namespace Ndk if (callbacks.startCallback) { - worldCallbacks.startCallback = [this, cb = callbacks.startCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.startCallback = [this, cb = std::move(callbacks.startCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { return cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; From 109e6a89cab50e55db6e8752c0a5da62abf74a76 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 28 Aug 2018 22:05:31 +0200 Subject: [PATCH 070/352] Sdk/PhysicsSystem2D: Removed copy constructor --- SDK/include/NDK/Systems/PhysicsSystem2D.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp index 09dd5c19d..0bbe8d907 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp @@ -38,7 +38,6 @@ namespace Ndk struct RaycastHit; PhysicsSystem2D(); - PhysicsSystem2D(const PhysicsSystem2D& system); ~PhysicsSystem2D() = default; void DebugDraw(const DebugDrawOptions& options, bool drawShapes = true, bool drawConstraints = true, bool drawCollisions = true); From 652ecd2404a363e82afb09951c4dbe2d370dcc0d Mon Sep 17 00:00:00 2001 From: S6066 Date: Tue, 28 Aug 2018 22:35:20 +0200 Subject: [PATCH 071/352] [Premake5: package] Fix typo in pack-libdir's description (#186) --- build/scripts/actions/package.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/scripts/actions/package.lua b/build/scripts/actions/package.lua index 3def5138c..f263f8faf 100644 --- a/build/scripts/actions/package.lua +++ b/build/scripts/actions/package.lua @@ -1,6 +1,6 @@ newoption({ trigger = "pack-libdir", - description = "Specifiy the subdirectory in lib/ to be used when packaging the project" + description = "Specifies the subdirectory in lib/ to be used when packaging the project" }) ACTION.Name = "Package" From e62afabd7100943ccd9da27b03583f094871e133 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 29 Aug 2018 20:54:57 +0200 Subject: [PATCH 072/352] Physics2D/Collider2D: Fix CompoundCollider2D filters --- include/Nazara/Physics2D/Collider2D.hpp | 18 ++++----- src/Nazara/Physics2D/Collider2D.cpp | 53 +++++++++++++++---------- src/Nazara/Physics2D/RigidBody2D.cpp | 2 +- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index 249110320..36443e66a 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -65,7 +65,7 @@ namespace Nz NazaraSignal(OnColliderRelease, const Collider2D* /*collider*/); protected: - virtual void CreateShapes(RigidBody2D* body, std::vector& shapes) const = 0; + virtual std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const = 0; bool m_trigger; UInt32 m_categoryMask; @@ -74,7 +74,7 @@ namespace Nz UInt32 m_collisionMask; private: - virtual std::vector GenerateShapes(RigidBody2D* body) const; + virtual std::size_t GenerateShapes(RigidBody2D* body, std::vector* shapes) const; static Collider2DLibrary::LibraryMap s_library; }; @@ -100,7 +100,7 @@ namespace Nz template static BoxCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; Rectf m_rect; float m_radius; @@ -125,7 +125,7 @@ namespace Nz template static CircleCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; Vector2f m_offset; float m_radius; @@ -153,8 +153,8 @@ namespace Nz template static CompoundCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; - std::vector GenerateShapes(RigidBody2D* body) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; + std::size_t GenerateShapes(RigidBody2D* body, std::vector* shapes) const override; std::vector m_geoms; bool m_doesOverrideCollisionProperties; @@ -178,7 +178,7 @@ namespace Nz template static ConvexCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; std::vector m_vertices; float m_radius; @@ -201,7 +201,7 @@ namespace Nz template static NullCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; }; class SegmentCollider2D; @@ -225,7 +225,7 @@ namespace Nz template static SegmentCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; Vector2f m_first; Vector2f m_second; diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index 463ddf13b..5f0e9bcfe 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -11,20 +11,21 @@ namespace Nz { Collider2D::~Collider2D() = default; - std::vector Collider2D::GenerateShapes(RigidBody2D* body) const + std::size_t Collider2D::GenerateShapes(RigidBody2D* body, std::vector* shapes) const { - std::vector shapes; - CreateShapes(body, shapes); + std::size_t shapeCount = CreateShapes(body, shapes); cpShapeFilter filter = cpShapeFilterNew(m_collisionGroup, m_categoryMask, m_collisionMask); - for (cpShape* shape : shapes) + for (std::size_t i = shapes->size() - shapeCount; i < shapes->size(); ++i) { + cpShape* shape = (*shapes)[i]; + cpShapeSetFilter(shape, filter); cpShapeSetCollisionType(shape, m_collisionId); cpShapeSetSensor(shape, (m_trigger) ? cpTrue : cpFalse); } - return shapes; + return shapeCount; } /******************************** BoxCollider2D *********************************/ @@ -50,9 +51,10 @@ namespace Nz return ColliderType2D_Box; } - void BoxCollider2D::CreateShapes(RigidBody2D* body, std::vector& shapes) const + std::size_t BoxCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { - shapes.push_back(cpBoxShapeNew2(body->GetHandle(), cpBBNew(m_rect.x, m_rect.y, m_rect.x + m_rect.width, m_rect.y + m_rect.height), m_radius)); + shapes->push_back(cpBoxShapeNew2(body->GetHandle(), cpBBNew(m_rect.x, m_rect.y, m_rect.x + m_rect.width, m_rect.y + m_rect.height), m_radius)); + return 1; } /******************************** CircleCollider2D *********************************/ @@ -73,9 +75,10 @@ namespace Nz return ColliderType2D_Circle; } - void CircleCollider2D::CreateShapes(RigidBody2D* body, std::vector& shapes) const + std::size_t CircleCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { - shapes.push_back(cpCircleShapeNew(body->GetHandle(), m_radius, cpv(m_offset.x, m_offset.y))); + shapes->push_back(cpCircleShapeNew(body->GetHandle(), m_radius, cpv(m_offset.x, m_offset.y))); + return 1; } /******************************** CompoundCollider2D *********************************/ @@ -102,24 +105,29 @@ namespace Nz return ColliderType2D_Compound; } - void CompoundCollider2D::CreateShapes(RigidBody2D* body, std::vector& shapes) const + std::size_t CompoundCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { // Since C++ does not allow protected call from other objects, we have to be a friend of Collider2D, yay + + std::size_t shapeCount = 0; for (const auto& geom : m_geoms) - geom->CreateShapes(body, shapes); + shapeCount += geom->CreateShapes(body, shapes); + + return shapeCount; } - std::vector CompoundCollider2D::GenerateShapes(RigidBody2D* body) const + std::size_t CompoundCollider2D::GenerateShapes(RigidBody2D* body, std::vector* shapes) const { // This is our parent's default behavior if (m_doesOverrideCollisionProperties) - return Collider2D::GenerateShapes(body); + return Collider2D::GenerateShapes(body, shapes); else { - std::vector shapes; - CreateShapes(body, shapes); + std::size_t shapeCount = 0; + for (const auto& geom : m_geoms) + shapeCount += geom->GenerateShapes(body, shapes); - return shapes; + return shapeCount; } } @@ -145,9 +153,10 @@ namespace Nz return ColliderType2D_Convex; } - void ConvexCollider2D::CreateShapes(RigidBody2D* body, std::vector& shapes) const + std::size_t ConvexCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { - shapes.push_back(cpPolyShapeNew(body->GetHandle(), int(m_vertices.size()), reinterpret_cast(m_vertices.data()), cpTransformIdentity, m_radius)); + shapes->push_back(cpPolyShapeNew(body->GetHandle(), int(m_vertices.size()), reinterpret_cast(m_vertices.data()), cpTransformIdentity, m_radius)); + return 1; } /********************************* NullCollider2D **********************************/ @@ -162,8 +171,9 @@ namespace Nz return (mass > 0.f) ? 1.f : 0.f; //< Null inertia is only possible for static/kinematic objects } - void NullCollider2D::CreateShapes(RigidBody2D* /*body*/, std::vector& /*shapes*/) const + std::size_t NullCollider2D::CreateShapes(RigidBody2D* /*body*/, std::vector* /*shapes*/) const { + return 0; } /******************************** SegmentCollider2D *********************************/ @@ -178,8 +188,9 @@ namespace Nz return ColliderType2D_Segment; } - void SegmentCollider2D::CreateShapes(RigidBody2D* body, std::vector& shapes) const + 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)); + shapes->push_back(cpSegmentShapeNew(body->GetHandle(), cpv(m_first.x, m_first.y), cpv(m_second.x, m_second.y), m_thickness)); + return 1; } } diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 76844db3b..cb3f60ccf 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -311,7 +311,7 @@ namespace Nz else m_geom = NullCollider2D::New(); - m_shapes = m_geom->GenerateShapes(this); + m_geom->GenerateShapes(this, &m_shapes); cpSpace* space = m_world->GetHandle(); for (cpShape* shape : m_shapes) From b8e25502f56b31573d67b4d5bbe9dc92d76baf29 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 29 Aug 2018 20:55:19 +0200 Subject: [PATCH 073/352] Physics2D/RigidBody2D: Fix useless copy --- src/Nazara/Physics2D/RigidBody2D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index cb3f60ccf..b12bc7e2e 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -30,7 +30,7 @@ namespace Nz NazaraAssert(m_world, "Invalid world"); m_handle = Create(mass); - SetGeom(geom); + SetGeom(std::move(geom)); } RigidBody2D::RigidBody2D(const RigidBody2D& object) : From 28c6bd7af73a6675859582193c7e04af692d50e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 30 Aug 2018 12:10:33 +0200 Subject: [PATCH 074/352] Network: Log internal errors --- src/Nazara/Network/Posix/SocketImpl.cpp | 11 +++++------ src/Nazara/Network/Win32/SocketImpl.cpp | 11 +++++------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/Nazara/Network/Posix/SocketImpl.cpp b/src/Nazara/Network/Posix/SocketImpl.cpp index 7f94f5a9d..f82e992ca 100644 --- a/src/Nazara/Network/Posix/SocketImpl.cpp +++ b/src/Nazara/Network/Posix/SocketImpl.cpp @@ -952,6 +952,11 @@ namespace Nz case EFAULT: case ENOTSOCK: case EPROTOTYPE: + // Those are not errors and should have been handled + case EALREADY: + case EISCONN: + case EWOULDBLOCK: + NazaraWarning("Internal error occurred: " + Error::GetLastSystemError(error) + " (" + String::Number(error) + ')'); return SocketError_Internal; case EADDRNOTAVAIL: @@ -965,12 +970,6 @@ namespace Nz case ESOCKTNOSUPPORT: return SocketError_NotSupported; - // Those are not errors and should have been handled before the call - case EALREADY: - case EISCONN: - case EWOULDBLOCK: - return SocketError_Internal; - case ECONNREFUSED: return SocketError_ConnectionRefused; diff --git a/src/Nazara/Network/Win32/SocketImpl.cpp b/src/Nazara/Network/Win32/SocketImpl.cpp index 097927dc6..f503fa4d8 100644 --- a/src/Nazara/Network/Win32/SocketImpl.cpp +++ b/src/Nazara/Network/Win32/SocketImpl.cpp @@ -951,6 +951,11 @@ namespace Nz case WSAENOTSOCK: case WSAEPROTOTYPE: case WSA_INVALID_HANDLE: + // Those are not errors and should have been handled + case WSAEALREADY: + case WSAEISCONN: + case WSAEWOULDBLOCK: + NazaraWarning("Internal error occurred: " + Error::GetLastSystemError(error) + " (" + String::Number(error) + ')'); return SocketError_Internal; case WSAEADDRNOTAVAIL: @@ -964,12 +969,6 @@ namespace Nz case WSAESOCKTNOSUPPORT: return SocketError_NotSupported; - // Those are not errors and should have been handled before the call - case WSAEALREADY: - case WSAEISCONN: - case WSAEWOULDBLOCK: - return SocketError_Internal; - case WSAECONNREFUSED: return SocketError_ConnectionRefused; From 56873b92b06fbdeb4ec656c5e6a9ba5625726dcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 30 Aug 2018 13:03:50 +0200 Subject: [PATCH 075/352] Network/Socket: Fix Connect (timeout) on Windows/Linux --- ChangeLog.md | 1 + src/Nazara/Network/Posix/SocketImpl.cpp | 2 +- src/Nazara/Network/Win32/SocketImpl.cpp | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 866118c41..8f433fe57 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -141,6 +141,7 @@ Nazara Engine: - Added SegmentCollider2D::GetThickness - Fixed vertices generation/render queue submit when using multiples materials on a Tilemap - It is now possible to prevent CompoundCollider2D to override individual colliders properties +- Fixed TcpClient::WaitForConnected possible failure (although connected) on Windows/Linux Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Network/Posix/SocketImpl.cpp b/src/Nazara/Network/Posix/SocketImpl.cpp index f82e992ca..46afef418 100644 --- a/src/Nazara/Network/Posix/SocketImpl.cpp +++ b/src/Nazara/Network/Posix/SocketImpl.cpp @@ -153,7 +153,7 @@ namespace Nz tv.tv_usec = static_cast((msTimeout % 1000ULL) * 1000ULL); int ret = select(handle + 1, nullptr, &localSet, &localSet, (msTimeout > 0) ? &tv : nullptr); - if (ret == SOCKET_ERROR) + if (ret > 0) { int code = GetLastErrorCode(handle, error); if (code < 0) //< GetLastErrorCode() failed diff --git a/src/Nazara/Network/Win32/SocketImpl.cpp b/src/Nazara/Network/Win32/SocketImpl.cpp index f503fa4d8..e1191e07d 100644 --- a/src/Nazara/Network/Win32/SocketImpl.cpp +++ b/src/Nazara/Network/Win32/SocketImpl.cpp @@ -132,6 +132,7 @@ namespace Nz switch (errorCode) //< Check for "normal errors" first { case WSAEALREADY: + case WSAEINVAL: //< In case of connect, WSAEINVAL may be returned instead of WSAEALREADY case WSAEWOULDBLOCK: return SocketState_Connecting; From 7bb6c8475284fe0a8886d87c3fcdfedd880fe521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 31 Aug 2018 17:26:50 +0200 Subject: [PATCH 076/352] Graphics/CullingList: Improve culling list - Now supports box culling - Removed branch - Removed complex hash combination and replaced it with a much faster algorithm - It now supports partial visibility --- SDK/src/NDK/Systems/RenderSystem.cpp | 5 +- include/Nazara/Graphics/CullingList.hpp | 59 +++-- include/Nazara/Graphics/CullingList.inl | 308 +++++++++++++----------- include/Nazara/Graphics/Enums.hpp | 1 + 4 files changed, 205 insertions(+), 168 deletions(-) diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index 56c19abfa..e79c238b4 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -217,7 +217,10 @@ namespace Ndk if (camComponent.UpdateVisibility(visibilityHash) || m_forceRenderQueueInvalidation || forceInvalidation) { renderQueue->Clear(); - for (const GraphicsComponent* gfxComponent : m_drawableCulling) + for (const GraphicsComponent* gfxComponent : m_drawableCulling.GetFullyVisibleResults()) + gfxComponent->AddToRenderQueue(renderQueue); + + for (const GraphicsComponent* gfxComponent : m_drawableCulling.GetPartiallyVisibleResults()) gfxComponent->AddToRenderQueue(renderQueue); for (const Ndk::EntityHandle& light : m_lights) diff --git a/include/Nazara/Graphics/CullingList.hpp b/include/Nazara/Graphics/CullingList.hpp index edc6e1621..7feb32362 100644 --- a/include/Nazara/Graphics/CullingList.hpp +++ b/include/Nazara/Graphics/CullingList.hpp @@ -23,11 +23,13 @@ namespace Nz { public: template class Entry; + class BoxEntry; class NoTestEntry; class SphereEntry; class VolumeEntry; template friend class Entry; + friend BoxEntry; friend NoTestEntry; friend SphereEntry; friend VolumeEntry; @@ -43,6 +45,10 @@ namespace Nz std::size_t FillWithAllEntries(bool* forceInvalidation = nullptr); + const ResultContainer& GetFullyVisibleResults() const; + const ResultContainer& GetPartiallyVisibleResults() const; + + BoxEntry RegisterBoxTest(const T* renderable); NoTestEntry RegisterNoTest(const T* renderable); SphereEntry RegisterSphereTest(const T* renderable); VolumeEntry RegisterVolumeTest(const T* renderable); @@ -50,37 +56,24 @@ namespace Nz CullingList& operator=(const CullingList& renderable) = delete; CullingList& operator=(CullingList&& renderable) = delete; - // STL API - typename ResultContainer::iterator begin(); - typename ResultContainer::const_iterator begin() const; - - typename ResultContainer::const_iterator cbegin() const; - typename ResultContainer::const_iterator cend() const; - typename ResultContainer::const_reverse_iterator crbegin() const; - typename ResultContainer::const_reverse_iterator crend() const; - - bool empty() const; - - typename ResultContainer::iterator end(); - typename ResultContainer::const_iterator end() const; - - typename ResultContainer::reverse_iterator rbegin(); - typename ResultContainer::const_reverse_iterator rbegin() const; - - typename ResultContainer::reverse_iterator rend(); - typename ResultContainer::const_reverse_iterator rend() const; - - typename ResultContainer::size_type size() const; - NazaraSignal(OnCullingListRelease, CullingList* /*cullingList*/); private: + inline void NotifyBoxUpdate(std::size_t index, const Boxf& boundingVolume); inline void NotifyForceInvalidation(CullTest type, std::size_t index); inline void NotifyMovement(CullTest type, std::size_t index, void* oldPtr, void* newPtr); inline void NotifyRelease(CullTest type, std::size_t index); inline void NotifySphereUpdate(std::size_t index, const Spheref& sphere); inline void NotifyVolumeUpdate(std::size_t index, const BoundingVolumef& boundingVolume); + struct BoxVisibilityEntry + { + Boxf box; + BoxEntry* entry; + const T* renderable; + bool forceInvalidation; + }; + struct NoTestVisibilityEntry { NoTestEntry* entry; @@ -104,10 +97,12 @@ namespace Nz bool forceInvalidation; }; + std::vector m_boxTestList; std::vector m_noTestList; std::vector m_sphereTestList; std::vector m_volumeTestList; - ResultContainer m_results; + ResultContainer m_fullyVisibleResults; + ResultContainer m_partiallyVisibleResults; }; template @@ -135,6 +130,24 @@ namespace Nz std::size_t m_index; CullingList* m_parent; }; + + template + class CullingList::BoxEntry : public CullingList::template Entry + { + friend CullingList; + + public: + BoxEntry(); + BoxEntry(BoxEntry&&) = default; + ~BoxEntry() = default; + + void UpdateBox(const Boxf& box); + + BoxEntry& operator=(BoxEntry&&) = default; + + private: + BoxEntry(CullingList* parent, std::size_t index); + }; template class CullingList::NoTestEntry : public CullingList::template Entry diff --git a/include/Nazara/Graphics/CullingList.inl b/include/Nazara/Graphics/CullingList.inl index fb278d019..1230ce9e9 100644 --- a/include/Nazara/Graphics/CullingList.inl +++ b/include/Nazara/Graphics/CullingList.inl @@ -16,16 +16,48 @@ namespace Nz template std::size_t CullingList::Cull(const Frustumf& frustum, bool* forceInvalidation) { - m_results.clear(); + m_fullyVisibleResults.clear(); + m_partiallyVisibleResults.clear(); bool forcedInvalidation = false; - std::size_t visibleHash = 0U; + std::size_t fullyVisibleHash = 5U; + std::size_t partiallyVisibleHash = 5U; + + auto CombineHash = [](std::size_t currentHash, std::size_t newHash) + { + return currentHash * 23 + newHash; + }; + + for (BoxVisibilityEntry& entry : m_boxTestList) + { + switch (frustum.Intersect(entry.box)) + { + case IntersectionSide_Inside: + m_fullyVisibleResults.push_back(entry.renderable); + CombineHash(fullyVisibleHash, std::hash()(entry.renderable)); + + forcedInvalidation = forcedInvalidation | entry.forceInvalidation; + entry.forceInvalidation = false; + break; + + case IntersectionSide_Intersecting: + m_partiallyVisibleResults.push_back(entry.renderable); + CombineHash(partiallyVisibleHash, std::hash()(entry.renderable)); + + forcedInvalidation = forcedInvalidation | entry.forceInvalidation; + entry.forceInvalidation = false; + break; + + case IntersectionSide_Outside: + break; + } + } for (NoTestVisibilityEntry& entry : m_noTestList) { - m_results.push_back(entry.renderable); - Nz::HashCombine(visibleHash, entry.renderable); + m_fullyVisibleResults.push_back(entry.renderable); + CombineHash(fullyVisibleHash, std::hash()(entry.renderable)); if (entry.forceInvalidation) { @@ -36,34 +68,87 @@ namespace Nz for (SphereVisibilityEntry& entry : m_sphereTestList) { - if (frustum.Contains(entry.sphere)) + switch (frustum.Intersect(entry.sphere)) { - m_results.push_back(entry.renderable); - Nz::HashCombine(visibleHash, entry.renderable); + case IntersectionSide_Inside: + m_fullyVisibleResults.push_back(entry.renderable); + CombineHash(fullyVisibleHash, std::hash()(entry.renderable)); - if (entry.forceInvalidation) - { - forcedInvalidation = true; + forcedInvalidation = forcedInvalidation | entry.forceInvalidation; entry.forceInvalidation = false; - } + break; + + case IntersectionSide_Intersecting: + m_partiallyVisibleResults.push_back(entry.renderable); + CombineHash(partiallyVisibleHash, std::hash()(entry.renderable)); + + forcedInvalidation = forcedInvalidation | entry.forceInvalidation; + entry.forceInvalidation = false; + break; + + case IntersectionSide_Outside: + break; } } - + for (VolumeVisibilityEntry& entry : m_volumeTestList) { - if (frustum.Contains(entry.volume)) + switch (frustum.Intersect(entry.volume)) { - m_results.push_back(entry.renderable); - Nz::HashCombine(visibleHash, entry.renderable); + case IntersectionSide_Inside: + m_fullyVisibleResults.push_back(entry.renderable); + CombineHash(fullyVisibleHash, std::hash()(entry.renderable)); - if (entry.forceInvalidation) - { - forcedInvalidation = true; + forcedInvalidation = forcedInvalidation | entry.forceInvalidation; entry.forceInvalidation = false; - } + break; + + case IntersectionSide_Intersecting: + m_partiallyVisibleResults.push_back(entry.renderable); + CombineHash(partiallyVisibleHash, std::hash()(entry.renderable)); + + forcedInvalidation = forcedInvalidation | entry.forceInvalidation; + entry.forceInvalidation = false; + break; + + case IntersectionSide_Outside: + break; } } + if (forceInvalidation) + *forceInvalidation = forcedInvalidation; + + return 5 + partiallyVisibleHash * 17 + fullyVisibleHash; + } + + template + std::size_t CullingList::FillWithAllEntries(bool* forceInvalidation) + { + m_fullyVisibleResults.clear(); + m_partiallyVisibleResults.clear(); + + bool forcedInvalidation = false; + + std::size_t visibleHash = 5U; + + auto FillWithList = [&](auto& testList) + { + for (auto& entry : testList) + { + m_fullyVisibleResults.push_back(entry.renderable); + visibleHash = visibleHash * 23 + std::hash()(entry.renderable); + + forcedInvalidation = forcedInvalidation | entry.forceInvalidation; + entry.forceInvalidation = false; + } + }; + + FillWithList(m_boxTestList); + FillWithList(m_noTestList); + FillWithList(m_sphereTestList); + FillWithList(m_volumeTestList); + if (forceInvalidation) *forceInvalidation = forcedInvalidation; @@ -71,53 +156,24 @@ namespace Nz } template - std::size_t CullingList::FillWithAllEntries(bool* forceInvalidation) + auto CullingList::GetFullyVisibleResults() const -> const ResultContainer& { - m_results.clear(); + return m_fullyVisibleResults; + } - bool forcedInvalidation = false; + template + auto CullingList::GetPartiallyVisibleResults() const -> const ResultContainer& + { + return m_partiallyVisibleResults; + } - std::size_t visibleHash = 0U; - for (NoTestVisibilityEntry& entry : m_noTestList) - { - m_results.push_back(entry.renderable); - Nz::HashCombine(visibleHash, entry.renderable); + template + auto CullingList::RegisterBoxTest(const T* renderable) -> BoxEntry + { + BoxEntry newEntry(this, m_boxTestList.size()); + m_boxTestList.emplace_back(BoxVisibilityEntry{ Nz::Boxf(), &newEntry, renderable, false }); //< Address of entry will be updated when moving - if (entry.forceInvalidation) - { - forcedInvalidation = true; - entry.forceInvalidation = false; - } - } - - for (SphereVisibilityEntry& entry : m_sphereTestList) - { - m_results.push_back(entry.renderable); - Nz::HashCombine(visibleHash, entry.renderable); - - if (entry.forceInvalidation) - { - forcedInvalidation = true; - entry.forceInvalidation = false; - } - } - - for (VolumeVisibilityEntry& entry : m_volumeTestList) - { - m_results.push_back(entry.renderable); - Nz::HashCombine(visibleHash, entry.renderable); - - if (entry.forceInvalidation) - { - forcedInvalidation = true; - entry.forceInvalidation = false; - } - } - - if (forceInvalidation) - *forceInvalidation = forcedInvalidation; - - return visibleHash; + return newEntry; } template @@ -132,7 +188,7 @@ namespace Nz template auto CullingList::RegisterSphereTest(const T* renderable) -> SphereEntry { - SphereEntry newEntry(this, m_sphereTestList.size() - 1); + SphereEntry newEntry(this, m_sphereTestList.size()); m_sphereTestList.emplace_back(SphereVisibilityEntry{Nz::Spheref(), &newEntry, renderable, false}); //< Address of entry will be updated when moving return newEntry; @@ -147,89 +203,10 @@ namespace Nz return newEntry; } - // Interface STD template - typename CullingList::ResultContainer::iterator CullingList::begin() + inline void CullingList::NotifyBoxUpdate(std::size_t index, const Boxf& box) { - return m_results.begin(); - } - - template - typename CullingList::ResultContainer::const_iterator CullingList::begin() const - { - return m_results.begin(); - } - - template - typename CullingList::ResultContainer::const_iterator CullingList::cbegin() const - { - return m_results.cbegin(); - } - - template - typename CullingList::ResultContainer::const_iterator CullingList::cend() const - { - return m_results.cend(); - } - - template - typename CullingList::ResultContainer::const_reverse_iterator CullingList::crbegin() const - { - return m_results.crbegin(); - } - - template - typename CullingList::ResultContainer::const_reverse_iterator CullingList::crend() const - { - return m_results.crend(); - } - - template - bool CullingList::empty() const - { - return m_results.empty(); - } - - template - typename CullingList::ResultContainer::iterator CullingList::end() - { - return m_results.end(); - } - - template - typename CullingList::ResultContainer::const_iterator CullingList::end() const - { - return m_results.end(); - } - - template - typename CullingList::ResultContainer::reverse_iterator CullingList::rbegin() - { - return m_results.rbegin(); - } - - template - typename CullingList::ResultContainer::const_reverse_iterator CullingList::rbegin() const - { - return m_results.rbegin(); - } - - template - typename CullingList::ResultContainer::reverse_iterator CullingList::rend() - { - return m_results.rend(); - } - - template - typename CullingList::ResultContainer::const_reverse_iterator CullingList::rend() const - { - return m_results.rend(); - } - - template - typename CullingList::ResultContainer::size_type CullingList::size() const - { - return m_results.size(); + m_boxTestList[index].box = box; } template @@ -237,6 +214,12 @@ namespace Nz { switch (type) { + case CullTest::Box: + { + m_boxTestList[index].forceInvalidation = true; + break; + } + case CullTest::NoTest: { m_noTestList[index].forceInvalidation = true; @@ -268,6 +251,15 @@ namespace Nz switch (type) { + case CullTest::Box: + { + BoxVisibilityEntry& entry = m_boxTestList[index]; + NazaraAssert(entry.entry == oldPtr, "Invalid box entry"); + + entry.entry = static_cast(newPtr); + break; + } + case CullTest::NoTest: { NoTestVisibilityEntry& entry = m_noTestList[index]; @@ -306,6 +298,14 @@ namespace Nz { switch (type) { + case CullTest::Box: + { + m_boxTestList[index] = std::move(m_boxTestList.back()); + m_boxTestList[index].entry->UpdateIndex(index); + m_boxTestList.pop_back(); + break; + } + case CullTest::NoTest: { m_noTestList[index] = std::move(m_noTestList.back()); @@ -424,6 +424,26 @@ namespace Nz return *this; } + + ////////////////////////////////////////////////////////////////////////// + + template + CullingList::BoxEntry::BoxEntry() : + Entry() + { + } + + template + CullingList::BoxEntry::BoxEntry(CullingList* parent, std::size_t index) : + Entry(parent, index) + { + } + + template + void CullingList::BoxEntry::UpdateBox(const Boxf& box) + { + this->m_parent->NotifyBoxUpdate(this->m_index, box); + } ////////////////////////////////////////////////////////////////////////// diff --git a/include/Nazara/Graphics/Enums.hpp b/include/Nazara/Graphics/Enums.hpp index 83f46dc22..277d78a03 100644 --- a/include/Nazara/Graphics/Enums.hpp +++ b/include/Nazara/Graphics/Enums.hpp @@ -21,6 +21,7 @@ namespace Nz enum class CullTest { + Box, NoTest, Sphere, Volume From e42ff5b18a06c242e98099fd04963e78c8bad749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 31 Aug 2018 17:32:48 +0200 Subject: [PATCH 077/352] Sdk/GraphicsComponent: Remake bounding volume handling GraphicsComponent now only have an AABB but their instanced renderable now have individual BoundingVolume --- .../NDK/Components/GraphicsComponent.hpp | 37 ++++---- .../NDK/Components/GraphicsComponent.inl | 87 ++++++++++--------- SDK/src/NDK/Components/GraphicsComponent.cpp | 54 ++++++------ SDK/src/NDK/Systems/DebugSystem.cpp | 33 ++++--- SDK/src/NDK/Systems/RenderSystem.cpp | 5 +- SDK/src/NDK/Widgets/ButtonWidget.cpp | 2 +- 6 files changed, 118 insertions(+), 100 deletions(-) diff --git a/SDK/include/NDK/Components/GraphicsComponent.hpp b/SDK/include/NDK/Components/GraphicsComponent.hpp index 3e7b05def..d55ad0035 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.hpp +++ b/SDK/include/NDK/Components/GraphicsComponent.hpp @@ -44,15 +44,17 @@ namespace Ndk inline bool DoesRequireRealTimeReflections() const; + inline void EnsureBoundingVolumesUpdate() const; + inline void EnsureTransformMatrixUpdate() const; + template void ForEachRenderable(const Func& func) const; - inline void EnsureBoundingVolumeUpdate() const; - inline void EnsureTransformMatrixUpdate() const; + inline const Nz::Boxf& GetAABB() const; inline void GetAttachedRenderables(RenderableList* renderables) const; inline std::size_t GetAttachedRenderableCount() const; - inline const Nz::BoundingVolumef& GetBoundingVolume() const; + inline const Nz::BoundingVolumef& GetBoundingVolume(std::size_t renderableIndex) const; inline void RemoveFromCullingList(GraphicsComponentCullingList* cullingList) const; @@ -68,7 +70,7 @@ namespace Ndk void ConnectInstancedRenderableSignals(Renderable& renderable); - inline void InvalidateBoundingVolume() const; + inline void InvalidateAABB() const; void InvalidateRenderableData(const Nz::InstancedRenderable* renderable, Nz::UInt32 flags, std::size_t index); void InvalidateRenderableMaterial(const Nz::InstancedRenderable* renderable, std::size_t skinIndex, std::size_t matIndex, const Nz::MaterialRef& newMat); inline void InvalidateRenderables(); @@ -89,11 +91,20 @@ namespace Ndk void UnregisterMaterial(Nz::Material* material); - void UpdateBoundingVolume() const; + void UpdateBoundingVolumes() const; void UpdateTransformMatrix() const; NazaraSlot(Nz::Node, OnNodeInvalidation, m_nodeInvalidationSlot); + using CullingListBoxEntry = GraphicsComponentCullingList::BoxEntry; + + struct CullingBoxEntry + { + CullingListBoxEntry listEntry; + + NazaraSlot(GraphicsComponentCullingList, OnCullingListRelease, cullingListReleaseSlot); + }; + struct MaterialEntry { NazaraSlot(Nz::Material, OnMaterialReflectionModeChange, reflectionModelChangeSlot); @@ -128,29 +139,21 @@ namespace Ndk NazaraSlot(Nz::InstancedRenderable, OnInstancedRenderableResetMaterials, renderableResetMaterialsSlot); NazaraSlot(Nz::InstancedRenderable, OnInstancedRenderableSkinChange, renderableSkinChangeSlot); + mutable Nz::BoundingVolumef boundingVolume; mutable Nz::InstancedRenderable::InstanceData data; Nz::InstancedRenderableRef renderable; mutable bool dataUpdated; }; - using VolumeCullingListEntry = GraphicsComponentCullingList::VolumeEntry; - - struct VolumeCullingEntry - { - VolumeCullingListEntry listEntry; - - NazaraSlot(GraphicsComponentCullingList, OnCullingListRelease, cullingListReleaseSlot); - }; - std::size_t m_reflectiveMaterialCount; - mutable std::vector m_volumeCullingEntries; + mutable std::vector m_cullingBoxEntries; std::vector m_renderables; std::unordered_map m_materialEntries; - mutable Nz::BoundingVolumef m_boundingVolume; + mutable Nz::Boxf m_aabb; mutable Nz::Matrix4f m_transformMatrix; Nz::Recti m_scissorRect; Nz::TextureRef m_reflectionMap; - mutable bool m_boundingVolumeUpdated; + mutable bool m_boundingVolumesUpdated; mutable bool m_transformMatrixUpdated; unsigned int m_reflectionMapSize; }; diff --git a/SDK/include/NDK/Components/GraphicsComponent.inl b/SDK/include/NDK/Components/GraphicsComponent.inl index 08dc3c867..127be42f5 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.inl +++ b/SDK/include/NDK/Components/GraphicsComponent.inl @@ -24,10 +24,10 @@ namespace Ndk Component(graphicsComponent), HandledObject(graphicsComponent), m_reflectiveMaterialCount(0), - m_boundingVolume(graphicsComponent.m_boundingVolume), + m_aabb(graphicsComponent.m_aabb), m_transformMatrix(graphicsComponent.m_transformMatrix), m_scissorRect(graphicsComponent.m_scissorRect), - m_boundingVolumeUpdated(graphicsComponent.m_boundingVolumeUpdated), + m_boundingVolumesUpdated(graphicsComponent.m_boundingVolumesUpdated), m_transformMatrixUpdated(graphicsComponent.m_transformMatrixUpdated) { m_renderables.reserve(graphicsComponent.m_renderables.size()); @@ -37,12 +37,12 @@ namespace Ndk inline void GraphicsComponent::AddToCullingList(GraphicsComponentCullingList* cullingList) const { - m_volumeCullingEntries.emplace_back(); - VolumeCullingEntry& entry = m_volumeCullingEntries.back(); + m_cullingBoxEntries.emplace_back(); + CullingBoxEntry& entry = m_cullingBoxEntries.back(); entry.cullingListReleaseSlot.Connect(cullingList->OnCullingListRelease, this, &GraphicsComponent::RemoveFromCullingList); - entry.listEntry = cullingList->RegisterVolumeTest(this); + entry.listEntry = cullingList->RegisterBoxTest(this); - InvalidateBoundingVolume(); + InvalidateAABB(); } /*! @@ -71,7 +71,7 @@ namespace Ndk InvalidateReflectionMap(); } - InvalidateBoundingVolume(); + InvalidateAABB(); } /*! @@ -86,7 +86,7 @@ namespace Ndk { if (it->renderable == renderable) { - InvalidateBoundingVolume(); + InvalidateAABB(); std::size_t materialCount = renderable->GetMaterialCount(); for (std::size_t i = 0; i < materialCount; ++i) @@ -110,26 +110,14 @@ namespace Ndk return m_reflectiveMaterialCount != 0 && m_reflectionMap; } - /*! - * \brief Calls a function for every renderable attached to this component - * - * \param func Callback function which will be called with renderable data - */ - template - void GraphicsComponent::ForEachRenderable(const Func& func) const - { - for (const auto& renderableData : m_renderables) - func(renderableData.renderable, renderableData.data.localMatrix, renderableData.data.renderOrder); - } - /*! * \brief Ensures the bounding volume is up to date */ - inline void GraphicsComponent::EnsureBoundingVolumeUpdate() const + inline void GraphicsComponent::EnsureBoundingVolumesUpdate() const { - if (!m_boundingVolumeUpdated) - UpdateBoundingVolume(); + if (!m_boundingVolumesUpdated) + UpdateBoundingVolumes(); } /*! @@ -142,6 +130,17 @@ namespace Ndk UpdateTransformMatrix(); } + /*! + * \brief Gets the axis-aligned bounding box of the entity + * \return A constant reference to the AABB + */ + inline const Nz::Boxf& GraphicsComponent::GetAABB() const + { + EnsureBoundingVolumesUpdate(); + + return m_aabb; + } + /*! * \brief Gets the set of renderable elements * @@ -169,28 +168,36 @@ namespace Ndk return m_renderables.size(); } - /*! - * \brief Gets the bouding volume of the entity - * \return A constant reference to the bounding volume - */ - - inline const Nz::BoundingVolumef& GraphicsComponent::GetBoundingVolume() const + inline const Nz::BoundingVolumef& GraphicsComponent::GetBoundingVolume(std::size_t renderableIndex) const { - EnsureBoundingVolumeUpdate(); + EnsureBoundingVolumesUpdate(); - return m_boundingVolume; + assert(renderableIndex < m_renderables.size()); + return m_renderables[renderableIndex].boundingVolume; + } + + /*! + * \brief Calls a function for every renderable attached to this component + * + * \param func Callback function which will be called with renderable data + */ + template + void GraphicsComponent::ForEachRenderable(const Func& func) const + { + for (const auto& renderableData : m_renderables) + func(renderableData.renderable, renderableData.data.localMatrix, renderableData.data.renderOrder); } inline void GraphicsComponent::RemoveFromCullingList(GraphicsComponentCullingList* cullingList) const { - for (auto it = m_volumeCullingEntries.begin(); it != m_volumeCullingEntries.end(); ++it) + for (auto it = m_cullingBoxEntries.begin(); it != m_cullingBoxEntries.end(); ++it) { if (it->listEntry.GetParent() == cullingList) { - if (m_volumeCullingEntries.size() > 1) - *it = std::move(m_volumeCullingEntries.back()); + if (m_cullingBoxEntries.size() > 1) + *it = std::move(m_cullingBoxEntries.back()); - m_volumeCullingEntries.pop_back(); + m_cullingBoxEntries.pop_back(); break; } } @@ -200,7 +207,7 @@ namespace Ndk { m_scissorRect = scissorRect; - for (VolumeCullingEntry& entry : m_volumeCullingEntries) + for (CullingBoxEntry& entry : m_cullingBoxEntries) entry.listEntry.ForceInvalidation(); //< Invalidate render queues } @@ -212,7 +219,7 @@ namespace Ndk { renderable.data.localMatrix = localMatrix; - InvalidateBoundingVolume(); + InvalidateAABB(); break; } } @@ -234,9 +241,9 @@ namespace Ndk * \brief Invalidates the bounding volume */ - inline void GraphicsComponent::InvalidateBoundingVolume() const + inline void GraphicsComponent::InvalidateAABB() const { - m_boundingVolumeUpdated = false; + m_boundingVolumesUpdated = false; } /*! @@ -257,7 +264,7 @@ namespace Ndk { m_transformMatrixUpdated = false; - InvalidateBoundingVolume(); + InvalidateAABB(); InvalidateRenderables(); } } diff --git a/SDK/src/NDK/Components/GraphicsComponent.cpp b/SDK/src/NDK/Components/GraphicsComponent.cpp index f865e749b..41c25fb90 100644 --- a/SDK/src/NDK/Components/GraphicsComponent.cpp +++ b/SDK/src/NDK/Components/GraphicsComponent.cpp @@ -60,12 +60,12 @@ namespace Ndk for (std::size_t i = 0; i < materialCount; ++i) RegisterMaterial(entry.renderable->GetMaterial(i)); - InvalidateBoundingVolume(); + InvalidateAABB(); } void GraphicsComponent::ConnectInstancedRenderableSignals(Renderable& entry) { - entry.renderableBoundingVolumeInvalidationSlot.Connect(entry.renderable->OnInstancedRenderableInvalidateBoundingVolume, [this](const Nz::InstancedRenderable*) { InvalidateBoundingVolume(); }); + entry.renderableBoundingVolumeInvalidationSlot.Connect(entry.renderable->OnInstancedRenderableInvalidateBoundingVolume, [this](const Nz::InstancedRenderable*) { InvalidateAABB(); }); entry.renderableDataInvalidationSlot.Connect(entry.renderable->OnInstancedRenderableInvalidateData, std::bind(&GraphicsComponent::InvalidateRenderableData, this, std::placeholders::_1, std::placeholders::_2, m_renderables.size() - 1)); entry.renderableMaterialInvalidationSlot.Connect(entry.renderable->OnInstancedRenderableInvalidateMaterial, this, &GraphicsComponent::InvalidateRenderableMaterial); entry.renderableReleaseSlot.Connect(entry.renderable->OnInstancedRenderableRelease, this, &GraphicsComponent::Detach); @@ -82,7 +82,7 @@ namespace Ndk r.dataUpdated = false; r.renderable->InvalidateData(&r.data, flags); - for (VolumeCullingEntry& entry : m_volumeCullingEntries) + for (CullingBoxEntry& entry : m_cullingBoxEntries) entry.listEntry.ForceInvalidation(); } @@ -234,10 +234,10 @@ namespace Ndk NazaraUnused(node); // Our view matrix depends on NodeComponent position/rotation - InvalidateBoundingVolume(); + InvalidateAABB(); InvalidateTransformMatrix(); - for (VolumeCullingEntry& entry : m_volumeCullingEntries) + for (CullingBoxEntry& entry : m_cullingBoxEntries) entry.listEntry.ForceInvalidation(); //< Force invalidation on movement } @@ -263,36 +263,32 @@ namespace Ndk * \brief Updates the bounding volume */ - void GraphicsComponent::UpdateBoundingVolume() const + void GraphicsComponent::UpdateBoundingVolumes() const { EnsureTransformMatrixUpdate(); - m_boundingVolume.MakeNull(); - for (const Renderable& r : m_renderables) - { - Nz::BoundingVolumef boundingVolume = r.renderable->GetBoundingVolume(); - - // Adjust renderable bounding volume by local matrix - if (boundingVolume.IsFinite()) - { - Nz::Boxf localBox = boundingVolume.obb.localBox; - Nz::Vector3f newPos = r.data.localMatrix * localBox.GetPosition(); - Nz::Vector3f newCorner = r.data.localMatrix * (localBox.GetPosition() + localBox.GetLengths()); - Nz::Vector3f newLengths = newCorner - newPos; - - boundingVolume.Set(Nz::Boxf(newPos.x, newPos.y, newPos.z, newLengths.x, newLengths.y, newLengths.z)); - } - - m_boundingVolume.ExtendTo(boundingVolume); - } - RenderSystem& renderSystem = m_entity->GetWorld()->GetSystem(); - m_boundingVolume.Update(Nz::Matrix4f::ConcatenateAffine(renderSystem.GetCoordinateSystemMatrix(), m_transformMatrix)); - m_boundingVolumeUpdated = true; + m_aabb.MakeZero(); + for (std::size_t i = 0; i < m_renderables.size(); ++i) + { + const Renderable& r = m_renderables[i]; + r.boundingVolume = r.renderable->GetBoundingVolume(); + if (r.boundingVolume.IsFinite()) + { + r.boundingVolume.Update(Nz::Matrix4f::ConcatenateAffine(renderSystem.GetCoordinateSystemMatrix(), Nz::Matrix4f::ConcatenateAffine(r.data.localMatrix, m_transformMatrix))); - for (VolumeCullingEntry& entry : m_volumeCullingEntries) - entry.listEntry.UpdateVolume(m_boundingVolume); + if (i > 0) + m_aabb.ExtendTo(r.boundingVolume.aabb); + else + m_aabb.Set(r.boundingVolume.aabb); + } + } + + m_boundingVolumesUpdated = true; + + for (CullingBoxEntry& entry : m_cullingBoxEntries) + entry.listEntry.UpdateBox(m_aabb); } /*! diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 0da17c352..407267fcd 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -62,13 +62,22 @@ namespace Ndk const DebugComponent& entityDebug = m_entityOwner->GetComponent(); const GraphicsComponent& entityGfx = m_entityOwner->GetComponent(); - Nz::Boxf aabb = entityGfx.GetBoundingVolume().aabb; + auto DrawBox = [&](const Nz::Boxf& box) + { + Nz::Matrix4f transformMatrix = Nz::Matrix4f::Identity(); + transformMatrix.SetScale(box.GetLengths()); + transformMatrix.SetTranslation(box.GetCenter()); - Nz::Matrix4f transformMatrix = Nz::Matrix4f::Identity(); - transformMatrix.SetScale(aabb.GetLengths()); - transformMatrix.SetTranslation(aabb.GetCenter()); + renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect); + }; - renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect); + //DrawBox(entityGfx.GetAABB()); + for (std::size_t i = 0; i < entityGfx.GetAttachedRenderableCount(); ++i) + { + const Nz::BoundingVolumef& boundingVolume = entityGfx.GetBoundingVolume(i); + if (boundingVolume.IsFinite()) + DrawBox(boundingVolume.aabb); + } } std::unique_ptr Clone() const override @@ -86,10 +95,11 @@ namespace Ndk { NazaraAssert(m_entityOwner, "DebugRenderable has no owner"); - const DebugComponent& entityDebug = m_entityOwner->GetComponent(); + // TODO + /*const DebugComponent& entityDebug = m_entityOwner->GetComponent(); const GraphicsComponent& entityGfx = m_entityOwner->GetComponent(); - Nz::Boxf obb = entityGfx.GetBoundingVolume().obb.localBox; + Nz::Boxf obb = entityGfx.GetAABB().obb.localBox; Nz::Matrix4f transformMatrix = instanceData.transformMatrix; Nz::Vector3f obbCenter = transformMatrix.Transform(obb.GetCenter(), 0.f); //< Apply rotation/scale to obb center, to display it at a correct position @@ -97,7 +107,7 @@ namespace Ndk transformMatrix.ApplyScale(obb.GetLengths()); transformMatrix.ApplyTranslation(obbCenter); - renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect); + renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect);*/ } std::unique_ptr Clone() const override @@ -120,7 +130,7 @@ namespace Ndk */ DebugSystem::DebugSystem() { - Requires(); + Requires(); SetUpdateOrder(1000); //< Update last } @@ -181,6 +191,7 @@ namespace Ndk DebugComponent& entityDebug = entity->GetComponent(); GraphicsComponent& entityGfx = entity->GetComponent(); + NodeComponent& entityNode = entity->GetComponent(); DebugDrawFlags enabledFlags = entityDebug.GetEnabledFlags(); DebugDrawFlags flags = entityDebug.GetFlags(); @@ -195,14 +206,14 @@ namespace Ndk { case DebugDraw::Collider3D: { - const Nz::Boxf& obb = entityGfx.GetBoundingVolume().obb.localBox; + const Nz::Boxf& obb = entityGfx.GetAABB(); Nz::InstancedRenderableRef renderable = GenerateCollision3DMesh(entity); if (renderable) { renderable->SetPersistent(false); - entityGfx.Attach(renderable, Nz::Matrix4f::Translate(obb.GetCenter()), DebugDrawOrder); + entityGfx.Attach(renderable, Nz::Matrix4f::Translate(obb.GetCenter() - entityNode.GetPosition()), DebugDrawOrder); } entityDebug.UpdateDebugRenderable(option, std::move(renderable)); diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index e79c238b4..f01294865 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -195,11 +195,11 @@ namespace Ndk Nz::AbstractRenderQueue* renderQueue = m_renderTechnique->GetRenderQueue(); - // To make sure the bounding volume used by the culling list is updated + // To make sure the bounding volumes used by the culling list is updated for (const Ndk::EntityHandle& drawable : m_drawables) { GraphicsComponent& graphicsComponent = drawable->GetComponent(); - graphicsComponent.EnsureBoundingVolumeUpdate(); + graphicsComponent.EnsureBoundingVolumesUpdate(); } bool forceInvalidation = false; @@ -220,6 +220,7 @@ namespace Ndk for (const GraphicsComponent* gfxComponent : m_drawableCulling.GetFullyVisibleResults()) gfxComponent->AddToRenderQueue(renderQueue); + // FIXME: We should cull individual renderables here for (const GraphicsComponent* gfxComponent : m_drawableCulling.GetPartiallyVisibleResults()) gfxComponent->AddToRenderQueue(renderQueue); diff --git a/SDK/src/NDK/Widgets/ButtonWidget.cpp b/SDK/src/NDK/Widgets/ButtonWidget.cpp index 5d8360635..f432d86b7 100644 --- a/SDK/src/NDK/Widgets/ButtonWidget.cpp +++ b/SDK/src/NDK/Widgets/ButtonWidget.cpp @@ -87,7 +87,7 @@ namespace Ndk Nz::Vector2f origin = GetContentOrigin(); const Nz::Vector2f& contentSize = GetContentSize(); - Nz::Boxf textBox = m_textEntity->GetComponent().GetBoundingVolume().obb.localBox; + Nz::Boxf textBox = m_textEntity->GetComponent().GetAABB(); m_textEntity->GetComponent().SetPosition(origin.x + contentSize.x / 2 - textBox.width / 2, origin.y + contentSize.y / 2 - textBox.height / 2); } From 5e6204fad441bb6e7caabdb5a5c57ad1ec0a270a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 31 Aug 2018 17:33:51 +0200 Subject: [PATCH 078/352] Fix compilation --- examples/Particles/main.cpp | 4 ++-- tests/SDK/NDK/Systems/RenderSystem.cpp | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/Particles/main.cpp b/examples/Particles/main.cpp index 084c33da8..e4940c63d 100644 --- a/examples/Particles/main.cpp +++ b/examples/Particles/main.cpp @@ -97,8 +97,8 @@ int main() particleCountGfx.Attach(shared.particleCount, 1); - Nz::Boxf fpsCountBox = fpsGfx.GetBoundingVolume().aabb; - Nz::Boxf particleCountBox = particleCountGfx.GetBoundingVolume().aabb; + Nz::Boxf fpsCountBox = fpsGfx.GetAABB(); + Nz::Boxf particleCountBox = particleCountGfx.GetAABB(); Nz::Vector2ui windowSize = window.GetSize(); demoNameNode.SetPosition(5.f, 5.f); diff --git a/tests/SDK/NDK/Systems/RenderSystem.cpp b/tests/SDK/NDK/Systems/RenderSystem.cpp index ec22d6e57..a94109b9d 100644 --- a/tests/SDK/NDK/Systems/RenderSystem.cpp +++ b/tests/SDK/NDK/Systems/RenderSystem.cpp @@ -76,7 +76,7 @@ SCENARIO("RenderSystem", "[NDK][RenderSystem]") { CHECK(nodeComponent.GetPosition() == position + velocity); CHECK(physicsComponent2D.GetAABB() == aabb.Translate(position + velocity)); - CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetBoundingVolume()); + CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); } } @@ -91,17 +91,17 @@ SCENARIO("RenderSystem", "[NDK][RenderSystem]") CHECK(physicsComponent2D.GetAngularVelocity() == Approx(angularSpeed)); CHECK(physicsComponent2D.GetRotation() == Approx(angularSpeed)); CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(1.f, 4.f, 2.f, 1.f)); - CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetBoundingVolume()); + CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); CHECK(physicsComponent2D.GetRotation() == Approx(2.f * angularSpeed)); CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(2.f, 2.f, 1.f, 2.f)); - CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetBoundingVolume()); + CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); CHECK(physicsComponent2D.GetRotation() == Approx(3.f * angularSpeed)); CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(3.f, 3.f, 2.f, 1.f)); - CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetBoundingVolume()); + CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); CHECK(physicsComponent2D.GetRotation() == Approx(4.f * angularSpeed)); @@ -117,4 +117,4 @@ void CompareAABB(const Nz::Rectf& aabb, const Nz::BoundingVolumef& boundingVolum CHECK(aabb.y == Approx(box.y)); CHECK(aabb.width == Approx(box.width)); CHECK(aabb.height == Approx(box.height)); -} \ No newline at end of file +} From b739965b1dfdb0f9b365b8376009122ce193ac05 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 31 Aug 2018 21:45:35 +0200 Subject: [PATCH 079/352] Graphics/RenderSystem: Add supports for partial culling --- .../NDK/Components/GraphicsComponent.hpp | 2 ++ SDK/src/NDK/Components/GraphicsComponent.cpp | 33 +++++++++++++++++-- SDK/src/NDK/Systems/RenderSystem.cpp | 7 ++-- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/SDK/include/NDK/Components/GraphicsComponent.hpp b/SDK/include/NDK/Components/GraphicsComponent.hpp index d55ad0035..177dbbb1f 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.hpp +++ b/SDK/include/NDK/Components/GraphicsComponent.hpp @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -34,6 +35,7 @@ namespace Ndk inline void AddToCullingList(GraphicsComponentCullingList* cullingList) const; void AddToRenderQueue(Nz::AbstractRenderQueue* renderQueue) const; + void AddToRenderQueueByCulling(const Nz::Frustumf& frustum, Nz::AbstractRenderQueue* renderQueue) const; inline void Attach(Nz::InstancedRenderableRef renderable, int renderOrder = 0); void Attach(Nz::InstancedRenderableRef renderable, const Nz::Matrix4f& localMatrix, int renderOrder = 0); diff --git a/SDK/src/NDK/Components/GraphicsComponent.cpp b/SDK/src/NDK/Components/GraphicsComponent.cpp index 41c25fb90..6b2b2880a 100644 --- a/SDK/src/NDK/Components/GraphicsComponent.cpp +++ b/SDK/src/NDK/Components/GraphicsComponent.cpp @@ -22,6 +22,7 @@ namespace Ndk */ void GraphicsComponent::AddToRenderQueue(Nz::AbstractRenderQueue* renderQueue) const { + EnsureBoundingVolumesUpdate(); EnsureTransformMatrixUpdate(); RenderSystem& renderSystem = m_entity->GetWorld()->GetSystem(); @@ -30,7 +31,6 @@ namespace Ndk { if (!object.dataUpdated) { - object.data.transformMatrix = Nz::Matrix4f::ConcatenateAffine(renderSystem.GetCoordinateSystemMatrix(), Nz::Matrix4f::ConcatenateAffine(object.data.localMatrix, m_transformMatrix)); object.renderable->UpdateData(&object.data); object.dataUpdated = true; } @@ -39,6 +39,34 @@ namespace Ndk } } + /*! + * \brief Adds the renderable elements to the render queue if their bounding volume intersects with the frustum + * + * \param frustum Queue to be added + * \param renderQueue Queue to be added + */ + void GraphicsComponent::AddToRenderQueueByCulling(const Nz::Frustumf& frustum, Nz::AbstractRenderQueue* renderQueue) const + { + EnsureBoundingVolumesUpdate(); + EnsureTransformMatrixUpdate(); + + RenderSystem& renderSystem = m_entity->GetWorld()->GetSystem(); + + for (const Renderable& object : m_renderables) + { + if (frustum.Contains(object.boundingVolume)) + { + if (!object.dataUpdated) + { + object.renderable->UpdateData(&object.data); + object.dataUpdated = true; + } + + object.renderable->AddToRenderQueue(renderQueue, object.data, m_scissorRect); + } + } + } + /*! * \brief Attaches a renderable to the entity with a specific matrix * @@ -274,9 +302,10 @@ namespace Ndk { const Renderable& r = m_renderables[i]; r.boundingVolume = r.renderable->GetBoundingVolume(); + r.data.transformMatrix = Nz::Matrix4f::ConcatenateAffine(renderSystem.GetCoordinateSystemMatrix(), Nz::Matrix4f::ConcatenateAffine(r.data.localMatrix, m_transformMatrix)); if (r.boundingVolume.IsFinite()) { - r.boundingVolume.Update(Nz::Matrix4f::ConcatenateAffine(renderSystem.GetCoordinateSystemMatrix(), Nz::Matrix4f::ConcatenateAffine(r.data.localMatrix, m_transformMatrix))); + r.boundingVolume.Update(r.data.transformMatrix); if (i > 0) m_aabb.ExtendTo(r.boundingVolume.aabb); diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index f01294865..25b8e3585 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -204,9 +204,11 @@ namespace Ndk bool forceInvalidation = false; + const Nz::Frustumf& frustum = camComponent.GetFrustum(); + std::size_t visibilityHash; if (m_isCullingEnabled) - visibilityHash = m_drawableCulling.Cull(camComponent.GetFrustum(), &forceInvalidation); + visibilityHash = m_drawableCulling.Cull(frustum, &forceInvalidation); else visibilityHash = m_drawableCulling.FillWithAllEntries(&forceInvalidation); @@ -220,9 +222,8 @@ namespace Ndk for (const GraphicsComponent* gfxComponent : m_drawableCulling.GetFullyVisibleResults()) gfxComponent->AddToRenderQueue(renderQueue); - // FIXME: We should cull individual renderables here for (const GraphicsComponent* gfxComponent : m_drawableCulling.GetPartiallyVisibleResults()) - gfxComponent->AddToRenderQueue(renderQueue); + gfxComponent->AddToRenderQueueByCulling(frustum, renderQueue); for (const Ndk::EntityHandle& light : m_lights) { From 8ce8eafb88c956d9c7a7d40138149d76a95dff6d Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 31 Aug 2018 21:45:57 +0200 Subject: [PATCH 080/352] Sdk/DebugSystem: Fix AABB/OBB debug draw --- .../NDK/Components/GraphicsComponent.hpp | 2 ++ .../NDK/Components/GraphicsComponent.inl | 14 +++++++++ SDK/src/NDK/Systems/DebugSystem.cpp | 30 ++++++++++++------- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/SDK/include/NDK/Components/GraphicsComponent.hpp b/SDK/include/NDK/Components/GraphicsComponent.hpp index 177dbbb1f..cd2900d7f 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.hpp +++ b/SDK/include/NDK/Components/GraphicsComponent.hpp @@ -57,6 +57,8 @@ namespace Ndk inline std::size_t GetAttachedRenderableCount() const; inline const Nz::BoundingVolumef& GetBoundingVolume(std::size_t renderableIndex) const; + inline const Nz::Matrix4f& GetLocalMatrix(std::size_t renderableIndex) const; + inline const Nz::Matrix4f& GetTransformMatrix(std::size_t renderableIndex) const; inline void RemoveFromCullingList(GraphicsComponentCullingList* cullingList) const; diff --git a/SDK/include/NDK/Components/GraphicsComponent.inl b/SDK/include/NDK/Components/GraphicsComponent.inl index 127be42f5..71adf64d4 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.inl +++ b/SDK/include/NDK/Components/GraphicsComponent.inl @@ -176,6 +176,20 @@ namespace Ndk return m_renderables[renderableIndex].boundingVolume; } + inline const Nz::Matrix4f& GraphicsComponent::GetLocalMatrix(std::size_t renderableIndex) const + { + assert(renderableIndex < m_renderables.size()); + return m_renderables[renderableIndex].data.localMatrix; + } + + inline const Nz::Matrix4f& GraphicsComponent::GetTransformMatrix(std::size_t renderableIndex) const + { + EnsureBoundingVolumesUpdate(); + + assert(renderableIndex < m_renderables.size()); + return m_renderables[renderableIndex].data.transformMatrix; + } + /*! * \brief Calls a function for every renderable attached to this component * diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 407267fcd..2354a799a 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -39,7 +39,9 @@ namespace Ndk void MakeBoundingVolume() const override { - m_boundingVolume.MakeNull(); + // We generate an infinite bounding volume so that we're always considered for rendering when culling does occurs + // (bounding volume culling happens only if GraphicsComponent AABB partially fail) + m_boundingVolume.MakeInfinite(); } protected: @@ -71,7 +73,9 @@ namespace Ndk renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect); }; + // Maybe we should draw the global AABB (using another color) //DrawBox(entityGfx.GetAABB()); + for (std::size_t i = 0; i < entityGfx.GetAttachedRenderableCount(); ++i) { const Nz::BoundingVolumef& boundingVolume = entityGfx.GetBoundingVolume(i); @@ -95,19 +99,25 @@ namespace Ndk { NazaraAssert(m_entityOwner, "DebugRenderable has no owner"); - // TODO - /*const DebugComponent& entityDebug = m_entityOwner->GetComponent(); + const DebugComponent& entityDebug = m_entityOwner->GetComponent(); const GraphicsComponent& entityGfx = m_entityOwner->GetComponent(); - Nz::Boxf obb = entityGfx.GetAABB().obb.localBox; + auto DrawBox = [&](const Nz::Boxf& box, const Nz::Matrix4f& transformMatrix) + { + Nz::Matrix4f boxMatrix = Nz::Matrix4f::Identity(); + boxMatrix.SetScale(box.GetLengths()); + boxMatrix.SetTranslation(box.GetCenter()); + boxMatrix.ConcatenateAffine(transformMatrix); - Nz::Matrix4f transformMatrix = instanceData.transformMatrix; - Nz::Vector3f obbCenter = transformMatrix.Transform(obb.GetCenter(), 0.f); //< Apply rotation/scale to obb center, to display it at a correct position + renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), boxMatrix, scissorRect); + }; - transformMatrix.ApplyScale(obb.GetLengths()); - transformMatrix.ApplyTranslation(obbCenter); - - renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect);*/ + for (std::size_t i = 0; i < entityGfx.GetAttachedRenderableCount(); ++i) + { + const Nz::BoundingVolumef& boundingVolume = entityGfx.GetBoundingVolume(i); + if (boundingVolume.IsFinite()) + DrawBox(boundingVolume.obb.localBox, entityGfx.GetTransformMatrix(i)); + } } std::unique_ptr Clone() const override From a5c2a433f8b6f8f552fb9a7a00d73b351723bd42 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 31 Aug 2018 22:01:06 +0200 Subject: [PATCH 081/352] Sdk/DebugSystem: Draw global AABB in orange --- SDK/include/NDK/Systems/DebugSystem.hpp | 6 ++- SDK/src/NDK/Systems/DebugSystem.cpp | 67 +++++++++++++++++-------- 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/SDK/include/NDK/Systems/DebugSystem.hpp b/SDK/include/NDK/Systems/DebugSystem.hpp index 940feb782..3dd186f36 100644 --- a/SDK/include/NDK/Systems/DebugSystem.hpp +++ b/SDK/include/NDK/Systems/DebugSystem.hpp @@ -28,8 +28,9 @@ namespace Ndk Nz::InstancedRenderableRef GenerateBox(Nz::Boxf box); Nz::InstancedRenderableRef GenerateCollision3DMesh(Entity* entity); - Nz::MaterialRef GetAABBMaterial(); Nz::MaterialRef GetCollisionMaterial(); + Nz::MaterialRef GetGlobalAABBMaterial(); + Nz::MaterialRef GetLocalAABBMaterial(); Nz::MaterialRef GetOBBMaterial(); std::pair GetBoxMesh(); @@ -37,7 +38,8 @@ namespace Ndk void OnUpdate(float elapsedTime) override; - Nz::MaterialRef m_aabbMaterial; + Nz::MaterialRef m_globalAabbMaterial; + Nz::MaterialRef m_localAabbMaterial; Nz::MaterialRef m_collisionMaterial; Nz::MaterialRef m_obbMaterial; Nz::IndexBufferRef m_boxMeshIndexBuffer; diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 2354a799a..28cd53dee 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -20,9 +20,8 @@ namespace Ndk class DebugRenderable : public Nz::InstancedRenderable { public: - DebugRenderable(Ndk::Entity* owner, Nz::MaterialRef mat, Nz::IndexBufferRef indexBuffer, Nz::VertexBufferRef vertexBuffer) : + DebugRenderable(Ndk::Entity* owner, Nz::IndexBufferRef indexBuffer, Nz::VertexBufferRef vertexBuffer) : m_entityOwner(owner), - m_material(std::move(mat)), m_indexBuffer(std::move(indexBuffer)), m_vertexBuffer(std::move(vertexBuffer)) { @@ -33,7 +32,7 @@ namespace Ndk m_meshData.vertexBuffer = m_vertexBuffer; } - void UpdateBoundingVolume(InstanceData* instanceData) const override + void UpdateBoundingVolume(InstanceData* /*instanceData*/) const override { } @@ -47,7 +46,6 @@ namespace Ndk protected: Ndk::EntityHandle m_entityOwner; Nz::IndexBufferRef m_indexBuffer; - Nz::MaterialRef m_material; Nz::MeshData m_meshData; Nz::VertexBufferRef m_vertexBuffer; }; @@ -55,7 +53,12 @@ namespace Ndk class AABBDebugRenderable : public DebugRenderable { public: - using DebugRenderable::DebugRenderable; + AABBDebugRenderable(Ndk::Entity* owner, Nz::MaterialRef globalMaterial, Nz::MaterialRef localMaterial, Nz::IndexBufferRef indexBuffer, Nz::VertexBufferRef vertexBuffer) : + DebugRenderable(owner, std::move(indexBuffer), std::move(vertexBuffer)), + m_globalMaterial(std::move(globalMaterial)), + m_localMaterial(std::move(localMaterial)) + { + } void AddToRenderQueue(Nz::AbstractRenderQueue* renderQueue, const InstanceData& instanceData, const Nz::Recti& scissorRect) const override { @@ -64,23 +67,22 @@ namespace Ndk const DebugComponent& entityDebug = m_entityOwner->GetComponent(); const GraphicsComponent& entityGfx = m_entityOwner->GetComponent(); - auto DrawBox = [&](const Nz::Boxf& box) + auto DrawBox = [&](const Nz::Boxf& box, const Nz::MaterialRef& mat) { Nz::Matrix4f transformMatrix = Nz::Matrix4f::Identity(); transformMatrix.SetScale(box.GetLengths()); transformMatrix.SetTranslation(box.GetCenter()); - renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect); + renderQueue->AddMesh(0, mat, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect); }; - // Maybe we should draw the global AABB (using another color) - //DrawBox(entityGfx.GetAABB()); + DrawBox(entityGfx.GetAABB(), m_globalMaterial); for (std::size_t i = 0; i < entityGfx.GetAttachedRenderableCount(); ++i) { const Nz::BoundingVolumef& boundingVolume = entityGfx.GetBoundingVolume(i); if (boundingVolume.IsFinite()) - DrawBox(boundingVolume.aabb); + DrawBox(boundingVolume.aabb, m_localMaterial); } } @@ -88,12 +90,20 @@ namespace Ndk { return nullptr; } + + private: + Nz::MaterialRef m_globalMaterial; + Nz::MaterialRef m_localMaterial; }; class OBBDebugRenderable : public DebugRenderable { public: - using DebugRenderable::DebugRenderable; + OBBDebugRenderable(Ndk::Entity* owner, Nz::MaterialRef material, Nz::IndexBufferRef indexBuffer, Nz::VertexBufferRef vertexBuffer) : + DebugRenderable(owner, std::move(indexBuffer), std::move(vertexBuffer)), + m_material(std::move(material)) + { + } void AddToRenderQueue(Nz::AbstractRenderQueue* renderQueue, const InstanceData& instanceData, const Nz::Recti& scissorRect) const override { @@ -124,6 +134,9 @@ namespace Ndk { return nullptr; } + + private: + Nz::MaterialRef m_material; }; } @@ -234,7 +247,7 @@ namespace Ndk { auto indexVertexBuffers = GetBoxMesh(); - Nz::InstancedRenderableRef renderable = new AABBDebugRenderable(entity, GetAABBMaterial(), indexVertexBuffers.first, indexVertexBuffers.second); + Nz::InstancedRenderableRef renderable = new AABBDebugRenderable(entity, GetGlobalAABBMaterial(), GetLocalAABBMaterial(), indexVertexBuffers.first, indexVertexBuffers.second); renderable->SetPersistent(false); entityGfx.Attach(renderable, Nz::Matrix4f::Identity(), DebugDrawOrder); @@ -356,18 +369,32 @@ namespace Ndk return nullptr; } - Nz::MaterialRef DebugSystem::GetAABBMaterial() + Nz::MaterialRef DebugSystem::GetGlobalAABBMaterial() { - if (!m_aabbMaterial) + if (!m_globalAabbMaterial) { - m_aabbMaterial = Nz::Material::New(); - m_aabbMaterial->EnableFaceCulling(false); - m_aabbMaterial->EnableDepthBuffer(true); - m_aabbMaterial->SetDiffuseColor(Nz::Color::Red); - m_aabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); + m_globalAabbMaterial = Nz::Material::New(); + m_globalAabbMaterial->EnableFaceCulling(false); + m_globalAabbMaterial->EnableDepthBuffer(true); + m_globalAabbMaterial->SetDiffuseColor(Nz::Color::Orange); + m_globalAabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); } - return m_aabbMaterial; + return m_globalAabbMaterial; + } + + Nz::MaterialRef DebugSystem::GetLocalAABBMaterial() + { + if (!m_localAabbMaterial) + { + m_localAabbMaterial = Nz::Material::New(); + m_localAabbMaterial->EnableFaceCulling(false); + m_localAabbMaterial->EnableDepthBuffer(true); + m_localAabbMaterial->SetDiffuseColor(Nz::Color::Red); + m_localAabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); + } + + return m_localAabbMaterial; } Nz::MaterialRef DebugSystem::GetCollisionMaterial() From 566e5b4dcf3657246c8a7eabeae90429e9ce5504 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 31 Aug 2018 22:01:21 +0200 Subject: [PATCH 082/352] Sdk/DebugSystem: Increase line width to 2 --- SDK/src/NDK/Systems/DebugSystem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 28cd53dee..063a25d77 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -378,6 +378,7 @@ namespace Ndk m_globalAabbMaterial->EnableDepthBuffer(true); m_globalAabbMaterial->SetDiffuseColor(Nz::Color::Orange); m_globalAabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); + m_globalAabbMaterial->SetLineWidth(2.f); } return m_globalAabbMaterial; @@ -392,6 +393,7 @@ namespace Ndk m_localAabbMaterial->EnableDepthBuffer(true); m_localAabbMaterial->SetDiffuseColor(Nz::Color::Red); m_localAabbMaterial->SetFaceFilling(Nz::FaceFilling_Line); + m_localAabbMaterial->SetLineWidth(2.f); } return m_localAabbMaterial; @@ -406,6 +408,7 @@ namespace Ndk m_collisionMaterial->EnableDepthBuffer(true); m_collisionMaterial->SetDiffuseColor(Nz::Color::Blue); m_collisionMaterial->SetFaceFilling(Nz::FaceFilling_Line); + m_collisionMaterial->SetLineWidth(2.f); } return m_collisionMaterial; @@ -420,6 +423,7 @@ namespace Ndk m_obbMaterial->EnableDepthBuffer(true); m_obbMaterial->SetDiffuseColor(Nz::Color::Green); m_obbMaterial->SetFaceFilling(Nz::FaceFilling_Line); + m_obbMaterial->SetLineWidth(2.f); } return m_obbMaterial; From 03d2742fed49016cc0ff30617a8f8be21bc45e8a Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 31 Aug 2018 22:07:47 +0200 Subject: [PATCH 083/352] Demo: Fix Particles not building --- examples/Particles/SpacebattleDemo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Particles/SpacebattleDemo.cpp b/examples/Particles/SpacebattleDemo.cpp index 0fe08d8f3..2bd30940c 100644 --- a/examples/Particles/SpacebattleDemo.cpp +++ b/examples/Particles/SpacebattleDemo.cpp @@ -662,7 +662,7 @@ void SpacebattleExample::Enter(Ndk::StateMachine& fsm) Ndk::NodeComponent& cannonNode = m_turret.cannonEntity->GetComponent(); - Nz::Boxf introAABB = introGfx.GetBoundingVolume().aabb; + Nz::Boxf introAABB = introGfx.GetAABB(); introNode.SetPosition(cannonNode.GetForward() * 500.f + introNode.GetLeft() * introAABB.width / 2.f + introNode.GetUp() * introAABB.height / 2.f); } From b1241da2a657daed44a7edba2576a3863cf33a5a Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 31 Aug 2018 22:17:40 +0200 Subject: [PATCH 084/352] Fill changelog [skip-ci] --- ChangeLog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 8f433fe57..fb8d26b03 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -142,6 +142,8 @@ Nazara Engine: - Fixed vertices generation/render queue submit when using multiples materials on a Tilemap - It is now possible to prevent CompoundCollider2D to override individual colliders properties - Fixed TcpClient::WaitForConnected possible failure (although connected) on Windows/Linux +- CullingList now handles box tests +- ⚠️ CullingList now handles full and partial visibility testing Nazara Development Kit: - Added ImageWidget (#139) @@ -200,6 +202,8 @@ Nazara Development Kit: - It is now possible to disable object culling in the RenderSystem - Make Nz::PhysWorld2D& Ndk::PhysicsSystem2D::GetWorld private and rename it into GetPhysWorld - Make Ndk::PhysicsSystem2D an interface of Nz::PhysWorld2D +- ⚠️ GraphicsComponent no longer has a BoundingVolume, it instead has only an AABB with its attached InstancedRenderable getting a BoundingVolume of their own, improving culling possibilities. +- RenderSystem now does cull InstancedRenderables attached to a GraphicsComponent, improving performance. # 0.4: From 960af3afa3d824caef4dda76a94615fe89ff2da4 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 1 Sep 2018 13:22:37 +0200 Subject: [PATCH 085/352] Fix example not compiling --- examples/Tut01/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Tut01/main.cpp b/examples/Tut01/main.cpp index 8a3df36ff..9d53b7b5e 100644 --- a/examples/Tut01/main.cpp +++ b/examples/Tut01/main.cpp @@ -39,7 +39,7 @@ int main(int argc, char* argv[]) Ndk::GraphicsComponent& graphicsComponent = text->AddComponent(); graphicsComponent.Attach(textSprite); - Nz::Boxf textBox = graphicsComponent.GetBoundingVolume().aabb; + Nz::Boxf textBox = graphicsComponent.GetAABB(); Nz::Vector2ui windowSize = mainWindow.GetSize(); nodeComponent.SetPosition(windowSize.x / 2 - textBox.width / 2, windowSize.y / 2 - textBox.height / 2); From f59810b68ea4ee972385218b2bd13f0da04354a8 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 2 Sep 2018 22:06:03 +0200 Subject: [PATCH 086/352] Math: Add Angle class --- include/Nazara/Math/Angle.hpp | 89 ++++++++ include/Nazara/Math/Angle.inl | 406 ++++++++++++++++++++++++++++++++++ tests/Engine/Math/Angle.cpp | 128 +++++++++++ 3 files changed, 623 insertions(+) create mode 100644 include/Nazara/Math/Angle.hpp create mode 100644 include/Nazara/Math/Angle.inl create mode 100644 tests/Engine/Math/Angle.cpp diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp new file mode 100644 index 000000000..ccf770959 --- /dev/null +++ b/include/Nazara/Math/Angle.hpp @@ -0,0 +1,89 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Mathematics module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_ANGLE_HPP +#define NAZARA_ANGLE_HPP + +#include +#include +#include +#include + +namespace Nz +{ + struct SerializationContext; + + template + class Angle + { + public: + Angle() = default; + Angle(T Angle); + template> explicit Angle(const Angle& Angle) { Set(Angle); } + template> explicit Angle(const Angle& Angle) { Set(Angle); } + template explicit Angle(const Angle& Angle); + Angle(const Angle&) = default; + ~Angle() = default; + + Angle& MakeZero(); + + void Normalize(); + + template> Angle& Set(const Angle& Angle); + template> Angle& Set(const Angle& Angle); + Angle& Set(const Angle& Angle); + template Angle& Set(const Angle& Angle); + + Angle ToDegrees() const; + Angle ToRadians() const; + String ToString() const; + + Angle& operator=(const Angle&) = default; + + Angle operator+(const Angle& Angle) const; + Angle operator-(const Angle& Angle) const; + + Angle& operator+=(const Angle& Angle); + Angle& operator-=(const Angle& Angle); + Angle& operator*=(T scalar); + Angle& operator/=(T divider); + + bool operator==(const Angle& Angle) const; + bool operator!=(const Angle& Angle) const; + + static Angle Zero(); + + T angle; + }; + + template + using DegreeAngle = Angle; + + using DegreeAngled = DegreeAngle; + using DegreeAnglef = DegreeAngle; + + template + using RadianAngle = Angle; + + using RadianAngled = RadianAngle; + using RadianAnglef = RadianAngle; + + template bool Serialize(SerializationContext& context, const Angle& angle, TypeTag>); + template bool Unserialize(SerializationContext& context, Angle* angle, TypeTag>); +} + +template +Nz::Angle operator*(T scale, const Nz::Angle& angle); + +template +Nz::Angle operator/(T divider, const Nz::Angle& angle); + +template +std::ostream& operator<<(std::ostream& out, const Nz::Angle& angle); + +#include + +#endif // NAZARA_ANGLE_HPP diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl new file mode 100644 index 000000000..0e8f8dbfe --- /dev/null +++ b/include/Nazara/Math/Angle.inl @@ -0,0 +1,406 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Mathematics module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include + +namespace Nz +{ + namespace Detail + { + template struct AngleUtils; + + template<> + struct AngleUtils + { + template static constexpr T GetLimit() + { + return 180; + } + + template static T FromDegrees(T degrees) + { + return degrees; + } + + template static T FromRadians(T radians) + { + return RadianToDegree(radians); + } + + template static T ToDegrees(T degrees) + { + return degrees; + } + + template static T ToRadians(T degrees) + { + return DegreeToRadian(degrees); + } + + template static String ToString(T value) + { + return "Angle(" + String::Number(value) + "deg)"; + } + + template static std::ostream& ToString(std::ostream& out, T value) + { + return out << "Angle(" << value << "deg)"; + } + }; + + template<> + struct AngleUtils + { + template static constexpr T GetLimit() + { + return M_PI; + } + + template static T FromDegrees(T degrees) + { + return DegreeToRadian(degrees); + } + + template static T FromRadians(T radians) + { + return radians; + } + + template static T ToDegrees(T radians) + { + return RadianToDegree(radians); + } + + template static T ToRadians(T radians) + { + return radians; + } + + template static String ToString(T value) + { + return "Angle(" + String::Number(value) + "rad)"; + } + + template static std::ostream& ToString(std::ostream& out, T value) + { + return out << "Angle(" << value << "rad)"; + } + }; + } + /*! + * \ingroup math + * \class Nz::Angle + * \brief Math class that represents an angle + */ + + /*! + * \brief Constructs an Angle object with an angle value + * + * \param Angle value of the angle + */ + template + Angle::Angle(T Angle) : + angle(Angle) + { + } + + /*! + * \brief Changes the angle value to zero + */ + template + Angle& Angle::MakeZero() + { + angle = T(0); + } + + /*! + * \brief Normalizes the angle value + * + * If angle exceeds local limits positively or negatively, bring it back between them. + * For degree angles, local limits are [-180, 180] + * For radian angles, local limits are [-M_PI, M_PI] + */ + template + void Angle::Normalize() + { + constexpr T limit = Detail::AngleUtils::GetLimit(); + constexpr T twoLimit = limit * T(2); + + angle = std::fmod(angle, twoLimit); + if (angle < T(0)) + angle += twoLimit; + } + + /*! + * \brief Changes the angle value by converting a radian angle + * + * \param Angle Radian angle which will be converted + */ + template + template + Angle& Angle::Set(const Angle& Angle) + { + angle = RadianToDegree(Angle.angle); + return *this; + } + + /*! + * \brief Changes the angle value by converting a degree angle + * + * \param Angle Degree angle which will be converted + */ + template + template + Angle& Angle::Set(const Angle& Angle) + { + angle = DegreeToRadian(Angle.angle); + return *this; + } + + /*! + * \brief Copies the angle value of an angle + * + * \param Angle Angle which will be copied + */ + template + Angle& Angle::Set(const Angle& Angle) + { + angle = Angle.angle; + return *this; + } + + /*! + * \brief Changes the angle value to the same as an Angle of a different type + * + * \param Angle Angle which will be casted + * + * \remark Conversion from U to T occurs using static_cast + */ + template + template + Angle& Angle::Set(const Angle& Angle) + { + angle = static_cast(Angle.angle); + return *this; + } + + /*! + * \brief Returns the degree angle that is equivalent to this one + * \return Equivalent degree angle + */ + template + Angle Angle::ToDegrees() const + { + return DegreeAngle(Detail::AngleUtils::ToDegrees(angle)); + } + + /*! + * \brief Returns the radian angle that is equivalent to this angle + * \return Equivalent radian angle + */ + template + Angle Angle::ToRadians() const + { + return RadianAngle(Detail::AngleUtils::ToRadians(angle)); + } + + /*! + * \brief Converts the angle to a string representation + * \return String representation of the angle + */ + template + String Angle::ToString() const + { + return Detail::AngleUtils::ToString(angle); + } + + /*! + * \brief Addition operator + * \return Adds two angles together + * + * \param angle Angle to add + */ + template + Angle Angle::operator+(const Angle& Angle) const + { + return Angle(angle + Angle.angle); + } + + /*! + * \brief Subtraction operator + * \return Subtracts two angles together + * + * \param angle Angle to subtract + */ + template + Angle Angle::operator-(const Angle& Angle) const + { + return Angle(angle - Angle.angle); + } + + /*! + * \brief Adds an angle by another + * \return A reference to the angle + * + * \param angle Angle to add + */ + template + Angle& Angle::operator+=(const Angle& Angle) + { + angle += Angle.angle; + return *this; + } + + /*! + * \brief Subtract an angle by another + * \return A reference to the angle + * + * \param angle Angle to subtract + */ + template + Angle& Angle::operator-=(const Angle& Angle) + { + angle -= Angle.angle; + return *this; + } + + /*! + * \brief Scales the angle by a scalar + * \return A reference to the angle + * + * \param scalar Multiplier + */ + template + Angle& Angle::operator*=(T scalar) + { + angle *= scalar; + return *this; + } + + /*! + * \brief Divides the angle by a scalar + * \return A reference to the angle + * + * \param divider Divider + */ + template + Angle& Angle::operator/=(T divider) + { + angle /= divider; + return *this; + } + + /*! + * \brief Compares the angle to another for equality + * \return True if both angles are equal + * + * \param Angle The other angle to compare to + */ + template + bool Angle::operator==(const Angle& Angle) const + { + return NumberEquals(angle, Angle.angle); + } + + /*! + * \brief Compares the angle to another for inequality + * \return True if both angles are equal + * + * \param Angle The other angle to compare to + */ + template + bool Angle::operator!=(const Angle& Angle) const + { + return !NumberEquals(angle, Angle.angle); + } + + /*! + * \brief Returns an angle with an angle of zero + * \return Zero angle + */ + template + Angle Angle::Zero() + { + Angle angle; + angle.MakeZero(); + + return angle; + } + + /*! + * \brief Serializes an Angle + * \return true if successfully serialized + * + * \param context Serialization context + * \param angle Input Angle + */ + template + bool Serialize(SerializationContext& context, const Angle& angle, TypeTag>) + { + if (!Serialize(context, angle.angle)) + return false; + + return true; + } + + /*! + * \brief Unserializes an Angle + * \return true if successfully unserialized + * + * \param context Serialization context + * \param angle Output Angle + */ + template + bool Unserialize(SerializationContext& context, Angle* angle, TypeTag>) + { + if (!Unserialize(context, &angle->angle)) + return false; + + return true; + } +} + +/*! +* \brief Multiplication operator +* \return An angle corresponding to scale * angle +* +* \param scale Multiplier +* \param angle Angle +*/ +template +Nz::Angle operator*(T scale, const Nz::Angle& angle) +{ + return Nz::Angle(scale * angle.angle); +} + +/*! +* \brief Division operator +* \return An angle corresponding to scale / angle +* +* \param scale Divisor +* \param angle Angle +*/ +template +Nz::Angle operator/(T scale, const Nz::Angle& angle) +{ + return Nz::Angle(scale / angle.angle); +} + +/*! +* \brief Output operator +* \return The stream +* +* \param out The stream +* \param box The box to output +*/ +template +std::ostream& operator<<(std::ostream& out, const Nz::Angle& angle) +{ + return Nz::Detail::AngleUtils::ToString(out, angle.angle); +} + +#include diff --git a/tests/Engine/Math/Angle.cpp b/tests/Engine/Math/Angle.cpp new file mode 100644 index 000000000..81e83c261 --- /dev/null +++ b/tests/Engine/Math/Angle.cpp @@ -0,0 +1,128 @@ +#include +#include + +SCENARIO("Angle", "[MATH][ANGLE]") +{ + GIVEN("A degree angle of 90deg") + { + Nz::DegreeAnglef angle(90.f); + + WHEN("We convert it to degrees") + { + Nz::DegreeAnglef copyAngle = angle.ToDegrees(); + + THEN("It should compare to itself") + { + CHECK(angle == copyAngle); + } + } + + WHEN("We convert it to radians") + { + Nz::RadianAnglef radAngle(angle); + + THEN("It should be equal to pi/2") + { + Nz::RadianAnglef expectedResult(float(M_PI_2)); + + CHECK(radAngle == expectedResult); + CHECK(angle.ToRadians() == expectedResult); + } + } + } + + GIVEN("A degree angle of 480deg") + { + Nz::DegreeAnglef angle(480.f); + + WHEN("We normalize it") + { + angle.Normalize(); + + THEN("It should be equal to a normalized version of itself") + { + Nz::DegreeAnglef expectedResult(120.f); + + CHECK(angle == expectedResult); + } + } + } + + GIVEN("A degree angle of -270deg") + { + Nz::DegreeAnglef angle(-270.f); + + WHEN("We normalize it") + { + angle.Normalize(); + + THEN("It should be equal to a normalized version of itself") + { + Nz::DegreeAnglef expectedResult(90.f); + + CHECK(angle == expectedResult); + } + } + } + + GIVEN("A radian angle of -M_PI") + { + Nz::RadianAnglef angle(float(-M_PI)); + + WHEN("We convert it to radians") + { + Nz::RadianAnglef copyAngle = angle.ToRadians(); + + THEN("It should compare to itself") + { + CHECK(angle == copyAngle); + } + } + + WHEN("We convert it to degrees") + { + Nz::DegreeAnglef degAngle(angle); + + THEN("It should be equal to pi/2") + { + Nz::DegreeAnglef expectedResult(-180.f); + + CHECK(degAngle == expectedResult); + CHECK(angle.ToDegrees() == expectedResult); + } + } + } + GIVEN("A radian angle of 7pi") + { + Nz::RadianAnglef angle(float(7 * M_PI)); + + WHEN("We normalize it") + { + angle.Normalize(); + + THEN("It should be equal to a normalized version of itself") + { + Nz::RadianAnglef expectedResult(float(M_PI)); + + CHECK(angle == expectedResult); + } + } + } + + GIVEN("A radian angle of -4pi") + { + Nz::RadianAnglef angle(float(-4 * M_PI)); + + WHEN("We normalize it") + { + angle.Normalize(); + + THEN("It should be equal to a normalized version of itself") + { + Nz::RadianAnglef expectedResult(0.f); + + CHECK(angle == expectedResult); + } + } + } +} From 3cc70daf3e4ef586f5a8dcb746112ebc2839dafe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 5 Sep 2018 15:13:39 +0200 Subject: [PATCH 087/352] Fix missing file --- include/Nazara/Math/Enums.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/Nazara/Math/Enums.hpp b/include/Nazara/Math/Enums.hpp index 0430df83a..78f36942b 100644 --- a/include/Nazara/Math/Enums.hpp +++ b/include/Nazara/Math/Enums.hpp @@ -9,6 +9,12 @@ namespace Nz { + enum class AngleUnit + { + Degree, + Radian + }; + enum BoxCorner { BoxCorner_FarLeftBottom, From 9e0b61f30d995a7c5f5640039aeb8fb502b0629f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 5 Sep 2018 15:14:31 +0200 Subject: [PATCH 088/352] Math/Angle: Add sine, cosine, tangent methods --- include/Nazara/Math/Angle.hpp | 6 +++ include/Nazara/Math/Angle.inl | 78 +++++++++++++++++++++++++++++++++-- tests/Engine/Math/Angle.cpp | 47 +++++++++++++++++++-- 3 files changed, 125 insertions(+), 6 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index ccf770959..e1c904204 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace Nz { @@ -28,6 +29,11 @@ namespace Nz Angle(const Angle&) = default; ~Angle() = default; + T GetCos() const; + T GetSin() const; + std::pair GetSinCos() const; + T GetTan() const; + Angle& MakeZero(); void Normalize(); diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index 0e8f8dbfe..e04a751d9 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -16,6 +16,11 @@ namespace Nz template<> struct AngleUtils { + template static constexpr T GetEpsilon() + { + return T(1e-4); + } + template static constexpr T GetLimit() { return 180; @@ -55,9 +60,14 @@ namespace Nz template<> struct AngleUtils { + template static constexpr T GetEpsilon() + { + return T(1e-5); + } + template static constexpr T GetLimit() { - return M_PI; + return T(M_PI); } template static T FromDegrees(T degrees) @@ -90,6 +100,14 @@ namespace Nz return out << "Angle(" << value << "rad)"; } }; + + // Naive implementation, hopefully optimized by the compiler + template + void SinCos(T x, T* sin, T* cos) + { + *sin = std::sin(x); + *cos = std::cos(x); + } } /*! * \ingroup math @@ -108,6 +126,59 @@ namespace Nz { } + /*! + * \brief Computes the cosine of the angle + * \return Cosine of angle + * + * \see GetSinCos + */ + template + T Angle::GetCos() const + { + return std::cos(ToRadians().angle); + } + + /*! + * \brief Computes the sine of the angle + * \return Sine of angle + * + * \see GetSinCos + */ + template + T Angle::GetSin() const + { + return std::sin(ToRadians().angle); + } + + /*! + * \brief Computes both sines and cosines of the angle + * \return Sine and cosine of the angle + * + * \remark This is potentially faster than calling both GetSin and GetCos separately as it can computes both values at the same time. + * + * \see GetCos, GetSin + */ + template + std::pair Angle::GetSinCos() const + { + T sin, cos; + Detail::SinCos(ToRadians().angle, &sin, &cos); + + return std::make_pair(sin, cos); + } + + /*! + * \brief Computes the tangent of the angle + * \return Tangent value of the angle + * + * \see GetCos, GetSin + */ + template + T Angle::GetTan() const + { + return std::tan(ToRadians().angle); + } + /*! * \brief Changes the angle value to zero */ @@ -115,6 +186,7 @@ namespace Nz Angle& Angle::MakeZero() { angle = T(0); + return *this; } /*! @@ -303,7 +375,7 @@ namespace Nz template bool Angle::operator==(const Angle& Angle) const { - return NumberEquals(angle, Angle.angle); + return NumberEquals(angle, Angle.angle, Detail::AngleUtils::GetEpsilon()); } /*! @@ -315,7 +387,7 @@ namespace Nz template bool Angle::operator!=(const Angle& Angle) const { - return !NumberEquals(angle, Angle.angle); + return !NumberEquals(angle, Angle.angle, Detail::AngleUtils::GetEpsilon()); } /*! diff --git a/tests/Engine/Math/Angle.cpp b/tests/Engine/Math/Angle.cpp index 81e83c261..a4abc4a82 100644 --- a/tests/Engine/Math/Angle.cpp +++ b/tests/Engine/Math/Angle.cpp @@ -29,6 +29,26 @@ SCENARIO("Angle", "[MATH][ANGLE]") CHECK(angle.ToRadians() == expectedResult); } } + + WHEN("We compute its sinus/cosinus separatly") + { + THEN("It should be equal to 1 and 0") + { + CHECK(angle.GetSin() == Approx(1.f).margin(0.0001f)); + CHECK(angle.GetCos() == Approx(0.f).margin(0.0001f)); + } + + } + AND_WHEN("We compute it at the same time") + { + auto sincos = angle.GetSinCos(); + + THEN("It should also be equal to 1 and 0") + { + CHECK(sincos.first == Approx(1.f).margin(0.0001f)); + CHECK(sincos.second == Approx(0.f).margin(0.0001f)); + } + } } GIVEN("A degree angle of 480deg") @@ -48,9 +68,9 @@ SCENARIO("Angle", "[MATH][ANGLE]") } } - GIVEN("A degree angle of -270deg") + GIVEN("A degree angle of -300deg") { - Nz::DegreeAnglef angle(-270.f); + Nz::DegreeAnglef angle(-300.f); WHEN("We normalize it") { @@ -58,7 +78,7 @@ SCENARIO("Angle", "[MATH][ANGLE]") THEN("It should be equal to a normalized version of itself") { - Nz::DegreeAnglef expectedResult(90.f); + Nz::DegreeAnglef expectedResult(60.f); CHECK(angle == expectedResult); } @@ -91,7 +111,28 @@ SCENARIO("Angle", "[MATH][ANGLE]") CHECK(angle.ToDegrees() == expectedResult); } } + + WHEN("We compute its sinus/cosinus separatly") + { + THEN("It should be equal to 0 and -1") + { + CHECK(angle.GetSin() == Approx(0.f).margin(0.0001f)); + CHECK(angle.GetCos() == Approx(-1.f).margin(0.0001f)); + } + + } + AND_WHEN("We compute it at the same time") + { + auto sincos = angle.GetSinCos(); + + THEN("It should also be equal to 0 and -1") + { + CHECK(sincos.first == Approx(0.f).margin(0.0001f)); + CHECK(sincos.second == Approx(-1.f).margin(0.0001f)); + } + } } + GIVEN("A radian angle of 7pi") { Nz::RadianAnglef angle(float(7 * M_PI)); From f0e215f8f51e5faaac9617c560f34014ceff49f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 5 Sep 2018 15:15:02 +0200 Subject: [PATCH 089/352] Math/Angle: Optimize SinCos on Linux --- build/scripts/modules/core.lua | 1 + include/Nazara/Math/Angle.inl | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/build/scripts/modules/core.lua b/build/scripts/modules/core.lua index ae87461e8..e998080f8 100644 --- a/build/scripts/modules/core.lua +++ b/build/scripts/modules/core.lua @@ -19,5 +19,6 @@ MODULE.OsFiles.Posix = { MODULE.OsLibraries.Posix = { "dl", + "m", -- Math library (for sincos()) "pthread" } diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index e04a751d9..c22e99e2c 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -5,6 +5,11 @@ #include #include #include + +#ifdef NAZARA_PLATFORM_POSIX +#include //< sincos +#endif + #include namespace Nz @@ -101,6 +106,29 @@ namespace Nz } }; +#ifdef NAZARA_PLATFORM_POSIX + template + void SinCos(std::enable_if_t::value && !std::is_same::value, double> x, T* sin, T* cos) + { + double s, c; + ::sincos(x, &s, &c); + + *sin = static_cast(s); + *cos = static_cast(c); + } + + template + void SinCos(std::enable_if_t::value, float> x, float* s, float* cos) + { + ::sincosf(x, s, c); + } + + template + void SinCos(std::enable_if_t::value, long double> x, long double* s, long double* c) + { + ::sincosl(x, sin, cos); + } +#else // Naive implementation, hopefully optimized by the compiler template void SinCos(T x, T* sin, T* cos) @@ -108,6 +136,7 @@ namespace Nz *sin = std::sin(x); *cos = std::cos(x); } +#endif } /*! * \ingroup math From 97cdb110aef5bb75ba225a795d30f3534472e239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 5 Sep 2018 15:15:26 +0200 Subject: [PATCH 090/352] Unit test fixes --- tests/Engine/Physics2D/RigidBody2D.cpp | 4 ++-- tests/SDK/NDK/Systems/PhysicsSystem2D.cpp | 2 +- tests/SDK/NDK/Systems/RenderSystem.cpp | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/Engine/Physics2D/RigidBody2D.cpp b/tests/Engine/Physics2D/RigidBody2D.cpp index 0da831cfc..e801cc849 100644 --- a/tests/Engine/Physics2D/RigidBody2D.cpp +++ b/tests/Engine/Physics2D/RigidBody2D.cpp @@ -126,7 +126,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") { CHECK(body.GetAABB() == aabb); CHECK(body.GetAngularVelocity() == Approx(0.f)); - CHECK(body.GetCenterOfGravity() == Nz::Vector2f::Zero()); + CHECK(body.GetMassCenter() == Nz::Vector2f::Zero()); CHECK(body.GetGeom() == box); CHECK(body.GetMass() == Approx(mass)); CHECK(body.GetPosition() == position); @@ -150,7 +150,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") { aabb.Translate(velocity); CHECK(body.GetAABB() == aabb); - CHECK(body.GetCenterOfGravity() == Nz::Vector2f::Zero()); + CHECK(body.GetMassCenter() == Nz::Vector2f::Zero()); CHECK(body.GetPosition() == position); CHECK(body.GetVelocity() == velocity); } diff --git a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp index 3cda3f0f1..33871be57 100644 --- a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp +++ b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp @@ -38,7 +38,7 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") WHEN("We make it collide with a wall") { int rawDistance = 3; - Nz::Vector2f distance(rawDistance, 0.f); + Nz::Vector2f distance(float(rawDistance), 0.f); Nz::Vector2f wallPosition = position + Nz::Vector2f(movingAABB.width, 0.f) + distance; Nz::Rectf wallAABB(0.f, 0.f, 100.f, 100.f); Ndk::EntityHandle wallEntity = CreateBaseEntity(world, wallPosition, wallAABB); diff --git a/tests/SDK/NDK/Systems/RenderSystem.cpp b/tests/SDK/NDK/Systems/RenderSystem.cpp index a94109b9d..09fb6add2 100644 --- a/tests/SDK/NDK/Systems/RenderSystem.cpp +++ b/tests/SDK/NDK/Systems/RenderSystem.cpp @@ -6,7 +6,7 @@ #include #include -void CompareAABB(const Nz::Rectf& aabb, const Nz::BoundingVolumef& boundingVolume); +void CompareAABB(const Nz::Rectf& aabb, const Nz::Boxf& box); SCENARIO("RenderSystem", "[NDK][RenderSystem]") { @@ -110,9 +110,8 @@ SCENARIO("RenderSystem", "[NDK][RenderSystem]") } } -void CompareAABB(const Nz::Rectf& aabb, const Nz::BoundingVolumef& boundingVolume) +void CompareAABB(const Nz::Rectf& aabb, const Nz::Boxf& box) { - Nz::Boxf box = boundingVolume.aabb; CHECK(aabb.x == Approx(box.x)); CHECK(aabb.y == Approx(box.y)); CHECK(aabb.width == Approx(box.width)); From 4c8e40bb6c6c065bea10d0f398b41fd3c09cee4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 5 Sep 2018 15:18:35 +0200 Subject: [PATCH 091/352] Math/Angle: Rename parameters to prevent name clash --- include/Nazara/Math/Angle.hpp | 18 +++++++++--------- include/Nazara/Math/Angle.inl | 34 +++++++++++++++++----------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index e1c904204..70fbbdd1b 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -22,9 +22,9 @@ namespace Nz { public: Angle() = default; - Angle(T Angle); - template> explicit Angle(const Angle& Angle) { Set(Angle); } - template> explicit Angle(const Angle& Angle) { Set(Angle); } + Angle(T value); + template> explicit Angle(const Angle& value) { Set(value); } + template> explicit Angle(const Angle& value) { Set(value); } template explicit Angle(const Angle& Angle); Angle(const Angle&) = default; ~Angle() = default; @@ -49,16 +49,16 @@ namespace Nz Angle& operator=(const Angle&) = default; - Angle operator+(const Angle& Angle) const; - Angle operator-(const Angle& Angle) const; + Angle operator+(const Angle& other) const; + Angle operator-(const Angle& other) const; - Angle& operator+=(const Angle& Angle); - Angle& operator-=(const Angle& Angle); + Angle& operator+=(const Angle& other); + Angle& operator-=(const Angle& other); Angle& operator*=(T scalar); Angle& operator/=(T divider); - bool operator==(const Angle& Angle) const; - bool operator!=(const Angle& Angle) const; + bool operator==(const Angle& other) const; + bool operator!=(const Angle& other) const; static Angle Zero(); diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index c22e99e2c..c9c26c04f 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -147,11 +147,11 @@ namespace Nz /*! * \brief Constructs an Angle object with an angle value * - * \param Angle value of the angle + * \param value value of the angle */ template - Angle::Angle(T Angle) : - angle(Angle) + Angle::Angle(T value) : + angle(value) { } @@ -323,10 +323,10 @@ namespace Nz * \brief Addition operator * \return Adds two angles together * - * \param angle Angle to add + * \param other Angle to add */ template - Angle Angle::operator+(const Angle& Angle) const + Angle Angle::operator+(const Angle& other) const { return Angle(angle + Angle.angle); } @@ -335,10 +335,10 @@ namespace Nz * \brief Subtraction operator * \return Subtracts two angles together * - * \param angle Angle to subtract + * \param other Angle to subtract */ template - Angle Angle::operator-(const Angle& Angle) const + Angle Angle::operator-(const Angle& other) const { return Angle(angle - Angle.angle); } @@ -347,10 +347,10 @@ namespace Nz * \brief Adds an angle by another * \return A reference to the angle * - * \param angle Angle to add + * \param other Angle to add */ template - Angle& Angle::operator+=(const Angle& Angle) + Angle& Angle::operator+=(const Angle& other) { angle += Angle.angle; return *this; @@ -360,10 +360,10 @@ namespace Nz * \brief Subtract an angle by another * \return A reference to the angle * - * \param angle Angle to subtract + * \param other Angle to subtract */ template - Angle& Angle::operator-=(const Angle& Angle) + Angle& Angle::operator-=(const Angle& other) { angle -= Angle.angle; return *this; @@ -399,24 +399,24 @@ namespace Nz * \brief Compares the angle to another for equality * \return True if both angles are equal * - * \param Angle The other angle to compare to + * \param other The other angle to compare to */ template - bool Angle::operator==(const Angle& Angle) const + bool Angle::operator==(const Angle& other) const { - return NumberEquals(angle, Angle.angle, Detail::AngleUtils::GetEpsilon()); + return NumberEquals(angle, other.angle, Detail::AngleUtils::GetEpsilon()); } /*! * \brief Compares the angle to another for inequality * \return True if both angles are equal * - * \param Angle The other angle to compare to + * \param other The other angle to compare to */ template - bool Angle::operator!=(const Angle& Angle) const + bool Angle::operator!=(const Angle& other) const { - return !NumberEquals(angle, Angle.angle, Detail::AngleUtils::GetEpsilon()); + return !NumberEquals(angle, other.angle, Detail::AngleUtils::GetEpsilon()); } /*! From 500ad417a7065a9f53a5cd6aefe7bbc7af47cb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 5 Sep 2018 15:59:00 +0200 Subject: [PATCH 092/352] Math/Angle: Fix compilation under Linux --- include/Nazara/Math/Angle.hpp | 1 + include/Nazara/Math/Angle.inl | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index 70fbbdd1b..e177392fd 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index c9c26c04f..fd5658366 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -118,7 +118,7 @@ namespace Nz } template - void SinCos(std::enable_if_t::value, float> x, float* s, float* cos) + void SinCos(std::enable_if_t::value, float> x, float* s, float* c) { ::sincosf(x, s, c); } @@ -228,7 +228,7 @@ namespace Nz template void Angle::Normalize() { - constexpr T limit = Detail::AngleUtils::GetLimit(); + constexpr T limit = Detail::AngleUtils::template GetLimit(); constexpr T twoLimit = limit * T(2); angle = std::fmod(angle, twoLimit); @@ -404,7 +404,7 @@ namespace Nz template bool Angle::operator==(const Angle& other) const { - return NumberEquals(angle, other.angle, Detail::AngleUtils::GetEpsilon()); + return NumberEquals(angle, other.angle, Detail::AngleUtils::template GetEpsilon()); } /*! @@ -416,7 +416,7 @@ namespace Nz template bool Angle::operator!=(const Angle& other) const { - return !NumberEquals(angle, other.angle, Detail::AngleUtils::GetEpsilon()); + return !NumberEquals(angle, other.angle, Detail::AngleUtils::template GetEpsilon()); } /*! From 1114bb0fddba8f7871496242c2965106e3cb2216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 5 Sep 2018 16:24:10 +0200 Subject: [PATCH 093/352] Fix some other oopsies --- include/Nazara/Math/Angle.hpp | 4 ++-- include/Nazara/Math/Angle.inl | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index e177392fd..10525c56e 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -24,8 +24,8 @@ namespace Nz public: Angle() = default; Angle(T value); - template> explicit Angle(const Angle& value) { Set(value); } - template> explicit Angle(const Angle& value) { Set(value); } + template> explicit Angle(const Angle& value) { Set(value); } + template> explicit Angle(const Angle& value) { Set(value); } template explicit Angle(const Angle& Angle); Angle(const Angle&) = default; ~Angle() = default; diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index fd5658366..4cec7bb1a 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -328,7 +328,7 @@ namespace Nz template Angle Angle::operator+(const Angle& other) const { - return Angle(angle + Angle.angle); + return Angle(angle + other.angle); } /*! @@ -340,7 +340,7 @@ namespace Nz template Angle Angle::operator-(const Angle& other) const { - return Angle(angle - Angle.angle); + return Angle(angle - other.angle); } /*! @@ -352,7 +352,7 @@ namespace Nz template Angle& Angle::operator+=(const Angle& other) { - angle += Angle.angle; + angle += other.angle; return *this; } @@ -365,7 +365,7 @@ namespace Nz template Angle& Angle::operator-=(const Angle& other) { - angle -= Angle.angle; + angle -= other.angle; return *this; } From 1ee75f26991a17dfaefe8a0eb8a78bdb93359f63 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 5 Sep 2018 21:51:32 +0200 Subject: [PATCH 094/352] Math/Angle: Adds conversion to euler angles and quaternions --- include/Nazara/Math/Angle.hpp | 10 +++++ include/Nazara/Math/Angle.inl | 76 +++++++++++++++++++++++++++++++++++ tests/Engine/Math/Angle.cpp | 55 ++++++++++++++++++++----- 3 files changed, 132 insertions(+), 9 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index 10525c56e..28537473e 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -18,6 +18,9 @@ namespace Nz { struct SerializationContext; + template class EulerAngles; + template class Quaternion; + template class Angle { @@ -45,13 +48,20 @@ namespace Nz template Angle& Set(const Angle& Angle); Angle ToDegrees() const; + EulerAngles ToEulerAngles() const; + Quaternion ToQuaternion() const; Angle ToRadians() const; String ToString() const; + operator EulerAngles() const; + operator Quaternion() const; + Angle& operator=(const Angle&) = default; Angle operator+(const Angle& other) const; Angle operator-(const Angle& other) const; + Angle operator*(T scalar) const; + Angle operator/(T divider) const; Angle& operator+=(const Angle& other); Angle& operator-=(const Angle& other); diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index 4cec7bb1a..71d5631cc 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -319,6 +319,58 @@ namespace Nz return Detail::AngleUtils::ToString(angle); } + /*! + * \brief Shortcut allowing implicit conversion to Euler angles + * \return Euler Angles representing a 2D rotation by this angle + * + * \see ToEulerAngles + */ + template + Angle::operator EulerAngles() const + { + return ToEulerAngles(); + } + + /*! + * \brief Shortcut allowing implicit conversion to Quaternion + * \return Quaternion representing a 2D rotation by this angle + * + * \see ToQuaternion + */ + template + Angle::operator Quaternion() const + { + return ToQuaternion(); + } + + /*! + * \brief Converts the angle to an Euler Angles representation + * \return A 2D rotation expressed in Euler angles + * + * This will assume two-dimensional usage, and will set the angle value (as degrees) as the roll value of the Euler Angles, leaving pitch and yaw to zero + */ + template + EulerAngles Angle::ToEulerAngles() const + { + return EulerAngles(0, 0, ToDegrees().angle); + } + + /*! + * \brief Converts the angle to a Quaternion representation + * \return A 2D rotation expressed with Quaternion + * + * This will assume two-dimensional usage, as if the angle was first converted to Euler Angles and then to a Quaternion + * + * \see ToEulerAngles + */ + template + Quaternion Angle::ToQuaternion() const + { + auto halfAngle = Angle(*this) / 2.f; + auto sincos = halfAngle.GetSinCos(); + return Quaternion(sincos.second, 0, 0, sincos.first); + } + /*! * \brief Addition operator * \return Adds two angles together @@ -343,6 +395,30 @@ namespace Nz return Angle(angle - other.angle); } + /*! + * \brief Multiplication operator + * \return A copy of the angle, scaled by the multiplier + * + * \param scalar Multiplier + */ + template + Angle Angle::operator*(T scalar) const + { + return Angle(angle * scalar); + } + + /*! + * \brief Divides the angle by a scalar + * \return A copy of the angle, divided by the divider + * + * \param divider Divider + */ + template + Angle Angle::operator/(T divider) const + { + return Angle(angle / divider); + } + /*! * \brief Adds an angle by another * \return A reference to the angle diff --git a/tests/Engine/Math/Angle.cpp b/tests/Engine/Math/Angle.cpp index a4abc4a82..3b5346c06 100644 --- a/tests/Engine/Math/Angle.cpp +++ b/tests/Engine/Math/Angle.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include SCENARIO("Angle", "[MATH][ANGLE]") @@ -37,16 +39,33 @@ SCENARIO("Angle", "[MATH][ANGLE]") CHECK(angle.GetSin() == Approx(1.f).margin(0.0001f)); CHECK(angle.GetCos() == Approx(0.f).margin(0.0001f)); } - - } - AND_WHEN("We compute it at the same time") - { - auto sincos = angle.GetSinCos(); - - THEN("It should also be equal to 1 and 0") + AND_WHEN("We compute sin/cos at the same time") { - CHECK(sincos.first == Approx(1.f).margin(0.0001f)); - CHECK(sincos.second == Approx(0.f).margin(0.0001f)); + auto sincos = angle.GetSinCos(); + + THEN("It should also be equal to 1 and 0") + { + CHECK(sincos.first == Approx(1.f).margin(0.0001f)); + CHECK(sincos.second == Approx(0.f).margin(0.0001f)); + } + } + } + + WHEN("We get the Euler Angles representation of this angle") + { + Nz::EulerAnglesf eulerAngles = angle; + THEN("It should be equivalent to a 2D rotation by this angle") + { + CHECK(eulerAngles == Nz::EulerAnglesf(0.f, 0.f, 90.f)); + } + AND_WHEN("We get the Quaternion representation of this angle") + { + Nz::Quaternionf quat = angle; + + THEN("It should be equivalent to a 2D rotation by this angle") + { + CHECK(quat == eulerAngles.ToQuaternion()); + } } } } @@ -131,6 +150,24 @@ SCENARIO("Angle", "[MATH][ANGLE]") CHECK(sincos.second == Approx(-1.f).margin(0.0001f)); } } + + WHEN("We get the Euler Angles representation of this angle") + { + Nz::EulerAnglesf eulerAngles = angle; + THEN("It should be equivalent to a 2D rotation by this angle") + { + CHECK(eulerAngles == Nz::EulerAnglesf(0.f, 0.f, -180.f)); + } + AND_WHEN("We get the Quaternion representation of this angle") + { + Nz::Quaternionf quat = angle; + + THEN("It should be equivalent to a 2D rotation by this angle") + { + CHECK(quat == eulerAngles.ToQuaternion()); + } + } + } } GIVEN("A radian angle of 7pi") From 09c49f03fbcb348db05e9c5ab8ae243c152d26bd Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 5 Sep 2018 21:53:13 +0200 Subject: [PATCH 095/352] Math: Update global header --- include/Nazara/Math.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/Nazara/Math.hpp b/include/Nazara/Math.hpp index 9ee9a2351..e3d52540f 100644 --- a/include/Nazara/Math.hpp +++ b/include/Nazara/Math.hpp @@ -31,6 +31,7 @@ #define NAZARA_GLOBAL_MATH_HPP #include +#include #include #include #include From b631f3d3dad56e8d54a11010abbf8d623a6c1c97 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 5 Sep 2018 22:42:34 +0200 Subject: [PATCH 096/352] Fix some units test --- tests/Engine/Math/EulerAngles.cpp | 58 ++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/tests/Engine/Math/EulerAngles.cpp b/tests/Engine/Math/EulerAngles.cpp index 95a5e301a..01bfaecff 100644 --- a/tests/Engine/Math/EulerAngles.cpp +++ b/tests/Engine/Math/EulerAngles.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -26,8 +27,8 @@ SCENARIO("EulerAngles", "[MATH][EULERANGLES]") THEN("They should still be equal") { - REQUIRE(euler360 == firstZero); - REQUIRE(euler0 == secondZero); + CHECK(euler360 == firstZero); + CHECK(euler0 == secondZero); } } @@ -35,9 +36,9 @@ SCENARIO("EulerAngles", "[MATH][EULERANGLES]") { THEN("They are the same") { - REQUIRE(firstZero.ToQuaternion() == secondZero.ToQuaternion()); - REQUIRE(firstZero.ToQuaternion() == Nz::EulerAnglesf(Nz::Quaternionf(1.f, 0.f, 0.f, 0.f))); - REQUIRE(secondZero.ToQuaternion() == Nz::EulerAnglesf(Nz::Quaternionf(1.f, 0.f, 0.f, 0.f))); + CHECK(firstZero.ToQuaternion() == secondZero.ToQuaternion()); + CHECK(firstZero.ToQuaternion() == Nz::EulerAnglesf(Nz::Quaternionf(1.f, 0.f, 0.f, 0.f))); + CHECK(secondZero.ToQuaternion() == Nz::EulerAnglesf(Nz::Quaternionf(1.f, 0.f, 0.f, 0.f))); } } } @@ -56,9 +57,9 @@ SCENARIO("EulerAngles", "[MATH][EULERANGLES]") Nz::Vector3f rotation90Y = euler90Y.ToQuaternion() * Nz::Vector3f::UnitZ(); Nz::Vector3f rotation90R = euler90R.ToQuaternion() * Nz::Vector3f::UnitX(); - REQUIRE(rotation90P == Nz::Vector3f::UnitZ()); - REQUIRE(rotation90Y == Nz::Vector3f::UnitX()); - REQUIRE(rotation90R == Nz::Vector3f::UnitY()); + CHECK(rotation90P == Nz::Vector3f::UnitZ()); + CHECK(rotation90Y == Nz::Vector3f::UnitX()); + CHECK(rotation90R == Nz::Vector3f::UnitY()); } } } @@ -69,9 +70,9 @@ SCENARIO("EulerAngles", "[MATH][EULERANGLES]") { THEN("These results are expected") { - REQUIRE(Nz::EulerAngles(Nz::FromDegrees(45.f), 0.f, 0.f) == Nz::EulerAngles(Nz::Quaternionf(0.923879504204f, 0.382683455944f, 0.f, 0.f).ToEulerAngles())); - REQUIRE(Nz::EulerAngles(0.f, Nz::FromDegrees(45.f), 0.f) == Nz::EulerAngles(Nz::Quaternionf(0.923879504204f, 0.f, 0.382683455944f, 0.f).ToEulerAngles())); - REQUIRE(Nz::EulerAngles(0.f, 0.f, Nz::FromDegrees(45.f)) == Nz::EulerAngles(Nz::Quaternionf(0.923879504204f, 0.f, 0.f, 0.382683455944f).ToEulerAngles())); + CHECK(Nz::EulerAngles(Nz::FromDegrees(45.f), 0.f, 0.f) == Nz::EulerAngles(Nz::Quaternionf(0.923879504204f, 0.382683455944f, 0.f, 0.f).ToEulerAngles())); + CHECK(Nz::EulerAngles(0.f, Nz::FromDegrees(45.f), 0.f) == Nz::EulerAngles(Nz::Quaternionf(0.923879504204f, 0.f, 0.382683455944f, 0.f).ToEulerAngles())); + CHECK(Nz::EulerAngles(0.f, 0.f, Nz::FromDegrees(45.f)) == Nz::EulerAngles(Nz::Quaternionf(0.923879504204f, 0.f, 0.f, 0.382683455944f).ToEulerAngles())); } } } @@ -87,17 +88,34 @@ SCENARIO("EulerAngles", "[MATH][EULERANGLES]") THEN("And then convert to euler angles, we have identity") { Nz::EulerAnglesf tmp = Nz::Quaternionf(euler45.ToQuaternion()).ToEulerAngles(); - REQUIRE(tmp.pitch == Approx(0.f)); - REQUIRE(tmp.yaw == Approx(22.5f)); - REQUIRE(tmp.roll == Approx(22.5f)); + CHECK(tmp.pitch == Approx(0.f)); + CHECK(tmp.yaw == Approx(22.5f)); + CHECK(tmp.roll == Approx(22.5f)); + tmp = Nz::Quaternionf(euler90.ToQuaternion()).ToEulerAngles(); - REQUIRE(tmp.pitch == Approx(90.f)); - REQUIRE(tmp.yaw == Approx(90.f)); - REQUIRE(tmp.roll == Approx(0.f)); + CHECK(tmp.pitch == Approx(90.f)); + CHECK(tmp.yaw == Approx(90.f)); + CHECK(tmp.roll == Approx(0.f)); + tmp = Nz::Quaternionf(euler30.ToQuaternion()).ToEulerAngles(); - REQUIRE(tmp.pitch == Approx(30.f)); - REQUIRE(tmp.yaw == Approx(0.f).margin(0.0001f)); - REQUIRE(tmp.roll == Approx(30.f)); + CHECK(tmp.pitch == Approx(30.f)); + CHECK(tmp.yaw == Approx(0.f).margin(0.0001f)); + CHECK(tmp.roll == Approx(30.f)); + } + } + } + + GIVEN("An angle of 45 degrees") + { + Nz::DegreeAnglef angle(45.f); + + WHEN("We convert it to Euler angles") + { + Nz::EulerAnglesf eulerAngles(angle); + + THEN("It should be equal to a 2D rotation of 45 degrees") + { + CHECK(eulerAngles == Nz::EulerAnglesf(0.f, 0.f, 45.f)); } } } From 8bcb8756f938d2bdff09b82e3e1910946cb6962d Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 5 Sep 2018 22:42:39 +0200 Subject: [PATCH 097/352] Fill changelog --- ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog.md b/ChangeLog.md index fb8d26b03..ae9f1cda3 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -144,6 +144,7 @@ Nazara Engine: - Fixed TcpClient::WaitForConnected possible failure (although connected) on Windows/Linux - CullingList now handles box tests - ⚠️ 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. Nazara Development Kit: - Added ImageWidget (#139) From 46008531e0078d3ca6c4e90c6d1242d2b03a6e8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 6 Sep 2018 13:24:29 +0200 Subject: [PATCH 098/352] Math/Angle: Fix implicit conversion to Euler Angles/Quaternion --- include/Nazara/Math/Angle.hpp | 3 --- include/Nazara/Math/Angle.inl | 24 ---------------------- include/Nazara/Math/EulerAngles.hpp | 3 +++ include/Nazara/Math/EulerAngles.inl | 31 +++++++++++++++++++++++++++-- include/Nazara/Math/Quaternion.hpp | 3 +++ include/Nazara/Math/Quaternion.inl | 30 ++++++++++++++++++++++++++-- 6 files changed, 63 insertions(+), 31 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index 28537473e..a64893e3a 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -53,9 +53,6 @@ namespace Nz Angle ToRadians() const; String ToString() const; - operator EulerAngles() const; - operator Quaternion() const; - Angle& operator=(const Angle&) = default; Angle operator+(const Angle& other) const; diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index 71d5631cc..a2a9f8c8e 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -319,30 +319,6 @@ namespace Nz return Detail::AngleUtils::ToString(angle); } - /*! - * \brief Shortcut allowing implicit conversion to Euler angles - * \return Euler Angles representing a 2D rotation by this angle - * - * \see ToEulerAngles - */ - template - Angle::operator EulerAngles() const - { - return ToEulerAngles(); - } - - /*! - * \brief Shortcut allowing implicit conversion to Quaternion - * \return Quaternion representing a 2D rotation by this angle - * - * \see ToQuaternion - */ - template - Angle::operator Quaternion() const - { - return ToQuaternion(); - } - /*! * \brief Converts the angle to an Euler Angles representation * \return A 2D rotation expressed in Euler angles diff --git a/include/Nazara/Math/EulerAngles.hpp b/include/Nazara/Math/EulerAngles.hpp index 126ea399e..0079d2f6a 100644 --- a/include/Nazara/Math/EulerAngles.hpp +++ b/include/Nazara/Math/EulerAngles.hpp @@ -8,6 +8,7 @@ #define NAZARA_EULERANGLES_HPP #include +#include #include #include @@ -22,6 +23,7 @@ namespace Nz EulerAngles() = default; EulerAngles(T P, T Y, T R); EulerAngles(const T angles[3]); + template EulerAngles(const Angle& angle); //EulerAngles(const Matrix3& mat); EulerAngles(const Quaternion& quat); template explicit EulerAngles(const EulerAngles& angles); @@ -34,6 +36,7 @@ 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); diff --git a/include/Nazara/Math/EulerAngles.inl b/include/Nazara/Math/EulerAngles.inl index 2c35503ec..52c2e4b41 100644 --- a/include/Nazara/Math/EulerAngles.inl +++ b/include/Nazara/Math/EulerAngles.inl @@ -50,12 +50,23 @@ namespace Nz Set(angles); } + /*! + * \brief Constructs a EulerAngles object from an angle + * + * \param angle Angle representing a 2D rotation + */ + template + template + EulerAngles::EulerAngles(const Angle& angle) + { + Set(angle); + } + /*! * \brief Constructs a EulerAngles object from a quaternion * * \param quat Quaternion representing a rotation of space */ - template EulerAngles::EulerAngles(const Quaternion& quat) { @@ -142,13 +153,28 @@ namespace Nz return *this; } + + /*! + * \brief Sets the components of the euler angle from a 2D rotation specified by an Angle + * \return A reference to this euler angle + * + * \param angle 2D angle + * + * \see Angle + */ + template + template + EulerAngles& EulerAngles::Set(const Angle& angle) + { + 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) { @@ -394,3 +420,4 @@ std::ostream& operator<<(std::ostream& out, const Nz::EulerAngles& angles) #undef F #include +#include "EulerAngles.hpp" diff --git a/include/Nazara/Math/Quaternion.hpp b/include/Nazara/Math/Quaternion.hpp index 17c9a8757..16e88b8ef 100644 --- a/include/Nazara/Math/Quaternion.hpp +++ b/include/Nazara/Math/Quaternion.hpp @@ -8,6 +8,7 @@ #define NAZARA_QUATERNION_HPP #include +#include namespace Nz { @@ -21,6 +22,7 @@ namespace Nz public: Quaternion() = default; Quaternion(T W, T X, T Y, T Z); + template Quaternion(const Angle& angle); Quaternion(const EulerAngles& angles); Quaternion(T angle, const Vector3& axis); Quaternion(const T quat[4]); @@ -49,6 +51,7 @@ namespace Nz Quaternion& Normalize(T* length = nullptr); Quaternion& Set(T W, T X, T Y, T Z); + template Quaternion& Set(const Angle& angle); Quaternion& Set(const EulerAngles& angles); Quaternion& Set(T angle, const Vector3& normalizedAxis); Quaternion& Set(const T quat[4]); diff --git a/include/Nazara/Math/Quaternion.inl b/include/Nazara/Math/Quaternion.inl index 59099f3b8..f253d7d6b 100644 --- a/include/Nazara/Math/Quaternion.inl +++ b/include/Nazara/Math/Quaternion.inl @@ -39,6 +39,18 @@ namespace Nz Set(W, X, Y, Z); } + /*! + * \brief Constructs a Quaternion object from an angle + * + * \param angle Angle representing a 2D rotation + */ + template + template + Quaternion::Quaternion(const Angle& angle) + { + Set(angle); + } + /*! * \brief Constructs a Quaternion object from a EulerAngles * @@ -46,7 +58,6 @@ namespace Nz * * \see EulerAngles */ - template Quaternion::Quaternion(const EulerAngles& angles) { @@ -343,6 +354,21 @@ namespace Nz return *this; } + /*! + * \brief Sets this quaternion from a 2D rotation specified by an Angle + * \return A reference to this quaternion + * + * \param angle 2D angle + * + * \see Angle + */ + template + template + Quaternion& Quaternion::Set(const Angle& angle) + { + return Set(angle.ToQuaternion()); + } + /*! * \brief Sets this quaternion from rotation specified by Euler angle * \return A reference to this quaternion @@ -351,7 +377,6 @@ namespace Nz * * \see EulerAngles */ - template Quaternion& Quaternion::Set(const EulerAngles& angles) { @@ -886,3 +911,4 @@ std::ostream& operator<<(std::ostream& out, const Nz::Quaternion& quat) #undef F #include +#include "Quaternion.hpp" From eaa3fd2f090447d7dc411f4b240adeaf380ccdaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 6 Sep 2018 13:27:06 +0200 Subject: [PATCH 099/352] Fix method order --- include/Nazara/Math/Angle.inl | 40 +++++++++++++++++------------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index a2a9f8c8e..82f7c4dbe 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -299,26 +299,6 @@ namespace Nz return DegreeAngle(Detail::AngleUtils::ToDegrees(angle)); } - /*! - * \brief Returns the radian angle that is equivalent to this angle - * \return Equivalent radian angle - */ - template - Angle Angle::ToRadians() const - { - return RadianAngle(Detail::AngleUtils::ToRadians(angle)); - } - - /*! - * \brief Converts the angle to a string representation - * \return String representation of the angle - */ - template - String Angle::ToString() const - { - return Detail::AngleUtils::ToString(angle); - } - /*! * \brief Converts the angle to an Euler Angles representation * \return A 2D rotation expressed in Euler angles @@ -347,6 +327,26 @@ namespace Nz return Quaternion(sincos.second, 0, 0, sincos.first); } + /*! + * \brief Returns the radian angle that is equivalent to this angle + * \return Equivalent radian angle + */ + template + Angle Angle::ToRadians() const + { + return RadianAngle(Detail::AngleUtils::ToRadians(angle)); + } + + /*! + * \brief Converts the angle to a string representation + * \return String representation of the angle + */ + template + String Angle::ToString() const + { + return Detail::AngleUtils::ToString(angle); + } + /*! * \brief Addition operator * \return Adds two angles together From d0bea6d09a121e84c70cc862409c6f4aaa171b89 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 6 Sep 2018 18:35:51 +0200 Subject: [PATCH 100/352] Update global headers --- include/Nazara/Core.hpp | 2 ++ include/Nazara/Physics2D.hpp | 1 + 2 files changed, 3 insertions(+) diff --git a/include/Nazara/Core.hpp b/include/Nazara/Core.hpp index 515d8c545..faab3b2f8 100644 --- a/include/Nazara/Core.hpp +++ b/include/Nazara/Core.hpp @@ -82,6 +82,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/include/Nazara/Physics2D.hpp b/include/Nazara/Physics2D.hpp index 074578140..1aa97796f 100644 --- a/include/Nazara/Physics2D.hpp +++ b/include/Nazara/Physics2D.hpp @@ -29,6 +29,7 @@ #ifndef NAZARA_GLOBAL_PHYSICS2D_HPP #define NAZARA_GLOBAL_PHYSICS2D_HPP +#include #include #include #include From b019fc4f6d2b0eeb14c147eb541988b645683958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 7 Sep 2018 13:26:14 +0200 Subject: [PATCH 101/352] Sdk/GraphicsComponent: Fix generated AABB --- SDK/src/NDK/Components/GraphicsComponent.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/SDK/src/NDK/Components/GraphicsComponent.cpp b/SDK/src/NDK/Components/GraphicsComponent.cpp index 6b2b2880a..fb4d6920b 100644 --- a/SDK/src/NDK/Components/GraphicsComponent.cpp +++ b/SDK/src/NDK/Components/GraphicsComponent.cpp @@ -297,17 +297,16 @@ namespace Ndk RenderSystem& renderSystem = m_entity->GetWorld()->GetSystem(); - m_aabb.MakeZero(); - for (std::size_t i = 0; i < m_renderables.size(); ++i) + m_aabb.Set(-1.f, -1.f, -1.f); + for (const Renderable& r : m_renderables) { - const Renderable& r = m_renderables[i]; r.boundingVolume = r.renderable->GetBoundingVolume(); r.data.transformMatrix = Nz::Matrix4f::ConcatenateAffine(renderSystem.GetCoordinateSystemMatrix(), Nz::Matrix4f::ConcatenateAffine(r.data.localMatrix, m_transformMatrix)); if (r.boundingVolume.IsFinite()) { r.boundingVolume.Update(r.data.transformMatrix); - if (i > 0) + if (m_aabb.IsValid()) m_aabb.ExtendTo(r.boundingVolume.aabb); else m_aabb.Set(r.boundingVolume.aabb); From 02383b1c0bfbc6ff92a02b7b221e7a0b3c0da36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 7 Sep 2018 13:34:55 +0200 Subject: [PATCH 102/352] Sdk/GraphicsComponent: Invalidates culling when adding/removing renderables --- SDK/include/NDK/Components/GraphicsComponent.hpp | 1 + SDK/include/NDK/Components/GraphicsComponent.inl | 8 ++++++++ SDK/src/NDK/Components/GraphicsComponent.cpp | 7 +++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/SDK/include/NDK/Components/GraphicsComponent.hpp b/SDK/include/NDK/Components/GraphicsComponent.hpp index cd2900d7f..83afc22f1 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.hpp +++ b/SDK/include/NDK/Components/GraphicsComponent.hpp @@ -74,6 +74,7 @@ namespace Ndk void ConnectInstancedRenderableSignals(Renderable& renderable); + inline void ForceCullingInvalidation(); inline void InvalidateAABB() const; void InvalidateRenderableData(const Nz::InstancedRenderable* renderable, Nz::UInt32 flags, std::size_t index); void InvalidateRenderableMaterial(const Nz::InstancedRenderable* renderable, std::size_t skinIndex, std::size_t matIndex, const Nz::MaterialRef& newMat); diff --git a/SDK/include/NDK/Components/GraphicsComponent.inl b/SDK/include/NDK/Components/GraphicsComponent.inl index 71adf64d4..f7cfb07ba 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.inl +++ b/SDK/include/NDK/Components/GraphicsComponent.inl @@ -93,6 +93,8 @@ namespace Ndk UnregisterMaterial(renderable->GetMaterial(i)); m_renderables.erase(it); + + ForceCullingInvalidation(); break; } } @@ -255,6 +257,12 @@ namespace Ndk * \brief Invalidates the bounding volume */ + inline void GraphicsComponent::ForceCullingInvalidation() + { + for (CullingBoxEntry& entry : m_cullingBoxEntries) + entry.listEntry.ForceInvalidation(); //< Invalidate render queues + } + inline void GraphicsComponent::InvalidateAABB() const { m_boundingVolumesUpdated = false; diff --git a/SDK/src/NDK/Components/GraphicsComponent.cpp b/SDK/src/NDK/Components/GraphicsComponent.cpp index fb4d6920b..5182e2d2d 100644 --- a/SDK/src/NDK/Components/GraphicsComponent.cpp +++ b/SDK/src/NDK/Components/GraphicsComponent.cpp @@ -89,6 +89,7 @@ namespace Ndk RegisterMaterial(entry.renderable->GetMaterial(i)); InvalidateAABB(); + ForceCullingInvalidation(); } void GraphicsComponent::ConnectInstancedRenderableSignals(Renderable& entry) @@ -110,8 +111,7 @@ namespace Ndk r.dataUpdated = false; r.renderable->InvalidateData(&r.data, flags); - for (CullingBoxEntry& entry : m_cullingBoxEntries) - entry.listEntry.ForceInvalidation(); + ForceCullingInvalidation(); } void GraphicsComponent::InvalidateRenderableMaterial(const Nz::InstancedRenderable* renderable, std::size_t skinIndex, std::size_t matIndex, const Nz::MaterialRef& newMat) @@ -265,8 +265,7 @@ namespace Ndk InvalidateAABB(); InvalidateTransformMatrix(); - for (CullingBoxEntry& entry : m_cullingBoxEntries) - entry.listEntry.ForceInvalidation(); //< Force invalidation on movement + ForceCullingInvalidation(); //< Force invalidation on movement for now (FIXME) } void GraphicsComponent::UnregisterMaterial(Nz::Material* material) From ba59bc927f98536f3546fbd8af399ef15acf4c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 7 Sep 2018 13:48:27 +0200 Subject: [PATCH 103/352] AppVeyor: Switch from VS2015 to VS2017 --- ChangeLog.md | 1 + appveyor.yml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index ae9f1cda3..23d2af364 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -18,6 +18,7 @@ Miscellaneous: - Replaced typedefs keywords with modern using keywords - When supported, projects are now parts of a virtual "workspace group" according to their kind - Fixed .dll copy when building Nazara occuring on Linux when targeting Windows (MinGW) +- ⚠ Appveyor nightlies are now compiled with VS2017 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/appveyor.yml b/appveyor.yml index 8c53f2bd8..dcdf221ad 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -17,11 +17,11 @@ skip_commits: - NazaraModuleTemplate/* os: - - Visual Studio 2015 + - Visual Studio 2017 environment: matrix: - - TOOLSET: vs2015 + - TOOLSET: vs2017 install: - cd build && "./premake5.exe" %TOOLSET% && cd .. From dad8894d76cfe2ccdc4e6ba83310e4420cb52528 Mon Sep 17 00:00:00 2001 From: S6066 Date: Fri, 7 Sep 2018 17:27:33 +0200 Subject: [PATCH 104/352] Readme: Fix Appveyor Nightlies' link (#187) * [Readme] Fix Appveyor nightlies link * [Readme] Add link to debug binaries --- readme.md | 4 +++- readme_fr.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index b35253f90..b8dc10063 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,8 @@ Platform | Build Status | Nightlies ------------ | ------------- | ------------- -Windows | [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/rqxfj343mh3ab2we/branch/master?svg=true)](https://ci.appveyor.com/project/DrLynix/nazaraengine/branch/master) | MSVC14: [x86](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2015%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20Win32) [x86_64](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2015%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20x64) +Windows | [![AppVeyor Build +status](https://ci.appveyor.com/api/projects/status/rqxfj343mh3ab2we/branch/master?svg=true)](https://ci.appveyor.com/project/DrLynix/nazaraengine/branch/master) +| MSVC14: Debug [x86](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20Win32), [x86_64](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20x64) & Release [x86](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20Win32), [x86_64](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20x64) Linux | [![Travis CI Build Status](https://travis-ci.org/DigitalPulseSoftware/NazaraEngine.svg?branch=master)](https://travis-ci.org/DigitalPulseSoftware/NazaraEngine) | No # Nazara Engine diff --git a/readme_fr.md b/readme_fr.md index ef57f0448..135482c73 100644 --- a/readme_fr.md +++ b/readme_fr.md @@ -1,6 +1,8 @@ Platforme | Build Status | Nightlies ------------ | ------------- | ------------- -Windows | [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/rqxfj343mh3ab2we/branch/master?svg=true)](https://ci.appveyor.com/project/DrLynix/nazaraengine/branch/master) | MSVC14: [x86](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2015%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20Win32) [x86_64](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2015%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20x64) +Windows | [![AppVeyor Build +status](https://ci.appveyor.com/api/projects/status/rqxfj343mh3ab2we/branch/master?svg=true)](https://ci.appveyor.com/project/DrLynix/nazaraengine/branch/master) +| MSVC14: MSVC14: Debug [x86](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20Win32), [x86_64](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20x64) & Release [x86](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20Win32), [x86_64](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20x64) Linux | [![Travis CI Build Status](https://travis-ci.org/DigitalPulseSoftware/NazaraEngine.svg?branch=master)](https://travis-ci.org/DigitalPulseSoftware/NazaraEngine) | Non # Nazara Engine From 5f2cec313a30698f07ca934b18b75dbf79066ca4 Mon Sep 17 00:00:00 2001 From: S6066 Date: Fri, 7 Sep 2018 17:47:49 +0200 Subject: [PATCH 105/352] Fix readme's (#188) --- readme.md | 4 +--- readme_fr.md | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/readme.md b/readme.md index b8dc10063..2eaabc09e 100644 --- a/readme.md +++ b/readme.md @@ -1,8 +1,6 @@ Platform | Build Status | Nightlies ------------ | ------------- | ------------- -Windows | [![AppVeyor Build -status](https://ci.appveyor.com/api/projects/status/rqxfj343mh3ab2we/branch/master?svg=true)](https://ci.appveyor.com/project/DrLynix/nazaraengine/branch/master) -| MSVC14: Debug [x86](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20Win32), [x86_64](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20x64) & Release [x86](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20Win32), [x86_64](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20x64) +Windows | [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/rqxfj343mh3ab2we/branch/master?svg=true)](https://ci.appveyor.com/project/DrLynix/nazaraengine/branch/master) | MSVC14.1:
**x86:** [Debug](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20Win32), [Release](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20Win32)
**x86_64:** [Debug](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20x64), [Release](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20x64) Linux | [![Travis CI Build Status](https://travis-ci.org/DigitalPulseSoftware/NazaraEngine.svg?branch=master)](https://travis-ci.org/DigitalPulseSoftware/NazaraEngine) | No # Nazara Engine diff --git a/readme_fr.md b/readme_fr.md index 135482c73..f0b7bf6c4 100644 --- a/readme_fr.md +++ b/readme_fr.md @@ -1,8 +1,6 @@ -Platforme | Build Status | Nightlies +Plateforme | Build Status | Nightlies ------------ | ------------- | ------------- -Windows | [![AppVeyor Build -status](https://ci.appveyor.com/api/projects/status/rqxfj343mh3ab2we/branch/master?svg=true)](https://ci.appveyor.com/project/DrLynix/nazaraengine/branch/master) -| MSVC14: MSVC14: Debug [x86](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20Win32), [x86_64](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20x64) & Release [x86](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20Win32), [x86_64](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20x64) +Windows | [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/rqxfj343mh3ab2we/branch/master?svg=true)](https://ci.appveyor.com/project/DrLynix/nazaraengine/branch/master) | MSVC14.1:
**x86:** [Debug](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20Win32), [Release](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20Win32)
**x86_64:** [Debug](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20DebugDynamic%3B%20Platform%3A%20x64), [Release](https://ci.appveyor.com/api/projects/DrLynix/NazaraEngine/artifacts/package%2FNazaraEngine.7z?branch=master&job=Environment%3A%20TOOLSET%3Dvs2017%3B%20Configuration%3A%20ReleaseDynamic%3B%20Platform%3A%20x64) Linux | [![Travis CI Build Status](https://travis-ci.org/DigitalPulseSoftware/NazaraEngine.svg?branch=master)](https://travis-ci.org/DigitalPulseSoftware/NazaraEngine) | Non # Nazara Engine From 7c5b0df96cf86702d5587569c485ede4e3f0831c Mon Sep 17 00:00:00 2001 From: Faymoon Date: Sat, 8 Sep 2018 10:28:25 +0200 Subject: [PATCH 106/352] Make all component inherits of HandledObject (#185) * Update * Add: [Get/Set]AngularDaming for standardization * Fix: Name error * Add: [Get/Set][AngularDamping/MomentOfInertia] in PhysicsComponent2D * Forgot in last commit * Add: param coordSys in [PhysicsComponent2D/RigidBody2D]::SetMassCenter * Add: Some forgotten inline * Fix little error * Fix: Indentation before case * Move and Change GetCenterOfGravity * Rename m_world into m_physWorld * Rename GetWorld int GetPhysWorld * Update: PhysicsSystem2D became an interface of PhysWorld2D * Update Collison/PhysicsComponent because GetWorld was renamed * Update tests * Update: Make the interface usable with Entity instead of PhysicsComponent * Update: Make GetPhysWorld private * Update PhysicsSystem2D.hpp * Update: indent * Remove: useless blank line * update order(?) * Update PhysicsSystem2D.hpp * Add calls to GetPhysWorld to attempt a nullptr value * update include * little fix * add some missing inline * Fix * Make all component inherits of HandledObject * fix: compilation error * Add Handle alias for all Components * forgot in last commit --- SDK/include/NDK/Component.hpp | 2 +- SDK/include/NDK/Components/CameraComponent.hpp | 2 +- SDK/include/NDK/Components/CameraComponent.inl | 1 - SDK/include/NDK/Components/CollisionComponent2D.hpp | 4 ++++ SDK/include/NDK/Components/CollisionComponent3D.hpp | 4 ++++ SDK/include/NDK/Components/ConstraintComponent2D.hpp | 4 ++++ SDK/include/NDK/Components/DebugComponent.hpp | 4 ++++ SDK/include/NDK/Components/GraphicsComponent.hpp | 2 +- SDK/include/NDK/Components/GraphicsComponent.inl | 1 - SDK/include/NDK/Components/LightComponent.hpp | 6 +++++- SDK/include/NDK/Components/ListenerComponent.hpp | 4 ++++ SDK/include/NDK/Components/NodeComponent.hpp | 2 +- SDK/include/NDK/Components/ParticleEmitterComponent.hpp | 4 ++++ SDK/include/NDK/Components/ParticleGroupComponent.hpp | 4 ++-- SDK/include/NDK/Components/PhysicsComponent2D.hpp | 4 ++++ SDK/include/NDK/Components/PhysicsComponent3D.hpp | 4 ++++ SDK/include/NDK/Components/VelocityComponent.hpp | 2 +- 17 files changed, 44 insertions(+), 10 deletions(-) diff --git a/SDK/include/NDK/Component.hpp b/SDK/include/NDK/Component.hpp index a3bc1cac2..6b32c5fd2 100644 --- a/SDK/include/NDK/Component.hpp +++ b/SDK/include/NDK/Component.hpp @@ -12,7 +12,7 @@ namespace Ndk { template - class Component : public BaseComponent + class Component : public BaseComponent, public Nz::HandledObject { public: Component(); diff --git a/SDK/include/NDK/Components/CameraComponent.hpp b/SDK/include/NDK/Components/CameraComponent.hpp index e9a4de2da..92fab2e0e 100644 --- a/SDK/include/NDK/Components/CameraComponent.hpp +++ b/SDK/include/NDK/Components/CameraComponent.hpp @@ -22,7 +22,7 @@ namespace Ndk using CameraComponentHandle = Nz::ObjectHandle; - class NDK_API CameraComponent : public Component, public Nz::AbstractViewer, public Nz::HandledObject + class NDK_API CameraComponent : public Component, public Nz::AbstractViewer { public: inline CameraComponent(); diff --git a/SDK/include/NDK/Components/CameraComponent.inl b/SDK/include/NDK/Components/CameraComponent.inl index 4baad5225..df6d5a2b3 100644 --- a/SDK/include/NDK/Components/CameraComponent.inl +++ b/SDK/include/NDK/Components/CameraComponent.inl @@ -38,7 +38,6 @@ namespace Ndk inline CameraComponent::CameraComponent(const CameraComponent& camera) : Component(camera), AbstractViewer(camera), - HandledObject(camera), m_visibilityHash(camera.m_visibilityHash), m_projectionType(camera.m_projectionType), m_targetRegion(camera.m_targetRegion), diff --git a/SDK/include/NDK/Components/CollisionComponent2D.hpp b/SDK/include/NDK/Components/CollisionComponent2D.hpp index 6908c2bef..aecdc5197 100644 --- a/SDK/include/NDK/Components/CollisionComponent2D.hpp +++ b/SDK/include/NDK/Components/CollisionComponent2D.hpp @@ -14,6 +14,10 @@ namespace Ndk { + class CollisionComponent2D; + + using CollisionComponent2DHandle = Nz::ObjectHandle; + class NDK_API CollisionComponent2D : public Component { friend class PhysicsSystem2D; diff --git a/SDK/include/NDK/Components/CollisionComponent3D.hpp b/SDK/include/NDK/Components/CollisionComponent3D.hpp index 5c14f2c70..65e48576b 100644 --- a/SDK/include/NDK/Components/CollisionComponent3D.hpp +++ b/SDK/include/NDK/Components/CollisionComponent3D.hpp @@ -14,6 +14,10 @@ namespace Ndk { + class CollisionComponent3D; + + using CollisionComponent3DHandle = Nz::ObjectHandle; + class NDK_API CollisionComponent3D : public Component { friend class PhysicsSystem3D; diff --git a/SDK/include/NDK/Components/ConstraintComponent2D.hpp b/SDK/include/NDK/Components/ConstraintComponent2D.hpp index 8ad80e1de..23fcfe4c8 100644 --- a/SDK/include/NDK/Components/ConstraintComponent2D.hpp +++ b/SDK/include/NDK/Components/ConstraintComponent2D.hpp @@ -11,6 +11,10 @@ namespace Ndk { + class ConstraintComponent2D; + + using ConstraintComponent2DHandle = Nz::ObjectHandle; + class NDK_API ConstraintComponent2D : public Component { public: diff --git a/SDK/include/NDK/Components/DebugComponent.hpp b/SDK/include/NDK/Components/DebugComponent.hpp index 85e868b5a..206f85724 100644 --- a/SDK/include/NDK/Components/DebugComponent.hpp +++ b/SDK/include/NDK/Components/DebugComponent.hpp @@ -40,6 +40,10 @@ namespace Ndk constexpr DebugDrawFlags DebugDraw_None = 0; + class DebugComponent; + + using DebugComponentHandle = Nz::ObjectHandle; + class NDK_API DebugComponent : public Component { friend class DebugSystem; diff --git a/SDK/include/NDK/Components/GraphicsComponent.hpp b/SDK/include/NDK/Components/GraphicsComponent.hpp index 83afc22f1..e7780f3e0 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.hpp +++ b/SDK/include/NDK/Components/GraphicsComponent.hpp @@ -22,7 +22,7 @@ namespace Ndk using GraphicsComponentCullingList = Nz::CullingList; using GraphicsComponentHandle = Nz::ObjectHandle; - class NDK_API GraphicsComponent : public Component, public Nz::HandledObject + class NDK_API GraphicsComponent : public Component { friend class RenderSystem; diff --git a/SDK/include/NDK/Components/GraphicsComponent.inl b/SDK/include/NDK/Components/GraphicsComponent.inl index f7cfb07ba..37bbd1049 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.inl +++ b/SDK/include/NDK/Components/GraphicsComponent.inl @@ -22,7 +22,6 @@ namespace Ndk */ inline GraphicsComponent::GraphicsComponent(const GraphicsComponent& graphicsComponent) : Component(graphicsComponent), - HandledObject(graphicsComponent), m_reflectiveMaterialCount(0), m_aabb(graphicsComponent.m_aabb), m_transformMatrix(graphicsComponent.m_transformMatrix), diff --git a/SDK/include/NDK/Components/LightComponent.hpp b/SDK/include/NDK/Components/LightComponent.hpp index fcf59f179..a7f72d0eb 100644 --- a/SDK/include/NDK/Components/LightComponent.hpp +++ b/SDK/include/NDK/Components/LightComponent.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Jrme Leclercq +// 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 @@ -13,6 +13,10 @@ namespace Ndk { + class LightComponent; + + using LightComponentHandle = Nz::ObjectHandle; + class NDK_API LightComponent : public Component, public Nz::Light { public: diff --git a/SDK/include/NDK/Components/ListenerComponent.hpp b/SDK/include/NDK/Components/ListenerComponent.hpp index 605f425a2..d5debdd36 100644 --- a/SDK/include/NDK/Components/ListenerComponent.hpp +++ b/SDK/include/NDK/Components/ListenerComponent.hpp @@ -12,6 +12,10 @@ namespace Ndk { + class ListenerComponent; + + using ListenerComponentHandle = Nz::ObjectHandle; + class NDK_API ListenerComponent : public Component { public: diff --git a/SDK/include/NDK/Components/NodeComponent.hpp b/SDK/include/NDK/Components/NodeComponent.hpp index 5661ab3ea..bccba1233 100644 --- a/SDK/include/NDK/Components/NodeComponent.hpp +++ b/SDK/include/NDK/Components/NodeComponent.hpp @@ -17,7 +17,7 @@ namespace Ndk using NodeComponentHandle = Nz::ObjectHandle; - class NDK_API NodeComponent : public Component, public Nz::Node, public Nz::HandledObject + class NDK_API NodeComponent : public Component, public Nz::Node { public: NodeComponent() = default; diff --git a/SDK/include/NDK/Components/ParticleEmitterComponent.hpp b/SDK/include/NDK/Components/ParticleEmitterComponent.hpp index f50229ef5..0c7497a3b 100644 --- a/SDK/include/NDK/Components/ParticleEmitterComponent.hpp +++ b/SDK/include/NDK/Components/ParticleEmitterComponent.hpp @@ -13,6 +13,10 @@ namespace Ndk { + class ParticleEmitterComponent; + + using ParticleEmitterComponentHandle = Nz::ObjectHandle; + class NDK_API ParticleEmitterComponent : public Component, public Nz::ParticleEmitter { public: diff --git a/SDK/include/NDK/Components/ParticleGroupComponent.hpp b/SDK/include/NDK/Components/ParticleGroupComponent.hpp index 981dbd11e..9415b8547 100644 --- a/SDK/include/NDK/Components/ParticleGroupComponent.hpp +++ b/SDK/include/NDK/Components/ParticleGroupComponent.hpp @@ -17,7 +17,7 @@ namespace Ndk using ParticleGroupComponentHandle = Nz::ObjectHandle; - class NDK_API ParticleGroupComponent : public Component, public Nz::ParticleGroup, public Nz::HandledObject + class NDK_API ParticleGroupComponent : public Component, public Nz::ParticleGroup { public: inline ParticleGroupComponent(unsigned int maxParticleCount, Nz::ParticleLayout layout); @@ -38,4 +38,4 @@ namespace Ndk #include #endif // NDK_COMPONENTS_PARTICLEGROUPCOMPONENT_HPP -#endif // NDK_SERVER \ No newline at end of file +#endif // NDK_SERVER diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index c1a741153..74b6d630e 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -13,6 +13,10 @@ namespace Ndk { + class PhysicsComponent2D; + + using PhysicsComponent2DHandle = Nz::ObjectHandle; + class NDK_API PhysicsComponent2D : public Component { friend class CollisionComponent2D; diff --git a/SDK/include/NDK/Components/PhysicsComponent3D.hpp b/SDK/include/NDK/Components/PhysicsComponent3D.hpp index d7c9ddd52..08cc64081 100644 --- a/SDK/include/NDK/Components/PhysicsComponent3D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent3D.hpp @@ -13,6 +13,10 @@ namespace Ndk { + class PhysicsComponent3D; + + using PhysicsComponent3DHandle = Nz::ObjectHandle; + class NDK_API PhysicsComponent3D : public Component { friend class CollisionComponent3D; diff --git a/SDK/include/NDK/Components/VelocityComponent.hpp b/SDK/include/NDK/Components/VelocityComponent.hpp index 6497fd61a..8785f6861 100644 --- a/SDK/include/NDK/Components/VelocityComponent.hpp +++ b/SDK/include/NDK/Components/VelocityComponent.hpp @@ -16,7 +16,7 @@ namespace Ndk using VelocityComponentHandle = Nz::ObjectHandle; - class NDK_API VelocityComponent : public Component, public Nz::HandledObject + class NDK_API VelocityComponent : public Component { public: VelocityComponent(const Nz::Vector3f& velocity = Nz::Vector3f::Zero()); From d99ae411c634f96b743cdf04416c39eea9217b7b Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 9 Sep 2018 13:56:29 +0200 Subject: [PATCH 107/352] Renderer/OpenGL: Fix glUniformMatrix4dv not being loaded --- src/Nazara/Renderer/OpenGL.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Nazara/Renderer/OpenGL.cpp b/src/Nazara/Renderer/OpenGL.cpp index 0d6f07d2e..1c6ac00dd 100644 --- a/src/Nazara/Renderer/OpenGL.cpp +++ b/src/Nazara/Renderer/OpenGL.cpp @@ -1112,6 +1112,7 @@ namespace Nz glUniform2dv = reinterpret_cast(LoadEntry("glUniform2dv")); glUniform3dv = reinterpret_cast(LoadEntry("glUniform3dv")); glUniform4dv = reinterpret_cast(LoadEntry("glUniform4dv")); + glUniformMatrix4dv = reinterpret_cast(LoadEntry("glUniformMatrix4dv")); s_openGLextensions[OpenGLExtension_FP64] = true; } From 53aa9ea1709523b87a35e3583059f58be9248d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 11 Sep 2018 21:03:44 +0200 Subject: [PATCH 108/352] Layouts (#189) * Layout WIP * Widgets/BoxLayout: Fix layout algorithm * Widgets/BoxLayout: Fix box layout algorithm for good * SDK/Widgets: Remove padding * Sdk/Widgets: Make use of minimum/preferred size * Sdk/TextAreaWidget: Add Minimum/PreferredSize to TextArea * Sdk/Widgets: Add height/width variants of get/set fixed, maximum, minimum and preferred size methods * Sdk/BoxLayout: Remove useless code * Sdk/TextAreaWidget: Fix compilation * Widgets/TextAreaWidget: Fix cursor position --- SDK/include/NDK/BaseWidget.hpp | 60 ++++--- SDK/include/NDK/BaseWidget.inl | 158 +++++++++++++++--- SDK/include/NDK/Canvas.hpp | 2 - SDK/include/NDK/Canvas.inl | 3 - SDK/include/NDK/Widgets/BoxLayout.hpp | 48 ++++++ SDK/include/NDK/Widgets/BoxLayout.inl | 15 ++ SDK/include/NDK/Widgets/ButtonWidget.hpp | 4 - SDK/include/NDK/Widgets/ButtonWidget.inl | 4 + SDK/include/NDK/Widgets/CheckboxWidget.hpp | 2 +- SDK/include/NDK/Widgets/CheckboxWidget.inl | 3 + SDK/include/NDK/Widgets/Enums.hpp | 6 + SDK/include/NDK/Widgets/ImageWidget.hpp | 4 +- SDK/include/NDK/Widgets/ImageWidget.inl | 7 +- SDK/include/NDK/Widgets/LabelWidget.hpp | 4 - SDK/include/NDK/Widgets/LabelWidget.inl | 3 + SDK/include/NDK/Widgets/ProgressBarWidget.hpp | 2 - SDK/include/NDK/Widgets/ProgressBarWidget.inl | 7 +- SDK/include/NDK/Widgets/TextAreaWidget.hpp | 10 +- SDK/include/NDK/Widgets/TextAreaWidget.inl | 9 +- SDK/src/NDK/BaseWidget.cpp | 35 ++-- SDK/src/NDK/Canvas.cpp | 4 - SDK/src/NDK/Widgets/BoxLayout.cpp | 122 ++++++++++++++ SDK/src/NDK/Widgets/ButtonWidget.cpp | 17 +- SDK/src/NDK/Widgets/CheckboxWidget.cpp | 29 ++-- SDK/src/NDK/Widgets/ImageWidget.cpp | 13 +- SDK/src/NDK/Widgets/LabelWidget.cpp | 9 +- SDK/src/NDK/Widgets/ProgressBarWidget.cpp | 10 +- SDK/src/NDK/Widgets/TextAreaWidget.cpp | 41 +++-- build/scripts/tools/ndk_server.lua | 1 + 29 files changed, 470 insertions(+), 162 deletions(-) create mode 100644 SDK/include/NDK/Widgets/BoxLayout.hpp create mode 100644 SDK/include/NDK/Widgets/BoxLayout.inl create mode 100644 SDK/src/NDK/Widgets/BoxLayout.cpp diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index 12ab85cd1..26c7f5539 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -46,44 +46,61 @@ namespace Ndk void EnableBackground(bool enable); + template void ForEachWidgetChild(F iterator); + template void ForEachWidgetChild(F iterator) const; + //virtual BaseWidget* Clone() const = 0; inline const Nz::Color& GetBackgroundColor() const; inline Canvas* GetCanvas(); inline Nz::SystemCursor GetCursor() const; - inline const Padding& GetPadding() const; - inline Nz::Vector2f GetContentOrigin() const; - inline const Nz::Vector2f& GetContentSize() const; + inline float GetHeight() const; + + inline float GetMaximumHeight() const; + inline Nz::Vector2f GetMaximumSize() const; + inline float GetMaximumWidth() const; + + inline float GetMinimumHeight() const; + inline Nz::Vector2f GetMinimumSize() const; + inline float GetMinimumWidth() const; + + inline float GetPreferredHeight() const; + inline Nz::Vector2f GetPreferredSize() const; + inline float GetPreferredWidth() const; + inline Nz::Vector2f GetSize() const; + inline float GetWidth() const; + inline std::size_t GetWidgetChildCount() const; bool HasFocus() const; inline bool IsVisible() const; - virtual void ResizeToContent() = 0; + void Resize(const Nz::Vector2f& size); void SetBackgroundColor(const Nz::Color& color); void SetCursor(Nz::SystemCursor systemCursor); - inline void SetContentSize(const Nz::Vector2f& size); void SetFocus(); - inline void SetPadding(float left, float top, float right, float bottom); - void SetSize(const Nz::Vector2f& size); + + inline void SetFixedHeight(float fixedHeight); + inline void SetFixedSize(const Nz::Vector2f& fixedSize); + inline void SetFixedWidth(float fixedWidth); + + inline void SetMaximumHeight(float maximumHeight); + inline void SetMaximumSize(const Nz::Vector2f& maximumSize); + inline void SetMaximumWidth(float maximumWidth); + + inline void SetMinimumHeight(float minimumHeight); + inline void SetMinimumSize(const Nz::Vector2f& minimumSize); + inline void SetMinimumWidth(float minimumWidth); void Show(bool show = true); BaseWidget& operator=(const BaseWidget&) = delete; BaseWidget& operator=(BaseWidget&&) = delete; - struct Padding - { - float left; - float top; - float right; - float bottom; - }; - protected: - const EntityHandle& CreateEntity(bool isContentEntity); + const EntityHandle& CreateEntity(); void DestroyEntity(Entity* entity); virtual void Layout(); @@ -102,10 +119,12 @@ namespace Ndk virtual void OnParentResized(const Nz::Vector2f& newSize); virtual void OnTextEntered(char32_t character, bool repeated); + inline void SetPreferredSize(const Nz::Vector2f& preferredSize); + private: inline BaseWidget(); - inline void DestroyChild(BaseWidget* widget); + void DestroyChild(BaseWidget* widget); void DestroyChildren(); inline bool IsRegisteredToCanvas() const; inline void NotifyParentResized(const Nz::Vector2f& newSize); @@ -117,7 +136,6 @@ namespace Ndk struct WidgetEntity { EntityOwner handle; - bool isContent; }; static constexpr std::size_t InvalidCanvasIndex = std::numeric_limits::max(); @@ -127,12 +145,14 @@ namespace Ndk std::vector> m_children; Canvas* m_canvas; EntityOwner m_backgroundEntity; - Padding m_padding; WorldHandle m_world; Nz::Color m_backgroundColor; Nz::SpriteRef m_backgroundSprite; Nz::SystemCursor m_cursor; - Nz::Vector2f m_contentSize; + Nz::Vector2f m_maximumSize; + Nz::Vector2f m_minimumSize; + Nz::Vector2f m_preferredSize; + Nz::Vector2f m_size; BaseWidget* m_widgetParent; bool m_visible; }; diff --git a/SDK/include/NDK/BaseWidget.inl b/SDK/include/NDK/BaseWidget.inl index 6c7a0a3dd..e24b89285 100644 --- a/SDK/include/NDK/BaseWidget.inl +++ b/SDK/include/NDK/BaseWidget.inl @@ -13,11 +13,13 @@ namespace Ndk m_canvas(nullptr), m_backgroundColor(Nz::Color(230, 230, 230, 255)), m_cursor(Nz::SystemCursor_Default), - m_contentSize(50.f, 50.f), + m_size(50.f, 50.f), + m_maximumSize(std::numeric_limits::infinity()), + m_minimumSize(0.f), + m_preferredSize(-1), m_widgetParent(nullptr), m_visible(true) { - SetPadding(5.f, 5.f, 5.f, 5.f); } template @@ -64,6 +66,20 @@ namespace Ndk SetPosition(GetPosition(Nz::CoordSys_Local).x, (parentSize.y - mySize.y) / 2.f); } + template + inline void BaseWidget::ForEachWidgetChild(F iterator) + { + for (const auto& child : m_children) + iterator(child.get()); + } + + template + inline void BaseWidget::ForEachWidgetChild(F iterator) const + { + for (const auto& child : m_children) + iterator(static_cast(child.get())); + } + inline const Nz::Color& BaseWidget::GetBackgroundColor() const { return m_backgroundColor; @@ -79,24 +95,69 @@ namespace Ndk return m_cursor; } - inline const BaseWidget::Padding& BaseWidget::GetPadding() const + inline float BaseWidget::GetHeight() const { - return m_padding; + return m_size.y; } - inline Nz::Vector2f BaseWidget::GetContentOrigin() const + inline float BaseWidget::GetMaximumHeight() const { - return { m_padding.left, m_padding.top }; + return m_maximumSize.y; } - inline const Nz::Vector2f& BaseWidget::GetContentSize() const + inline Nz::Vector2f BaseWidget::GetMaximumSize() const { - return m_contentSize; + return m_maximumSize; + } + + inline float BaseWidget::GetMaximumWidth() const + { + return m_maximumSize.x; + } + + inline float BaseWidget::GetMinimumHeight() const + { + return m_minimumSize.y; + } + + inline Nz::Vector2f BaseWidget::GetMinimumSize() const + { + return m_minimumSize; + } + + inline float BaseWidget::GetMinimumWidth() const + { + return m_minimumSize.x; + } + + inline float BaseWidget::GetPreferredHeight() const + { + return m_preferredSize.y; + } + + inline Nz::Vector2f BaseWidget::GetPreferredSize() const + { + return m_preferredSize; + } + + inline float BaseWidget::GetPreferredWidth() const + { + return m_preferredSize.x; } inline Nz::Vector2f BaseWidget::GetSize() const { - return Nz::Vector2f(m_contentSize.x + m_padding.left + m_padding.right, m_contentSize.y + m_padding.top + m_padding.bottom); + return Nz::Vector2f(GetWidth(), GetHeight()); + } + + inline float BaseWidget::GetWidth() const + { + return m_size.x; + } + + inline std::size_t BaseWidget::GetWidgetChildCount() const + { + return m_children.size(); } inline bool BaseWidget::IsVisible() const @@ -104,22 +165,79 @@ namespace Ndk return m_visible; } - inline void BaseWidget::SetContentSize(const Nz::Vector2f& size) + inline void BaseWidget::SetFixedHeight(float fixedHeight) { - NotifyParentResized(size); - m_contentSize = size; - - Layout(); + SetMaximumHeight(fixedHeight); + SetMinimumHeight(fixedHeight); } - inline void BaseWidget::SetPadding(float left, float top, float right, float bottom) + inline void BaseWidget::SetFixedSize(const Nz::Vector2f& fixedSize) { - m_padding.left = left; - m_padding.top = top; - m_padding.bottom = bottom; - m_padding.right = right; + SetMaximumSize(fixedSize); + SetMinimumSize(fixedSize); + } - Layout(); + inline void BaseWidget::SetFixedWidth(float fixedWidth) + { + SetMaximumWidth(fixedWidth); + SetMinimumWidth(fixedWidth); + } + + inline void BaseWidget::SetMaximumHeight(float maximumHeight) + { + Nz::Vector2f maximumSize = GetMaximumSize(); + maximumSize.y = maximumHeight; + + SetMaximumSize(maximumSize); + } + + inline void BaseWidget::SetMaximumSize(const Nz::Vector2f& maximumSize) + { + m_maximumSize = maximumSize; + + Nz::Vector2f size = GetSize(); + if (size.x > m_maximumSize.x || size.y > m_maximumSize.y) + Resize(size); //< Will clamp automatically + } + + inline void BaseWidget::SetMaximumWidth(float maximumWidth) + { + Nz::Vector2f maximumSize = GetMaximumSize(); + maximumSize.x = maximumWidth; + + SetMaximumSize(maximumSize); + } + + inline void BaseWidget::SetMinimumHeight(float minimumHeight) + { + Nz::Vector2f minimumSize = GetMinimumSize(); + minimumSize.y = minimumHeight; + + SetMinimumSize(minimumSize); + } + + inline void BaseWidget::SetMinimumSize(const Nz::Vector2f& minimumSize) + { + m_minimumSize = minimumSize; + + Nz::Vector2f size = GetSize(); + if (size.x < m_minimumSize.x || size.y < m_minimumSize.y) + Resize(size); //< Will clamp automatically + } + + inline void BaseWidget::SetMinimumWidth(float minimumWidth) + { + Nz::Vector2f minimumSize = GetMinimumSize(); + minimumSize.x = minimumWidth; + + SetMinimumSize(minimumSize); + } + + inline void BaseWidget::SetPreferredSize(const Nz::Vector2f& preferredSize) + { + m_preferredSize = preferredSize; + + Resize(m_preferredSize); } inline bool BaseWidget::IsRegisteredToCanvas() const diff --git a/SDK/include/NDK/Canvas.hpp b/SDK/include/NDK/Canvas.hpp index f99900d30..d563c6cd3 100644 --- a/SDK/include/NDK/Canvas.hpp +++ b/SDK/include/NDK/Canvas.hpp @@ -28,8 +28,6 @@ namespace Ndk inline const WorldHandle& GetWorld() const; - void ResizeToContent() override; - Canvas& operator=(const Canvas&) = delete; Canvas& operator=(Canvas&&) = delete; diff --git a/SDK/include/NDK/Canvas.inl b/SDK/include/NDK/Canvas.inl index 7ac84a45d..7a602cffb 100644 --- a/SDK/include/NDK/Canvas.inl +++ b/SDK/include/NDK/Canvas.inl @@ -27,9 +27,6 @@ namespace Ndk m_mouseMovedSlot.Connect(eventHandler.OnMouseMoved, this, &Canvas::OnEventMouseMoved); m_mouseLeftSlot.Connect(eventHandler.OnMouseLeft, this, &Canvas::OnEventMouseLeft); m_textEnteredSlot.Connect(eventHandler.OnTextEntered, this, &Canvas::OnEventTextEntered); - - // Disable padding by default - SetPadding(0.f, 0.f, 0.f, 0.f); } inline Canvas::~Canvas() diff --git a/SDK/include/NDK/Widgets/BoxLayout.hpp b/SDK/include/NDK/Widgets/BoxLayout.hpp new file mode 100644 index 000000000..d27616814 --- /dev/null +++ b/SDK/include/NDK/Widgets/BoxLayout.hpp @@ -0,0 +1,48 @@ +// 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_BOXLAYOUT_HPP +#define NDK_WIDGETS_BOXLAYOUT_HPP + +#include +#include +#include +#include + +namespace Ndk +{ + class NDK_API BoxLayout : public BaseWidget + { + public: + inline BoxLayout(BaseWidget* parent, BoxLayoutOrientation orientation); + BoxLayout(const BoxLayout&) = delete; + BoxLayout(BoxLayout&&) = default; + ~BoxLayout() = default; + + void Layout() override; + + BoxLayout& operator=(const BoxLayout&) = delete; + BoxLayout& operator=(BoxLayout&&) = default; + + private: + struct ChildInfo + { + BaseWidget* widget; + bool isConstrained; + float maximumSize; + float minimumSize; + float size; + }; + + std::vector m_childInfos; + BoxLayoutOrientation m_orientation; + float m_spacing; + }; +} + +#include + +#endif // NDK_WIDGETS_BOXLAYOUT_HPP diff --git a/SDK/include/NDK/Widgets/BoxLayout.inl b/SDK/include/NDK/Widgets/BoxLayout.inl new file mode 100644 index 000000000..72dfaaf5f --- /dev/null +++ b/SDK/include/NDK/Widgets/BoxLayout.inl @@ -0,0 +1,15 @@ +// 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 +{ + BoxLayout::BoxLayout(BaseWidget* parent, BoxLayoutOrientation orientation) : + BaseWidget(parent), + m_orientation(orientation), + m_spacing(5.f) + { + } +} diff --git a/SDK/include/NDK/Widgets/ButtonWidget.hpp b/SDK/include/NDK/Widgets/ButtonWidget.hpp index 01eb4a90a..a65429290 100644 --- a/SDK/include/NDK/Widgets/ButtonWidget.hpp +++ b/SDK/include/NDK/Widgets/ButtonWidget.hpp @@ -28,10 +28,6 @@ namespace Ndk ButtonWidget(ButtonWidget&&) = default; ~ButtonWidget() = default; - //virtual ButtonWidget* Clone() const = 0; - - void ResizeToContent() override; - inline const Nz::Color& GetColor() const; inline const Nz::Color& GetCornerColor() const; inline const Nz::Color& GetHoverColor() const; diff --git a/SDK/include/NDK/Widgets/ButtonWidget.inl b/SDK/include/NDK/Widgets/ButtonWidget.inl index 757b33ab2..11cf202cf 100644 --- a/SDK/include/NDK/Widgets/ButtonWidget.inl +++ b/SDK/include/NDK/Widgets/ButtonWidget.inl @@ -93,6 +93,10 @@ namespace Ndk { m_textSprite->Update(drawer); + Nz::Vector2f textSize = Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths()); + SetMinimumSize(textSize); + SetPreferredSize(textSize + Nz::Vector2f(20.f, 10.f)); + Layout(); } } diff --git a/SDK/include/NDK/Widgets/CheckboxWidget.hpp b/SDK/include/NDK/Widgets/CheckboxWidget.hpp index d8382ba02..a9723c20b 100644 --- a/SDK/include/NDK/Widgets/CheckboxWidget.hpp +++ b/SDK/include/NDK/Widgets/CheckboxWidget.hpp @@ -53,7 +53,6 @@ namespace Ndk void SetState(CheckboxState state); inline void SetTextMargin(float margin); - void ResizeToContent() override; inline void UpdateText(const Nz::AbstractTextDrawer& drawer); @@ -68,6 +67,7 @@ namespace Ndk void Layout() override; void UpdateCheckbox(); + void UpdateSize(); void OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button) override; inline bool ContainsCheckbox(int x, int y) const; diff --git a/SDK/include/NDK/Widgets/CheckboxWidget.inl b/SDK/include/NDK/Widgets/CheckboxWidget.inl index 3b4823fde..5fa9e30ed 100644 --- a/SDK/include/NDK/Widgets/CheckboxWidget.inl +++ b/SDK/include/NDK/Widgets/CheckboxWidget.inl @@ -65,6 +65,7 @@ namespace Ndk m_checkboxBackgroundSprite->SetSize(size - GetCheckboxBorderSize() * 2.f); m_checkboxContentSprite->SetSize(GetCheckboxSize() - GetCheckboxBorderSize() * 2.f - Nz::Vector2f { 4.f, 4.f }); + UpdateSize(); Layout(); } @@ -77,6 +78,8 @@ namespace Ndk inline void CheckboxWidget::UpdateText(const Nz::AbstractTextDrawer& drawer) { m_textSprite->Update(drawer); + + UpdateSize(); Layout(); } diff --git a/SDK/include/NDK/Widgets/Enums.hpp b/SDK/include/NDK/Widgets/Enums.hpp index 111ee43db..a11511694 100644 --- a/SDK/include/NDK/Widgets/Enums.hpp +++ b/SDK/include/NDK/Widgets/Enums.hpp @@ -9,6 +9,12 @@ namespace Ndk { + enum BoxLayoutOrientation + { + BoxLayoutOrientation_Horizontal, + BoxLayoutOrientation_Vertical + }; + enum CheckboxState { CheckboxState_Checked, diff --git a/SDK/include/NDK/Widgets/ImageWidget.hpp b/SDK/include/NDK/Widgets/ImageWidget.hpp index 93169c80d..fc36ca298 100644 --- a/SDK/include/NDK/Widgets/ImageWidget.hpp +++ b/SDK/include/NDK/Widgets/ImageWidget.hpp @@ -26,14 +26,14 @@ namespace Ndk //virtual ImageWidget* Clone() const = 0; - void ResizeToContent() override; + void ResizeToContent(); inline const Nz::Color& GetColor() const; inline const Nz::TextureRef& GetTexture() const; inline const Nz::Rectf& GetTextureCoords() const; inline void SetColor(const Nz::Color& color); - inline void SetTexture(const Nz::TextureRef& texture, bool resizeToContent = true); + inline void SetTexture(const Nz::TextureRef& texture); inline void SetTextureCoords(const Nz::Rectf& coords); inline void SetTextureRect(const Nz::Rectui& rect); diff --git a/SDK/include/NDK/Widgets/ImageWidget.inl b/SDK/include/NDK/Widgets/ImageWidget.inl index 1ba13d525..b1835941b 100644 --- a/SDK/include/NDK/Widgets/ImageWidget.inl +++ b/SDK/include/NDK/Widgets/ImageWidget.inl @@ -26,12 +26,13 @@ namespace Ndk m_sprite->SetColor(color); } - inline void ImageWidget::SetTexture(const Nz::TextureRef& texture, bool resizeToContent) + inline void ImageWidget::SetTexture(const Nz::TextureRef& texture) { m_sprite->SetTexture(texture, false); - if (resizeToContent) - ResizeToContent(); + Nz::Vector2f textureSize = Nz::Vector2f(Nz::Vector2ui(m_sprite->GetMaterial()->GetDiffuseMap()->GetSize())); + SetMinimumSize(textureSize); + SetPreferredSize(textureSize); } inline void ImageWidget::SetTextureCoords(const Nz::Rectf& coords) diff --git a/SDK/include/NDK/Widgets/LabelWidget.hpp b/SDK/include/NDK/Widgets/LabelWidget.hpp index f96960e15..aea711010 100644 --- a/SDK/include/NDK/Widgets/LabelWidget.hpp +++ b/SDK/include/NDK/Widgets/LabelWidget.hpp @@ -26,10 +26,6 @@ namespace Ndk LabelWidget(LabelWidget&&) = default; ~LabelWidget() = default; - //virtual LabelWidget* Clone() const = 0; - - void ResizeToContent() override; - inline void UpdateText(const Nz::AbstractTextDrawer& drawer); LabelWidget& operator=(const LabelWidget&) = delete; diff --git a/SDK/include/NDK/Widgets/LabelWidget.inl b/SDK/include/NDK/Widgets/LabelWidget.inl index 72d0ad1a6..db3d10a52 100644 --- a/SDK/include/NDK/Widgets/LabelWidget.inl +++ b/SDK/include/NDK/Widgets/LabelWidget.inl @@ -9,5 +9,8 @@ namespace Ndk inline void LabelWidget::UpdateText(const Nz::AbstractTextDrawer& drawer) { m_textSprite->Update(drawer); + + SetMinimumSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + SetPreferredSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); } } diff --git a/SDK/include/NDK/Widgets/ProgressBarWidget.hpp b/SDK/include/NDK/Widgets/ProgressBarWidget.hpp index 6e19aa0cd..2ae334b8c 100644 --- a/SDK/include/NDK/Widgets/ProgressBarWidget.hpp +++ b/SDK/include/NDK/Widgets/ProgressBarWidget.hpp @@ -67,8 +67,6 @@ namespace Ndk inline void SetTextMargin(float margin); inline void SetTextColor(const Nz::Color& color); - inline void ResizeToContent() override {} - NazaraSignal(OnValueChanged, const ProgressBarWidget* /*progressBar*/); private: diff --git a/SDK/include/NDK/Widgets/ProgressBarWidget.inl b/SDK/include/NDK/Widgets/ProgressBarWidget.inl index a90641203..9fe2c8382 100644 --- a/SDK/include/NDK/Widgets/ProgressBarWidget.inl +++ b/SDK/include/NDK/Widgets/ProgressBarWidget.inl @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Samy Bensaid +// Copyright (C) 2017 Samy Bensaid // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequisites.hpp @@ -148,9 +148,8 @@ namespace Ndk { if (IsTextEnabled()) { - Nz::Vector2f size = GetContentSize(); - m_textSprite->Update(Nz::SimpleTextDrawer::Draw(Nz::String::Number(m_value).Append('%'), - static_cast(std::min(size.x, size.y) / 2.f), 0u, m_textColor)); + Nz::Vector2f size = GetSize(); + m_textSprite->Update(Nz::SimpleTextDrawer::Draw(Nz::String::Number(m_value).Append('%'), static_cast(std::min(size.x, size.y) / 2.f), 0u, m_textColor)); } } } diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.hpp b/SDK/include/NDK/Widgets/TextAreaWidget.hpp index f57e7a049..9a5d33335 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.hpp +++ b/SDK/include/NDK/Widgets/TextAreaWidget.hpp @@ -11,8 +11,8 @@ #include #include #include -#include #include +#include namespace Ndk { @@ -40,7 +40,7 @@ namespace Ndk void Erase(std::size_t firstGlyph, std::size_t lastGlyph); void EraseSelection(); - inline CharacterFilter GetCharacterFilter() const; + 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; @@ -61,10 +61,8 @@ namespace Ndk inline void MoveCursor(int offset); inline void MoveCursor(const Nz::Vector2i& offset); - void ResizeToContent() override; - inline void SetCharacterFilter(CharacterFilter filter); - inline void SetCharacterSize(unsigned int characterSize); + void SetCharacterSize(unsigned int characterSize); inline void SetCursorPosition(std::size_t glyphIndex); inline void SetCursorPosition(Nz::Vector2ui cursorPosition); inline void SetEchoMode(EchoMode echoMode); @@ -108,7 +106,7 @@ namespace Ndk void RefreshCursor(); void UpdateDisplayText(); - std::function m_characterFilter; + CharacterFilter m_characterFilter; EchoMode m_echoMode; EntityHandle m_cursorEntity; EntityHandle m_textEntity; diff --git a/SDK/include/NDK/Widgets/TextAreaWidget.inl b/SDK/include/NDK/Widgets/TextAreaWidget.inl index 88be7520a..e4c9f2c30 100644 --- a/SDK/include/NDK/Widgets/TextAreaWidget.inl +++ b/SDK/include/NDK/Widgets/TextAreaWidget.inl @@ -33,7 +33,7 @@ namespace Ndk Erase(glyphPosition, glyphPosition + 1U); } - inline TextAreaWidget::CharacterFilter TextAreaWidget::GetCharacterFilter() const + inline const TextAreaWidget::CharacterFilter& TextAreaWidget::GetCharacterFilter() const { return m_characterFilter; } @@ -162,12 +162,7 @@ namespace Ndk inline void TextAreaWidget::SetCharacterFilter(CharacterFilter filter) { - m_characterFilter = filter; - } - - inline void TextAreaWidget::SetCharacterSize(unsigned int characterSize) - { - m_drawer.SetCharacterSize(characterSize); + m_characterFilter = std::move(filter); } inline void TextAreaWidget::SetCursorPosition(std::size_t glyphIndex) diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index dc33252e2..89ca6bb9c 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -81,7 +81,7 @@ namespace Ndk m_backgroundSprite->SetColor(m_backgroundColor); m_backgroundSprite->SetMaterial(Nz::Material::New((m_backgroundColor.IsOpaque()) ? "Basic2D" : "Translucent2D")); //< TODO: Use a shared material instead of creating one everytime - m_backgroundEntity = CreateEntity(false); + m_backgroundEntity = CreateEntity(); m_backgroundEntity->AddComponent().Attach(m_backgroundSprite, -1); m_backgroundEntity->AddComponent().SetParent(this); @@ -89,14 +89,14 @@ namespace Ndk } else { - m_backgroundEntity->Kill(); + m_backgroundEntity.Reset(); m_backgroundSprite.Reset(); } } /*! * \brief Checks if this widget has keyboard focus - * \return true if widget has keyboard focus, false otherwhise + * \return true if widget has keyboard focus, false otherwise */ bool BaseWidget::HasFocus() const { @@ -106,6 +106,19 @@ namespace Ndk return m_canvas->IsKeyboardOwner(m_canvasIndex); } + void BaseWidget::Resize(const Nz::Vector2f& size) + { + // Adjust new size + Nz::Vector2f newSize = size; + newSize.Maximize(m_minimumSize); + newSize.Minimize(m_maximumSize); + + NotifyParentResized(newSize); + m_size = newSize; + + Layout(); + } + void BaseWidget::SetBackgroundColor(const Nz::Color& color) { m_backgroundColor = color; @@ -131,11 +144,6 @@ namespace Ndk m_canvas->SetKeyboardOwner(m_canvasIndex); } - void BaseWidget::SetSize(const Nz::Vector2f& size) - { - SetContentSize({std::max(size.x - m_padding.left - m_padding.right, 0.f), std::max(size.y - m_padding.top - m_padding.bottom, 0.f)}); - } - void BaseWidget::Show(bool show) { if (m_visible != show) @@ -155,7 +163,7 @@ namespace Ndk } } - const Ndk::EntityHandle& BaseWidget::CreateEntity(bool isContentEntity) + const Ndk::EntityHandle& BaseWidget::CreateEntity() { const EntityHandle& newEntity = m_world->CreateEntity(); newEntity->Enable(m_visible); @@ -163,7 +171,6 @@ namespace Ndk m_entities.emplace_back(); WidgetEntity& widgetEntity = m_entities.back(); widgetEntity.handle = newEntity; - widgetEntity.isContent = isContentEntity; return newEntity; } @@ -179,7 +186,7 @@ namespace Ndk void BaseWidget::Layout() { if (m_backgroundEntity) - m_backgroundSprite->SetSize(m_contentSize.x + m_padding.left + m_padding.right, m_contentSize.y + m_padding.top + m_padding.bottom); + m_backgroundSprite->SetSize(m_size.x, m_size.y); UpdatePositionAndSize(); } @@ -282,16 +289,12 @@ namespace Ndk Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition()); Nz::Vector2f widgetSize = GetSize(); - Nz::Vector2f contentPos = widgetPos + GetContentOrigin(); - Nz::Vector2f contentSize = GetContentSize(); - Nz::Recti fullBounds(Nz::Rectf(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y)); - Nz::Recti contentBounds(Nz::Rectf(contentPos.x, contentPos.y, contentSize.x, contentSize.y)); for (WidgetEntity& widgetEntity : m_entities) { const Ndk::EntityHandle& entity = widgetEntity.handle; if (entity->HasComponent()) - entity->GetComponent().SetScissorRect((widgetEntity.isContent) ? contentBounds : fullBounds); + entity->GetComponent().SetScissorRect(fullBounds); } } } diff --git a/SDK/src/NDK/Canvas.cpp b/SDK/src/NDK/Canvas.cpp index 9a5996432..3959f1765 100644 --- a/SDK/src/NDK/Canvas.cpp +++ b/SDK/src/NDK/Canvas.cpp @@ -7,10 +7,6 @@ namespace Ndk { - void Canvas::ResizeToContent() - { - } - std::size_t Canvas::RegisterWidget(BaseWidget* widget) { WidgetEntry box; diff --git a/SDK/src/NDK/Widgets/BoxLayout.cpp b/SDK/src/NDK/Widgets/BoxLayout.cpp new file mode 100644 index 000000000..89564ed08 --- /dev/null +++ b/SDK/src/NDK/Widgets/BoxLayout.cpp @@ -0,0 +1,122 @@ +// 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 + +namespace Ndk +{ + void BoxLayout::Layout() + { + std::size_t axis1, axis2; + + switch (m_orientation) + { + case BoxLayoutOrientation_Horizontal: + axis1 = 0; //< x + axis2 = 1; //< y + break; + + case BoxLayoutOrientation_Vertical: + axis1 = 1; //< y + axis2 = 0; //< x + break; + + default: + assert(false); + break; + } + + m_childInfos.clear(); + + // Handle size + ForEachWidgetChild([&](BaseWidget* child) + { + if (!child->IsVisible()) + return; + + m_childInfos.emplace_back(); + auto& info = m_childInfos.back(); + info.isConstrained = false; + info.maximumSize = child->GetMaximumSize()[axis1]; + info.minimumSize = child->GetMinimumSize()[axis1]; + info.size = info.minimumSize; + info.widget = child; + }); + + Nz::Vector2f layoutSize = GetSize(); + + float availableSpace = layoutSize[axis1] - m_spacing * (m_childInfos.size() - 1); + float remainingSize = availableSpace; + for (auto& info : m_childInfos) + remainingSize -= info.minimumSize; + + // Okay this algorithm is FAR from perfect but I couldn't figure a way other than this one + std::size_t unconstrainedChildCount = m_childInfos.size(); + + bool hasUnconstrainedChilds = false; + for (std::size_t i = 0; i < m_childInfos.size(); ++i) + { + if (remainingSize <= 0.0001f) + break; + + float evenSize = remainingSize / unconstrainedChildCount; + + for (auto& info : m_childInfos) + { + if (info.isConstrained) + continue; + + float previousSize = info.size; + + info.size += evenSize; + if (info.size > info.maximumSize) + { + unconstrainedChildCount--; + + evenSize += (info.size - info.maximumSize) / unconstrainedChildCount; + info.isConstrained = true; + info.size = info.maximumSize; + } + else + hasUnconstrainedChilds = true; + + remainingSize -= info.size - previousSize; + } + + if (!hasUnconstrainedChilds) + break; + } + + float spacing = m_spacing + remainingSize / (m_childInfos.size() - 1); + + for (auto& info : m_childInfos) + { + Nz::Vector2f newSize = info.widget->GetSize(); + newSize[axis1] = info.size; + + info.widget->Resize(newSize); + } + + // Handle position + float cursor = 0.f; + bool first = true; + for (auto& info : m_childInfos) + { + if (first) + first = false; + else + cursor += spacing; + + Nz::Vector2f position = Nz::Vector2f(0.f, 0.f); + position[axis1] = cursor; + + info.widget->SetPosition(position); + + cursor += info.size; + }; + } +} diff --git a/SDK/src/NDK/Widgets/ButtonWidget.cpp b/SDK/src/NDK/Widgets/ButtonWidget.cpp index f432d86b7..c88645e44 100644 --- a/SDK/src/NDK/Widgets/ButtonWidget.cpp +++ b/SDK/src/NDK/Widgets/ButtonWidget.cpp @@ -30,13 +30,13 @@ namespace Ndk m_gradientSprite->SetCornerColor(Nz::RectCorner_RightBottom, m_cornerColor); m_gradientSprite->SetMaterial(Nz::Material::New("Basic2D")); - m_gradientEntity = CreateEntity(false); + m_gradientEntity = CreateEntity(); m_gradientEntity->AddComponent().SetParent(this); m_gradientEntity->AddComponent().Attach(m_gradientSprite); m_textSprite = Nz::TextSprite::New(); - m_textEntity = CreateEntity(true); + m_textEntity = CreateEntity(); m_textEntity->AddComponent().SetParent(this); m_textEntity->AddComponent().Attach(m_textSprite, 1); @@ -73,22 +73,15 @@ namespace Ndk return s_pressCornerColor; } - void ButtonWidget::ResizeToContent() - { - SetContentSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); - } - void ButtonWidget::Layout() { BaseWidget::Layout(); - m_gradientSprite->SetSize(GetSize()); - - Nz::Vector2f origin = GetContentOrigin(); - const Nz::Vector2f& contentSize = GetContentSize(); + Nz::Vector2f size = GetSize(); + m_gradientSprite->SetSize(size); Nz::Boxf textBox = m_textEntity->GetComponent().GetAABB(); - m_textEntity->GetComponent().SetPosition(origin.x + contentSize.x / 2 - textBox.width / 2, origin.y + contentSize.y / 2 - textBox.height / 2); + m_textEntity->GetComponent().SetPosition(size.x / 2.f - textBox.width / 2.f, size.y / 2.f - textBox.height / 2.f); } void ButtonWidget::OnMouseButtonPress(int /*x*/, int /*y*/, Nz::Mouse::Button button) diff --git a/SDK/src/NDK/Widgets/CheckboxWidget.cpp b/SDK/src/NDK/Widgets/CheckboxWidget.cpp index 3f20ff7c6..1bea0c9ce 100644 --- a/SDK/src/NDK/Widgets/CheckboxWidget.cpp +++ b/SDK/src/NDK/Widgets/CheckboxWidget.cpp @@ -28,19 +28,19 @@ namespace Ndk m_checkboxContentSprite = Nz::Sprite::New(Nz::Material::New("Translucent2D")); m_textSprite = Nz::TextSprite::New(); - m_checkboxBorderEntity = CreateEntity(false); + m_checkboxBorderEntity = CreateEntity(); m_checkboxBorderEntity->AddComponent().SetParent(this); m_checkboxBorderEntity->AddComponent().Attach(m_checkboxBorderSprite); - m_checkboxBackgroundEntity = CreateEntity(false); + m_checkboxBackgroundEntity = CreateEntity(); m_checkboxBackgroundEntity->AddComponent().SetParent(this); m_checkboxBackgroundEntity->AddComponent().Attach(m_checkboxBackgroundSprite, 1); - m_checkboxContentEntity = CreateEntity(true); + m_checkboxContentEntity = CreateEntity(); m_checkboxContentEntity->AddComponent().SetParent(this); m_checkboxContentEntity->AddComponent().Attach(m_checkboxContentSprite, 2); - m_textEntity = CreateEntity(true); + m_textEntity = CreateEntity(); m_textEntity->AddComponent().SetParent(this); m_textEntity->AddComponent().Attach(m_textSprite); @@ -108,20 +108,11 @@ namespace Ndk return m_state; } - void CheckboxWidget::ResizeToContent() - { - Nz::Vector3f textSize = m_textSprite->GetBoundingVolume().obb.localBox.GetLengths(); - Nz::Vector2f checkboxSize = GetCheckboxSize(); - - Nz::Vector2f finalSize { checkboxSize.x + (m_adaptativeMargin ? checkboxSize.x / 2.f : m_textMargin) + textSize.x, std::max(textSize.y, checkboxSize.y) }; - SetContentSize(finalSize); - } - void CheckboxWidget::Layout() { BaseWidget::Layout(); - Nz::Vector2f origin = GetContentOrigin(); + Nz::Vector2f origin = Nz::Vector2f(0.f); Nz::Vector2f checkboxSize = GetCheckboxSize(); Nz::Vector2f borderSize = GetCheckboxBorderSize(); @@ -178,4 +169,14 @@ namespace Ndk m_checkboxContentSprite->SetTexture(Nz::TextureRef {}); } } + + void CheckboxWidget::UpdateSize() + { + Nz::Vector3f textSize = m_textSprite->GetBoundingVolume().obb.localBox.GetLengths(); + Nz::Vector2f checkboxSize = GetCheckboxSize(); + + Nz::Vector2f finalSize{ checkboxSize.x + (m_adaptativeMargin ? checkboxSize.x / 2.f : m_textMargin) + textSize.x, std::max(textSize.y, checkboxSize.y) }; + SetMinimumSize(finalSize); + SetPreferredSize(finalSize); + } } diff --git a/SDK/src/NDK/Widgets/ImageWidget.cpp b/SDK/src/NDK/Widgets/ImageWidget.cpp index b43d5ba8d..8a766419b 100644 --- a/SDK/src/NDK/Widgets/ImageWidget.cpp +++ b/SDK/src/NDK/Widgets/ImageWidget.cpp @@ -11,7 +11,7 @@ namespace Ndk ImageWidget::ImageWidget(BaseWidget* parent) : BaseWidget(parent) { - m_entity = CreateEntity(true); + m_entity = CreateEntity(); m_entity->AddComponent(); auto& gfx = m_entity->AddComponent(); @@ -19,19 +19,10 @@ namespace Ndk gfx.Attach(m_sprite); } - void ImageWidget::ResizeToContent() - { - Nz::Vector3ui textureSize = m_sprite->GetMaterial()->GetDiffuseMap()->GetSize(); - SetSize({ static_cast(textureSize.x), static_cast(textureSize.y) }); - } - void ImageWidget::Layout() { BaseWidget::Layout(); - Nz::Vector2f origin = GetContentOrigin(); - Nz::Vector2f contentSize = GetContentSize(); - m_entity->GetComponent().SetPosition(origin); - m_sprite->SetSize(contentSize); + m_sprite->SetSize(GetSize()); } } diff --git a/SDK/src/NDK/Widgets/LabelWidget.cpp b/SDK/src/NDK/Widgets/LabelWidget.cpp index 98deb8da3..4c6553011 100644 --- a/SDK/src/NDK/Widgets/LabelWidget.cpp +++ b/SDK/src/NDK/Widgets/LabelWidget.cpp @@ -13,7 +13,7 @@ namespace Ndk { m_textSprite = Nz::TextSprite::New(); - m_textEntity = CreateEntity(true); + m_textEntity = CreateEntity(); m_textEntity->AddComponent().Attach(m_textSprite); m_textEntity->AddComponent().SetParent(this); @@ -23,12 +23,5 @@ namespace Ndk void LabelWidget::Layout() { BaseWidget::Layout(); - - m_textEntity->GetComponent().SetPosition(GetContentOrigin()); - } - - void LabelWidget::ResizeToContent() - { - SetContentSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); } } diff --git a/SDK/src/NDK/Widgets/ProgressBarWidget.cpp b/SDK/src/NDK/Widgets/ProgressBarWidget.cpp index 80f01d43a..3e2f01440 100644 --- a/SDK/src/NDK/Widgets/ProgressBarWidget.cpp +++ b/SDK/src/NDK/Widgets/ProgressBarWidget.cpp @@ -30,11 +30,11 @@ namespace Ndk SetBarColor(s_barColor, s_barCornerColor); - m_borderEntity = CreateEntity(false); + m_borderEntity = CreateEntity(); m_borderEntity->AddComponent().SetParent(this); m_borderEntity->AddComponent().Attach(m_borderSprite); - m_barEntity = CreateEntity(true); + m_barEntity = CreateEntity(); m_barEntity->AddComponent().SetParent(this); GraphicsComponent& graphics = m_barEntity->AddComponent(); @@ -43,7 +43,7 @@ namespace Ndk m_textSprite = Nz::TextSprite::New(); - m_textEntity = CreateEntity(true); + m_textEntity = CreateEntity(); m_textEntity->AddComponent().SetParent(this); m_textEntity->AddComponent().Attach(m_textSprite); @@ -76,8 +76,8 @@ namespace Ndk void ProgressBarWidget::Layout() { - Nz::Vector2f origin = GetContentOrigin(); - Nz::Vector2f size = GetContentSize(); + Nz::Vector2f origin = Nz::Vector2f(0.f); + Nz::Vector2f size = GetSize(); Nz::Vector2f progressBarSize = size; if (IsTextEnabled()) diff --git a/SDK/src/NDK/Widgets/TextAreaWidget.cpp b/SDK/src/NDK/Widgets/TextAreaWidget.cpp index 34ebac579..09355c09c 100644 --- a/SDK/src/NDK/Widgets/TextAreaWidget.cpp +++ b/SDK/src/NDK/Widgets/TextAreaWidget.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -20,19 +21,23 @@ namespace Ndk m_readOnly(false), m_tabEnabled(false) { - m_cursorEntity = CreateEntity(true); + 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(true); + m_textEntity = CreateEntity(); m_textEntity->AddComponent().Attach(m_textSprite); m_textEntity->AddComponent().SetParent(this); + m_textEntity->GetComponent().SetPosition(5.f, 3.f); SetCursor(Nz::SystemCursor_Text); + SetCharacterSize(GetCharacterSize()); //< Actualize minimum / preferred size + EnableBackground(true); Layout(); } @@ -140,9 +145,25 @@ namespace Ndk return Nz::Vector2ui::Zero(); } - void TextAreaWidget::ResizeToContent() + void TextAreaWidget::SetCharacterSize(unsigned int characterSize) { - SetContentSize(Nz::Vector2f(m_textSprite->GetBoundingVolume().obb.localBox.GetLengths())); + 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); + SetPreferredSize({ size.x * 6.f, size.y }); } void TextAreaWidget::Write(const Nz::String& text, std::size_t glyphPosition) @@ -165,8 +186,6 @@ namespace Ndk { BaseWidget::Layout(); - m_textEntity->GetComponent().SetPosition(GetContentOrigin()); - RefreshCursor(); } @@ -403,8 +422,7 @@ namespace Ndk { SetFocus(); - const Padding& padding = GetPadding(); - Nz::Vector2ui hoveredGlyph = GetHoveredGlyph(float(x - padding.left), float(y - padding.top)); + Nz::Vector2ui hoveredGlyph = GetHoveredGlyph(float(x) - 5.f, float(y) - 5.f); // Shift extends selection if (Nz::Keyboard::IsKeyPressed(Nz::Keyboard::LShift) || Nz::Keyboard::IsKeyPressed(Nz::Keyboard::RShift)) @@ -434,10 +452,7 @@ namespace Ndk void TextAreaWidget::OnMouseMoved(int x, int y, int deltaX, int deltaY) { if (m_isMouseButtonDown) - { - const Padding& padding = GetPadding(); - SetSelection(m_selectionCursor, GetHoveredGlyph(float(x - padding.left), float(y - padding.top))); - } + SetSelection(m_selectionCursor, GetHoveredGlyph(float(x) - 5.f, float(y) - 3.f)); } void TextAreaWidget::OnTextEntered(char32_t character, bool /*repeated*/) @@ -514,8 +529,6 @@ namespace Ndk if (m_readOnly) return; - m_cursorEntity->GetComponent().SetPosition(GetContentOrigin()); - std::size_t selectionLineCount = m_cursorPositionEnd.y - m_cursorPositionBegin.y + 1; std::size_t oldSpriteCount = m_cursorSprites.size(); if (m_cursorSprites.size() != selectionLineCount) diff --git a/build/scripts/tools/ndk_server.lua b/build/scripts/tools/ndk_server.lua index e235b1343..2fd17e7f1 100644 --- a/build/scripts/tools/ndk_server.lua +++ b/build/scripts/tools/ndk_server.lua @@ -36,6 +36,7 @@ TOOL.FilesExcluded = { "../SDK/**/Particle*Component.*", "../SDK/**/ParticleSystem.*", "../SDK/**/RenderSystem.*", + "../SDK/**/*Layout*.*", "../SDK/**/*Widget*.*", "../SDK/**/LuaBinding_Audio.*", "../SDK/**/LuaBinding_Graphics.*", From 602bdbe29223de03a92867f9f132d84778b3f235 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 11 Sep 2018 21:16:27 +0200 Subject: [PATCH 109/352] Update changelog --- ChangeLog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 23d2af364..cfd544bcb 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -146,6 +146,10 @@ Nazara Engine: - CullingList now handles box tests - ⚠️ 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. +- ⚠️ Widgets have been reworked and no longer have padding, but instead have preferred, maximum and minimum size. +- ⚠️ BaseWidget::SetSize has been renamed to BaseWidget::Resize +- Added BaseWidget::ForEachWidgetChild +- Added experimental BoxLayout class Nazara Development Kit: - Added ImageWidget (#139) From b6a33c76ca9d8d05a81df32fbc257750f906737f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 25 Sep 2018 14:53:49 +0200 Subject: [PATCH 110/352] Fix crash on moving empty NetPacket --- include/Nazara/Core/ByteStream.hpp | 2 ++ include/Nazara/Core/ByteStream.inl | 23 ++++++++++++++--------- include/Nazara/Network/NetPacket.inl | 16 ++++++++++++---- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/include/Nazara/Core/ByteStream.hpp b/include/Nazara/Core/ByteStream.hpp index 2f1dba4b6..6c2069895 100644 --- a/include/Nazara/Core/ByteStream.hpp +++ b/include/Nazara/Core/ByteStream.hpp @@ -27,6 +27,8 @@ namespace Nz ByteStream(ByteStream&& stream) noexcept = default; virtual ~ByteStream(); + inline void ClearStream(); + inline Endianness GetDataEndianness() const; inline Nz::UInt64 GetSize() const; inline Stream* GetStream() const; diff --git a/include/Nazara/Core/ByteStream.inl b/include/Nazara/Core/ByteStream.inl index b0c4c8233..c52ec0274 100644 --- a/include/Nazara/Core/ByteStream.inl +++ b/include/Nazara/Core/ByteStream.inl @@ -30,6 +30,18 @@ namespace Nz NazaraWarning("Failed to flush bits at serializer destruction"); } + /*! + * \brief Reset stream + */ + inline void ByteStream::ClearStream() + { + // We don't want to lose some bits.. + FlushBits(); + + m_context.stream = nullptr; + m_ownedStream.reset(); + } + /*! * \brief Gets the stream endianness * \return Type of the endianness @@ -113,22 +125,15 @@ namespace Nz } /*! - * \brief Sets this with a stream + * \brief Changes stream * * \param stream Stream existing - * - * \remark Produces a NazaraAssert if stream is invalid */ - inline void ByteStream::SetStream(Stream* stream) { - NazaraAssert(stream, "Invalid stream"); - - // We don't want to lose some bits.. - FlushBits(); + ClearStream(); m_context.stream = stream; - m_ownedStream.reset(); } /*! diff --git a/include/Nazara/Network/NetPacket.inl b/include/Nazara/Network/NetPacket.inl index 7cd78b529..b2a4a5f60 100644 --- a/include/Nazara/Network/NetPacket.inl +++ b/include/Nazara/Network/NetPacket.inl @@ -56,8 +56,11 @@ namespace Nz m_netCode(packet.m_netCode) { ///< Redirect memory stream to the moved buffer - m_memoryStream.SetBuffer(m_buffer.get(), m_memoryStream.GetOpenMode()); - SetStream(&m_memoryStream); + if (m_buffer) + { + m_memoryStream.SetBuffer(m_buffer.get(), m_memoryStream.GetOpenMode()); + SetStream(&m_memoryStream); + } } /*! @@ -206,8 +209,13 @@ namespace Nz m_netCode = packet.m_netCode; ///< Redirect memory stream to the moved buffer - m_memoryStream.SetBuffer(m_buffer.get(), m_memoryStream.GetOpenMode()); - SetStream(&m_memoryStream); + if (m_buffer) + { + m_memoryStream.SetBuffer(m_buffer.get(), m_memoryStream.GetOpenMode()); + SetStream(&m_memoryStream); + } + else + SetStream(static_cast(nullptr)); return *this; } From 974fa07bcba54b11c9a41b3f20cd07ced9846992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 25 Sep 2018 14:53:56 +0200 Subject: [PATCH 111/352] Remove Vulkan.hpp --- include/Nazara/Vulkan.hpp | 44 --------------------------------------- 1 file changed, 44 deletions(-) delete mode 100644 include/Nazara/Vulkan.hpp diff --git a/include/Nazara/Vulkan.hpp b/include/Nazara/Vulkan.hpp deleted file mode 100644 index a3e363272..000000000 --- a/include/Nazara/Vulkan.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// This file was automatically generated on 15 May 2016 at 00:11:13 - -/* - Nazara Engine - Vulkan - - Copyright (C) 2015 Jérôme "Lynix" Leclercq (Lynix680@gmail.com) - - Permission is hereby granted, free of charge, to any person obtaining a copy of - this software and associated documentation files (the "Software"), to deal in - the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is furnished to do - so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -*/ - -#pragma once - -#ifndef NAZARA_GLOBAL_VULKAN_HPP -#define NAZARA_GLOBAL_VULKAN_HPP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif // NAZARA_GLOBAL_VULKAN_HPP From 706a06b506cc47ee75337d947598f0ca6b2b9ff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 25 Sep 2018 15:51:45 +0200 Subject: [PATCH 112/352] Increase NetPacket size from UInt16 to UInt32 --- include/Nazara/Network/NetPacket.hpp | 6 +++--- src/Nazara/Network/NetPacket.cpp | 6 +++--- src/Nazara/Network/TcpClient.cpp | 4 ++-- src/Nazara/Network/UdpSocket.cpp | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/Nazara/Network/NetPacket.hpp b/include/Nazara/Network/NetPacket.hpp index 62be3e990..37003e14c 100644 --- a/include/Nazara/Network/NetPacket.hpp +++ b/include/Nazara/Network/NetPacket.hpp @@ -46,10 +46,10 @@ namespace Nz NetPacket& operator=(const NetPacket&) = delete; NetPacket& operator=(NetPacket&& packet); - static bool DecodeHeader(const void* data, UInt16* packetSize, UInt16* netCode); - static bool EncodeHeader(void* data, UInt16 packetSize, UInt16 netCode); + static bool DecodeHeader(const void* data, UInt32* packetSize, UInt16* netCode); + static bool EncodeHeader(void* data, UInt32 packetSize, UInt16 netCode); - static constexpr std::size_t HeaderSize = sizeof(UInt16) + sizeof(UInt16); //< PacketSize + NetCode + static constexpr std::size_t HeaderSize = sizeof(UInt32) + sizeof(UInt16); //< PacketSize + NetCode private: void OnEmptyStream() override; diff --git a/src/Nazara/Network/NetPacket.cpp b/src/Nazara/Network/NetPacket.cpp index 0dda7c864..4df6e0cae 100644 --- a/src/Nazara/Network/NetPacket.cpp +++ b/src/Nazara/Network/NetPacket.cpp @@ -45,7 +45,7 @@ namespace Nz NazaraAssert(m_netCode != NetCode_Invalid, "Invalid NetCode"); std::size_t size = m_buffer->GetSize(); - if (!EncodeHeader(m_buffer->GetBuffer(), static_cast(size), m_netCode)) + if (!EncodeHeader(m_buffer->GetBuffer(), static_cast(size), m_netCode)) { NazaraError("Failed to encode packet header"); return nullptr; @@ -64,7 +64,7 @@ namespace Nz * \param netCode Packet number */ - bool NetPacket::DecodeHeader(const void* data, UInt16* packetSize, UInt16* netCode) + bool NetPacket::DecodeHeader(const void* data, UInt32* packetSize, UInt16* netCode) { MemoryView stream(data, HeaderSize); @@ -83,7 +83,7 @@ namespace Nz * \param netCode Packet number */ - bool NetPacket::EncodeHeader(void* data, UInt16 packetSize, UInt16 netCode) + bool NetPacket::EncodeHeader(void* data, UInt32 packetSize, UInt16 netCode) { MemoryView stream(data, HeaderSize); diff --git a/src/Nazara/Network/TcpClient.cpp b/src/Nazara/Network/TcpClient.cpp index 9e2eb7e0c..56060b40e 100644 --- a/src/Nazara/Network/TcpClient.cpp +++ b/src/Nazara/Network/TcpClient.cpp @@ -244,7 +244,7 @@ namespace Nz NazaraAssert(m_pendingPacket.received <= NetPacket::HeaderSize, "Received more data than header size"); if (m_pendingPacket.received >= NetPacket::HeaderSize) { - UInt16 size; + UInt32 size; if (!NetPacket::DecodeHeader(m_pendingPacket.data.GetConstBuffer(), &size, &m_pendingPacket.netcode)) { m_lastError = SocketError_Packet; @@ -261,7 +261,7 @@ namespace Nz // We may have just received the header now if (m_pendingPacket.headerReceived) { - UInt16 packetSize = static_cast(m_pendingPacket.data.GetSize()); //< Total packet size + UInt32 packetSize = static_cast(m_pendingPacket.data.GetSize()); //< Total packet size if (packetSize == 0) { // Special case: our packet carry no data diff --git a/src/Nazara/Network/UdpSocket.cpp b/src/Nazara/Network/UdpSocket.cpp index c0a88eb88..a44ad3c14 100644 --- a/src/Nazara/Network/UdpSocket.cpp +++ b/src/Nazara/Network/UdpSocket.cpp @@ -182,7 +182,7 @@ namespace Nz return false; //< No datagram received Nz::UInt16 netCode; - Nz::UInt16 packetSize; + Nz::UInt32 packetSize; if (!NetPacket::DecodeHeader(packet->GetConstData(), &packetSize, &netCode)) { m_lastError = SocketError_Packet; From 2243749480521e0ff9c7d73a53b1c3ea1c6e8490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 25 Sep 2018 15:55:16 +0200 Subject: [PATCH 113/352] Math/Angle: Fix warning --- include/Nazara/Math/Angle.inl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index 82f7c4dbe..46e03d5b1 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -243,9 +243,9 @@ namespace Nz */ template template - Angle& Angle::Set(const Angle& Angle) + Angle& Angle::Set(const Angle& angle) { - angle = RadianToDegree(Angle.angle); + angle = RadianToDegree(angle.angle); return *this; } @@ -256,9 +256,9 @@ namespace Nz */ template template - Angle& Angle::Set(const Angle& Angle) + Angle& Angle::Set(const Angle& angle) { - angle = DegreeToRadian(Angle.angle); + angle = DegreeToRadian(angle.angle); return *this; } @@ -268,9 +268,9 @@ namespace Nz * \param Angle Angle which will be copied */ template - Angle& Angle::Set(const Angle& Angle) + Angle& Angle::Set(const Angle& angle) { - angle = Angle.angle; + angle = angle.angle; return *this; } @@ -283,9 +283,9 @@ namespace Nz */ template template - Angle& Angle::Set(const Angle& Angle) + Angle& Angle::Set(const Angle& angle) { - angle = static_cast(Angle.angle); + angle = static_cast(angle.angle); return *this; } From e1cfa2e1849c5b411407ba3379844e790acb7292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Tue, 25 Sep 2018 15:56:35 +0200 Subject: [PATCH 114/352] And again --- include/Nazara/Math/Angle.hpp | 8 ++++---- include/Nazara/Math/Angle.inl | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index a64893e3a..74e2b884d 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -42,10 +42,10 @@ namespace Nz void Normalize(); - template> Angle& Set(const Angle& Angle); - template> Angle& Set(const Angle& Angle); - Angle& Set(const Angle& Angle); - template Angle& Set(const Angle& Angle); + template> Angle& Set(const Angle& ang); + template> Angle& Set(const Angle& ang); + Angle& Set(const Angle& ang); + template Angle& Set(const Angle& ang); Angle ToDegrees() const; EulerAngles ToEulerAngles() const; diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index 46e03d5b1..354cab93f 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -243,9 +243,9 @@ namespace Nz */ template template - Angle& Angle::Set(const Angle& angle) + Angle& Angle::Set(const Angle& ang) { - angle = RadianToDegree(angle.angle); + angle = RadianToDegree(ang.angle); return *this; } @@ -256,9 +256,9 @@ namespace Nz */ template template - Angle& Angle::Set(const Angle& angle) + Angle& Angle::Set(const Angle& ang) { - angle = DegreeToRadian(angle.angle); + angle = DegreeToRadian(ang.angle); return *this; } @@ -268,9 +268,9 @@ namespace Nz * \param Angle Angle which will be copied */ template - Angle& Angle::Set(const Angle& angle) + Angle& Angle::Set(const Angle& ang) { - angle = angle.angle; + angle = ang.angle; return *this; } @@ -283,9 +283,9 @@ namespace Nz */ template template - Angle& Angle::Set(const Angle& angle) + Angle& Angle::Set(const Angle& ang) { - angle = static_cast(angle.angle); + angle = static_cast(ang.angle); return *this; } From 583393acd0ae6ac3a6f8098342492a2d056a521e Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 30 Sep 2018 18:04:49 +0200 Subject: [PATCH 115/352] Network/AbstractSocket: Replace OnStateChange signal by OnStateChanged --- ChangeLog.md | 1 + include/Nazara/Network/AbstractSocket.hpp | 2 +- include/Nazara/Network/AbstractSocket.inl | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index cfd544bcb..a8734d9a9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -150,6 +150,7 @@ Nazara Engine: - ⚠️ BaseWidget::SetSize has been renamed to BaseWidget::Resize - Added BaseWidget::ForEachWidgetChild - Added experimental BoxLayout class +- ⚠️ AbstractSocket::OnStateChange has been replaced by OnStateChanged, which is now called after state has been changed (with oldState and newState as parameters). Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Network/AbstractSocket.hpp b/include/Nazara/Network/AbstractSocket.hpp index 315364e8d..ca69d7713 100644 --- a/include/Nazara/Network/AbstractSocket.hpp +++ b/include/Nazara/Network/AbstractSocket.hpp @@ -44,7 +44,7 @@ namespace Nz AbstractSocket& operator=(AbstractSocket&& abstractSocket); // Signals: - NazaraSignal(OnStateChange, const AbstractSocket* /*socket*/, SocketState /*newState*/); + NazaraSignal(OnStateChanged, const AbstractSocket* /*socket*/, SocketState /*oldState*/, SocketState /*newState*/); protected: AbstractSocket(SocketType type); diff --git a/include/Nazara/Network/AbstractSocket.inl b/include/Nazara/Network/AbstractSocket.inl index fe8aed5af..530b696e0 100644 --- a/include/Nazara/Network/AbstractSocket.inl +++ b/include/Nazara/Network/AbstractSocket.inl @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Jrme Leclercq +// Copyright (C) 2017 Jérôme Leclercq // This file is part of the "Nazara Engine - Network module" // For conditions of distribution and use, see copyright notice in Config.hpp @@ -66,8 +66,9 @@ namespace Nz { if (m_state != newState) { - OnStateChange(this, newState); + SocketState oldState = m_state; m_state = newState; + OnStateChange(this, oldState, newState); } } } From f0da71b807f83ee913d605385212b254e170635c Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 30 Sep 2018 18:05:15 +0200 Subject: [PATCH 116/352] Move changelogs entries belonging to the NDK --- ChangeLog.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index a8734d9a9..3219f10ec 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -146,10 +146,6 @@ Nazara Engine: - CullingList now handles box tests - ⚠️ 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. -- ⚠️ Widgets have been reworked and no longer have padding, but instead have preferred, maximum and minimum size. -- ⚠️ BaseWidget::SetSize has been renamed to BaseWidget::Resize -- Added BaseWidget::ForEachWidgetChild -- Added experimental BoxLayout class - ⚠️ AbstractSocket::OnStateChange has been replaced by OnStateChanged, which is now called after state has been changed (with oldState and newState as parameters). Nazara Development Kit: @@ -211,6 +207,10 @@ Nazara Development Kit: - Make Ndk::PhysicsSystem2D an interface of Nz::PhysWorld2D - ⚠️ GraphicsComponent no longer has a BoundingVolume, it instead has only an AABB with its attached InstancedRenderable getting a BoundingVolume of their own, improving culling possibilities. - RenderSystem now does cull InstancedRenderables attached to a GraphicsComponent, improving performance. +- ⚠️ Widgets have been reworked and no longer have padding, but instead have preferred, maximum and minimum size. +- ⚠️ BaseWidget::SetSize has been renamed to BaseWidget::Resize +- Added BaseWidget::ForEachWidgetChild +- Added experimental BoxLayout class # 0.4: From 8091e5234888497af4052e91462307eaa666448e Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 30 Sep 2018 18:07:38 +0200 Subject: [PATCH 117/352] Forgot to save this file --- include/Nazara/Network/AbstractSocket.inl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Nazara/Network/AbstractSocket.inl b/include/Nazara/Network/AbstractSocket.inl index 530b696e0..9b7434812 100644 --- a/include/Nazara/Network/AbstractSocket.inl +++ b/include/Nazara/Network/AbstractSocket.inl @@ -68,7 +68,7 @@ namespace Nz { SocketState oldState = m_state; m_state = newState; - OnStateChange(this, oldState, newState); + OnStateChanged(this, oldState, newState); } } } From f6b0405f9b4137cdeb285aa6264b669514b4ed15 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 30 Sep 2018 18:08:17 +0200 Subject: [PATCH 118/352] Sdk/RenderSystem: Resolve skinning before rendering --- ChangeLog.md | 1 + SDK/src/NDK/Systems/RenderSystem.cpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 3219f10ec..a0ab78b93 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -211,6 +211,7 @@ Nazara Development Kit: - ⚠️ BaseWidget::SetSize has been renamed to BaseWidget::Resize - Added BaseWidget::ForEachWidgetChild - Added experimental BoxLayout class +- RenderSystem now resolve skinning before render # 0.4: diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index 25b8e3585..8b4bfe03f 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -184,6 +185,8 @@ namespace Ndk m_coordinateSystemInvalidated = false; } + Nz::SkinningManager::Skin(); + UpdateDynamicReflections(); UpdatePointSpotShadowMaps(); From 13a515c1b5ffc82986ad87d10d074969fc2b0afd Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 1 Oct 2018 22:19:49 +0200 Subject: [PATCH 119/352] Network/TcpClient: WaitForConnected now closes the socket on failure --- ChangeLog.md | 1 + src/Nazara/Network/TcpClient.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index a0ab78b93..76c4236d4 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -147,6 +147,7 @@ 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 closes the socket on failure. Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Network/TcpClient.cpp b/src/Nazara/Network/TcpClient.cpp index 56060b40e..41d06348d 100644 --- a/src/Nazara/Network/TcpClient.cpp +++ b/src/Nazara/Network/TcpClient.cpp @@ -467,9 +467,9 @@ namespace Nz SocketState newState = SocketImpl::Connect(m_handle, m_peerAddress, msTimeout, &m_lastError); NazaraAssert(newState != SocketState_Connecting, "Invalid internal return"); //< Connect cannot return Connecting is a timeout was specified - // Prevent valid peer address in non-connected state + // Prevent valid stats in non-connected state if (newState == SocketState_NotConnected) - m_peerAddress = IpAddress::Invalid; + Close(); UpdateState(newState); return newState == SocketState_Connected; From dad2dbae1c524fb67af7b9eb161aada92bd0bf71 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 1 Oct 2018 22:38:20 +0200 Subject: [PATCH 120/352] Network/TcpClient: WaitForConnected now returns new socket state --- ChangeLog.md | 1 + include/Nazara/Network/TcpClient.hpp | 2 +- src/Nazara/Network/TcpClient.cpp | 29 ++++++++++++++-------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 76c4236d4..1b4bc564b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -148,6 +148,7 @@ Nazara Engine: - 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 closes the socket on failure. +- ⚠️ TcpClient::WaitForconnected now returns the new socket state. Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Network/TcpClient.hpp b/include/Nazara/Network/TcpClient.hpp index 43b299994..7c92e2ce0 100644 --- a/include/Nazara/Network/TcpClient.hpp +++ b/include/Nazara/Network/TcpClient.hpp @@ -54,7 +54,7 @@ namespace Nz bool SetCursorPos(UInt64 offset) override; - bool WaitForConnected(UInt64 msTimeout = 3000); + SocketState WaitForConnected(UInt64 msTimeout = 3000); inline TcpClient& operator=(TcpClient&& tcpClient) = default; diff --git a/src/Nazara/Network/TcpClient.cpp b/src/Nazara/Network/TcpClient.cpp index 41d06348d..441174836 100644 --- a/src/Nazara/Network/TcpClient.cpp +++ b/src/Nazara/Network/TcpClient.cpp @@ -432,24 +432,18 @@ namespace Nz /*! * \brief Waits for being connected before time out - * \return true If connection is successful + * \return The new socket state, either Connected if connection did succeed or NotConnected if an error occurred * - * \param msTimeout Time in milliseconds before time out + * This functions waits for the pending connection to either succeed or fail for a specific duration before failing. * - * \remark Produces a NazaraAssert if socket is invalid + * \param msTimeout Time in milliseconds before time out (0 for system-specific duration, like a blocking connect would) + * + * \remark This function doesn't do anything if the socket is not currently connecting. */ - - bool TcpClient::WaitForConnected(UInt64 msTimeout) + SocketState TcpClient::WaitForConnected(UInt64 msTimeout) { switch (m_state) { - case SocketState_Bound: - case SocketState_Resolving: - break; - - case SocketState_Connected: - return true; - case SocketState_Connecting: { NazaraAssert(m_handle != SocketImpl::InvalidHandle, "Invalid handle"); @@ -472,15 +466,20 @@ namespace Nz Close(); UpdateState(newState); - return newState == SocketState_Connected; + return newState; } + case SocketState_Connected: case SocketState_NotConnected: - return false; + return m_state; + + case SocketState_Bound: + case SocketState_Resolving: + break; } NazaraInternalError("Unhandled socket state (0x" + String::Number(m_state, 16) + ')'); - return false; + return m_state; } /*! From 67c56b2abac744390a1fd271ecb24f2dc7936007 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 1 Oct 2018 23:04:53 +0200 Subject: [PATCH 121/352] Network/TcpClient: Add PollForConnected --- ChangeLog.md | 1 + include/Nazara/Network/TcpClient.hpp | 2 + src/Nazara/Network/Posix/SocketImpl.cpp | 105 ++++++++++++------------ src/Nazara/Network/Posix/SocketImpl.hpp | 2 +- src/Nazara/Network/TcpClient.cpp | 61 +++++++++++--- src/Nazara/Network/Win32/SocketImpl.cpp | 105 ++++++++++++------------ src/Nazara/Network/Win32/SocketImpl.hpp | 2 +- 7 files changed, 159 insertions(+), 119 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 1b4bc564b..01a31cf2a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -149,6 +149,7 @@ Nazara Engine: - ⚠️ 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 closes the socket on failure. - ⚠️ TcpClient::WaitForconnected now returns the new socket state. +- Added TcpClient::PollForConnected Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Network/TcpClient.hpp b/include/Nazara/Network/TcpClient.hpp index 7c92e2ce0..13ab9a13b 100644 --- a/include/Nazara/Network/TcpClient.hpp +++ b/include/Nazara/Network/TcpClient.hpp @@ -45,6 +45,8 @@ namespace Nz inline bool IsLowDelayEnabled() const; inline bool IsKeepAliveEnabled() const; + SocketState PollForConnected(UInt64 waitDuration = 0); + bool Receive(void* buffer, std::size_t size, std::size_t* received); bool ReceivePacket(NetPacket* packet); diff --git a/src/Nazara/Network/Posix/SocketImpl.cpp b/src/Nazara/Network/Posix/SocketImpl.cpp index 46afef418..8bccda0db 100644 --- a/src/Nazara/Network/Posix/SocketImpl.cpp +++ b/src/Nazara/Network/Posix/SocketImpl.cpp @@ -138,59 +138,6 @@ namespace Nz return SocketState_Connected; } - SocketState SocketImpl::Connect(SocketHandle handle, const IpAddress& address, UInt64 msTimeout, SocketError* error) - { - SocketState state = Connect(handle, address, error); - if (state == SocketState_Connecting) - { - // http://developerweb.net/viewtopic.php?id=3196 - fd_set localSet; - FD_ZERO(&localSet); - FD_SET(handle, &localSet); - - timeval tv; - tv.tv_sec = static_cast(msTimeout / 1000ULL); - tv.tv_usec = static_cast((msTimeout % 1000ULL) * 1000ULL); - - int ret = select(handle + 1, nullptr, &localSet, &localSet, (msTimeout > 0) ? &tv : nullptr); - if (ret > 0) - { - int code = GetLastErrorCode(handle, error); - if (code < 0) //< GetLastErrorCode() failed - return SocketState_NotConnected; - - if (code) - { - if (error) - *error = TranslateErrnoToSocketError(code); - - return SocketState_NotConnected; - } - } - else if (ret == 0) - { - if (error) - *error = SocketError_TimedOut; - - return SocketState_NotConnected; - } - else - { - if (error) - *error = TranslateErrnoToSocketError(GetLastErrorCode()); - - return SocketState_NotConnected; - } - - if (error) - *error = SocketError_NoError; - - state = SocketState_Connected; - } - - return state; - } - bool SocketImpl::Initialize() { return true; @@ -462,6 +409,58 @@ namespace Nz return static_cast(result); } + SocketState SocketImpl::PollConnection(SocketHandle handle, const IpAddress& address, UInt64 msTimeout, SocketError* error) + { + // http://developerweb.net/viewtopic.php?id=3196 + fd_set localSet; + FD_ZERO(&localSet); + FD_SET(handle, &localSet); + + timeval tv; + tv.tv_sec = static_cast(msTimeout / 1000ULL); + tv.tv_usec = static_cast((msTimeout % 1000ULL) * 1000ULL); + + int ret = ::select(0, nullptr, &localSet, &localSet, (msTimeout >= 0 && msTimeout != std::numeric_limits::max()) ? &tv : nullptr); + if (ret > 0) + { + int code = GetLastErrorCode(handle, error); + if (code < 0) //< GetLastErrorCode() failed + return SocketState_NotConnected; + + if (code) + { + if (error) + *error = TranslateWSAErrorToSocketError(code); + + return SocketState_NotConnected; + } + } + else if (ret == 0) + { + if (error) + { + if (msTimeout > 0) + *error = SocketError_TimedOut; + else + *error = SocketError_NoError; + } + + return SocketState_Connecting; + } + else + { + if (error) + *error = TranslateWSAErrorToSocketError(WSAGetLastError()); + + return SocketState_NotConnected; + } + + if (error) + *error = SocketError_NoError; + + return SocketState_Connected; + } + bool SocketImpl::Receive(SocketHandle handle, void* buffer, int length, int* read, SocketError* error) { NazaraAssert(handle != InvalidHandle, "Invalid handle"); diff --git a/src/Nazara/Network/Posix/SocketImpl.hpp b/src/Nazara/Network/Posix/SocketImpl.hpp index af22eb8dd..7365ca600 100644 --- a/src/Nazara/Network/Posix/SocketImpl.hpp +++ b/src/Nazara/Network/Posix/SocketImpl.hpp @@ -40,7 +40,6 @@ namespace Nz static void Close(SocketHandle handle); static SocketState Connect(SocketHandle handle, const IpAddress& address, SocketError* error); - static SocketState Connect(SocketHandle handle, const IpAddress& address, UInt64 msTimeout, SocketError* error); static bool Initialize(); @@ -61,6 +60,7 @@ namespace Nz static std::size_t QuerySendBufferSize(SocketHandle handle, SocketError* error = nullptr); static unsigned int Poll(PollSocket* fdarray, std::size_t nfds, int timeout, SocketError* error); + static SocketState PollConnection(SocketHandle handle, const IpAddress& address, UInt64 msTimeout, SocketError* error); static bool Receive(SocketHandle handle, void* buffer, int length, int* read, SocketError* error); static bool ReceiveFrom(SocketHandle handle, void* buffer, int length, IpAddress* from, int* read, SocketError* error); diff --git a/src/Nazara/Network/TcpClient.cpp b/src/Nazara/Network/TcpClient.cpp index 441174836..9b43fbea0 100644 --- a/src/Nazara/Network/TcpClient.cpp +++ b/src/Nazara/Network/TcpClient.cpp @@ -173,6 +173,50 @@ namespace Nz return QueryAvailableBytes(); } + /*! + * \brief Polls the connection status of the currently connecting socket + * \return New socket state, which maybe unchanged (if connecting is still pending), SocketState_Connected if connection is successful or SocketState_NotConnected if connection failed + * + * This functions checks if the pending connection has either succeeded, failed or is still processing at the time of the call. + * + * \remark This function doesn't do anything if the socket is not currently connecting. + * + * \see WaitForConnected + */ + SocketState TcpClient::PollForConnected(UInt64 waitDuration) + { + switch (m_state) + { + case SocketState_Connecting: + { + NazaraAssert(m_handle != SocketImpl::InvalidHandle, "Invalid handle"); + + SocketState newState = SocketImpl::PollConnection(m_handle, m_peerAddress, waitDuration, &m_lastError); + + // Prevent valid peer address in non-connected state + if (newState == SocketState_NotConnected) + { + m_openMode = OpenMode_NotOpen; + m_peerAddress = IpAddress::Invalid; + } + + UpdateState(newState); + return newState; + } + + case SocketState_Connected: + case SocketState_NotConnected: + return m_state; + + case SocketState_Bound: + case SocketState_Resolving: + break; + } + + NazaraInternalError("Unexpected socket state (0x" + String::Number(m_state, 16) + ')'); + return m_state; + } + /*! * \brief Receives the data available * \return true If data received @@ -439,6 +483,8 @@ namespace Nz * \param msTimeout Time in milliseconds before time out (0 for system-specific duration, like a blocking connect would) * * \remark This function doesn't do anything if the socket is not currently connecting. + * + * \see PollForConnected */ SocketState TcpClient::WaitForConnected(UInt64 msTimeout) { @@ -448,18 +494,11 @@ namespace Nz { NazaraAssert(m_handle != SocketImpl::InvalidHandle, "Invalid handle"); - CallOnExit restoreBlocking; - if (m_isBlockingEnabled) - { - SocketImpl::SetBlocking(m_handle, false); - restoreBlocking.Reset([this] () - { - SocketImpl::SetBlocking(m_handle, true); - }); - } + SocketState newState = SocketImpl::PollConnection(m_handle, m_peerAddress, (msTimeout > 0) ? msTimeout : std::numeric_limits::max(), &m_lastError); - SocketState newState = SocketImpl::Connect(m_handle, m_peerAddress, msTimeout, &m_lastError); - NazaraAssert(newState != SocketState_Connecting, "Invalid internal return"); //< Connect cannot return Connecting is a timeout was specified + // If connection is still pending after waiting, cancel it + if (newState == SocketState_Connecting) + newState = SocketState_NotConnected; // Prevent valid stats in non-connected state if (newState == SocketState_NotConnected) diff --git a/src/Nazara/Network/Win32/SocketImpl.cpp b/src/Nazara/Network/Win32/SocketImpl.cpp index e1191e07d..f9e4b42f5 100644 --- a/src/Nazara/Network/Win32/SocketImpl.cpp +++ b/src/Nazara/Network/Win32/SocketImpl.cpp @@ -154,59 +154,6 @@ namespace Nz return SocketState_Connected; } - SocketState SocketImpl::Connect(SocketHandle handle, const IpAddress& address, UInt64 msTimeout, SocketError* error) - { - SocketState state = Connect(handle, address, error); - if (state == SocketState_Connecting) - { - // http://developerweb.net/viewtopic.php?id=3196 - fd_set localSet; - FD_ZERO(&localSet); - FD_SET(handle, &localSet); - - timeval tv; - tv.tv_sec = static_cast(msTimeout / 1000ULL); - tv.tv_usec = static_cast((msTimeout % 1000ULL) * 1000ULL); - - int ret = select(0, nullptr, &localSet, &localSet, (msTimeout > 0) ? &tv : nullptr); - if (ret > 0) - { - int code = GetLastErrorCode(handle, error); - if (code < 0) //< GetLastErrorCode() failed - return SocketState_NotConnected; - - if (code) - { - if (error) - *error = TranslateWSAErrorToSocketError(code); - - return SocketState_NotConnected; - } - } - else if (ret == 0) - { - if (error) - *error = SocketError_TimedOut; - - return SocketState_NotConnected; - } - else - { - if (error) - *error = TranslateWSAErrorToSocketError(WSAGetLastError()); - - return SocketState_NotConnected; - } - - if (error) - *error = SocketError_NoError; - - state = SocketState_Connected; - } - - return state; - } - bool SocketImpl::Initialize() { int errorCode = WSAStartup(MAKEWORD(2, 2), &s_WSA); @@ -502,6 +449,58 @@ namespace Nz return 0; #endif } + + SocketState SocketImpl::PollConnection(SocketHandle handle, const IpAddress& address, UInt64 msTimeout, SocketError* error) + { + // http://developerweb.net/viewtopic.php?id=3196 + fd_set localSet; + FD_ZERO(&localSet); + FD_SET(handle, &localSet); + + timeval tv; + tv.tv_sec = static_cast(msTimeout / 1000ULL); + tv.tv_usec = static_cast((msTimeout % 1000ULL) * 1000ULL); + + int ret = ::select(0, nullptr, &localSet, &localSet, (msTimeout != std::numeric_limits::max()) ? &tv : nullptr); + if (ret > 0) + { + int code = GetLastErrorCode(handle, error); + if (code < 0) //< GetLastErrorCode() failed + return SocketState_NotConnected; + + if (code) + { + if (error) + *error = TranslateWSAErrorToSocketError(code); + + return SocketState_NotConnected; + } + } + else if (ret == 0) + { + if (error) + { + if (msTimeout > 0) + *error = SocketError_TimedOut; + else + *error = SocketError_NoError; + } + + return SocketState_Connecting; + } + else + { + if (error) + *error = TranslateWSAErrorToSocketError(WSAGetLastError()); + + return SocketState_NotConnected; + } + + if (error) + *error = SocketError_NoError; + + return SocketState_Connected; + } bool SocketImpl::Receive(SocketHandle handle, void* buffer, int length, int* read, SocketError* error) { diff --git a/src/Nazara/Network/Win32/SocketImpl.hpp b/src/Nazara/Network/Win32/SocketImpl.hpp index ef49cd14d..36ba874ee 100644 --- a/src/Nazara/Network/Win32/SocketImpl.hpp +++ b/src/Nazara/Network/Win32/SocketImpl.hpp @@ -40,7 +40,6 @@ namespace Nz static void Close(SocketHandle handle); static SocketState Connect(SocketHandle handle, const IpAddress& address, SocketError* error); - static SocketState Connect(SocketHandle handle, const IpAddress& address, UInt64 msTimeout, SocketError* error); static bool Initialize(); @@ -61,6 +60,7 @@ namespace Nz static std::size_t QuerySendBufferSize(SocketHandle handle, SocketError* error = nullptr); static unsigned int Poll(PollSocket* fdarray, std::size_t nfds, int timeout, SocketError* error); + static SocketState PollConnection(SocketHandle handle, const IpAddress& address, UInt64 msTimeout, SocketError* error); static bool Receive(SocketHandle handle, void* buffer, int length, int* read, SocketError* error); static bool ReceiveFrom(SocketHandle handle, void* buffer, int length, IpAddress* from, int* read, SocketError* error); From aa9bec6e5e466a95d3632323961256175a5019bf Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 1 Oct 2018 23:05:14 +0200 Subject: [PATCH 122/352] Network/TcpClient: Revert to previous behavior on failure --- ChangeLog.md | 1 - src/Nazara/Network/TcpClient.cpp | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 01a31cf2a..7582edc12 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -147,7 +147,6 @@ 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 closes the socket on failure. - ⚠️ TcpClient::WaitForconnected now returns the new socket state. - Added TcpClient::PollForConnected diff --git a/src/Nazara/Network/TcpClient.cpp b/src/Nazara/Network/TcpClient.cpp index 9b43fbea0..de8e2771d 100644 --- a/src/Nazara/Network/TcpClient.cpp +++ b/src/Nazara/Network/TcpClient.cpp @@ -502,7 +502,10 @@ namespace Nz // Prevent valid stats in non-connected state if (newState == SocketState_NotConnected) - Close(); + { + m_openMode = OpenMode_NotOpen; + m_peerAddress = IpAddress::Invalid; + } UpdateState(newState); return newState; From 34787d676632037d5fa137e941ae64fde5916446 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 1 Oct 2018 23:10:25 +0200 Subject: [PATCH 123/352] Network/SocketImpl: Fix linux build --- src/Nazara/Network/Posix/SocketImpl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Nazara/Network/Posix/SocketImpl.cpp b/src/Nazara/Network/Posix/SocketImpl.cpp index 8bccda0db..af0b5557f 100644 --- a/src/Nazara/Network/Posix/SocketImpl.cpp +++ b/src/Nazara/Network/Posix/SocketImpl.cpp @@ -420,7 +420,7 @@ namespace Nz tv.tv_sec = static_cast(msTimeout / 1000ULL); tv.tv_usec = static_cast((msTimeout % 1000ULL) * 1000ULL); - int ret = ::select(0, nullptr, &localSet, &localSet, (msTimeout >= 0 && msTimeout != std::numeric_limits::max()) ? &tv : nullptr); + int ret = ::select(0, nullptr, &localSet, &localSet, (msTimeout != std::numeric_limits::max()) ? &tv : nullptr); if (ret > 0) { int code = GetLastErrorCode(handle, error); @@ -430,7 +430,7 @@ namespace Nz if (code) { if (error) - *error = TranslateWSAErrorToSocketError(code); + *error = TranslateErrnoToSocketError(code); return SocketState_NotConnected; } @@ -450,7 +450,7 @@ namespace Nz else { if (error) - *error = TranslateWSAErrorToSocketError(WSAGetLastError()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return SocketState_NotConnected; } From 5108eb8906626398cf7a746e603fb1c08dd5f59c Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 1 Oct 2018 23:14:02 +0200 Subject: [PATCH 124/352] Sdk/EntityOwner: Make Entity* constructor implicit --- ChangeLog.md | 1 + SDK/include/NDK/EntityOwner.hpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7582edc12..c559d14b2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -214,6 +214,7 @@ Nazara Development Kit: - Added BaseWidget::ForEachWidgetChild - Added experimental BoxLayout class - RenderSystem now resolve skinning before render +- EntityOwner constructor taking a Entity* is no longer explicit # 0.4: diff --git a/SDK/include/NDK/EntityOwner.hpp b/SDK/include/NDK/EntityOwner.hpp index fb32f0780..0be491058 100644 --- a/SDK/include/NDK/EntityOwner.hpp +++ b/SDK/include/NDK/EntityOwner.hpp @@ -15,7 +15,7 @@ namespace Ndk { public: EntityOwner() = default; - explicit EntityOwner(Entity* entity); + EntityOwner(Entity* entity); EntityOwner(const EntityOwner& handle) = delete; EntityOwner(EntityOwner&& handle) noexcept = default; ~EntityOwner(); From 7f2826f192753fe451b042a959bb7c91693b05b1 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 5 Oct 2018 19:53:35 +0200 Subject: [PATCH 125/352] Graphics/CullingList: Fix visibility hash being always the same, causing visibility issues --- include/Nazara/Graphics/CullingList.inl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/Nazara/Graphics/CullingList.inl b/include/Nazara/Graphics/CullingList.inl index 1230ce9e9..5e924d013 100644 --- a/include/Nazara/Graphics/CullingList.inl +++ b/include/Nazara/Graphics/CullingList.inl @@ -35,7 +35,7 @@ namespace Nz { case IntersectionSide_Inside: m_fullyVisibleResults.push_back(entry.renderable); - CombineHash(fullyVisibleHash, std::hash()(entry.renderable)); + fullyVisibleHash = CombineHash(fullyVisibleHash, std::hash()(entry.renderable)); forcedInvalidation = forcedInvalidation | entry.forceInvalidation; entry.forceInvalidation = false; @@ -43,7 +43,7 @@ namespace Nz case IntersectionSide_Intersecting: m_partiallyVisibleResults.push_back(entry.renderable); - CombineHash(partiallyVisibleHash, std::hash()(entry.renderable)); + partiallyVisibleHash = CombineHash(partiallyVisibleHash, std::hash()(entry.renderable)); forcedInvalidation = forcedInvalidation | entry.forceInvalidation; entry.forceInvalidation = false; @@ -72,7 +72,7 @@ namespace Nz { case IntersectionSide_Inside: m_fullyVisibleResults.push_back(entry.renderable); - CombineHash(fullyVisibleHash, std::hash()(entry.renderable)); + fullyVisibleHash = CombineHash(fullyVisibleHash, std::hash()(entry.renderable)); forcedInvalidation = forcedInvalidation | entry.forceInvalidation; entry.forceInvalidation = false; @@ -80,7 +80,7 @@ namespace Nz case IntersectionSide_Intersecting: m_partiallyVisibleResults.push_back(entry.renderable); - CombineHash(partiallyVisibleHash, std::hash()(entry.renderable)); + partiallyVisibleHash = CombineHash(partiallyVisibleHash, std::hash()(entry.renderable)); forcedInvalidation = forcedInvalidation | entry.forceInvalidation; entry.forceInvalidation = false; @@ -97,7 +97,7 @@ namespace Nz { case IntersectionSide_Inside: m_fullyVisibleResults.push_back(entry.renderable); - CombineHash(fullyVisibleHash, std::hash()(entry.renderable)); + fullyVisibleHash = CombineHash(fullyVisibleHash, std::hash()(entry.renderable)); forcedInvalidation = forcedInvalidation | entry.forceInvalidation; entry.forceInvalidation = false; @@ -105,7 +105,7 @@ namespace Nz case IntersectionSide_Intersecting: m_partiallyVisibleResults.push_back(entry.renderable); - CombineHash(partiallyVisibleHash, std::hash()(entry.renderable)); + partiallyVisibleHash = CombineHash(partiallyVisibleHash, std::hash()(entry.renderable)); forcedInvalidation = forcedInvalidation | entry.forceInvalidation; entry.forceInvalidation = false; From f02f206affd1de217393954475e93b91d74427a3 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Oct 2018 17:34:46 +0200 Subject: [PATCH 126/352] SDK/PhysicsComponent2D: Allow massless bodies --- ChangeLog.md | 1 + SDK/include/NDK/Components/PhysicsComponent2D.inl | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index c559d14b2..b1da8d24c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -215,6 +215,7 @@ Nazara Development Kit: - Added experimental BoxLayout class - RenderSystem now resolve skinning before render - EntityOwner constructor taking a Entity* is no longer explicit +- PhysicsComponent2D now allows massless bodies (zero mass) # 0.4: diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index bd550c41b..b60ac5047 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -320,7 +320,7 @@ namespace Ndk inline void PhysicsComponent2D::SetMass(float mass) { NazaraAssert(m_object, "Invalid physics object"); - NazaraAssert(mass > 0.f, "Mass should be positive"); + NazaraAssert(mass >= 0.f, "Mass should be positive"); m_object->SetMass(mass); } From dc6fbfc90f3eca2c89cf3f811091bd93c0d6cbce Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Oct 2018 23:20:53 +0200 Subject: [PATCH 127/352] Replace floating point angle by Angle class instance --- .../NDK/Components/PhysicsComponent2D.hpp | 8 ++--- .../NDK/Components/PhysicsComponent2D.inl | 21 ++++-------- SDK/include/NDK/Systems/PhysicsSystem2D.hpp | 2 +- .../NDK/Components/CollisionComponent2D.cpp | 1 - SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 2 +- include/Nazara/Graphics/Billboard.hpp | 7 ++-- include/Nazara/Graphics/Billboard.inl | 8 +++-- include/Nazara/Physics2D/Constraint2D.hpp | 21 ++++++------ include/Nazara/Physics2D/PhysWorld2D.hpp | 3 +- include/Nazara/Physics2D/RigidBody2D.hpp | 1 + src/Nazara/Physics2D/Constraint2D.cpp | 32 +++++++++---------- src/Nazara/Physics2D/PhysWorld2D.cpp | 2 +- src/Nazara/Physics2D/RigidBody2D.cpp | 18 ++++++----- tests/Engine/Graphics/Billboard.cpp | 2 +- tests/Engine/Physics2D/RigidBody2D.cpp | 27 ++++++++-------- tests/SDK/NDK/Systems/PhysicsSystem2D.cpp | 10 +++--- tests/SDK/NDK/Systems/RenderSystem.cpp | 12 +++---- 17 files changed, 87 insertions(+), 90 deletions(-) diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index 74b6d630e..79204fbdd 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -38,25 +38,25 @@ namespace Ndk inline Nz::Rectf GetAABB() const; inline float GetAngularDamping() const; - inline float GetAngularVelocity() const; + inline Nz::RadianAnglef GetAngularVelocity() const; NAZARA_DEPRECATED("Name error, please use GetMassCenter") inline Nz::Vector2f GetCenterOfGravity(Nz::CoordSys coordSys = Nz::CoordSys_Local) const; inline float GetMass() const; inline Nz::Vector2f GetMassCenter(Nz::CoordSys coordSys = Nz::CoordSys_Local) const; inline float GetMomentOfInertia() const; inline Nz::Vector2f GetPosition() const; - inline float GetRotation() const; + inline Nz::RadianAnglef GetRotation() const; inline Nz::Vector2f GetVelocity() const; inline bool IsSleeping() const; inline void SetAngularDamping(float angularDamping); - inline void SetAngularVelocity(float angularVelocity); + inline void SetAngularVelocity(const Nz::RadianAnglef& angularVelocity); inline void SetMass(float mass); inline void SetMassCenter(const Nz::Vector2f& center, Nz::CoordSys coordSys = Nz::CoordSys_Local); inline void SetMomentOfInertia(float moment); inline void SetPosition(const Nz::Vector2f& position); - inline void SetRotation(float rotation); + inline void SetRotation(const Nz::RadianAnglef& rotation); inline void SetVelocity(const Nz::Vector2f& velocity); static ComponentIndex componentIndex; diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index b60ac5047..075bd0ff3 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -151,7 +151,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline float PhysicsComponent2D::GetAngularVelocity() const + inline Nz::RadianAnglef PhysicsComponent2D::GetAngularVelocity() const { NazaraAssert(m_object, "Invalid physics object"); @@ -180,7 +180,6 @@ namespace Ndk * * \remark Produces a NazaraAssert if the physics object is invalid */ - inline float PhysicsComponent2D::GetMass() const { NazaraAssert(m_object, "Invalid physics object"); @@ -240,8 +239,7 @@ namespace Ndk * * \remark Produces a NazaraAssert if the physics object is invalid */ - - inline float PhysicsComponent2D::GetRotation() const + inline Nz::RadianAnglef PhysicsComponent2D::GetRotation() const { NazaraAssert(m_object, "Invalid physics object"); @@ -300,8 +298,7 @@ namespace Ndk * * \remark Produces a NazaraAssert if the physics object is invalid */ - - inline void PhysicsComponent2D::SetAngularVelocity(float angularVelocity) + inline void PhysicsComponent2D::SetAngularVelocity(const Nz::RadianAnglef& angularVelocity) { NazaraAssert(m_object, "Invalid physics object"); @@ -313,10 +310,8 @@ namespace Ndk * * \param mass Mass of the object * - * \remark Produces a NazaraAssert if the physics object is invalid - * \remark Produces a NazaraAssert if the mass is negative + * \remark Mass must be positive or zero */ - inline void PhysicsComponent2D::SetMass(float mass) { NazaraAssert(m_object, "Invalid physics object"); @@ -332,13 +327,13 @@ namespace Ndk * * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent2D::SetMassCenter(const Nz::Vector2f& center, Nz::CoordSys coordSys) { NazaraAssert(m_object, "Invalid physics object"); m_object->SetMassCenter(center, coordSys); } + /*! * \brief Sets the angular damping or moment of inertia of the physics object * @@ -348,7 +343,6 @@ namespace Ndk * * \see SetAngularDamping */ - inline void PhysicsComponent2D::SetMomentOfInertia(float moment) { NazaraAssert(m_object, "Invalid physics object"); @@ -363,7 +357,6 @@ namespace Ndk * * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent2D::SetPosition(const Nz::Vector2f& position) { NazaraAssert(m_object, "Invalid physics object"); @@ -378,8 +371,7 @@ namespace Ndk * * \remark Produces a NazaraAssert if the physics object is invalid */ - - inline void PhysicsComponent2D::SetRotation(float rotation) + inline void PhysicsComponent2D::SetRotation(const Nz::RadianAnglef& rotation) { NazaraAssert(m_object, "Invalid physics object"); @@ -405,7 +397,6 @@ namespace Ndk * \brief Gets the underlying physics object * \return A reference to the physics object */ - inline Nz::RigidBody2D* PhysicsComponent2D::GetRigidBody() { return m_object.get(); diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp index 0bbe8d907..a919abbd5 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp @@ -24,7 +24,7 @@ namespace Ndk using ContactPostSolveCallback = std::function; using ContactStartCallback = std::function; - using DebugDrawCircleCallback = std::function; + using DebugDrawCircleCallback = std::function; using DebugDrawDotCallback = std::function; using DebugDrawPolygonCallback = std::function; using DebugDrawSegmentCallback = std::function; diff --git a/SDK/src/NDK/Components/CollisionComponent2D.cpp b/SDK/src/NDK/Components/CollisionComponent2D.cpp index fd78e6c97..5cdfd1589 100644 --- a/SDK/src/NDK/Components/CollisionComponent2D.cpp +++ b/SDK/src/NDK/Components/CollisionComponent2D.cpp @@ -24,7 +24,6 @@ namespace Ndk * * \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); diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index a5bed6d28..69d6a99b1 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -181,7 +181,7 @@ namespace Ndk PhysicsComponent2D& phys = entity->GetComponent(); Nz::RigidBody2D* body = phys.GetRigidBody(); - node.SetRotation(Nz::EulerAnglesf(0.f, 0.f, body->GetRotation()), Nz::CoordSys_Global); + node.SetRotation(body->GetRotation(), Nz::CoordSys_Global); node.SetPosition(Nz::Vector3f(body->GetPosition(), node.GetPosition(Nz::CoordSys_Global).z), Nz::CoordSys_Global); } diff --git a/include/Nazara/Graphics/Billboard.hpp b/include/Nazara/Graphics/Billboard.hpp index f875bc23e..1a151ca69 100644 --- a/include/Nazara/Graphics/Billboard.hpp +++ b/include/Nazara/Graphics/Billboard.hpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace Nz { @@ -34,14 +35,14 @@ namespace Nz std::unique_ptr Clone() const override; inline const Color& GetColor() const; - inline float GetRotation() const; + inline const RadianAnglef& GetRotation() const; inline const Vector2f& GetSize() const; inline void SetColor(const Color& color); inline void SetDefaultMaterial(); inline void SetMaterial(MaterialRef material, bool resizeBillboard = true); inline void SetMaterial(std::size_t skinIndex, MaterialRef material, bool resizeBillboard = true); - inline void SetRotation(float rotation); + inline void SetRotation(const RadianAnglef& rotation); inline void SetSize(const Vector2f& size); inline void SetSize(float sizeX, float sizeY); inline void SetTexture(TextureRef texture, bool resizeBillboard = true); @@ -58,7 +59,7 @@ namespace Nz Color m_color; Vector2f m_sinCos; Vector2f m_size; - float m_rotation; + RadianAnglef m_rotation; static BillboardLibrary::LibraryMap s_library; }; diff --git a/include/Nazara/Graphics/Billboard.inl b/include/Nazara/Graphics/Billboard.inl index 6bbf9b143..be1a47918 100644 --- a/include/Nazara/Graphics/Billboard.inl +++ b/include/Nazara/Graphics/Billboard.inl @@ -84,7 +84,7 @@ namespace Nz * \return Current rotation */ - inline float Billboard::GetRotation() const + inline const RadianAnglef& Billboard::GetRotation() const { return m_rotation; } @@ -161,10 +161,12 @@ namespace Nz * \param rotation Rotation for the billboard */ - inline void Billboard::SetRotation(float rotation) + inline void Billboard::SetRotation(const RadianAnglef& rotation) { m_rotation = rotation; - m_sinCos.Set(std::sin(m_rotation), std::cos(m_rotation)); + + auto sincos = rotation.GetSinCos(); + m_sinCos.Set(sincos.first, sincos.second); } /*! diff --git a/include/Nazara/Physics2D/Constraint2D.hpp b/include/Nazara/Physics2D/Constraint2D.hpp index 9b2bf814b..74cded64d 100644 --- a/include/Nazara/Physics2D/Constraint2D.hpp +++ b/include/Nazara/Physics2D/Constraint2D.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -95,15 +96,15 @@ namespace Nz class NAZARA_PHYSICS2D_API DampedRotarySpringConstraint2D : public Constraint2D { public: - DampedRotarySpringConstraint2D(RigidBody2D& first, RigidBody2D& second, float restAngle, float stiffness, float damping); + DampedRotarySpringConstraint2D(RigidBody2D& first, RigidBody2D& second, const RadianAnglef& restAngle, float stiffness, float damping); ~DampedRotarySpringConstraint2D() = default; float GetDamping() const; - float GetRestAngle() const; + RadianAnglef GetRestAngle() const; float GetStiffness() const; void SetDamping(float newDamping); - void SetRestAngle(float newAngle); + void SetRestAngle(const RadianAnglef& newAngle); void SetStiffness(float newStiffness); template static DampedRotarySpringConstraint2DRef New(Args&&... args); @@ -200,11 +201,11 @@ namespace Nz RatchetConstraint2D(RigidBody2D& first, RigidBody2D& second, float phase, float ratchet); ~RatchetConstraint2D() = default; - float GetAngle() const; + RadianAnglef GetAngle() const; float GetPhase() const; float GetRatchet() const; - void SetAngle(float angle); + void SetAngle(const RadianAnglef& angle); void SetPhase(float phase); void SetRatchet(float ratchet); @@ -219,14 +220,14 @@ namespace Nz class NAZARA_PHYSICS2D_API RotaryLimitConstraint2D : public Constraint2D { public: - RotaryLimitConstraint2D(RigidBody2D& first, RigidBody2D& second, float minAngle, float maxAngle); + RotaryLimitConstraint2D(RigidBody2D& first, RigidBody2D& second, const RadianAnglef& minAngle, const RadianAnglef& maxAngle); ~RotaryLimitConstraint2D() = default; - float GetMaxAngle() const; - float GetMinAngle() const; + RadianAnglef GetMaxAngle() const; + RadianAnglef GetMinAngle() const; - void SetMaxAngle(float maxAngle); - void SetMinAngle(float minAngle); + void SetMaxAngle(const RadianAnglef& maxAngle); + void SetMinAngle(const RadianAnglef& minAngle); template static RotaryLimitConstraint2DRef New(Args&&... args); }; diff --git a/include/Nazara/Physics2D/PhysWorld2D.hpp b/include/Nazara/Physics2D/PhysWorld2D.hpp index 3e726de00..42e9288a1 100644 --- a/include/Nazara/Physics2D/PhysWorld2D.hpp +++ b/include/Nazara/Physics2D/PhysWorld2D.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -33,7 +34,7 @@ namespace Nz using ContactPostSolveCallback = std::function; using ContactStartCallback = std::function; - using DebugDrawCircleCallback = std::function; + using DebugDrawCircleCallback = std::function; using DebugDrawDotCallback = std::function; using DebugDrawPolygonCallback = std::function; using DebugDrawSegmentCallback = std::function; diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index 30eac8f43..ee5ff3cf0 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -64,6 +64,7 @@ namespace Nz inline void SetAngularDamping(float angularDamping); void SetAngularVelocity(float angularVelocity); + void SetFriction(std::size_t shapeIndex, float friction); void SetGeom(Collider2DRef geom, bool recomputeMoment = true); void SetMass(float mass, bool recomputeMoment = true); void SetMassCenter(const Vector2f& center, CoordSys coordSys = CoordSys_Local); diff --git a/src/Nazara/Physics2D/Constraint2D.cpp b/src/Nazara/Physics2D/Constraint2D.cpp index a17119545..c4c92fd4c 100644 --- a/src/Nazara/Physics2D/Constraint2D.cpp +++ b/src/Nazara/Physics2D/Constraint2D.cpp @@ -163,8 +163,8 @@ namespace Nz } - DampedRotarySpringConstraint2D::DampedRotarySpringConstraint2D(RigidBody2D& first, RigidBody2D& second, float restAngle, float stiffness, float damping) : - Constraint2D(first.GetWorld(), cpDampedRotarySpringNew(first.GetHandle(), second.GetHandle(), restAngle, stiffness, damping)) + DampedRotarySpringConstraint2D::DampedRotarySpringConstraint2D(RigidBody2D& first, RigidBody2D& second, const RadianAnglef& restAngle, float stiffness, float damping) : + Constraint2D(first.GetWorld(), cpDampedRotarySpringNew(first.GetHandle(), second.GetHandle(), restAngle.angle, stiffness, damping)) { } @@ -173,7 +173,7 @@ namespace Nz return float(cpDampedRotarySpringGetDamping(m_constraint)); } - float DampedRotarySpringConstraint2D::GetRestAngle() const + RadianAnglef DampedRotarySpringConstraint2D::GetRestAngle() const { return float(cpDampedRotarySpringGetRestAngle(m_constraint)); } @@ -188,9 +188,9 @@ namespace Nz cpDampedSpringSetDamping(m_constraint, newDamping); } - void DampedRotarySpringConstraint2D::SetRestAngle(float newAngle) + void DampedRotarySpringConstraint2D::SetRestAngle(const RadianAnglef& newAngle) { - cpDampedRotarySpringSetRestAngle(m_constraint, newAngle); + cpDampedRotarySpringSetRestAngle(m_constraint, newAngle.angle); } void DampedRotarySpringConstraint2D::SetStiffness(float newStiffness) @@ -317,7 +317,7 @@ namespace Nz { } - float RatchetConstraint2D::GetAngle() const + RadianAnglef RatchetConstraint2D::GetAngle() const { return float(cpRatchetJointGetAngle(m_constraint)); } @@ -332,9 +332,9 @@ namespace Nz return float(cpRatchetJointGetRatchet(m_constraint)); } - void RatchetConstraint2D::SetAngle(float angle) + void RatchetConstraint2D::SetAngle(const RadianAnglef& angle) { - cpRatchetJointSetAngle(m_constraint, angle); + cpRatchetJointSetAngle(m_constraint, angle.angle); } void RatchetConstraint2D::SetPhase(float phase) @@ -348,29 +348,29 @@ namespace Nz } - RotaryLimitConstraint2D::RotaryLimitConstraint2D(RigidBody2D& first, RigidBody2D& second, float minAngle, float maxAngle) : - Constraint2D(first.GetWorld(), cpRotaryLimitJointNew(first.GetHandle(), second.GetHandle(), minAngle, maxAngle)) + RotaryLimitConstraint2D::RotaryLimitConstraint2D(RigidBody2D& first, RigidBody2D& second, const RadianAnglef& minAngle, const RadianAnglef& maxAngle) : + Constraint2D(first.GetWorld(), cpRotaryLimitJointNew(first.GetHandle(), second.GetHandle(), minAngle.angle, maxAngle.angle)) { } - float RotaryLimitConstraint2D::GetMaxAngle() const + RadianAnglef RotaryLimitConstraint2D::GetMaxAngle() const { return float(cpRotaryLimitJointGetMax(m_constraint)); } - float RotaryLimitConstraint2D::GetMinAngle() const + RadianAnglef RotaryLimitConstraint2D::GetMinAngle() const { return float(cpRotaryLimitJointGetMax(m_constraint)); } - void RotaryLimitConstraint2D::SetMaxAngle(float maxAngle) + void RotaryLimitConstraint2D::SetMaxAngle(const RadianAnglef& maxAngle) { - cpRotaryLimitJointSetMax(m_constraint, maxAngle); + cpRotaryLimitJointSetMax(m_constraint, maxAngle.angle); } - void RotaryLimitConstraint2D::SetMinAngle(float minAngle) + void RotaryLimitConstraint2D::SetMinAngle(const RadianAnglef& minAngle) { - cpRotaryLimitJointSetMin(m_constraint, minAngle); + cpRotaryLimitJointSetMin(m_constraint, minAngle.angle); } diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp index 764ca1cf8..7383510f8 100644 --- a/src/Nazara/Physics2D/PhysWorld2D.cpp +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -26,7 +26,7 @@ namespace Nz { auto drawOptions = static_cast(userdata); if (drawOptions->circleCallback) - drawOptions->circleCallback(Vector2f(float(pos.x), float(pos.y)), float(angle), float(radius), CpDebugColorToColor(outlineColor), CpDebugColorToColor(fillColor), drawOptions->userdata); + drawOptions->circleCallback(Vector2f(float(pos.x), float(pos.y)), RadianAnglef(float(angle)), float(radius), CpDebugColorToColor(outlineColor), CpDebugColorToColor(fillColor), drawOptions->userdata); } void DrawDot(cpFloat size, cpVect pos, cpSpaceDebugColor color, cpDataPointer userdata) diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index b12bc7e2e..16e737e30 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -185,9 +185,9 @@ namespace Nz return Rectf(Rect(bb.l, bb.b, bb.r - bb.l, bb.t - bb.b)); } - float RigidBody2D::GetAngularVelocity() const + RadianAnglef RigidBody2D::GetAngularVelocity() const + return float(cpBodyGetAngularVelocity(m_handle)); { - return FromRadians(static_cast(cpBodyGetAngularVelocity(m_handle))); } const Collider2DRef& RigidBody2D::GetGeom() const @@ -233,9 +233,9 @@ namespace Nz return Vector2f(static_cast(pos.x), static_cast(pos.y)); } - float RigidBody2D::GetRotation() const + RadianAnglef RigidBody2D::GetRotation() const { - return FromRadians(static_cast(cpBodyGetAngle(m_handle))); + return float(cpBodyGetAngle(m_handle)); } std::size_t RigidBody2D::GetShapeIndex(cpShape* shape) const @@ -283,9 +283,11 @@ namespace Nz return m_isStatic; } - void RigidBody2D::SetAngularVelocity(float angularVelocity) + void RigidBody2D::SetAngularVelocity(const RadianAnglef& angularVelocity) { - cpBodySetAngularVelocity(m_handle, ToRadians(angularVelocity)); + cpBodySetAngularVelocity(m_handle, angularVelocity.angle); + { + assert(shapeIndex < m_shapes.size()); } void RigidBody2D::SetGeom(Collider2DRef geom, bool recomputeMoment) @@ -400,9 +402,9 @@ namespace Nz } } - void RigidBody2D::SetRotation(float rotation) + void RigidBody2D::SetRotation(const RadianAnglef& rotation) { - cpBodySetAngle(m_handle, ToRadians(rotation)); + cpBodySetAngle(m_handle, rotation.angle); if (m_isStatic) { m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) diff --git a/tests/Engine/Graphics/Billboard.cpp b/tests/Engine/Graphics/Billboard.cpp index 5136e3af6..de0bc8d02 100644 --- a/tests/Engine/Graphics/Billboard.cpp +++ b/tests/Engine/Graphics/Billboard.cpp @@ -20,7 +20,7 @@ SCENARIO("Billboard", "[GRAPHICS][BILLBOARD]") { REQUIRE(billboard.GetColor() == materialColor); REQUIRE(billboard.GetMaterial().Get() == materialRef.Get()); - REQUIRE(billboard.GetRotation() == Approx(0.f)); + REQUIRE(billboard.GetRotation().angle == Approx(0.f)); REQUIRE(billboard.GetSize() == Nz::Vector2f(64.f, 64.f)); // Default sizes } diff --git a/tests/Engine/Physics2D/RigidBody2D.cpp b/tests/Engine/Physics2D/RigidBody2D.cpp index e801cc849..421a2b083 100644 --- a/tests/Engine/Physics2D/RigidBody2D.cpp +++ b/tests/Engine/Physics2D/RigidBody2D.cpp @@ -125,12 +125,12 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") THEN("We expect those to be true") { CHECK(body.GetAABB() == aabb); - CHECK(body.GetAngularVelocity() == Approx(0.f)); + CHECK(body.GetAngularVelocity() == 0.f); CHECK(body.GetMassCenter() == Nz::Vector2f::Zero()); CHECK(body.GetGeom() == box); CHECK(body.GetMass() == Approx(mass)); CHECK(body.GetPosition() == position); - CHECK(body.GetRotation() == Approx(0.f)); + CHECK(body.GetRotation().angle == Approx(0.f)); CHECK(body.GetUserdata() == &userData); CHECK(body.GetVelocity() == Nz::Vector2f::Zero()); @@ -166,39 +166,38 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") WHEN("We set an angular velocity") { - float angularSpeed = Nz::FromDegrees(90.f); + Nz::RadianAnglef angularSpeed = Nz::RadianAnglef(Nz::DegreeToRadian(90.f)); body.SetAngularVelocity(angularSpeed); world.Step(1.f); THEN("We expect those to be true") { - CHECK(body.GetAngularVelocity() == Approx(angularSpeed)); - CHECK(body.GetRotation() == Approx(angularSpeed)); + CHECK(body.GetAngularVelocity() == angularSpeed); + CHECK(body.GetRotation() == angularSpeed); CHECK(body.GetAABB() == Nz::Rectf(-6.f, 3.f, 2.f, 1.f)); world.Step(1.f); - CHECK(body.GetRotation() == Approx(2.f * angularSpeed)); + CHECK(body.GetRotation() == 2.f * angularSpeed); CHECK(body.GetAABB() == Nz::Rectf(-4.f, -6.f, 1.f, 2.f)); world.Step(1.f); - CHECK(body.GetRotation() == Approx(3.f * angularSpeed)); + CHECK(body.GetRotation() == 3.f * angularSpeed); CHECK(body.GetAABB() == Nz::Rectf(4.f, -4.f, 2.f, 1.f)); world.Step(1.f); - CHECK(body.GetRotation() == Approx(4.f * angularSpeed)); + CHECK(body.GetRotation() == 4.f * angularSpeed); } } WHEN("We apply a torque") { - float angularSpeed = Nz::DegreeToRadian(90.f); - body.AddTorque(angularSpeed); + body.AddTorque(Nz::DegreeToRadian(90.f)); world.Step(1.f); THEN("It is also counter-clockwise") { - CHECK(body.GetAngularVelocity() >= 0.f); - CHECK(body.GetRotation() >= 0.f); + CHECK(body.GetAngularVelocity().angle >= 0.f); + CHECK(body.GetRotation().angle >= 0.f); } } } @@ -316,13 +315,13 @@ Nz::RigidBody2D CreateBody(Nz::PhysWorld2D& world) void EQUALITY(const Nz::RigidBody2D& left, const Nz::RigidBody2D& right) { CHECK(left.GetAABB() == right.GetAABB()); - CHECK(left.GetAngularVelocity() == Approx(right.GetAngularVelocity())); + CHECK(left.GetAngularVelocity() == right.GetAngularVelocity()); CHECK(left.GetMassCenter() == right.GetMassCenter()); CHECK(left.GetGeom() == right.GetGeom()); CHECK(left.GetHandle() != right.GetHandle()); CHECK(left.GetMass() == Approx(right.GetMass())); CHECK(left.GetPosition() == right.GetPosition()); - CHECK(left.GetRotation() == Approx(right.GetRotation())); + CHECK(left.GetRotation().angle == Approx(right.GetRotation().angle)); CHECK(left.GetUserdata() == right.GetUserdata()); CHECK(left.GetVelocity() == right.GetVelocity()); } diff --git a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp index 33871be57..bb6bf250a 100644 --- a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp +++ b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp @@ -85,15 +85,15 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") WHEN("We make rotate our entity") { - float angularSpeed = Nz::FromDegrees(45.f); + Nz::RadianAnglef angularSpeed = Nz::DegreeToRadian(45.f); physicsComponent2D.SetAngularVelocity(angularSpeed); world.Update(2.f); THEN("It should have been rotated") { - CHECK(physicsComponent2D.GetAngularVelocity() == Approx(angularSpeed)); + CHECK(physicsComponent2D.GetAngularVelocity() == angularSpeed); CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(-2.f, 0.f, 2.f, 1.f)); - CHECK(physicsComponent2D.GetRotation() == Approx(Nz::FromDegrees(90.f))); + CHECK(physicsComponent2D.GetRotation() == Nz::RadianAnglef(Nz::DegreeToRadian(90.f))); CHECK(nodeComponent.GetRotation().ToEulerAngles().roll == Approx(Nz::FromDegrees(90.f))); } } @@ -129,7 +129,7 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") WHEN("We make rotate our entity") { - float angularSpeed = Nz::FromDegrees(45.f); + Nz::RadianAnglef angularSpeed(Nz::DegreeToRadian(45.f)); physicsComponent2D.SetAngularVelocity(angularSpeed); world.Update(2.f); @@ -137,7 +137,7 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") { CHECK(physicsComponent2D.GetAngularVelocity() == angularSpeed); CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(1.f, 4.f, 2.f, 1.f)); - CHECK(physicsComponent2D.GetRotation() == Approx(Nz::FromDegrees(90.f))); + CHECK(physicsComponent2D.GetRotation() == 2.f * angularSpeed); CHECK(nodeComponent.GetPosition() == position); CHECK(nodeComponent.GetRotation().ToEulerAngles().roll == Approx(Nz::FromDegrees(90.f))); } diff --git a/tests/SDK/NDK/Systems/RenderSystem.cpp b/tests/SDK/NDK/Systems/RenderSystem.cpp index 09fb6add2..d68f544ab 100644 --- a/tests/SDK/NDK/Systems/RenderSystem.cpp +++ b/tests/SDK/NDK/Systems/RenderSystem.cpp @@ -82,29 +82,29 @@ SCENARIO("RenderSystem", "[NDK][RenderSystem]") WHEN("We set an angular velocity") { - float angularSpeed = Nz::FromDegrees(90.f); + Nz::RadianAnglef angularSpeed(Nz::DegreeToRadian(90.f)); physicsComponent2D.SetAngularVelocity(angularSpeed); world.Update(1.f); THEN("We expect those to be true") { - CHECK(physicsComponent2D.GetAngularVelocity() == Approx(angularSpeed)); - CHECK(physicsComponent2D.GetRotation() == Approx(angularSpeed)); + CHECK(physicsComponent2D.GetAngularVelocity() == angularSpeed); + CHECK(physicsComponent2D.GetRotation() == angularSpeed); CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(1.f, 4.f, 2.f, 1.f)); CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); - CHECK(physicsComponent2D.GetRotation() == Approx(2.f * angularSpeed)); + CHECK(physicsComponent2D.GetRotation() == 2.f * angularSpeed); CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(2.f, 2.f, 1.f, 2.f)); CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); - CHECK(physicsComponent2D.GetRotation() == Approx(3.f * angularSpeed)); + CHECK(physicsComponent2D.GetRotation() == 3.f * angularSpeed); CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(3.f, 3.f, 2.f, 1.f)); CompareAABB(physicsComponent2D.GetAABB(), graphicsComponent.GetAABB()); world.Update(1.f); - CHECK(physicsComponent2D.GetRotation() == Approx(4.f * angularSpeed)); + CHECK(physicsComponent2D.GetRotation() == 4.f * angularSpeed); } } } From 30348525d7b2fe0ae43a68f6f358d47c18a8b69c Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Oct 2018 23:22:28 +0200 Subject: [PATCH 128/352] Physics2D: Expose elasticity/friction/surface velocity --- .../NDK/Components/PhysicsComponent2D.hpp | 10 ++ .../NDK/Components/PhysicsComponent2D.inl | 150 +++++++++++++++++- include/Nazara/Physics2D/Collider2D.hpp | 13 +- include/Nazara/Physics2D/Collider2D.inl | 39 ++++- include/Nazara/Physics2D/RigidBody2D.hpp | 19 ++- include/Nazara/Physics2D/RigidBody2D.inl | 5 + src/Nazara/Physics2D/Collider2D.cpp | 5 +- src/Nazara/Physics2D/RigidBody2D.cpp | 67 +++++++- 8 files changed, 294 insertions(+), 14 deletions(-) diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index 79204fbdd..a652ceec6 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -41,22 +41,32 @@ namespace Ndk inline Nz::RadianAnglef GetAngularVelocity() const; NAZARA_DEPRECATED("Name error, please use GetMassCenter") inline Nz::Vector2f GetCenterOfGravity(Nz::CoordSys coordSys = Nz::CoordSys_Local) const; + inline float GetElasticity(std::size_t shapeIndex = 0) const; + inline float GetFriction(std::size_t shapeIndex = 0) const; inline float GetMass() const; inline Nz::Vector2f GetMassCenter(Nz::CoordSys coordSys = Nz::CoordSys_Local) const; inline float GetMomentOfInertia() const; inline Nz::Vector2f GetPosition() const; inline Nz::RadianAnglef GetRotation() const; + inline Nz::Vector2f GetSurfaceVelocity(std::size_t shapeIndex = 0) const; + inline std::size_t GetShapeCount() const; inline Nz::Vector2f GetVelocity() const; inline bool IsSleeping() const; inline void SetAngularDamping(float angularDamping); inline void SetAngularVelocity(const Nz::RadianAnglef& angularVelocity); + inline void SetElasticity(float elasticity); + inline void SetElasticity(std::size_t shapeIndex, float friction); + inline void SetFriction(float friction); + inline void SetFriction(std::size_t shapeIndex, float friction); inline void SetMass(float mass); inline void SetMassCenter(const Nz::Vector2f& center, Nz::CoordSys coordSys = Nz::CoordSys_Local); inline void SetMomentOfInertia(float moment); inline void SetPosition(const Nz::Vector2f& position); inline void SetRotation(const Nz::RadianAnglef& rotation); + inline void SetSurfaceVelocity(const Nz::Vector2f& velocity); + inline void SetSurfaceVelocity(std::size_t shapeIndex, const Nz::Vector2f& velocity); inline void SetVelocity(const Nz::Vector2f& velocity); static ComponentIndex componentIndex; diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index 075bd0ff3..8af4356f4 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -174,6 +174,36 @@ namespace Ndk return m_object->GetMassCenter(coordSys); } + /*! + * \brief Gets the elasticity of a shape belonging to this physics object + * \return Elasticity of the shape + * + * \param shapeIndex Shape index of the collider we're interested + * + * \remark Produces a NazaraAssert if the physics object is invalid + */ + inline float PhysicsComponent2D::GetElasticity(std::size_t shapeIndex) const + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->GetElasticity(shapeIndex); + } + + /*! + * \brief Gets the friction of a shape belonging to this physics object + * \return Friction of the shape + * + * \param shapeIndex Shape index of the collider we're interested + * + * \remark Produces a NazaraAssert if the physics object is invalid + */ + inline float PhysicsComponent2D::GetFriction(std::size_t shapeIndex) const + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->GetFriction(shapeIndex); + } + /*! * \brief Gets the mass of the physics object * \return Mass of the object @@ -246,6 +276,30 @@ namespace Ndk return m_object->GetRotation(); } + /*! + * \brief Gets the surface velocity of a shape belonging to this physics object + * \return Surface velocity of the shape + * + * \param shapeIndex Shape index of the collider we're interested + * + * \remark Produces a NazaraAssert if the physics object is invalid + */ + inline Nz::Vector2f PhysicsComponent2D::GetSurfaceVelocity(std::size_t shapeIndex) const +{ + return m_object->GetSurfaceVelocity(shapeIndex); + } + + /*! + * \brief Gets the rotation of the physics object + * \return Shape count of the object + * + * \remark Produces a NazaraAssert if the physics object is invalid + */ + inline std::size_t PhysicsComponent2D::GetShapeCount() const + { + return m_object->GetShapeCount(); + } + /*! * \brief Gets the velocity of the physics object * \return Velocity of the object @@ -305,6 +359,72 @@ namespace Ndk m_object->SetAngularVelocity(angularVelocity); } + /*! + * \brief Sets the elasticity of the whole physics object + * + * Overrides all shapes elasticity with a single value + * + * \param elasticity Elasticity to be applied + * + * \remark Elasticity must be positive or zero + */ + inline void PhysicsComponent2D::SetElasticity(float elasticity) + { + NazaraAssert(m_object, "Invalid physics object"); + NazaraAssert(elasticity >= 0.f, "Friction must be positive"); + + m_object->SetElasticity(elasticity); + } + + /*! + * \brief Sets the elasticity of a single shape of the physics object + * + * \param shapeIndex Target shape index + * \param elasticity Elasticity to be applied + * + * \remark Elasticity must be positive or zero + */ + inline void PhysicsComponent2D::SetElasticity(std::size_t shapeIndex, float elasticity) + { + NazaraAssert(m_object, "Invalid physics object"); + NazaraAssert(elasticity >= 0.f, "Friction must be positive"); + + m_object->SetElasticity(shapeIndex, elasticity); + } + + /*! + * \brief Sets the friction of the whole physics object + * + * Overrides all shapes friction with a single value + * + * \param friction Friction to be applied + * + * \remark Friction must be positive or zero + */ + inline void PhysicsComponent2D::SetFriction(float friction) + { + NazaraAssert(m_object, "Invalid physics object"); + NazaraAssert(friction >= 0.f, "Friction must be positive"); + + m_object->SetFriction(friction); + } + + /*! + * \brief Sets the friction of a single shape of the physics object + * + * \param shapeIndex Target shape index + * \param friction Friction to be applied + * + * \remark Friction must be positive or zero + */ + inline void PhysicsComponent2D::SetFriction(std::size_t shapeIndex, float friction) + { + NazaraAssert(m_object, "Invalid physics object"); + NazaraAssert(friction >= 0.f, "Friction must be positive"); + + m_object->SetFriction(shapeIndex, friction); + } + /*! * \brief Sets the mass of the physics object * @@ -378,14 +498,38 @@ namespace Ndk m_object->SetRotation(rotation); } + /*! + * \brief Sets the surface velocity of the whole physics object + * + * Overrides all shapes surface velocity with a single value + * + * \param velocity Surface velocity to be applied + */ + inline void PhysicsComponent2D::SetSurfaceVelocity(const Nz::Vector2f& velocity) + { + NazaraAssert(m_object, "Invalid physics object"); + + m_object->SetSurfaceVelocity(velocity); + } + + /*! + * \brief Sets the surface velocity of a single shape of the physics object + * + * \param shapeIndex Target shape index + * \param velocity Surface velocity to be applied + */ + inline void PhysicsComponent2D::SetSurfaceVelocity(std::size_t shapeIndex, const Nz::Vector2f& velocity) + { + NazaraAssert(m_object, "Invalid physics object"); + + m_object->SetSurfaceVelocity(shapeIndex, velocity); + } + /*! * \brief Sets the velocity of the physics object * * \param velocity Velocity of the object - * - * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent2D::SetVelocity(const Nz::Vector2f& velocity) { NazaraAssert(m_object, "Invalid physics object"); diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index 36443e66a..8b69bd780 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -47,6 +47,9 @@ namespace Nz inline UInt32 GetCollisionGroup() const; inline unsigned int GetCollisionId() const; inline UInt32 GetCollisionMask() const; + inline float GetElasticity() const; + inline float GetFriction() const; + inline Vector2f GetSurfaceVelocity() const; virtual ColliderType2D GetType() const = 0; @@ -56,6 +59,9 @@ namespace Nz inline void SetCollisionGroup(UInt32 groupId); inline void SetCollisionId(unsigned int typeId); inline void SetCollisionMask(UInt32 mask); + inline void SetElasticity(float elasticity); + inline void SetFriction(float friction); + inline void SetSurfaceVelocity(const Vector2f& surfaceVelocity); inline void SetTrigger(bool trigger); Collider2D& operator=(const Collider2D&) = delete; @@ -67,11 +73,14 @@ namespace Nz protected: virtual std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const = 0; - bool m_trigger; UInt32 m_categoryMask; UInt32 m_collisionGroup; - unsigned int m_collisionId; UInt32 m_collisionMask; + Vector2f m_surfaceVelocity; + bool m_trigger; + float m_elasticity; + float m_friction; + unsigned int m_collisionId; private: virtual std::size_t GenerateShapes(RigidBody2D* body, std::vector* shapes) const; diff --git a/include/Nazara/Physics2D/Collider2D.inl b/include/Nazara/Physics2D/Collider2D.inl index 71ae0603c..2142ba47e 100644 --- a/include/Nazara/Physics2D/Collider2D.inl +++ b/include/Nazara/Physics2D/Collider2D.inl @@ -9,11 +9,14 @@ namespace Nz { inline Collider2D::Collider2D() : - m_trigger(false), m_categoryMask(0xFFFFFFFF), m_collisionGroup(0), - m_collisionId(0), - m_collisionMask(0xFFFFFFFF) + m_collisionMask(0xFFFFFFFF), + m_trigger(false), + m_elasticity(0.f), + m_friction(0.f), + m_surfaceVelocity(Vector2f::Zero()), + m_collisionId(0) { } @@ -37,6 +40,21 @@ namespace Nz return m_collisionMask; } + inline float Collider2D::GetElasticity() const + { + return m_elasticity; + } + + inline float Collider2D::GetFriction() const + { + return m_friction; + } + + inline Vector2f Collider2D::GetSurfaceVelocity() const + { + return m_surfaceVelocity; + } + inline bool Collider2D::IsTrigger() const { return m_trigger; @@ -62,6 +80,21 @@ namespace Nz m_collisionMask = mask; } + inline void Collider2D::SetElasticity(float elasticity) + { + m_elasticity = elasticity; + } + + inline void Collider2D::SetFriction(float friction) + { + m_friction = friction; + } + + inline void Collider2D::SetSurfaceVelocity(const Vector2f& surfaceVelocity) + { + m_surfaceVelocity = surfaceVelocity; + } + inline void Collider2D::SetTrigger(bool trigger) { m_trigger = trigger; diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index ee5ff3cf0..b23b97187 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -42,17 +43,21 @@ namespace Nz Rectf GetAABB() const; inline float GetAngularDamping() const; - float GetAngularVelocity() const; + RadianAnglef GetAngularVelocity() const; NAZARA_DEPRECATED("Name error, please use GetMassCenter") inline Vector2f GetCenterOfGravity(CoordSys coordSys = CoordSys_Local) const; + float GetElasticity(std::size_t shapeIndex = 0) const; + float GetFriction(std::size_t shapeIndex = 0) const; const Collider2DRef& GetGeom() const; cpBody* GetHandle() const; float GetMass() const; Vector2f GetMassCenter(CoordSys coordSys = CoordSys_Local) const; float GetMomentOfInertia() const; Vector2f GetPosition() const; - float GetRotation() const; + RadianAnglef GetRotation() const; + inline std::size_t GetShapeCount() const; std::size_t GetShapeIndex(cpShape* shape) const; + Vector2f GetSurfaceVelocity(std::size_t shapeIndex = 0) const; void* GetUserdata() const; Vector2f GetVelocity() const; PhysWorld2D* GetWorld() const; @@ -63,14 +68,19 @@ namespace Nz bool IsStatic() const; inline void SetAngularDamping(float angularDamping); - void SetAngularVelocity(float angularVelocity); + void SetAngularVelocity(const RadianAnglef& angularVelocity); + void SetElasticity(float elasticity); + void SetElasticity(std::size_t shapeIndex, float elasticity); + void SetFriction(float friction); void SetFriction(std::size_t shapeIndex, float friction); void SetGeom(Collider2DRef geom, bool recomputeMoment = true); void SetMass(float mass, bool recomputeMoment = true); void SetMassCenter(const Vector2f& center, CoordSys coordSys = CoordSys_Local); void SetMomentOfInertia(float moment); void SetPosition(const Vector2f& position); - void SetRotation(float rotation); + void SetRotation(const RadianAnglef& rotation); + void SetSurfaceVelocity(const Vector2f& surfaceVelocity); + void SetSurfaceVelocity(std::size_t shapeIndex, const Vector2f& surfaceVelocity); void SetStatic(bool setStaticBody = true); void SetUserdata(void* ud); void SetVelocity(const Vector2f& velocity); @@ -90,6 +100,7 @@ namespace Nz void UnregisterFromSpace(); static void CopyBodyData(cpBody* from, cpBody* to); + static void CopyShapeData(cpShape* from, cpShape* to); std::vector m_shapes; Collider2DRef m_geom; diff --git a/include/Nazara/Physics2D/RigidBody2D.inl b/include/Nazara/Physics2D/RigidBody2D.inl index faebd017d..a654c03e7 100644 --- a/include/Nazara/Physics2D/RigidBody2D.inl +++ b/include/Nazara/Physics2D/RigidBody2D.inl @@ -17,6 +17,11 @@ namespace Nz return GetMassCenter(coordSys); } + inline std::size_t RigidBody2D::GetShapeCount() const + { + return m_shapes.size(); + } + inline void RigidBody2D::SetAngularDamping(float angularDamping) { SetMomentOfInertia(angularDamping); diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index 5f0e9bcfe..0be746838 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -20,9 +20,12 @@ namespace Nz { cpShape* shape = (*shapes)[i]; + cpShapeSetCollisionType(shape, cpFloat(m_collisionId)); + cpShapeSetElasticity(shape, cpFloat(m_elasticity)); cpShapeSetFilter(shape, filter); - cpShapeSetCollisionType(shape, m_collisionId); + cpShapeSetFriction(shape, cpFloat(m_friction)); cpShapeSetSensor(shape, (m_trigger) ? cpTrue : cpFalse); + cpShapeSetSurfaceVelocity(shape, cpv(cpFloat(m_surfaceVelocity.x), cpFloat(m_surfaceVelocity.y))); } return shapeCount; diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 16e737e30..99013467e 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -52,7 +52,10 @@ namespace Nz CopyBodyData(object.GetHandle(), m_handle); for (std::size_t i = 0; i < m_shapes.size(); ++i) + { + CopyShapeData(object.m_shapes[i], m_shapes[i]); m_shapes[i]->bb = cpShapeCacheBB(object.m_shapes[i]); + } } RigidBody2D::RigidBody2D(RigidBody2D&& object) : @@ -186,8 +189,20 @@ namespace Nz } RadianAnglef RigidBody2D::GetAngularVelocity() const - return float(cpBodyGetAngularVelocity(m_handle)); { + return float(cpBodyGetAngularVelocity(m_handle)); + } + + float Nz::RigidBody2D::GetElasticity(std::size_t shapeIndex) const + { + assert(shapeIndex < m_shapes.size()); + return float(cpShapeGetElasticity(m_shapes[shapeIndex])); + } + + float Nz::RigidBody2D::GetFriction(std::size_t shapeIndex) const + { + assert(shapeIndex < m_shapes.size()); + return float(cpShapeGetFriction(m_shapes[shapeIndex])); } const Collider2DRef& RigidBody2D::GetGeom() const @@ -247,6 +262,13 @@ namespace Nz return std::distance(m_shapes.begin(), it); } + Vector2f Nz::RigidBody2D::GetSurfaceVelocity(std::size_t shapeIndex) const + { + assert(shapeIndex < m_shapes.size()); + cpVect vel = cpShapeGetSurfaceVelocity(m_shapes[shapeIndex]); + return Vector2f(static_cast(vel.x), static_cast(vel.y)); + } + void* RigidBody2D::GetUserdata() const { return m_userData; @@ -286,8 +308,32 @@ namespace Nz void RigidBody2D::SetAngularVelocity(const RadianAnglef& angularVelocity) { cpBodySetAngularVelocity(m_handle, angularVelocity.angle); + } + + void RigidBody2D::SetElasticity(float friction) + { + cpFloat frict(friction); + for (cpShape* shape : m_shapes) + cpShapeSetElasticity(shape, frict); + } + + void RigidBody2D::SetElasticity(std::size_t shapeIndex, float friction) { assert(shapeIndex < m_shapes.size()); + cpShapeSetElasticity(m_shapes[shapeIndex], cpFloat(friction)); + } + + void RigidBody2D::SetFriction(float friction) + { + cpFloat frict(friction); + for (cpShape* shape : m_shapes) + cpShapeSetFriction(shape, frict); + } + + void RigidBody2D::SetFriction(std::size_t shapeIndex, float friction) + { + assert(shapeIndex < m_shapes.size()); + cpShapeSetFriction(m_shapes[shapeIndex], cpFloat(friction)); } void RigidBody2D::SetGeom(Collider2DRef geom, bool recomputeMoment) @@ -414,6 +460,19 @@ namespace Nz } } + void RigidBody2D::SetSurfaceVelocity(const Vector2f& surfaceVelocity) + { + Vector2 velocity(surfaceVelocity.x, surfaceVelocity.y); + for (cpShape* shape : m_shapes) + cpShapeSetSurfaceVelocity(shape, cpv(velocity.x, velocity.y)); + } + + void RigidBody2D::SetSurfaceVelocity(std::size_t shapeIndex, const Vector2f& surfaceVelocity) + { + assert(shapeIndex < m_shapes.size()); + cpShapeSetSurfaceVelocity(m_shapes[shapeIndex], cpv(cpFloat(surfaceVelocity.x), cpFloat(surfaceVelocity.y))); + } + void RigidBody2D::SetStatic(bool setStaticBody) { m_isStatic = setStaticBody; @@ -549,4 +608,10 @@ namespace Nz cpBodySetVelocity(to, cpBodyGetVelocity(from)); } + void RigidBody2D::CopyShapeData(cpShape* from, cpShape* to) + { + cpShapeSetElasticity(to, cpShapeGetElasticity(from)); + cpShapeSetFriction(to, cpShapeGetFriction(from)); + cpShapeSetSurfaceVelocity(to, cpShapeGetSurfaceVelocity(from)); + } } From a24944d103f50edbf3f5d17732bc7ad880d1bd14 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Oct 2018 23:22:50 +0200 Subject: [PATCH 129/352] Update changelog --- ChangeLog.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index b1da8d24c..a49c7d583 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -149,7 +149,9 @@ Nazara Engine: - ⚠️ 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 - +- ⚠️ 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 + Nazara Development Kit: - Added ImageWidget (#139) - ⚠️ Removed TextAreaWidget::GetLineCount @@ -216,6 +218,7 @@ Nazara Development Kit: - RenderSystem now resolve skinning before render - EntityOwner constructor taking a Entity* is no longer explicit - PhysicsComponent2D now allows massless bodies (zero mass) +- ⚠️ Use of the new Angle class instead of floating point angle # 0.4: From 56922001ba17c202af0c09f65ee24d60252fd755 Mon Sep 17 00:00:00 2001 From: S6066 Date: Tue, 9 Oct 2018 23:23:22 +0200 Subject: [PATCH 130/352] Widgets Fixes (#190) * CheckboxWidget: Check * ImageWidget: Check * LabelWidget: Delete uselessly overridden Layout * ProgressBarWidget: Check --- SDK/include/NDK/Widgets/ImageWidget.hpp | 2 -- SDK/include/NDK/Widgets/LabelWidget.hpp | 2 -- SDK/src/NDK/Widgets/CheckboxWidget.cpp | 12 ++++-------- SDK/src/NDK/Widgets/LabelWidget.cpp | 5 ----- SDK/src/NDK/Widgets/ProgressBarWidget.cpp | 6 ++---- 5 files changed, 6 insertions(+), 21 deletions(-) diff --git a/SDK/include/NDK/Widgets/ImageWidget.hpp b/SDK/include/NDK/Widgets/ImageWidget.hpp index fc36ca298..d95af8623 100644 --- a/SDK/include/NDK/Widgets/ImageWidget.hpp +++ b/SDK/include/NDK/Widgets/ImageWidget.hpp @@ -26,8 +26,6 @@ namespace Ndk //virtual ImageWidget* Clone() const = 0; - void ResizeToContent(); - inline const Nz::Color& GetColor() const; inline const Nz::TextureRef& GetTexture() const; inline const Nz::Rectf& GetTextureCoords() const; diff --git a/SDK/include/NDK/Widgets/LabelWidget.hpp b/SDK/include/NDK/Widgets/LabelWidget.hpp index aea711010..6e3b89ee8 100644 --- a/SDK/include/NDK/Widgets/LabelWidget.hpp +++ b/SDK/include/NDK/Widgets/LabelWidget.hpp @@ -32,8 +32,6 @@ namespace Ndk LabelWidget& operator=(LabelWidget&&) = default; private: - void Layout() override; - EntityHandle m_textEntity; Nz::TextSpriteRef m_textSprite; }; diff --git a/SDK/src/NDK/Widgets/CheckboxWidget.cpp b/SDK/src/NDK/Widgets/CheckboxWidget.cpp index 1bea0c9ce..7ea3969de 100644 --- a/SDK/src/NDK/Widgets/CheckboxWidget.cpp +++ b/SDK/src/NDK/Widgets/CheckboxWidget.cpp @@ -112,20 +112,16 @@ namespace Ndk { BaseWidget::Layout(); - Nz::Vector2f origin = Nz::Vector2f(0.f); Nz::Vector2f checkboxSize = GetCheckboxSize(); Nz::Vector2f borderSize = GetCheckboxBorderSize(); - m_checkboxBorderEntity->GetComponent().SetPosition(origin); - m_checkboxBackgroundEntity->GetComponent().SetPosition(origin + borderSize); + m_checkboxBackgroundEntity->GetComponent().SetPosition(borderSize); Nz::Vector3f checkboxBox = m_checkboxContentSprite->GetBoundingVolume().obb.localBox.GetLengths(); - m_checkboxContentEntity->GetComponent().SetPosition(origin.x + checkboxSize.x / 2.f - checkboxBox.x / 2.f, - origin.y + checkboxSize.y / 2.f - checkboxBox.y / 2.f); + m_checkboxContentEntity->GetComponent().SetPosition(checkboxSize.x / 2.f - checkboxBox.x / 2.f, checkboxSize.y / 2.f - checkboxBox.y / 2.f); Nz::Vector3f textBox = m_textSprite->GetBoundingVolume().obb.localBox.GetLengths(); - m_textEntity->GetComponent().SetPosition(origin.x + checkboxSize.x + (m_adaptativeMargin ? checkboxSize.x / 2.f : m_textMargin), - origin.y + checkboxSize.y / 2.f - textBox.y / 2.f); + m_textEntity->GetComponent().SetPosition(checkboxSize.x + (m_adaptativeMargin ? checkboxSize.x / 2.f : m_textMargin), checkboxSize.y / 2.f - textBox.y / 2.f); } void CheckboxWidget::OnMouseButtonRelease(int x, int y, Nz::Mouse::Button button) @@ -175,7 +171,7 @@ namespace Ndk Nz::Vector3f textSize = m_textSprite->GetBoundingVolume().obb.localBox.GetLengths(); Nz::Vector2f checkboxSize = GetCheckboxSize(); - Nz::Vector2f finalSize{ checkboxSize.x + (m_adaptativeMargin ? checkboxSize.x / 2.f : m_textMargin) + textSize.x, std::max(textSize.y, checkboxSize.y) }; + Nz::Vector2f finalSize { checkboxSize.x + (m_adaptativeMargin ? checkboxSize.x / 2.f : m_textMargin) + textSize.x, std::max(textSize.y, checkboxSize.y) }; SetMinimumSize(finalSize); SetPreferredSize(finalSize); } diff --git a/SDK/src/NDK/Widgets/LabelWidget.cpp b/SDK/src/NDK/Widgets/LabelWidget.cpp index 4c6553011..813295622 100644 --- a/SDK/src/NDK/Widgets/LabelWidget.cpp +++ b/SDK/src/NDK/Widgets/LabelWidget.cpp @@ -19,9 +19,4 @@ namespace Ndk Layout(); } - - void LabelWidget::Layout() - { - BaseWidget::Layout(); - } } diff --git a/SDK/src/NDK/Widgets/ProgressBarWidget.cpp b/SDK/src/NDK/Widgets/ProgressBarWidget.cpp index 3e2f01440..cc3f4f2d9 100644 --- a/SDK/src/NDK/Widgets/ProgressBarWidget.cpp +++ b/SDK/src/NDK/Widgets/ProgressBarWidget.cpp @@ -76,7 +76,6 @@ namespace Ndk void ProgressBarWidget::Layout() { - Nz::Vector2f origin = Nz::Vector2f(0.f); Nz::Vector2f size = GetSize(); Nz::Vector2f progressBarSize = size; @@ -85,7 +84,7 @@ namespace Ndk UpdateText(); Nz::Vector3f textSize = m_textSprite->GetBoundingVolume().obb.localBox.GetLengths(); - m_textEntity->GetComponent().SetPosition(origin.x + size.x - textSize.x, origin.y + size.y / 2.f - textSize.y); + m_textEntity->GetComponent().SetPosition(size.x - textSize.x, size.y / 2.f - textSize.y); progressBarSize -= { textSize.x + m_textMargin, 0.f }; } @@ -96,7 +95,6 @@ namespace Ndk m_barBackgroundSprite->SetSize(progressBarSize - (borderSize * 2.f)); m_barSprite->SetSize((progressBarSize.x - (borderSize.x * 2.f)) / 100.f * static_cast(m_value), progressBarSize.y - (borderSize.y * 2.f)); - m_borderEntity->GetComponent().SetPosition(origin.x, origin.y); - m_barEntity->GetComponent().SetPosition(origin.x + borderSize.x, origin.y + borderSize.y); + m_barEntity->GetComponent().SetPosition(borderSize.x, borderSize.y); } } From 9cc83aafdaf570b73b9671ba3b08ab211e0516fd Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 10 Oct 2018 22:59:57 +0200 Subject: [PATCH 131/352] Math/Angle: Add FromDegrees and FromRadians builders --- include/Nazara/Math/Angle.hpp | 2 ++ include/Nazara/Math/Angle.inl | 24 +++++++++++++++++++++++ tests/Engine/Physics2D/RigidBody2D.cpp | 2 +- tests/SDK/NDK/Systems/PhysicsSystem2D.cpp | 6 +++--- tests/SDK/NDK/Systems/RenderSystem.cpp | 2 +- 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index 74e2b884d..31ea6daeb 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -68,6 +68,8 @@ namespace Nz bool operator==(const Angle& other) const; bool operator!=(const Angle& other) const; + static Angle FromDegrees(T ang); + static Angle FromRadians(T ang); static Angle Zero(); T angle; diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index 354cab93f..b0c52c5a6 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -471,6 +471,30 @@ namespace Nz return !NumberEquals(angle, other.angle, Detail::AngleUtils::template GetEpsilon()); } + /*! + * \brief Builds an Angle instance using a degree angle, converting if needed + * \return An angle describing the degree angle as Unit + * + * \param ang Degree angle + */ + template + Angle Angle::FromDegrees(T ang) + { + return Angle(Detail::AngleUtils::FromDegrees(ang)); + } + + /*! + * \brief Builds an Angle instance using a radian angle, converting if needed + * \return An angle describing the radian angle as Unit + * + * \param ang Radian angle + */ + template + Angle Angle::FromRadians(T ang) + { + return Angle(Detail::AngleUtils::FromRadians(ang)); + } + /*! * \brief Returns an angle with an angle of zero * \return Zero angle diff --git a/tests/Engine/Physics2D/RigidBody2D.cpp b/tests/Engine/Physics2D/RigidBody2D.cpp index 421a2b083..749fa6f5c 100644 --- a/tests/Engine/Physics2D/RigidBody2D.cpp +++ b/tests/Engine/Physics2D/RigidBody2D.cpp @@ -166,7 +166,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") WHEN("We set an angular velocity") { - Nz::RadianAnglef angularSpeed = Nz::RadianAnglef(Nz::DegreeToRadian(90.f)); + Nz::RadianAnglef angularSpeed = Nz::RadianAnglef::FromDegrees(90.f); body.SetAngularVelocity(angularSpeed); world.Step(1.f); diff --git a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp index bb6bf250a..d94797065 100644 --- a/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp +++ b/tests/SDK/NDK/Systems/PhysicsSystem2D.cpp @@ -85,7 +85,7 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") WHEN("We make rotate our entity") { - Nz::RadianAnglef angularSpeed = Nz::DegreeToRadian(45.f); + Nz::RadianAnglef angularSpeed = Nz::RadianAnglef::FromDegrees(45.f); physicsComponent2D.SetAngularVelocity(angularSpeed); world.Update(2.f); @@ -93,7 +93,7 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") { CHECK(physicsComponent2D.GetAngularVelocity() == angularSpeed); CHECK(physicsComponent2D.GetAABB() == Nz::Rectf(-2.f, 0.f, 2.f, 1.f)); - CHECK(physicsComponent2D.GetRotation() == Nz::RadianAnglef(Nz::DegreeToRadian(90.f))); + CHECK(physicsComponent2D.GetRotation() == Nz::RadianAnglef::FromDegrees(90.f)); CHECK(nodeComponent.GetRotation().ToEulerAngles().roll == Approx(Nz::FromDegrees(90.f))); } } @@ -129,7 +129,7 @@ SCENARIO("PhysicsSystem2D", "[NDK][PHYSICSSYSTEM2D]") WHEN("We make rotate our entity") { - Nz::RadianAnglef angularSpeed(Nz::DegreeToRadian(45.f)); + Nz::RadianAnglef angularSpeed = Nz::RadianAnglef::FromDegrees(45.f); physicsComponent2D.SetAngularVelocity(angularSpeed); world.Update(2.f); diff --git a/tests/SDK/NDK/Systems/RenderSystem.cpp b/tests/SDK/NDK/Systems/RenderSystem.cpp index d68f544ab..329818f74 100644 --- a/tests/SDK/NDK/Systems/RenderSystem.cpp +++ b/tests/SDK/NDK/Systems/RenderSystem.cpp @@ -82,7 +82,7 @@ SCENARIO("RenderSystem", "[NDK][RenderSystem]") WHEN("We set an angular velocity") { - Nz::RadianAnglef angularSpeed(Nz::DegreeToRadian(90.f)); + Nz::RadianAnglef angularSpeed = Nz::RadianAnglef::FromDegrees(90.f); physicsComponent2D.SetAngularVelocity(angularSpeed); world.Update(1.f); From 7613f50a6e253e1acd057b2acfcf7ec21abd9a15 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 10 Oct 2018 23:01:23 +0200 Subject: [PATCH 132/352] Math/Angle: Rework ToDegrees/ToRadians - Rename To[Degrees|Radians] to To[Degrees|Radians]Angle - Add To[Degrees|Radians] methods which returns an angle value --- include/Nazara/Math/Angle.hpp | 6 ++++-- include/Nazara/Math/Angle.inl | 38 ++++++++++++++++++++++++++--------- tests/Engine/Math/Angle.cpp | 8 ++++---- 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index 31ea6daeb..26bccdb36 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -47,10 +47,12 @@ namespace Nz Angle& Set(const Angle& ang); template Angle& Set(const Angle& ang); - Angle ToDegrees() const; + T ToDegrees() const; + Angle ToDegreeAngle() const; EulerAngles ToEulerAngles() const; Quaternion ToQuaternion() const; - Angle ToRadians() const; + T ToRadians() const; + Angle ToRadianAngle() const; String ToString() const; Angle& operator=(const Angle&) = default; diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index b0c52c5a6..78b1d845d 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -164,7 +164,7 @@ namespace Nz template T Angle::GetCos() const { - return std::cos(ToRadians().angle); + return std::cos(ToRadianAngle().angle); } /*! @@ -176,7 +176,7 @@ namespace Nz template T Angle::GetSin() const { - return std::sin(ToRadians().angle); + return std::sin(ToRadianAngle().angle); } /*! @@ -191,7 +191,7 @@ namespace Nz std::pair Angle::GetSinCos() const { T sin, cos; - Detail::SinCos(ToRadians().angle, &sin, &cos); + Detail::SinCos(ToRadianAngle().angle, &sin, &cos); return std::make_pair(sin, cos); } @@ -205,7 +205,7 @@ namespace Nz template T Angle::GetTan() const { - return std::tan(ToRadians().angle); + return std::tan(ToRadianAngle().angle); } /*! @@ -289,14 +289,24 @@ namespace Nz return *this; } + /*! + * \brief Returns the degree angle that is equivalent to this one + * \return Equivalent degree angle value + */ + template + T Angle::ToDegrees() const + { + return Detail::AngleUtils::ToDegrees(angle); + } + /*! * \brief Returns the degree angle that is equivalent to this one * \return Equivalent degree angle */ template - Angle Angle::ToDegrees() const + Angle Angle::ToDegreeAngle() const { - return DegreeAngle(Detail::AngleUtils::ToDegrees(angle)); + return DegreeAngle(ToDegrees()); } /*! @@ -308,7 +318,7 @@ namespace Nz template EulerAngles Angle::ToEulerAngles() const { - return EulerAngles(0, 0, ToDegrees().angle); + return EulerAngles(0, 0, ToDegreeAngle().angle); } /*! @@ -327,14 +337,24 @@ namespace Nz return Quaternion(sincos.second, 0, 0, sincos.first); } + /*! + * \brief Returns the radian angle that is equivalent to this angle + * \return Equivalent radian angle value + */ + template + T Angle::ToRadians() const + { + return Detail::AngleUtils::ToRadians(angle); + } + /*! * \brief Returns the radian angle that is equivalent to this angle * \return Equivalent radian angle */ template - Angle Angle::ToRadians() const + Angle Angle::ToRadianAngle() const { - return RadianAngle(Detail::AngleUtils::ToRadians(angle)); + return RadianAngle(ToRadians()); } /*! diff --git a/tests/Engine/Math/Angle.cpp b/tests/Engine/Math/Angle.cpp index 3b5346c06..7eddb3d3e 100644 --- a/tests/Engine/Math/Angle.cpp +++ b/tests/Engine/Math/Angle.cpp @@ -11,7 +11,7 @@ SCENARIO("Angle", "[MATH][ANGLE]") WHEN("We convert it to degrees") { - Nz::DegreeAnglef copyAngle = angle.ToDegrees(); + Nz::DegreeAnglef copyAngle = angle.ToDegreeAngle(); THEN("It should compare to itself") { @@ -28,7 +28,7 @@ SCENARIO("Angle", "[MATH][ANGLE]") Nz::RadianAnglef expectedResult(float(M_PI_2)); CHECK(radAngle == expectedResult); - CHECK(angle.ToRadians() == expectedResult); + CHECK(angle.ToRadianAngle() == expectedResult); } } @@ -110,7 +110,7 @@ SCENARIO("Angle", "[MATH][ANGLE]") WHEN("We convert it to radians") { - Nz::RadianAnglef copyAngle = angle.ToRadians(); + Nz::RadianAnglef copyAngle = angle.ToRadianAngle(); THEN("It should compare to itself") { @@ -127,7 +127,7 @@ SCENARIO("Angle", "[MATH][ANGLE]") Nz::DegreeAnglef expectedResult(-180.f); CHECK(degAngle == expectedResult); - CHECK(angle.ToDegrees() == expectedResult); + CHECK(angle.ToDegreeAngle() == expectedResult); } } From fb11fe1ecf5bccbf05d25e165fa3c9f51db54cea Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 10 Oct 2018 23:12:27 +0200 Subject: [PATCH 133/352] Math/Angle: Rename angle field to value --- include/Nazara/Math/Angle.hpp | 2 +- include/Nazara/Math/Angle.inl | 56 +++++++++++++------------- src/Nazara/Physics2D/Constraint2D.cpp | 12 +++--- src/Nazara/Physics2D/RigidBody2D.cpp | 4 +- tests/Engine/Graphics/Billboard.cpp | 2 +- tests/Engine/Physics2D/RigidBody2D.cpp | 8 ++-- 6 files changed, 42 insertions(+), 42 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index 26bccdb36..fe559e958 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -74,7 +74,7 @@ namespace Nz static Angle FromRadians(T ang); static Angle Zero(); - T angle; + T value; }; template diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index 78b1d845d..fab999436 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -151,7 +151,7 @@ namespace Nz */ template Angle::Angle(T value) : - angle(value) + value(value) { } @@ -214,7 +214,7 @@ namespace Nz template Angle& Angle::MakeZero() { - angle = T(0); + value = T(0); return *this; } @@ -231,9 +231,9 @@ namespace Nz constexpr T limit = Detail::AngleUtils::template GetLimit(); constexpr T twoLimit = limit * T(2); - angle = std::fmod(angle, twoLimit); - if (angle < T(0)) - angle += twoLimit; + value = std::fmod(value, twoLimit); + if (value < T(0)) + value += twoLimit; } /*! @@ -245,7 +245,7 @@ namespace Nz template Angle& Angle::Set(const Angle& ang) { - angle = RadianToDegree(ang.angle); + value = RadianToDegree(ang.value); return *this; } @@ -258,7 +258,7 @@ namespace Nz template Angle& Angle::Set(const Angle& ang) { - angle = DegreeToRadian(ang.angle); + value = DegreeToRadian(ang.value); return *this; } @@ -270,7 +270,7 @@ namespace Nz template Angle& Angle::Set(const Angle& ang) { - angle = ang.angle; + value = ang.value; return *this; } @@ -285,7 +285,7 @@ namespace Nz template Angle& Angle::Set(const Angle& ang) { - angle = static_cast(ang.angle); + value = static_cast(ang.value); return *this; } @@ -296,7 +296,7 @@ namespace Nz template T Angle::ToDegrees() const { - return Detail::AngleUtils::ToDegrees(angle); + return Detail::AngleUtils::ToDegrees(value); } /*! @@ -318,7 +318,7 @@ namespace Nz template EulerAngles Angle::ToEulerAngles() const { - return EulerAngles(0, 0, ToDegreeAngle().angle); + return EulerAngles(0, 0, ToDegrees()); } /*! @@ -344,7 +344,7 @@ namespace Nz template T Angle::ToRadians() const { - return Detail::AngleUtils::ToRadians(angle); + return Detail::AngleUtils::ToRadians(value); } /*! @@ -364,7 +364,7 @@ namespace Nz template String Angle::ToString() const { - return Detail::AngleUtils::ToString(angle); + return Detail::AngleUtils::ToString(value); } /*! @@ -376,7 +376,7 @@ namespace Nz template Angle Angle::operator+(const Angle& other) const { - return Angle(angle + other.angle); + return Angle(value + other.value); } /*! @@ -388,7 +388,7 @@ namespace Nz template Angle Angle::operator-(const Angle& other) const { - return Angle(angle - other.angle); + return Angle(value - other.value); } /*! @@ -400,7 +400,7 @@ namespace Nz template Angle Angle::operator*(T scalar) const { - return Angle(angle * scalar); + return Angle(value * scalar); } /*! @@ -412,7 +412,7 @@ namespace Nz template Angle Angle::operator/(T divider) const { - return Angle(angle / divider); + return Angle(value / divider); } /*! @@ -424,7 +424,7 @@ namespace Nz template Angle& Angle::operator+=(const Angle& other) { - angle += other.angle; + value += other.value; return *this; } @@ -437,7 +437,7 @@ namespace Nz template Angle& Angle::operator-=(const Angle& other) { - angle -= other.angle; + value -= other.value; return *this; } @@ -450,7 +450,7 @@ namespace Nz template Angle& Angle::operator*=(T scalar) { - angle *= scalar; + value *= scalar; return *this; } @@ -463,7 +463,7 @@ namespace Nz template Angle& Angle::operator/=(T divider) { - angle /= divider; + value /= divider; return *this; } @@ -476,7 +476,7 @@ namespace Nz template bool Angle::operator==(const Angle& other) const { - return NumberEquals(angle, other.angle, Detail::AngleUtils::template GetEpsilon()); + return NumberEquals(value, other.value, Detail::AngleUtils::template GetEpsilon()); } /*! @@ -488,7 +488,7 @@ namespace Nz template bool Angle::operator!=(const Angle& other) const { - return !NumberEquals(angle, other.angle, Detail::AngleUtils::template GetEpsilon()); + return !NumberEquals(value, other.value, Detail::AngleUtils::template GetEpsilon()); } /*! @@ -538,7 +538,7 @@ namespace Nz template bool Serialize(SerializationContext& context, const Angle& angle, TypeTag>) { - if (!Serialize(context, angle.angle)) + if (!Serialize(context, angle.value)) return false; return true; @@ -554,7 +554,7 @@ namespace Nz template bool Unserialize(SerializationContext& context, Angle* angle, TypeTag>) { - if (!Unserialize(context, &angle->angle)) + if (!Unserialize(context, &angle->value)) return false; return true; @@ -571,7 +571,7 @@ namespace Nz template Nz::Angle operator*(T scale, const Nz::Angle& angle) { - return Nz::Angle(scale * angle.angle); + return Nz::Angle(scale * angle.value); } /*! @@ -584,7 +584,7 @@ Nz::Angle operator*(T scale, const Nz::Angle& angle) template Nz::Angle operator/(T scale, const Nz::Angle& angle) { - return Nz::Angle(scale / angle.angle); + return Nz::Angle(scale / angle.value); } /*! @@ -597,7 +597,7 @@ Nz::Angle operator/(T scale, const Nz::Angle& angle) template std::ostream& operator<<(std::ostream& out, const Nz::Angle& angle) { - return Nz::Detail::AngleUtils::ToString(out, angle.angle); + return Nz::Detail::AngleUtils::ToString(out, angle.value); } #include diff --git a/src/Nazara/Physics2D/Constraint2D.cpp b/src/Nazara/Physics2D/Constraint2D.cpp index c4c92fd4c..e4ad5e407 100644 --- a/src/Nazara/Physics2D/Constraint2D.cpp +++ b/src/Nazara/Physics2D/Constraint2D.cpp @@ -164,7 +164,7 @@ namespace Nz DampedRotarySpringConstraint2D::DampedRotarySpringConstraint2D(RigidBody2D& first, RigidBody2D& second, const RadianAnglef& restAngle, float stiffness, float damping) : - Constraint2D(first.GetWorld(), cpDampedRotarySpringNew(first.GetHandle(), second.GetHandle(), restAngle.angle, stiffness, damping)) + Constraint2D(first.GetWorld(), cpDampedRotarySpringNew(first.GetHandle(), second.GetHandle(), restAngle.value, stiffness, damping)) { } @@ -190,7 +190,7 @@ namespace Nz void DampedRotarySpringConstraint2D::SetRestAngle(const RadianAnglef& newAngle) { - cpDampedRotarySpringSetRestAngle(m_constraint, newAngle.angle); + cpDampedRotarySpringSetRestAngle(m_constraint, newAngle.value); } void DampedRotarySpringConstraint2D::SetStiffness(float newStiffness) @@ -334,7 +334,7 @@ namespace Nz void RatchetConstraint2D::SetAngle(const RadianAnglef& angle) { - cpRatchetJointSetAngle(m_constraint, angle.angle); + cpRatchetJointSetAngle(m_constraint, angle.value); } void RatchetConstraint2D::SetPhase(float phase) @@ -349,7 +349,7 @@ namespace Nz RotaryLimitConstraint2D::RotaryLimitConstraint2D(RigidBody2D& first, RigidBody2D& second, const RadianAnglef& minAngle, const RadianAnglef& maxAngle) : - Constraint2D(first.GetWorld(), cpRotaryLimitJointNew(first.GetHandle(), second.GetHandle(), minAngle.angle, maxAngle.angle)) + Constraint2D(first.GetWorld(), cpRotaryLimitJointNew(first.GetHandle(), second.GetHandle(), minAngle.value, maxAngle.value)) { } @@ -365,12 +365,12 @@ namespace Nz void RotaryLimitConstraint2D::SetMaxAngle(const RadianAnglef& maxAngle) { - cpRotaryLimitJointSetMax(m_constraint, maxAngle.angle); + cpRotaryLimitJointSetMax(m_constraint, maxAngle.value); } void RotaryLimitConstraint2D::SetMinAngle(const RadianAnglef& minAngle) { - cpRotaryLimitJointSetMin(m_constraint, minAngle.angle); + cpRotaryLimitJointSetMin(m_constraint, minAngle.value); } diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 99013467e..0d8c120b6 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -307,7 +307,7 @@ namespace Nz void RigidBody2D::SetAngularVelocity(const RadianAnglef& angularVelocity) { - cpBodySetAngularVelocity(m_handle, angularVelocity.angle); + cpBodySetAngularVelocity(m_handle, angularVelocity.value); } void RigidBody2D::SetElasticity(float friction) @@ -450,7 +450,7 @@ namespace Nz void RigidBody2D::SetRotation(const RadianAnglef& rotation) { - cpBodySetAngle(m_handle, rotation.angle); + cpBodySetAngle(m_handle, rotation.value); if (m_isStatic) { m_world->RegisterPostStep(this, [](Nz::RigidBody2D* body) diff --git a/tests/Engine/Graphics/Billboard.cpp b/tests/Engine/Graphics/Billboard.cpp index de0bc8d02..651274bfd 100644 --- a/tests/Engine/Graphics/Billboard.cpp +++ b/tests/Engine/Graphics/Billboard.cpp @@ -20,7 +20,7 @@ SCENARIO("Billboard", "[GRAPHICS][BILLBOARD]") { REQUIRE(billboard.GetColor() == materialColor); REQUIRE(billboard.GetMaterial().Get() == materialRef.Get()); - REQUIRE(billboard.GetRotation().angle == Approx(0.f)); + REQUIRE(billboard.GetRotation().value == Approx(0.f)); REQUIRE(billboard.GetSize() == Nz::Vector2f(64.f, 64.f)); // Default sizes } diff --git a/tests/Engine/Physics2D/RigidBody2D.cpp b/tests/Engine/Physics2D/RigidBody2D.cpp index 749fa6f5c..98af5c13b 100644 --- a/tests/Engine/Physics2D/RigidBody2D.cpp +++ b/tests/Engine/Physics2D/RigidBody2D.cpp @@ -130,7 +130,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") CHECK(body.GetGeom() == box); CHECK(body.GetMass() == Approx(mass)); CHECK(body.GetPosition() == position); - CHECK(body.GetRotation().angle == Approx(0.f)); + CHECK(body.GetRotation().value == Approx(0.f)); CHECK(body.GetUserdata() == &userData); CHECK(body.GetVelocity() == Nz::Vector2f::Zero()); @@ -196,8 +196,8 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") THEN("It is also counter-clockwise") { - CHECK(body.GetAngularVelocity().angle >= 0.f); - CHECK(body.GetRotation().angle >= 0.f); + CHECK(body.GetAngularVelocity().value >= 0.f); + CHECK(body.GetRotation().value >= 0.f); } } } @@ -321,7 +321,7 @@ void EQUALITY(const Nz::RigidBody2D& left, const Nz::RigidBody2D& right) CHECK(left.GetHandle() != right.GetHandle()); CHECK(left.GetMass() == Approx(right.GetMass())); CHECK(left.GetPosition() == right.GetPosition()); - CHECK(left.GetRotation().angle == Approx(right.GetRotation().angle)); + CHECK(left.GetRotation().value == Approx(right.GetRotation().value)); CHECK(left.GetUserdata() == right.GetUserdata()); CHECK(left.GetVelocity() == right.GetVelocity()); } From 6653be6f2ca3d700161cb26a50dff84df258cbd8 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 10 Oct 2018 23:12:45 +0200 Subject: [PATCH 134/352] Math/Angle: Make use of ToRadians() --- include/Nazara/Math/Angle.inl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index fab999436..855987a4a 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -164,7 +164,7 @@ namespace Nz template T Angle::GetCos() const { - return std::cos(ToRadianAngle().angle); + return std::cos(ToRadians()); } /*! @@ -176,7 +176,7 @@ namespace Nz template T Angle::GetSin() const { - return std::sin(ToRadianAngle().angle); + return std::sin(ToRadians()); } /*! @@ -191,7 +191,7 @@ namespace Nz std::pair Angle::GetSinCos() const { T sin, cos; - Detail::SinCos(ToRadianAngle().angle, &sin, &cos); + Detail::SinCos(ToRadians(), &sin, &cos); return std::make_pair(sin, cos); } @@ -205,7 +205,7 @@ namespace Nz template T Angle::GetTan() const { - return std::tan(ToRadianAngle().angle); + return std::tan(ToRadians()); } /*! From d2b1d51ecbd5e76c7bd6e9a9db358fe122ad696e Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 11 Oct 2018 00:07:50 +0200 Subject: [PATCH 135/352] Math/Angle: Replace conversion constructors by conversion operators --- include/Nazara/Math/Angle.hpp | 7 +++-- include/Nazara/Math/Angle.inl | 48 ++++++++++++++++------------------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index fe559e958..d65dc7c4f 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -27,8 +27,6 @@ namespace Nz public: Angle() = default; Angle(T value); - template> explicit Angle(const Angle& value) { Set(value); } - template> explicit Angle(const Angle& value) { Set(value); } template explicit Angle(const Angle& Angle); Angle(const Angle&) = default; ~Angle() = default; @@ -42,8 +40,6 @@ namespace Nz void Normalize(); - template> Angle& Set(const Angle& ang); - template> Angle& Set(const Angle& ang); Angle& Set(const Angle& ang); template Angle& Set(const Angle& ang); @@ -55,6 +51,9 @@ namespace Nz Angle ToRadianAngle() const; String ToString() const; + template> operator Angle(); + template> operator Angle(); + Angle& operator=(const Angle&) = default; Angle operator+(const Angle& other) const; diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index 855987a4a..d50bcb6d1 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -236,32 +236,6 @@ namespace Nz value += twoLimit; } - /*! - * \brief Changes the angle value by converting a radian angle - * - * \param Angle Radian angle which will be converted - */ - template - template - Angle& Angle::Set(const Angle& ang) - { - value = RadianToDegree(ang.value); - return *this; - } - - /*! - * \brief Changes the angle value by converting a degree angle - * - * \param Angle Degree angle which will be converted - */ - template - template - Angle& Angle::Set(const Angle& ang) - { - value = DegreeToRadian(ang.value); - return *this; - } - /*! * \brief Copies the angle value of an angle * @@ -367,6 +341,28 @@ namespace Nz return Detail::AngleUtils::ToString(value); } + /*! + * \brief Returns the degree angle that is equivalent to this one + * \return Equivalent degree angle + */ + template + template + Angle::operator Angle() + { + return ToDegreeAngle(); + } + + /*! + * \brief Converts the angle to a string representation + * \return String representation of the angle + */ + template + template + Angle::operator Angle() + { + return ToRadianAngle(); + } + /*! * \brief Addition operator * \return Adds two angles together From 3933d5007df0a4513f0bed5a13156dc16da556f1 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 11 Oct 2018 00:08:26 +0200 Subject: [PATCH 136/352] Physics2D/RigidBody2D: AddTorque now takes a RadianAnglesf instead of a float --- SDK/include/NDK/Components/PhysicsComponent2D.hpp | 2 +- SDK/include/NDK/Components/PhysicsComponent2D.inl | 2 +- include/Nazara/Physics2D/RigidBody2D.hpp | 2 +- src/Nazara/Physics2D/RigidBody2D.cpp | 4 ++-- tests/Engine/Physics2D/RigidBody2D.cpp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index a652ceec6..841b2df34 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -32,7 +32,7 @@ namespace Ndk inline void AddForce(const Nz::Vector2f& force, const Nz::Vector2f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global); inline void AddImpulse(const Nz::Vector2f& impulse, Nz::CoordSys coordSys = Nz::CoordSys_Global); inline void AddImpulse(const Nz::Vector2f& impulse, const Nz::Vector2f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global); - inline void AddTorque(float torque); + inline void AddTorque(const Nz::RadianAnglef& torque); inline bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const; diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index 8af4356f4..35782dcd9 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -91,7 +91,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent2D::AddTorque(float torque) + inline void PhysicsComponent2D::AddTorque(const Nz::RadianAnglef& torque) { NazaraAssert(m_object, "Invalid physics object"); diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index b23b97187..39dbb0b83 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -35,7 +35,7 @@ namespace Nz void AddForce(const Vector2f& force, const Vector2f& point, CoordSys coordSys = CoordSys_Global); void AddImpulse(const Vector2f& impulse, CoordSys coordSys = CoordSys_Global); void AddImpulse(const Vector2f& impulse, const Vector2f& point, CoordSys coordSys = CoordSys_Global); - void AddTorque(float torque); + void AddTorque(const RadianAnglef& torque); bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint = nullptr, float* closestDistance = nullptr) const; diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 0d8c120b6..4abd6505b 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -126,9 +126,9 @@ namespace Nz } } - void RigidBody2D::AddTorque(float torque) + void RigidBody2D::AddTorque(const RadianAnglef& torque) { - cpBodySetTorque(m_handle, cpBodyGetTorque(m_handle) + ToRadians(torque)); + cpBodySetTorque(m_handle, cpBodyGetTorque(m_handle) + torque.value); } bool RigidBody2D::ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const diff --git a/tests/Engine/Physics2D/RigidBody2D.cpp b/tests/Engine/Physics2D/RigidBody2D.cpp index 98af5c13b..7eae99908 100644 --- a/tests/Engine/Physics2D/RigidBody2D.cpp +++ b/tests/Engine/Physics2D/RigidBody2D.cpp @@ -191,7 +191,7 @@ SCENARIO("RigidBody2D", "[PHYSICS2D][RIGIDBODY2D]") WHEN("We apply a torque") { - body.AddTorque(Nz::DegreeToRadian(90.f)); + body.AddTorque(Nz::DegreeAnglef(90.f)); world.Step(1.f); THEN("It is also counter-clockwise") From 4c4822eef905fdf08db173d63ba42e2bc4ec94b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 12 Oct 2018 15:46:40 +0200 Subject: [PATCH 137/352] Core/ObjectHandle: Remade object handle system --- ChangeLog.md | 2 + SDK/include/NDK/Entity.hpp | 2 +- SDK/include/NDK/EntityOwner.hpp | 1 + SDK/include/NDK/EntityOwner.inl | 17 +++- include/Nazara/Core/HandledObject.hpp | 17 +++- include/Nazara/Core/HandledObject.inl | 76 +++++--------- include/Nazara/Core/ObjectHandle.hpp | 13 +-- include/Nazara/Core/ObjectHandle.inl | 141 ++++++-------------------- src/Nazara/Core/HandledObject.cpp | 18 ++++ 9 files changed, 107 insertions(+), 180 deletions(-) create mode 100644 src/Nazara/Core/HandledObject.cpp diff --git a/ChangeLog.md b/ChangeLog.md index a49c7d583..43f8aa898 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -151,6 +151,7 @@ Nazara Engine: - 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 Nazara Development Kit: - Added ImageWidget (#139) @@ -219,6 +220,7 @@ Nazara Development Kit: - EntityOwner constructor taking a Entity* is no longer explicit - PhysicsComponent2D now allows massless bodies (zero mass) - ⚠️ Use of the new Angle class instead of floating point angle +- Added EntityOwner::Release # 0.4: diff --git a/SDK/include/NDK/Entity.hpp b/SDK/include/NDK/Entity.hpp index 3cbe4785c..43a4a43c7 100644 --- a/SDK/include/NDK/Entity.hpp +++ b/SDK/include/NDK/Entity.hpp @@ -8,8 +8,8 @@ #define NDK_ENTITY_HPP #include -#include #include +#include #include #include #include diff --git a/SDK/include/NDK/EntityOwner.hpp b/SDK/include/NDK/EntityOwner.hpp index 0be491058..84eb95feb 100644 --- a/SDK/include/NDK/EntityOwner.hpp +++ b/SDK/include/NDK/EntityOwner.hpp @@ -20,6 +20,7 @@ namespace Ndk EntityOwner(EntityOwner&& handle) noexcept = default; ~EntityOwner(); + void Release(); void Reset(Entity* entity = nullptr); void Reset(EntityOwner&& handle); diff --git a/SDK/include/NDK/EntityOwner.inl b/SDK/include/NDK/EntityOwner.inl index 566962fb0..4ee9530f7 100644 --- a/SDK/include/NDK/EntityOwner.inl +++ b/SDK/include/NDK/EntityOwner.inl @@ -2,6 +2,7 @@ // 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 @@ -36,16 +37,23 @@ namespace Ndk Reset(nullptr); } + /*! + * \brief Release the ownership of the entity without killing it + */ + inline void EntityOwner::Release() + { + EntityHandle::Reset(nullptr); + } + /*! * \brief Resets the ownership of the entity, previous is killed * * \param entity Entity to own */ - inline void EntityOwner::Reset(Entity* entity) { - if (m_object) - m_object->Kill(); + if (IsValid()) + GetObject()->Kill(); EntityHandle::Reset(entity); } @@ -55,11 +63,10 @@ namespace Ndk * * \param handle EntityOwner to move into this */ - inline void EntityOwner::Reset(EntityOwner&& handle) { Reset(handle.GetObject()); - handle.m_object = nullptr; + handle.Release(); } /*! diff --git a/include/Nazara/Core/HandledObject.hpp b/include/Nazara/Core/HandledObject.hpp index 633f7e9fe..27c8646b3 100644 --- a/include/Nazara/Core/HandledObject.hpp +++ b/include/Nazara/Core/HandledObject.hpp @@ -13,6 +13,16 @@ namespace Nz { + namespace Detail + { + struct NAZARA_CORE_API HandleData + { + void* object; + + static std::shared_ptr GetEmptyObject(); + }; + } + template class ObjectHandle; template @@ -35,11 +45,10 @@ namespace Nz void UnregisterAllHandles() noexcept; private: - void RegisterHandle(ObjectHandle* handle); - void UnregisterHandle(ObjectHandle* handle) noexcept; - void UpdateHandle(ObjectHandle* oldHandle, ObjectHandle* newHandle) noexcept; + std::shared_ptr GetHandleData(); + void InitHandleData(); - std::vector*> m_handles; + std::shared_ptr m_handleData; }; } diff --git a/include/Nazara/Core/HandledObject.inl b/include/Nazara/Core/HandledObject.inl index 3349fa7e1..bc11ec645 100644 --- a/include/Nazara/Core/HandledObject.inl +++ b/include/Nazara/Core/HandledObject.inl @@ -2,9 +2,10 @@ // 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 #include #include @@ -35,10 +36,10 @@ namespace Nz */ template HandledObject::HandledObject(HandledObject&& object) noexcept : - m_handles(std::move(object.m_handles)) + m_handleData(std::move(object.m_handleData)) { - for (ObjectHandle* handle : m_handles) - handle->OnObjectMoved(static_cast(this)); + if (m_handleData) + m_handleData->object = static_cast(this); } /*! @@ -74,7 +75,7 @@ namespace Nz NazaraUnused(object); // Nothing to do - return *this; + return *this; } /*! @@ -88,73 +89,42 @@ namespace Nz { UnregisterAllHandles(); - m_handles = std::move(object.m_handles); - for (ObjectHandle* handle : m_handles) - handle->OnObjectMoved(static_cast(this)); + m_handleData = std::move(object.m_handleData); + + if (m_handleData) + m_handleData->object = static_cast(this); return *this; } - /*! - * \brief Registers a handle - * - * \param handle Handle to register - * - * \remark One handle can only be registered once, errors can occur if it's more than once - */ - template - void HandledObject::RegisterHandle(ObjectHandle* handle) - { - m_handles.push_back(handle); - } - /*! * \brief Unregisters all handles */ template void HandledObject::UnregisterAllHandles() noexcept { - // Tell every handle we got destroyed, to null them - for (ObjectHandle* handle : m_handles) - handle->OnObjectDestroyed(); - - m_handles.clear(); + if (m_handleData) + { + m_handleData->object = nullptr; + m_handleData.reset(); + } } - /*! - * \brief Unregisters a handle - * - * \param handle Handle to unregister - * - * \remark One handle can only be unregistered once, crash can occur if it's more than once - * \remark Produces a NazaraAssert if handle not registered - */ template - void HandledObject::UnregisterHandle(ObjectHandle* handle) noexcept + std::shared_ptr HandledObject::GetHandleData() { - auto it = std::find(m_handles.begin(), m_handles.end(), handle); - NazaraAssert(it != m_handles.end(), "Handle not registered"); + if (!m_handleData) + InitHandleData(); - // Swap and pop idiom, more efficient than vector::erase - std::swap(*it, m_handles.back()); - m_handles.pop_back(); + return std::shared_ptr(m_handleData); } - /*! - * \brief Updates one handle with another - * - * \param oldHandle Old handle to replace - * \param newHandle New handle to take place - * - * \remark Produces a NazaraAssert if handle not registered - */ template - void HandledObject::UpdateHandle(ObjectHandle* oldHandle, ObjectHandle* newHandle) noexcept + void HandledObject::InitHandleData() { - auto it = std::find(m_handles.begin(), m_handles.end(), oldHandle); - NazaraAssert(it != m_handles.end(), "Handle not registered"); + assert(!m_handleData); - // Simply update the handle - *it = newHandle; + m_handleData = std::make_shared(); + m_handleData->object = static_cast(this); } } diff --git a/include/Nazara/Core/ObjectHandle.hpp b/include/Nazara/Core/ObjectHandle.hpp index 9dadbc832..e2e72f185 100644 --- a/include/Nazara/Core/ObjectHandle.hpp +++ b/include/Nazara/Core/ObjectHandle.hpp @@ -8,12 +8,12 @@ #define NAZARA_OBJECTHANDLE_HPP #include +#include +#include #include namespace Nz { - template class HandledObject; - template class ObjectHandle { @@ -22,7 +22,7 @@ namespace Nz public: ObjectHandle(); explicit ObjectHandle(T* object); - ObjectHandle(const ObjectHandle& handle); + ObjectHandle(const ObjectHandle& handle) = default; ObjectHandle(ObjectHandle&& handle) noexcept; ~ObjectHandle(); @@ -43,16 +43,13 @@ namespace Nz T* operator->() const; ObjectHandle& operator=(T* object); - ObjectHandle& operator=(const ObjectHandle& handle); + ObjectHandle& operator=(const ObjectHandle& handle) = default; ObjectHandle& operator=(ObjectHandle&& handle) noexcept; static const ObjectHandle InvalidHandle; protected: - void OnObjectDestroyed() noexcept; - void OnObjectMoved(T* newObject) noexcept; - - T* m_object; + std::shared_ptr m_handleData; }; template std::ostream& operator<<(std::ostream& out, const ObjectHandle& handle); diff --git a/include/Nazara/Core/ObjectHandle.inl b/include/Nazara/Core/ObjectHandle.inl index 0ba6afc2c..fc43fdffe 100644 --- a/include/Nazara/Core/ObjectHandle.inl +++ b/include/Nazara/Core/ObjectHandle.inl @@ -15,37 +15,15 @@ namespace Nz * \brief Core class that represents a object handle */ - /*! - * \brief Constructs a ObjectHandle object by default - */ - template - ObjectHandle::ObjectHandle() : - m_object(nullptr) - { - } - /*! * \brief Constructs a ObjectHandle object with a pointer to an object * * \param object Pointer to handle like an object (can be nullptr) */ template - ObjectHandle::ObjectHandle(T* object) : - ObjectHandle() + ObjectHandle::ObjectHandle() : + m_handleData(Detail::HandleData::GetEmptyObject()) { - Reset(object); - } - - /*! - * \brief Constructs a ObjectHandle object by assignation - * - * \param handle ObjectHandle to assign into this - */ - template - ObjectHandle::ObjectHandle(const ObjectHandle& handle) : - ObjectHandle() - { - Reset(handle); } /*! @@ -54,12 +32,22 @@ namespace Nz * \param handle ObjectHandle to move into this */ template - ObjectHandle::ObjectHandle(ObjectHandle&& handle) noexcept : - ObjectHandle() + ObjectHandle::ObjectHandle(ObjectHandle&& handle) noexcept { Reset(std::move(handle)); } + /*! + * \brief Constructs a ObjectHandle object with a pointer to an object + * + * \param object Pointer to handle like an object (can be nullptr) + */ + template + ObjectHandle::ObjectHandle(T* object) + { + Reset(object); + } + /*! * \brief Destructs the object and calls reset with nullptr * @@ -78,7 +66,7 @@ namespace Nz template T* ObjectHandle::GetObject() const { - return m_object; + return static_cast(m_handleData->object); } /*! @@ -88,7 +76,7 @@ namespace Nz template bool ObjectHandle::IsValid() const { - return m_object != nullptr; + return m_handleData->object != nullptr; } /*! @@ -99,14 +87,10 @@ namespace Nz template void ObjectHandle::Reset(T* object) { - // If we already have an entity, we must alert it that we are not pointing to it anymore - if (m_object) - m_object->UnregisterHandle(this); - - m_object = object; - if (m_object) - // We alert the new entity that we are pointing to it - m_object->RegisterHandle(this); + if (object) + m_handleData = object->GetHandleData(); + else + m_handleData = Detail::HandleData::GetEmptyObject(); } /*! @@ -117,7 +101,7 @@ namespace Nz template void ObjectHandle::Reset(const ObjectHandle& handle) { - Reset(handle.GetObject()); + m_handleData = handle.m_handleData; } /*! @@ -128,20 +112,8 @@ namespace Nz template void ObjectHandle::Reset(ObjectHandle&& handle) noexcept { - if (this == &handle) - return; - - if (m_object) - m_object->UnregisterHandle(this); - - if (T* object = handle.GetObject()) - { - m_object = handle.m_object; - handle.m_object = nullptr; - object->UpdateHandle(&handle, this); - } - else - m_object = nullptr; + m_handleData = std::move(handle.m_handleData); + handle.m_handleData = Detail::HandleData::GetEmptyObject(); } /*! @@ -153,23 +125,8 @@ namespace Nz template ObjectHandle& ObjectHandle::Swap(ObjectHandle& handle) { - // As we swap the two handles, we must alert the entities - // The default version with swap (move) would be working, - // but will register handles one more time (due to temporary copy). - if (m_object) - { - m_object->UnregisterHandle(this); - m_object->RegisterHandle(&handle); - } - - if (handle.m_object) - { - handle.m_object->UnregisterHandle(&handle); - handle.m_object->RegisterHandle(this); - } - // We do the swap - std::swap(m_object, handle.m_object); + std::swap(m_handleData, handle.m_handleData); return *this; } @@ -183,7 +140,7 @@ namespace Nz Nz::StringStream ss; ss << "ObjectHandle("; if (IsValid()) - ss << m_object->ToString(); + ss << GetObject()->ToString(); else ss << "Null"; @@ -211,7 +168,7 @@ namespace Nz template ObjectHandle::operator T*() const { - return m_object; + return GetObject(); } /*! @@ -221,7 +178,7 @@ namespace Nz template T* ObjectHandle::operator->() const { - return m_object; + return GetObject(); } /*! @@ -231,23 +188,9 @@ namespace Nz * \param entity Pointer to handle like an object (can be nullptr) */ template - ObjectHandle& ObjectHandle::operator=(T* entity) + ObjectHandle& ObjectHandle::operator=(T* object) { - Reset(entity); - - return *this; - } - - /*! - * \brief Sets the handle of the ObjectHandle with the handle from another - * \return A reference to this - * - * \param handle The other ObjectHandle - */ - template - ObjectHandle& ObjectHandle::operator=(const ObjectHandle& handle) - { - Reset(handle); + Reset(object); return *this; } @@ -266,26 +209,6 @@ namespace Nz return *this; } - /*! - * \brief Action to do on object destruction - */ - template - void ObjectHandle::OnObjectDestroyed() noexcept - { - // Shortcut - m_object = nullptr; - } - - /*! - * \brief Action to do on object move - */ - template - void ObjectHandle::OnObjectMoved(T* newObject) noexcept - { - // The object has been moved, update our pointer - m_object = newObject; - } - /*! * \brief Output operator * \return The stream @@ -388,7 +311,7 @@ namespace Nz template bool operator<(const ObjectHandle& lhs, const ObjectHandle& rhs) { - return lhs.m_object < rhs.m_object; + return lhs.GetObject() < rhs.GetObject(); } /*! @@ -401,7 +324,7 @@ namespace Nz template bool operator<(const T& lhs, const ObjectHandle& rhs) { - return &lhs < rhs.m_object; + return &lhs < rhs.GetObject(); } /*! @@ -414,7 +337,7 @@ namespace Nz template bool operator<(const ObjectHandle& lhs, const T& rhs) { - return lhs.m_object < &rhs; + return lhs.GetObject() < &rhs; } /*! diff --git a/src/Nazara/Core/HandledObject.cpp b/src/Nazara/Core/HandledObject.cpp new file mode 100644 index 000000000..664912a6c --- /dev/null +++ b/src/Nazara/Core/HandledObject.cpp @@ -0,0 +1,18 @@ +// 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 + { + std::shared_ptr HandleData::GetEmptyObject() + { + static std::shared_ptr emptyHandleData = std::make_shared(HandleData{}); + return emptyHandleData; + } + } +} From 5e45983953a3aac5b4c7fd429bd972828e3c7860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 12 Oct 2018 17:09:39 +0200 Subject: [PATCH 138/352] Math/Angle: Fix compilation & warning on GCC < 8 --- include/Nazara/Math/Angle.hpp | 6 +++--- include/Nazara/Math/Angle.inl | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/Nazara/Math/Angle.hpp b/include/Nazara/Math/Angle.hpp index d65dc7c4f..64e7ad878 100644 --- a/include/Nazara/Math/Angle.hpp +++ b/include/Nazara/Math/Angle.hpp @@ -26,7 +26,7 @@ namespace Nz { public: Angle() = default; - Angle(T value); + Angle(T angle); template explicit Angle(const Angle& Angle); Angle(const Angle&) = default; ~Angle() = default; @@ -51,8 +51,8 @@ namespace Nz Angle ToRadianAngle() const; String ToString() const; - template> operator Angle(); - template> operator Angle(); + template> operator Angle() const { return ToDegreeAngle(); } // GCC < 8 bug + template> operator Angle() const { return ToRadianAngle(); } // GCC < 8 bug Angle& operator=(const Angle&) = default; diff --git a/include/Nazara/Math/Angle.inl b/include/Nazara/Math/Angle.inl index d50bcb6d1..036ed5943 100644 --- a/include/Nazara/Math/Angle.inl +++ b/include/Nazara/Math/Angle.inl @@ -150,8 +150,8 @@ namespace Nz * \param value value of the angle */ template - Angle::Angle(T value) : - value(value) + Angle::Angle(T angle) : + value(angle) { } @@ -345,23 +345,23 @@ namespace Nz * \brief Returns the degree angle that is equivalent to this one * \return Equivalent degree angle */ - template + /*template template - Angle::operator Angle() + Angle::operator Angle() const { return ToDegreeAngle(); - } + }*/ /*! * \brief Converts the angle to a string representation * \return String representation of the angle */ - template + /*template template - Angle::operator Angle() + Angle::operator Angle() const { return ToRadianAngle(); - } + }*/ /*! * \brief Addition operator From 9674d7373c205373c14a05738f3c9de96ec9a196 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 20 Oct 2018 23:52:32 +0200 Subject: [PATCH 139/352] SDK/PhysicsComponent2D: Add missing parameter to SetMass --- ChangeLog.md | 1 + SDK/include/NDK/Components/PhysicsComponent2D.hpp | 2 +- SDK/include/NDK/Components/PhysicsComponent2D.inl | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 43f8aa898..e0091913d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -221,6 +221,7 @@ Nazara Development Kit: - PhysicsComponent2D now allows massless bodies (zero mass) - ⚠️ Use of the new Angle class instead of floating point angle - Added EntityOwner::Release +- Add missing `recomputeMoment` parameter to PhysicsComponent2D::SetMass # 0.4: diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index 841b2df34..7d040c5a7 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -60,7 +60,7 @@ namespace Ndk inline void SetElasticity(std::size_t shapeIndex, float friction); inline void SetFriction(float friction); inline void SetFriction(std::size_t shapeIndex, float friction); - inline void SetMass(float mass); + inline void SetMass(float mass, bool recomputeMoment = true); inline void SetMassCenter(const Nz::Vector2f& center, Nz::CoordSys coordSys = Nz::CoordSys_Local); inline void SetMomentOfInertia(float moment); inline void SetPosition(const Nz::Vector2f& position); diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index 35782dcd9..387e50469 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -429,15 +429,16 @@ namespace Ndk * \brief Sets the mass of the physics object * * \param mass Mass of the object + * \param recomputeMoment Should the moment of inertia be recomputed according to the new mass * * \remark Mass must be positive or zero */ - inline void PhysicsComponent2D::SetMass(float mass) + inline void PhysicsComponent2D::SetMass(float mass, bool recomputeMoment) { NazaraAssert(m_object, "Invalid physics object"); NazaraAssert(mass >= 0.f, "Mass should be positive"); - m_object->SetMass(mass); + m_object->SetMass(mass, recomputeMoment); } /*! From 4e9d4c10da40597cfb851e4a8c52d107363a9ceb Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 21 Oct 2018 13:52:14 +0200 Subject: [PATCH 140/352] Network: Add accessors to ENetHost/ENetPeer --- ChangeLog.md | 3 ++- include/Nazara/Network/ENetHost.hpp | 6 +++++- include/Nazara/Network/ENetHost.inl | 21 +++++++++++++++++++++ include/Nazara/Network/ENetPeer.hpp | 2 ++ include/Nazara/Network/ENetPeer.inl | 11 +++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index e0091913d..669f8cc9e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -152,7 +152,8 @@ Nazara Engine: - ⚠️ 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 - + - Added ENetHost and ENetPeer accessor to total packet/data received/sent/lost + Nazara Development Kit: - Added ImageWidget (#139) - ⚠️ Removed TextAreaWidget::GetLineCount diff --git a/include/Nazara/Network/ENetHost.hpp b/include/Nazara/Network/ENetHost.hpp index 28a2d2da5..01f59234b 100644 --- a/include/Nazara/Network/ENetHost.hpp +++ b/include/Nazara/Network/ENetHost.hpp @@ -58,8 +58,12 @@ namespace Nz void Flush(); - inline Nz::IpAddress GetBoundAddress() const; + inline IpAddress GetBoundAddress() const; inline UInt32 GetServiceTime() const; + inline UInt32 GetTotalReceivedPackets() const; + inline UInt64 GetTotalReceivedData() const; + inline UInt64 GetTotalSentData() const; + inline UInt32 GetTotalSentPackets() const; int Service(ENetEvent* event, UInt32 timeout); diff --git a/include/Nazara/Network/ENetHost.inl b/include/Nazara/Network/ENetHost.inl index 11ee91c80..fcb6bf6de 100644 --- a/include/Nazara/Network/ENetHost.inl +++ b/include/Nazara/Network/ENetHost.inl @@ -2,6 +2,7 @@ // This file is part of the "Nazara Engine - Network module" // For conditions of distribution and use, see copyright notice in Config.hpp +#include #include #include @@ -63,6 +64,26 @@ namespace Nz return m_serviceTime; } + inline UInt32 ENetHost::GetTotalReceivedPackets() const + { + return m_totalReceivedPackets; + } + + inline UInt64 ENetHost::GetTotalReceivedData() const + { + return m_totalReceivedData; + } + + inline UInt64 ENetHost::GetTotalSentData() const + { + return m_totalSentData; + } + + inline UInt32 ENetHost::GetTotalSentPackets() const + { + return m_totalSentPackets; + } + inline void ENetHost::SetCompressor(std::unique_ptr&& compressor) { m_compressor = std::move(compressor); diff --git a/include/Nazara/Network/ENetPeer.hpp b/include/Nazara/Network/ENetPeer.hpp index f2435f579..7cba0d4a5 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 UInt32 GetTotalPacketLost() const; + inline UInt32 GetTotalPacketSent() const; inline bool HasPendingCommands(); diff --git a/include/Nazara/Network/ENetPeer.inl b/include/Nazara/Network/ENetPeer.inl index 3f8ffa846..55745ce56 100644 --- a/include/Nazara/Network/ENetPeer.inl +++ b/include/Nazara/Network/ENetPeer.inl @@ -62,6 +62,16 @@ namespace Nz return m_state; } + inline UInt32 ENetPeer::GetTotalPacketLost() const + { + return m_totalPacketLost; + } + + inline UInt32 ENetPeer::GetTotalPacketSent() const + { + return m_totalPacketSent; + } + inline bool ENetPeer::HasPendingCommands() { return m_outgoingReliableCommands.empty() && m_outgoingUnreliableCommands.empty() && m_sentReliableCommands.empty(); @@ -94,3 +104,4 @@ namespace Nz } #include +#include "ENetPeer.hpp" From f3febe5d3490202700a6a2faa55fa655249611aa Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 21 Oct 2018 13:53:06 +0200 Subject: [PATCH 141/352] Network/ENetHost: Comment out warning in case of error --- src/Nazara/Network/ENetHost.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Nazara/Network/ENetHost.cpp b/src/Nazara/Network/ENetHost.cpp index 5744b8743..c5c599b5b 100644 --- a/src/Nazara/Network/ENetHost.cpp +++ b/src/Nazara/Network/ENetHost.cpp @@ -247,7 +247,7 @@ namespace Nz return 1; case -1: - NazaraError("Error receiving incoming packets"); + //NazaraError("Error receiving incoming packets"); return -1; default: @@ -855,9 +855,9 @@ namespace Nz if (channel) { if (!windowWrap && outgoingCommand->sendAttempts < 1 && !(outgoingCommand->reliableSequenceNumber % ENetPeer_ReliableWindowSize) && - ((channel->reliableWindows[(reliableWindow + ENetPeer_ReliableWindows - 1) % ENetPeer_ReliableWindows] >= ENetPeer_ReliableWindowSize) || - channel->usedReliableWindows & ((((1 << ENetPeer_ReliableWindows) - 1) << reliableWindow) | - (((1 << ENetPeer_FreeReliableWindows) - 1) >> (ENetPeer_ReliableWindows - reliableWindow))))) + ((channel->reliableWindows[(reliableWindow + ENetPeer_ReliableWindows - 1) % ENetPeer_ReliableWindows] >= ENetPeer_ReliableWindowSize) || + channel->usedReliableWindows & ((((1 << ENetPeer_ReliableWindows) - 1) << reliableWindow) | + (((1 << ENetPeer_FreeReliableWindows) - 1) >> (ENetPeer_ReliableWindows - reliableWindow))))) windowWrap = true; if (windowWrap) From a292e476738addc2b957ad5a727765a27214bf21 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 24 Oct 2018 20:26:50 +0200 Subject: [PATCH 142/352] Network/ENetPeer: Fix return type of GettotalPacket[Lost|Sent] --- include/Nazara/Network/ENetPeer.hpp | 4 ++-- include/Nazara/Network/ENetPeer.inl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/Nazara/Network/ENetPeer.hpp b/include/Nazara/Network/ENetPeer.hpp index 7cba0d4a5..634f22402 100644 --- a/include/Nazara/Network/ENetPeer.hpp +++ b/include/Nazara/Network/ENetPeer.hpp @@ -56,8 +56,8 @@ namespace Nz inline UInt16 GetPeerId() const; inline UInt32 GetRoundTripTime() const; inline ENetPeerState GetState() const; - inline UInt32 GetTotalPacketLost() const; - inline UInt32 GetTotalPacketSent() const; + inline UInt64 GetTotalPacketLost() const; + inline UInt64 GetTotalPacketSent() const; inline bool HasPendingCommands(); diff --git a/include/Nazara/Network/ENetPeer.inl b/include/Nazara/Network/ENetPeer.inl index 55745ce56..04ec4aae2 100644 --- a/include/Nazara/Network/ENetPeer.inl +++ b/include/Nazara/Network/ENetPeer.inl @@ -62,12 +62,12 @@ namespace Nz return m_state; } - inline UInt32 ENetPeer::GetTotalPacketLost() const + inline UInt64 ENetPeer::GetTotalPacketLost() const { return m_totalPacketLost; } - inline UInt32 ENetPeer::GetTotalPacketSent() const + inline UInt64 ENetPeer::GetTotalPacketSent() const { return m_totalPacketSent; } From 2c0c8ef0a0fc07d3a23b45076bc5dc4e7390e375 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 24 Oct 2018 20:38:20 +0200 Subject: [PATCH 143/352] SDK/PhysicsComponent2D: Add node synchronization --- ChangeLog.md | 1 + .../NDK/Components/PhysicsComponent2D.hpp | 6 ++- .../NDK/Components/PhysicsComponent2D.inl | 37 ++++++++++++++++++- SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 21 +++++++---- 4 files changed, 54 insertions(+), 11 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 669f8cc9e..f821d1910 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -223,6 +223,7 @@ Nazara Development Kit: - ⚠️ Use of the new Angle class instead of floating point angle - Added EntityOwner::Release - Add missing `recomputeMoment` parameter to PhysicsComponent2D::SetMass +- Added possibility of disabling synchronization between PhysicsComponent2D and NodeComponent # 0.4: diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index 7d040c5a7..696a8f99d 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -24,7 +24,7 @@ namespace Ndk friend class ConstraintComponent2D; public: - PhysicsComponent2D() = default; + PhysicsComponent2D(); PhysicsComponent2D(const PhysicsComponent2D& physics); ~PhysicsComponent2D() = default; @@ -36,6 +36,8 @@ namespace Ndk inline bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const; + inline void EnableNodeSynchronization(bool nodeSynchronization); + inline Nz::Rectf GetAABB() const; inline float GetAngularDamping() const; inline Nz::RadianAnglef GetAngularVelocity() const; @@ -52,6 +54,7 @@ namespace Ndk inline std::size_t GetShapeCount() const; inline Nz::Vector2f GetVelocity() const; + inline bool IsNodeSynchronizationEnabled() const; inline bool IsSleeping() const; inline void SetAngularDamping(float angularDamping); @@ -81,6 +84,7 @@ namespace Ndk void OnEntityDestruction() override; std::unique_ptr m_object; + bool m_nodeSynchronizationEnabled; }; } diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index 387e50469..dd90b5f9a 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -7,12 +7,19 @@ namespace Ndk { + /*! + * \brief Constructs a PhysicsComponent2D object by default + */ + inline PhysicsComponent2D::PhysicsComponent2D() : + m_nodeSynchronizationEnabled(true) + { + } + /*! * \brief Constructs a PhysicsComponent2D object by copy semantic * * \param physics PhysicsComponent2D to copy */ - inline PhysicsComponent2D::PhysicsComponent2D(const PhysicsComponent2D& physics) { // No copy of physical object (because we only create it when attached to an entity) @@ -115,6 +122,22 @@ namespace Ndk return m_object->ClosestPointQuery(position, closestPoint, closestDistance); } + /*! + * \brief Enables position/rotation synchronization with the NodeComponent + * + * By default, at every update of the PhysicsSystem2D, the NodeComponent's position and rotation (if any) will be synchronized with + * the values of the PhysicsComponent2D. This function allows to enable/disable this behavior on a per-entity basis. + * + * \param nodeSynchronization Should synchronization occur between NodeComponent and PhysicsComponent2D + */ + inline void PhysicsComponent2D::EnableNodeSynchronization(bool nodeSynchronization) + { + m_nodeSynchronizationEnabled = nodeSynchronization; + + if (m_entity) + m_entity->Invalidate(); + } + /*! * \brief Gets the AABB of the physics object * \return AABB of the object @@ -314,13 +337,23 @@ namespace Ndk return m_object->GetVelocity(); } + /*! + * \brief Checks if position & rotation are synchronized with NodeComponent + * \return true If synchronization is enabled + * + * \see EnableNodeSynchronization + */ + inline bool PhysicsComponent2D::IsNodeSynchronizationEnabled() const + { + return m_nodeSynchronizationEnabled; + } + /*! * \brief Checks whether the entity is currently sleeping * \return true If it is the case * * \remark Produces a NazaraAssert if the physics object is invalid */ - inline bool PhysicsComponent2D::IsSleeping() const { NazaraAssert(m_object, "Invalid physics object"); diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index 69d6a99b1..29baeb6a1 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -147,16 +147,21 @@ namespace Ndk void PhysicsSystem2D::OnEntityValidation(Entity* entity, bool justAdded) { - // It's possible our entity got revalidated because of the addition/removal of a PhysicsComponent3D - if (!justAdded) + if (entity->HasComponent()) { - // We take the opposite array from which the entity should belong to - auto& entities = (entity->HasComponent()) ? m_staticObjects : m_dynamicObjects; - entities.Remove(entity); - } + if (entity->GetComponent().IsNodeSynchronizationEnabled()) + m_dynamicObjects.Insert(entity); + else + m_dynamicObjects.Remove(entity); - auto& entities = (entity->HasComponent()) ? m_dynamicObjects : m_staticObjects; - entities.Insert(entity); + m_staticObjects.Remove(entity); + } + else + { + m_dynamicObjects.Remove(entity); + m_staticObjects.Insert(entity); + + } if (!m_physWorld) CreatePhysWorld(); From fa7cbc21e59345dd7b737bcb44cb2e88fc4f01f9 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 24 Oct 2018 20:54:11 +0200 Subject: [PATCH 144/352] SDK/PhysicsSystem2D: Fix initial position/rotation --- SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index 29baeb6a1..6579bb1fb 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -161,6 +161,17 @@ namespace Ndk m_dynamicObjects.Remove(entity); m_staticObjects.Insert(entity); + // If entities just got added to the system, teleport them to their NodeComponent position/rotation + // This will prevent the physics engine to mess with the scene while correcting position/rotation + if (justAdded) + { + auto& collision = entity->GetComponent(); + auto& node = entity->GetComponent(); + + Nz::RigidBody2D* physObj = collision.GetStaticBody(); + physObj->SetPosition(Nz::Vector2f(node.GetPosition())); + //physObj->SetRotation(node.GetRotation()); + } } if (!m_physWorld) From ed46c87781804ad07ff2768eb0750afbafd9f721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Sun, 28 Oct 2018 01:53:11 +0200 Subject: [PATCH 145/352] Refactor the way resources are loaded (#191) * WIP * WIP * Font works * WIP: Only Music remains * Looks like it's working * Fix oopsie * Core/ObjectRef: Add cast functions * Update ChangeLog.md * Audio/SoundStream: Make sound stream thread-safe --- ChangeLog.md | 2 + SDK/include/NDK/LuaAPI.inl | 16 +- SDK/src/NDK/Lua/LuaBinding_Audio.cpp | 4 +- SDK/src/NDK/Lua/LuaBinding_Graphics.cpp | 7 +- SDK/src/NDK/Lua/LuaBinding_Renderer.cpp | 30 +- SDK/src/NDK/Lua/LuaBinding_Utility.cpp | 4 +- SDK/src/NDK/Widgets/CheckboxWidget.cpp | 6 +- examples/FirstScene/main.cpp | 10 +- examples/MeshInfos/main.cpp | 32 +- examples/Particles/LogoDemo.cpp | 17 +- examples/Particles/LogoDemo.hpp | 2 +- examples/Particles/SpacebattleDemo.cpp | 57 +- examples/Particles/SpacebattleDemo.hpp | 12 +- include/Nazara/Audio/Music.hpp | 26 +- include/Nazara/Audio/SoundBuffer.hpp | 15 +- include/Nazara/Audio/SoundStream.hpp | 30 +- include/Nazara/Core/ObjectRef.hpp | 4 + include/Nazara/Core/ObjectRef.inl | 55 ++ include/Nazara/Core/ResourceLoader.hpp | 14 +- include/Nazara/Core/ResourceLoader.inl | 44 +- include/Nazara/Core/ResourceManager.inl | 8 +- include/Nazara/Graphics/Material.hpp | 9 +- include/Nazara/Graphics/Material.inl | 74 +-- include/Nazara/Graphics/Model.hpp | 8 +- include/Nazara/Graphics/Model.inl | 1 - include/Nazara/Graphics/SkeletalModel.hpp | 14 +- include/Nazara/Graphics/SkeletalModel.inl | 27 + include/Nazara/Renderer/Texture.hpp | 45 +- include/Nazara/Utility/Animation.hpp | 8 +- include/Nazara/Utility/Font.hpp | 9 +- include/Nazara/Utility/Image.hpp | 37 +- include/Nazara/Utility/Mesh.hpp | 8 +- plugins/Assimp/Plugin.cpp | 11 +- src/Nazara/Audio/Formats/sndfileLoader.cpp | 99 ++-- src/Nazara/Audio/Music.cpp | 57 +- src/Nazara/Audio/Sound.cpp | 12 +- src/Nazara/Audio/SoundBuffer.cpp | 36 +- src/Nazara/Audio/SoundStream.cpp | 22 + src/Nazara/Graphics/Formats/MeshLoader.cpp | 65 +-- src/Nazara/Graphics/Formats/TextureLoader.cpp | 12 +- .../Graphics/GuillotineTextureAtlas.cpp | 2 +- src/Nazara/Graphics/Model.cpp | 77 ++- src/Nazara/Graphics/SkeletalModel.cpp | 42 -- src/Nazara/Renderer/Texture.cpp | 516 ++++++++---------- src/Nazara/Utility/Animation.cpp | 30 +- src/Nazara/Utility/Font.cpp | 36 +- src/Nazara/Utility/Formats/DDSLoader.cpp | 12 +- src/Nazara/Utility/Formats/FreeTypeLoader.cpp | 31 +- src/Nazara/Utility/Formats/MD2Loader.cpp | 11 +- src/Nazara/Utility/Formats/MD5AnimLoader.cpp | 7 +- src/Nazara/Utility/Formats/MD5MeshLoader.cpp | 14 +- src/Nazara/Utility/Formats/OBJLoader.cpp | 7 +- src/Nazara/Utility/Formats/PCXLoader.cpp | 33 +- src/Nazara/Utility/Formats/STBLoader.cpp | 20 +- src/Nazara/Utility/GuillotineImageAtlas.cpp | 3 +- src/Nazara/Utility/Image.cpp | 246 ++++----- src/Nazara/Utility/Mesh.cpp | 30 +- tests/Engine/Audio/Music.cpp | 20 +- tests/Engine/Audio/SoundBuffer.cpp | 9 +- tests/Engine/Graphics/Billboard.cpp | 3 +- tests/Engine/Graphics/Model.cpp | 4 +- tests/Engine/Graphics/SkeletalModel.cpp | 19 +- tests/Engine/Graphics/SkyboxBackground.cpp | 3 +- tests/Engine/Graphics/TextureBackground.cpp | 5 +- 64 files changed, 1058 insertions(+), 1071 deletions(-) create mode 100644 include/Nazara/Graphics/SkeletalModel.inl diff --git a/ChangeLog.md b/ChangeLog.md index f821d1910..ad2dd0a55 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -153,6 +153,8 @@ Nazara Engine: - 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 - Added ENetHost and ENetPeer accessor to total packet/data received/sent/lost +- ⚠ **Changed the way resources were Loaded, almost every LoadFromX and OpenFromX methods are now static and create the object themselves.** +- ⚠ SoundStream is now responsible for loaders instead of Music, and is now threadsafe (you can now load a stream only once and play it multiple times at the same time) Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/include/NDK/LuaAPI.inl b/SDK/include/NDK/LuaAPI.inl index 40fe33ec7..e2b1095dc 100644 --- a/SDK/include/NDK/LuaAPI.inl +++ b/SDK/include/NDK/LuaAPI.inl @@ -402,7 +402,7 @@ namespace Nz return 1; } - inline unsigned int LuaImplQueryArg(const LuaState& state, int index, MusicParams* params, TypeTag) + inline unsigned int LuaImplQueryArg(const LuaState& state, int index, SoundBufferParams* params, TypeTag) { state.CheckType(index, Nz::LuaType_Table); @@ -411,7 +411,7 @@ namespace Nz return 1; } - inline unsigned int LuaImplQueryArg(const LuaState& state, int index, SoundBufferParams* params, TypeTag) + inline unsigned int LuaImplQueryArg(const LuaState& state, int index, SoundStreamParams* params, TypeTag) { state.CheckType(index, Nz::LuaType_Table); @@ -635,12 +635,24 @@ namespace Nz return 1; } + inline int LuaImplReplyVal(const LuaState& state, ModelRef&& handle, TypeTag) + { + state.PushInstance("Model", handle); + return 1; + } + inline int LuaImplReplyVal(const LuaState& state, const SoundBuffer* val, TypeTag) { state.PushInstance("SoundBuffer", val); return 1; } + inline int LuaImplReplyVal(const LuaState& state, SoundBufferRef&& handle, TypeTag) + { + state.PushInstance("SoundBuffer", handle); + return 1; + } + inline int LuaImplReplyVal(const LuaState& state, SpriteRef&& handle, TypeTag) { state.PushInstance("Sprite", handle); diff --git a/SDK/src/NDK/Lua/LuaBinding_Audio.cpp b/SDK/src/NDK/Lua/LuaBinding_Audio.cpp index 1611c1b8c..c95b5d0ce 100644 --- a/SDK/src/NDK/Lua/LuaBinding_Audio.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_Audio.cpp @@ -67,7 +67,7 @@ namespace Ndk music.BindMethod("IsLooping", &Nz::Music::IsLooping); - music.BindMethod("OpenFromFile", &Nz::Music::OpenFromFile, Nz::MusicParams()); + music.BindMethod("OpenFromFile", &Nz::Music::OpenFromFile, Nz::SoundStreamParams()); music.BindMethod("Pause", &Nz::Music::Pause); music.BindMethod("Play", &Nz::Music::Play); @@ -138,7 +138,7 @@ namespace Ndk soundBuffer.BindMethod("IsValid", &Nz::SoundBuffer::IsValid); - soundBuffer.BindMethod("LoadFromFile", &Nz::SoundBuffer::LoadFromFile, Nz::SoundBufferParams()); + soundBuffer.BindStaticMethod("LoadFromFile", &Nz::SoundBuffer::LoadFromFile, Nz::SoundBufferParams()); soundBuffer.BindStaticMethod("IsFormatSupported", &Nz::SoundBuffer::IsFormatSupported); diff --git a/SDK/src/NDK/Lua/LuaBinding_Graphics.cpp b/SDK/src/NDK/Lua/LuaBinding_Graphics.cpp index 14105eb3c..fc764866a 100644 --- a/SDK/src/NDK/Lua/LuaBinding_Graphics.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_Graphics.cpp @@ -181,8 +181,6 @@ namespace Ndk material.BindMethod("IsShadowCastingEnabled", &Nz::Material::IsShadowCastingEnabled); material.BindMethod("IsShadowReceiveEnabled", &Nz::Material::IsShadowReceiveEnabled); - material.BindMethod("LoadFromFile", &Nz::Material::LoadFromFile, Nz::MaterialParams()); - material.BindMethod("Reset", &Nz::Material::Reset); material.BindMethod("SetAlphaThreshold", &Nz::Material::SetAlphaThreshold); @@ -205,6 +203,7 @@ namespace Ndk material.BindMethod("SetSrcBlend", &Nz::Material::SetSrcBlend); material.BindStaticMethod("GetDefault", &Nz::Material::GetDefault); + material.BindStaticMethod("LoadFromFile", &Nz::Material::LoadFromFile, Nz::MaterialParams()); material.BindMethod("SetAlphaMap", [] (Nz::LuaState& lua, Nz::MaterialRef& instance, std::size_t /*argumentCount*/) -> int { @@ -308,8 +307,6 @@ namespace Ndk //modelClass.SetMethod("GetMesh", &Nz::Model::GetMesh); model.BindMethod("IsAnimated", &Nz::Model::IsAnimated); - model.BindMethod("LoadFromFile", &Nz::Model::LoadFromFile, Nz::ModelParameters()); - model.BindMethod("SetMaterial", [] (Nz::LuaState& lua, Nz::Model* instance, std::size_t argumentCount) -> int { @@ -371,6 +368,8 @@ namespace Ndk //modelClass.SetMethod("SetMesh", &Nz::Model::SetMesh); //modelClass.SetMethod("SetSequence", &Nz::Model::SetSequence); + + model.BindStaticMethod("LoadFromFile", &Nz::Model::LoadFromFile, Nz::ModelParameters()); } /*********************************** Nz::Sprite ***********************************/ diff --git a/SDK/src/NDK/Lua/LuaBinding_Renderer.cpp b/SDK/src/NDK/Lua/LuaBinding_Renderer.cpp index 108941880..8aacf2a1f 100644 --- a/SDK/src/NDK/Lua/LuaBinding_Renderer.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_Renderer.cpp @@ -44,21 +44,6 @@ namespace Ndk texture.BindMethod("InvalidateMipmaps", &Nz::Texture::InvalidateMipmaps); texture.BindMethod("IsValid", &Nz::Texture::IsValid); - texture.BindMethod("LoadFromFile", &Nz::Texture::LoadFromFile, true, Nz::ImageParams()); - //bool LoadFromImage(const Image& image, bool generateMipmaps = true); - //bool LoadFromMemory(const void* data, std::size_t size, const ImageParams& params = ImageParams(), bool generateMipmaps = true); - //bool LoadFromStream(Stream& stream, const ImageParams& params = ImageParams(), bool generateMipmaps = true); - - texture.BindMethod("LoadArrayFromFile", &Nz::Texture::LoadArrayFromFile, Nz::Vector2ui(2, 2), true, Nz::ImageParams()); - //bool LoadArrayFromImage(const Image& image, bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); - //bool LoadArrayFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); - //bool LoadArrayFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); - - //bool LoadCubemapFromFile(const String& filePath, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); - //bool LoadCubemapFromImage(const Image& image, bool generateMipmaps = true, const CubemapParams& params = CubemapParams()); - //bool LoadCubemapFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); - //bool LoadCubemapFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); - texture.BindMethod("LoadFaceFromFile", &Nz::Texture::LoadFaceFromFile, Nz::ImageParams()); //bool LoadFaceFromMemory(CubemapFace face, const void* data, std::size_t size, const ImageParams& params = ImageParams()); //bool LoadFaceFromStream(CubemapFace face, Stream& stream, const ImageParams& params = ImageParams()); @@ -71,6 +56,21 @@ namespace Ndk texture.BindStaticMethod("IsFormatSupported", &Nz::Texture::IsFormatSupported); texture.BindStaticMethod("IsMipmappingSupported", &Nz::Texture::IsMipmappingSupported); texture.BindStaticMethod("IsTypeSupported", &Nz::Texture::IsTypeSupported); + + texture.BindStaticMethod("LoadFromFile", &Nz::Texture::LoadFromFile, true, Nz::ImageParams()); + //TextureRef LoadFromImage(const Image& image, bool generateMipmaps = true); + //TextureRef LoadFromMemory(const void* data, std::size_t size, const ImageParams& params = ImageParams(), bool generateMipmaps = true); + //TextureRef LoadFromStream(Stream& stream, const ImageParams& params = ImageParams(), bool generateMipmaps = true); + + texture.BindStaticMethod("LoadArrayFromFile", &Nz::Texture::LoadArrayFromFile, Nz::Vector2ui(2, 2), true, Nz::ImageParams()); + //TextureRef LoadArrayFromImage(const Image& image, bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); + //TextureRef LoadArrayFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); + //TextureRef LoadArrayFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); + + //TextureRef LoadCubemapFromFile(const String& filePath, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); + //TextureRef LoadCubemapFromImage(const Image& image, bool generateMipmaps = true, const CubemapParams& params = CubemapParams()); + //TextureRef LoadCubemapFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); + //TextureRef LoadCubemapFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); } /*********************************** Nz::TextureLibrary ***********************************/ diff --git a/SDK/src/NDK/Lua/LuaBinding_Utility.cpp b/SDK/src/NDK/Lua/LuaBinding_Utility.cpp index 5fdd52d01..43ea4a8c7 100644 --- a/SDK/src/NDK/Lua/LuaBinding_Utility.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_Utility.cpp @@ -148,8 +148,6 @@ namespace Ndk font.BindMethod("Precache", (bool(Nz::Font::*)(unsigned int, Nz::UInt32, const Nz::String&) const) &Nz::Font::Precache); - font.BindMethod("OpenFromFile", &Nz::Font::OpenFromFile, Nz::FontParams()); - font.BindMethod("SetGlyphBorder", &Nz::Font::SetGlyphBorder); font.BindMethod("SetMinimumStepSize", &Nz::Font::SetMinimumStepSize); @@ -157,6 +155,8 @@ namespace Ndk font.BindStaticMethod("GetDefaultGlyphBorder", &Nz::Font::GetDefaultGlyphBorder); font.BindStaticMethod("GetDefaultMinimumStepSize", &Nz::Font::GetDefaultMinimumStepSize); + font.BindStaticMethod("OpenFromFile", &Nz::Font::OpenFromFile, Nz::FontParams()); + font.BindStaticMethod("SetDefaultGlyphBorder", &Nz::Font::SetDefaultGlyphBorder); font.BindStaticMethod("SetDefaultMinimumStepSize", &Nz::Font::SetDefaultMinimumStepSize); } diff --git a/SDK/src/NDK/Widgets/CheckboxWidget.cpp b/SDK/src/NDK/Widgets/CheckboxWidget.cpp index 7ea3969de..7d906d8d1 100644 --- a/SDK/src/NDK/Widgets/CheckboxWidget.cpp +++ b/SDK/src/NDK/Widgets/CheckboxWidget.cpp @@ -57,14 +57,14 @@ namespace Ndk #include }; - Nz::TextureRef checkmarkTexture = Nz::Texture::New(); - if (!checkmarkTexture->LoadFromMemory(r_checkmark, sizeof(r_checkmark) / sizeof(r_checkmark[0]))) + Nz::TextureRef checkmarkTexture = Nz::Texture::LoadFromMemory(r_checkmark, sizeof(r_checkmark) / sizeof(r_checkmark[0])); + if (!checkmarkTexture) { NazaraError("Failed to load embedded checkmark"); return false; } - Nz::TextureLibrary::Register("Ndk::CheckboxWidget::checkmark", checkmarkTexture); + Nz::TextureLibrary::Register("Ndk::CheckboxWidget::checkmark", std::move(checkmarkTexture)); return true; } diff --git a/examples/FirstScene/main.cpp b/examples/FirstScene/main.cpp index a4ce40454..0e3f8f8a2 100644 --- a/examples/FirstScene/main.cpp +++ b/examples/FirstScene/main.cpp @@ -56,8 +56,8 @@ int main() // En réalité les textures "cubemap" regroupent six faces en une, pour faciliter leur utilisation. // Nous créons une nouvelle texture et prenons une référence sur celle-ci (à la manière des pointeurs intelligents) - Nz::TextureRef texture = Nz::Texture::New(); - if (texture->LoadCubemapFromFile("resources/skybox-space.png")) + Nz::TextureRef texture = Nz::Texture::LoadCubemapFromFile("resources/skybox-space.png"); + if (texture) { // Si la création du cubemap a fonctionné @@ -83,9 +83,6 @@ int main() // Les modèles représentent, globalement, tout ce qui est visible en trois dimensions. // Nous choisirons ici un vaisseau spatial (Quoi de mieux pour une scène spatiale ?) - // Encore une fois, nous récupérons une référence plutôt que l'objet lui-même (cela va être très utile par la suite) - Nz::ModelRef spaceshipModel = Nz::Model::New(); - // Nous allons charger notre modèle depuis un fichier, mais nous pouvons ajuster le modèle lors du chargement via // une structure permettant de paramétrer le chargement des modèles Nz::ModelParameters params; @@ -104,7 +101,8 @@ int main() // On charge ensuite le modèle depuis son fichier // Le moteur va charger le fichier et essayer de retrouver les fichiers associés (comme les matériaux, textures, ...) - if (!spaceshipModel->LoadFromFile("resources/Spaceship/spaceship.obj", params)) + Nz::ModelRef spaceshipModel = Nz::Model::LoadFromFile("resources/Spaceship/spaceship.obj", params); + if (!spaceshipModel) { // Si le chargement a échoué (fichier inexistant/invalide), il ne sert à rien de continuer std::cout << "Failed to load spaceship" << std::endl; diff --git a/examples/MeshInfos/main.cpp b/examples/MeshInfos/main.cpp index bac5398fe..e7b3feaeb 100644 --- a/examples/MeshInfos/main.cpp +++ b/examples/MeshInfos/main.cpp @@ -71,15 +71,15 @@ int main() if (iChoice == 0) break; - Nz::Mesh mesh; - if (!mesh.LoadFromFile(resourceDirectory.GetPath() + '/' + models[iChoice-1])) + Nz::MeshRef mesh = Nz::Mesh::LoadFromFile(resourceDirectory.GetPath() + '/' + models[iChoice-1]); + if (!mesh) { std::cout << "Failed to load mesh" << std::endl; std::getchar(); return EXIT_FAILURE; } - switch (mesh.GetAnimationType()) + switch (mesh->GetAnimationType()) { case Nz::AnimationType_Skeletal: std::cout << "This is a skeletal-animated mesh" << std::endl; @@ -92,13 +92,13 @@ int main() // Inutile de faire un case default (GetAnimationType renverra toujours une valeur correcte) } - std::cout << "It has a total of " << mesh.GetVertexCount() << " vertices for " << mesh.GetSubMeshCount() << " submesh(es)." << std::endl; + std::cout << "It has a total of " << mesh->GetVertexCount() << " vertices for " << mesh->GetSubMeshCount() << " submesh(es)." << std::endl; - if (mesh.IsAnimable()) + if (mesh->IsAnimable()) { - if (mesh.GetAnimationType() == Nz::AnimationType_Skeletal) + if (mesh->GetAnimationType() == Nz::AnimationType_Skeletal) { - const Nz::Skeleton* skeleton = mesh.GetSkeleton(); + const Nz::Skeleton* skeleton = mesh->GetSkeleton(); unsigned int jointCount = skeleton->GetJointCount(); std::cout << "It has a skeleton made of " << skeleton->GetJointCount() << " joint(s)." << std::endl; std::cout << "Print joints ? (Y/N) "; @@ -123,14 +123,14 @@ int main() } } - Nz::String animationPath = mesh.GetAnimation(); + Nz::String animationPath = mesh->GetAnimation(); if (!animationPath.IsEmpty()) { - Nz::Animation animation; - if (animation.LoadFromFile(animationPath)) + Nz::AnimationRef animation = Nz::Animation::LoadFromFile(animationPath); + if (animation) { - unsigned int sequenceCount = animation.GetSequenceCount(); - std::cout << "It has an animation made of " << animation.GetFrameCount() << " frame(s) for " << sequenceCount << " sequence(s)." << std::endl; + unsigned int sequenceCount = animation->GetSequenceCount(); + std::cout << "It has an animation made of " << animation->GetFrameCount() << " frame(s) for " << sequenceCount << " sequence(s)." << std::endl; std::cout << "Print sequences ? (Y/N) "; char cChoice; @@ -141,7 +141,7 @@ int main() { for (unsigned int i = 0; i < sequenceCount; ++i) { - const Nz::Sequence* sequence = animation.GetSequence(i); + const Nz::Sequence* sequence = animation->GetSequence(i); std::cout << "\t" << (i+1) << ": " << sequence->name << std::endl; std::cout << "\t\tStart frame: " << sequence->firstFrame << std::endl; std::cout << "\t\tFrame count: " << sequence->frameCount << std::endl; @@ -157,10 +157,10 @@ int main() std::cout << "It's animable but has no animation information" << std::endl; } - Nz::Boxf cube = mesh.GetAABB(); + Nz::Boxf cube = mesh->GetAABB(); std::cout << "Mesh is " << cube.width << " units wide, " << cube.height << " units height and " << cube.depth << " units depth" << std::endl; - unsigned int materialCount = mesh.GetMaterialCount(); + unsigned int materialCount = mesh->GetMaterialCount(); std::cout << "It has " << materialCount << " materials registred" << std::endl; std::cout << "Print materials ? (Y/N) "; @@ -172,7 +172,7 @@ int main() { for (unsigned int i = 0; i < materialCount; ++i) { - const Nz::ParameterList& matData = mesh.GetMaterialData(i); + const Nz::ParameterList& matData = mesh->GetMaterialData(i); Nz::String data; if (!matData.GetStringParameter(Nz::MaterialData::FilePath, &data)) diff --git a/examples/Particles/LogoDemo.cpp b/examples/Particles/LogoDemo.cpp index 0811191e1..f04ce43ad 100644 --- a/examples/Particles/LogoDemo.cpp +++ b/examples/Particles/LogoDemo.cpp @@ -107,7 +107,7 @@ class SpriteRenderer : public Nz::ParticleRenderer { } - void Render(const Nz::ParticleGroup& system, const Nz::ParticleMapper& mapper, unsigned int startId, unsigned int endId, Nz::AbstractRenderQueue* renderQueue) + void Render(const Nz::ParticleGroup& system, const Nz::ParticleMapper& mapper, unsigned int startId, unsigned int endId, Nz::AbstractRenderQueue* renderQueue) override { Nz::Vector2f size(1.f, 1.f); Nz::SparsePtr sizePtr(&size, 0); @@ -126,18 +126,19 @@ ParticleDemo("Logo", sharedData) Nz::ImageParams params; params.loadFormat = Nz::PixelFormatType_RGBA8; - if (!m_logo.LoadFromFile("resources/Logo.png", params)) + m_logo = Nz::Image::LoadFromFile("resources/Logo.png", params); + if (!m_logo) NazaraError("Failed to load logo!"); - unsigned int width = m_logo.GetWidth(); - unsigned int height = m_logo.GetHeight(); + unsigned int width = m_logo->GetWidth(); + unsigned int height = m_logo->GetHeight(); m_pixels.reserve(width * height); for (unsigned int x = 0; x < width; ++x) { for (unsigned int y = 0; y < height; ++y) { - Nz::Color color = m_logo.GetPixelColor(x, y); + Nz::Color color = m_logo->GetPixelColor(x, y); if (color.a == 0) continue; @@ -173,8 +174,8 @@ void LogoExample::Enter(Ndk::StateMachine& fsm) m_shared.world3D->GetSystem().SetDefaultBackground(nullptr); - Nz::TextureRef backgroundTexture = Nz::Texture::New(); - if (backgroundTexture->LoadFromFile("resources/stars-background.jpg")) + Nz::TextureRef backgroundTexture = Nz::Texture::LoadFromFile("resources/stars-background.jpg"); + if (backgroundTexture) m_shared.world2D->GetSystem().SetDefaultBackground(Nz::TextureBackground::New(std::move(backgroundTexture))); Ndk::EntityHandle particleGroupEntity = m_shared.world2D->CreateEntity(); @@ -254,7 +255,7 @@ void LogoExample::ResetParticles(float elapsed) Nz::Vector2ui size = m_shared.target->GetSize(); Nz::Vector2f center = {size.x / 2.f, size.y / 2.f}; - Nz::Vector2f offset = center - Nz::Vector2f(Nz::Vector2ui(m_logo.GetSize()) / 2); + Nz::Vector2f offset = center - Nz::Vector2f(Nz::Vector2ui(m_logo->GetSize()) / 2); std::uniform_real_distribution disX(0.f, float(size.x)); std::uniform_real_distribution disY(-float(size.y) * 0.5f, float(size.y) * 1.5f); diff --git a/examples/Particles/LogoDemo.hpp b/examples/Particles/LogoDemo.hpp index 7ce594080..bd0536edf 100644 --- a/examples/Particles/LogoDemo.hpp +++ b/examples/Particles/LogoDemo.hpp @@ -32,7 +32,7 @@ class LogoExample : public ParticleDemo Nz::BackgroundRef m_oldBackground; void* m_particles; Nz::Clock m_mouseClock; - Nz::Image m_logo; + Nz::ImageRef m_logo; Nz::ParticleControllerRef m_controller; Nz::ParticleDeclarationRef m_declaration; Nz::ParticleRendererRef m_renderer; diff --git a/examples/Particles/SpacebattleDemo.cpp b/examples/Particles/SpacebattleDemo.cpp index 2bd30940c..65336ad13 100644 --- a/examples/Particles/SpacebattleDemo.cpp +++ b/examples/Particles/SpacebattleDemo.cpp @@ -234,52 +234,59 @@ ParticleDemo("Space battle", sharedData) Nz::Color grey(100, 100, 100); - if (!m_turret.baseModel.LoadFromFile("resources/Turret/base.obj", parameters)) + m_turret.baseModel = Nz::Model::LoadFromFile("resources/Turret/base.obj", parameters); + if (!m_turret.baseModel) NazaraWarning("Failed to load base.obj"); - for (unsigned int i = 0; i < m_turret.baseModel.GetMaterialCount(); ++i) - m_turret.baseModel.GetMaterial(i)->SetDiffuseColor(grey); + for (unsigned int i = 0; i < m_turret.baseModel->GetMaterialCount(); ++i) + m_turret.baseModel->GetMaterial(i)->SetDiffuseColor(grey); - if (!m_turret.rotatingBaseModel.LoadFromFile("resources/Turret/rotating_base.obj", parameters)) + m_turret.rotatingBaseModel = Nz::Model::LoadFromFile("resources/Turret/rotating_base.obj", parameters); + if (!m_turret.rotatingBaseModel) NazaraWarning("Failed to load rotating_base.obj"); - for (unsigned int i = 0; i < m_turret.rotatingBaseModel.GetMaterialCount(); ++i) - m_turret.rotatingBaseModel.GetMaterial(i)->SetDiffuseColor(grey); + for (unsigned int i = 0; i < m_turret.rotatingBaseModel->GetMaterialCount(); ++i) + m_turret.rotatingBaseModel->GetMaterial(i)->SetDiffuseColor(grey); - if (!m_turret.cannonBaseModel.LoadFromFile("resources/Turret/cannon_base.obj", parameters)) + m_turret.cannonBaseModel = Nz::Model::LoadFromFile("resources/Turret/cannon_base.obj", parameters); + if (!m_turret.cannonBaseModel) NazaraWarning("Failed to load cannon_base.obj"); - for (unsigned int i = 0; i < m_turret.cannonBaseModel.GetMaterialCount(); ++i) - m_turret.cannonBaseModel.GetMaterial(i)->SetDiffuseColor(grey); + for (unsigned int i = 0; i < m_turret.cannonBaseModel->GetMaterialCount(); ++i) + m_turret.cannonBaseModel->GetMaterial(i)->SetDiffuseColor(grey); parameters.mesh.texCoordScale.Set(40.f, 40.f); parameters.mesh.matrix = Nz::Matrix4f::Rotate(Nz::EulerAnglesf(0.f, 180.f, 0.f)); - if (!m_turret.cannonModel.LoadFromFile("resources/Turret/cannon.obj", parameters)) + + m_turret.cannonModel = Nz::Model::LoadFromFile("resources/Turret/cannon.obj", parameters); + if (!m_turret.cannonModel) NazaraWarning("Failed to load cannon.obj"); - // Since OBJ don't support normal maps.. - m_turret.cannonModel.GetMaterial(0)->SetNormalMap("resources/Turret/198_norm.jpg"); + // Since OBJ doesn't support normal maps.. + 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.center = true; - if (!m_spacestationModel.LoadFromFile("resources/SpaceStation/space_station.obj", parameters)) + m_spacestationModel = Nz::Model::LoadFromFile("resources/SpaceStation/space_station.obj", parameters); + if (!m_spacestationModel) NazaraWarning("Failed to load space_station.obj"); - m_spacestationModel.GetMesh()->GenerateNormalsAndTangents(); + m_spacestationModel->GetMesh()->GenerateNormalsAndTangents(); parameters.mesh.texCoordScale.Set(1.f, -1.f); parameters.mesh.matrix.MakeRotation(Nz::EulerAnglesf(0.f, -90.f, 0.f)); - if (!m_spaceshipModel.LoadFromFile("resources/space_frigate_6/space_frigate_6.obj", parameters)) + m_spaceshipModel = Nz::Model::LoadFromFile("resources/space_frigate_6/space_frigate_6.obj", parameters); + if (!m_spaceshipModel) NazaraWarning("Failed to load space_frigate_6.obj"); - // Since OBJ don't support normal maps.. - for (unsigned int i = 0; i < m_spaceshipModel.GetMaterialCount(); ++i) + // Since OBJ doesn't support normal maps.. + for (unsigned int i = 0; i < m_spaceshipModel->GetMaterialCount(); ++i) { - m_spaceshipModel.GetMaterial(i)->SetEmissiveMap("resources/space_frigate_6/space_frigate_6_illumination.jpg"); - m_spaceshipModel.GetMaterial(i)->SetNormalMap("resources/space_frigate_6/space_frigate_6_normal.png"); + m_spaceshipModel->GetMaterial(i)->SetEmissiveMap("resources/space_frigate_6/space_frigate_6_illumination.jpg"); + m_spaceshipModel->GetMaterial(i)->SetNormalMap("resources/space_frigate_6/space_frigate_6_normal.png"); } Nz::TextureRef skyboxCubemap = Nz::Texture::New(); @@ -324,7 +331,7 @@ ParticleDemo("Space battle", sharedData) m_spaceshipTemplate->AddComponent(); m_spaceshipTemplate->AddComponent(); auto& gfxComponent = m_spaceshipTemplate->AddComponent(); - gfxComponent.Attach(&m_spaceshipModel); + gfxComponent.Attach(m_spaceshipModel); m_ambientMusic.OpenFromFile("resources/ambience.ogg"); m_ambientMusic.SetVolume(60.f); @@ -762,7 +769,7 @@ void SpacebattleExample::CreateSpaceShip() spacestationNode.SetScale(0.1f); Ndk::GraphicsComponent& spacestationGfx = m_spacestationEntity->AddComponent(); - spacestationGfx.Attach(&m_spacestationModel); + spacestationGfx.Attach(m_spacestationModel); } void SpacebattleExample::CreateTurret() @@ -776,7 +783,7 @@ void SpacebattleExample::CreateTurret() baseNode.SetRotation(Nz::EulerAnglesf(0.f, 180.f, 0.f)); Ndk::GraphicsComponent& baseGfx = m_turret.baseEntity->AddComponent(); - baseGfx.Attach(&m_turret.baseModel); + baseGfx.Attach(m_turret.baseModel); // Rotating base m_turret.rotatingBaseEntity = m_shared.world3D->CreateEntity(); @@ -786,7 +793,7 @@ void SpacebattleExample::CreateTurret() rotatingBaseNode.SetParent(m_turret.baseEntity); Ndk::GraphicsComponent& rotatingBaseGfx = m_turret.rotatingBaseEntity->AddComponent(); - rotatingBaseGfx.Attach(&m_turret.rotatingBaseModel); + rotatingBaseGfx.Attach(m_turret.rotatingBaseModel); // Cannon base m_turret.cannonBaseEntity = m_shared.world3D->CreateEntity(); @@ -797,7 +804,7 @@ void SpacebattleExample::CreateTurret() cannonBaseNode.SetParent(m_turret.rotatingBaseEntity); Ndk::GraphicsComponent& cannonBaseGfx = m_turret.cannonBaseEntity->AddComponent(); - cannonBaseGfx.Attach(&m_turret.cannonBaseModel); + cannonBaseGfx.Attach(m_turret.cannonBaseModel); // Cannon anchor m_turret.cannonAnchorEntity = m_shared.world3D->CreateEntity(); @@ -816,7 +823,7 @@ void SpacebattleExample::CreateTurret() cannonNode.SetRotation(Nz::EulerAnglesf(0.f, 180.f, 0.f)); Ndk::GraphicsComponent& cannonGfx = m_turret.cannonEntity->AddComponent(); - cannonGfx.Attach(&m_turret.cannonModel); + cannonGfx.Attach(m_turret.cannonModel); } void SpacebattleExample::OnMouseMoved(const Nz::EventHandler* /*eventHandler*/, const Nz::WindowEvent::MouseMoveEvent& event) diff --git a/examples/Particles/SpacebattleDemo.hpp b/examples/Particles/SpacebattleDemo.hpp index a41be7504..e0b928e19 100644 --- a/examples/Particles/SpacebattleDemo.hpp +++ b/examples/Particles/SpacebattleDemo.hpp @@ -33,10 +33,10 @@ class SpacebattleExample : public ParticleDemo struct Turret { - Nz::Model baseModel; - Nz::Model cannonModel; - Nz::Model cannonBaseModel; - Nz::Model rotatingBaseModel; + Nz::ModelRef baseModel; + Nz::ModelRef cannonModel; + Nz::ModelRef cannonBaseModel; + Nz::ModelRef rotatingBaseModel; Ndk::EntityHandle baseEntity; Ndk::EntityHandle cannonAnchorEntity; Ndk::EntityHandle cannonEntity; @@ -50,8 +50,8 @@ class SpacebattleExample : public ParticleDemo float m_turretBaseRotation; float m_turretCannonBaseRotation; float m_turretShootTimer; - Nz::Model m_spaceshipModel; - Nz::Model m_spacestationModel; + Nz::ModelRef m_spaceshipModel; + Nz::ModelRef m_spacestationModel; Nz::Music m_ambientMusic; Nz::ParticleDeclarationRef m_torpedoDeclaration; Nz::ParticleRendererRef m_laserBeamRenderer; diff --git a/include/Nazara/Audio/Music.hpp b/include/Nazara/Audio/Music.hpp index 27e742063..331624a8d 100644 --- a/include/Nazara/Audio/Music.hpp +++ b/include/Nazara/Audio/Music.hpp @@ -10,31 +10,15 @@ #include #include #include +#include #include -#include -#include -#include namespace Nz { - struct MusicParams : ResourceParameters - { - bool forceMono = false; - - bool IsValid() const; - }; - - class Music; - class SoundStream; - - using MusicLoader = ResourceLoader; - struct MusicImpl; class NAZARA_AUDIO_API Music : public Resource, public SoundEmitter { - friend MusicLoader; - public: Music() = default; Music(const Music&) = delete; @@ -55,9 +39,9 @@ namespace Nz bool IsLooping() const override; - bool OpenFromFile(const String& filePath, const MusicParams& params = MusicParams()); - bool OpenFromMemory(const void* data, std::size_t size, const MusicParams& params = MusicParams()); - bool OpenFromStream(Stream& stream, const MusicParams& params = MusicParams()); + bool OpenFromFile(const String& filePath, const SoundStreamParams& params = SoundStreamParams()); + bool OpenFromMemory(const void* data, std::size_t size, const SoundStreamParams& params = SoundStreamParams()); + bool OpenFromStream(Stream& stream, const SoundStreamParams& params = SoundStreamParams()); void Pause() override; void Play() override; @@ -75,8 +59,6 @@ namespace Nz bool FillAndQueueBuffer(unsigned int buffer); void MusicThread(); void StopThread(); - - static MusicLoader::LoaderList s_loaders; }; } diff --git a/include/Nazara/Audio/SoundBuffer.hpp b/include/Nazara/Audio/SoundBuffer.hpp index 46f37ab05..4cf5e50df 100644 --- a/include/Nazara/Audio/SoundBuffer.hpp +++ b/include/Nazara/Audio/SoundBuffer.hpp @@ -66,16 +66,17 @@ namespace Nz bool IsValid() const; - bool LoadFromFile(const String& filePath, const SoundBufferParams& params = SoundBufferParams()); - bool LoadFromMemory(const void* data, std::size_t size, const SoundBufferParams& params = SoundBufferParams()); - bool LoadFromStream(Stream& stream, const SoundBufferParams& params = SoundBufferParams()); - - static bool IsFormatSupported(AudioFormat format); - template static SoundBufferRef New(Args&&... args); - SoundBuffer& operator=(const SoundBuffer&) = delete; SoundBuffer& operator=(SoundBuffer&&) = delete; + static bool IsFormatSupported(AudioFormat format); + + static SoundBufferRef LoadFromFile(const String& filePath, const SoundBufferParams& params = SoundBufferParams()); + static SoundBufferRef LoadFromMemory(const void* data, std::size_t size, const SoundBufferParams& params = SoundBufferParams()); + static SoundBufferRef LoadFromStream(Stream& stream, const SoundBufferParams& params = SoundBufferParams()); + + template static SoundBufferRef New(Args&&... args); + // Signals: NazaraSignal(OnSoundBufferDestroy, const SoundBuffer* /*soundBuffer*/); NazaraSignal(OnSoundBufferRelease, const SoundBuffer* /*soundBuffer*/); diff --git a/include/Nazara/Audio/SoundStream.hpp b/include/Nazara/Audio/SoundStream.hpp index 9b9731b41..d33997d26 100644 --- a/include/Nazara/Audio/SoundStream.hpp +++ b/include/Nazara/Audio/SoundStream.hpp @@ -10,22 +10,50 @@ #include #include #include +#include +#include +#include +#include namespace Nz { - class NAZARA_AUDIO_API SoundStream + struct SoundStreamParams : public ResourceParameters { + bool forceMono = false; + + bool IsValid() const; + }; + + class Mutex; + class SoundStream; + + using SoundStreamLoader = ResourceLoader; + using SoundStreamRef = Nz::ObjectRef; + + class NAZARA_AUDIO_API SoundStream : public RefCounted, public Resource + { + friend SoundStreamLoader; + public: SoundStream() = default; virtual ~SoundStream(); virtual UInt32 GetDuration() const = 0; virtual AudioFormat GetFormat() const = 0; + virtual Mutex& GetMutex() = 0; virtual UInt64 GetSampleCount() const = 0; virtual UInt32 GetSampleRate() const = 0; virtual UInt64 Read(void* buffer, UInt64 sampleCount) = 0; virtual void Seek(UInt64 offset) = 0; + virtual UInt64 Tell() = 0; + + static SoundStreamRef OpenFromFile(const String& filePath, const SoundStreamParams& params = SoundStreamParams()); + static SoundStreamRef OpenFromMemory(const void* data, std::size_t size, const SoundStreamParams& params = SoundStreamParams()); + static SoundStreamRef OpenFromStream(Stream& stream, const SoundStreamParams& params = SoundStreamParams()); + + private: + static SoundStreamLoader::LoaderList s_loaders; }; } diff --git a/include/Nazara/Core/ObjectRef.hpp b/include/Nazara/Core/ObjectRef.hpp index c7959efc8..cb100c554 100644 --- a/include/Nazara/Core/ObjectRef.hpp +++ b/include/Nazara/Core/ObjectRef.hpp @@ -68,6 +68,10 @@ namespace Nz template bool operator>=(const T& lhs, const ObjectRef& rhs); template bool operator>=(const ObjectRef& lhs, const T& rhs); + template ObjectRef ConstRefCast(const ObjectRef& ref); + template ObjectRef DynamicRefCast(const ObjectRef& ref); + template ObjectRef ReinterpretRefCast(const ObjectRef& ref); + template ObjectRef StaticRefCast(const ObjectRef& ref); template struct PointedType> { using type = T; }; template struct PointedType const> { using type = T; }; diff --git a/include/Nazara/Core/ObjectRef.inl b/include/Nazara/Core/ObjectRef.inl index b4d89531c..f592fd501 100644 --- a/include/Nazara/Core/ObjectRef.inl +++ b/include/Nazara/Core/ObjectRef.inl @@ -480,6 +480,60 @@ namespace Nz { return !(lhs < rhs); } + + /*! + * \brief Casts an ObjectRef from one type to another using static_cast + * \return Reference to the casted object + * + * \param ref The reference to convert + * + * \remark It is an undefined behavior to cast between incompatible types + */ + template + ObjectRef ConstRefCast(const ObjectRef& ref) + { + return ObjectRef(const_cast(ref.Get())); + } + + /*! + * \brief Casts an ObjectRef from one type to another using static_cast + * \return Reference to the casted object + * + * \param ref The reference to convert + */ + template + ObjectRef DynamicRefCast(const ObjectRef& ref) + { + return ObjectRef(dynamic_cast(ref.Get())); + } + + /*! + * \brief Casts an ObjectRef from one type to another using static_cast + * \return Reference to the casted object + * + * \param ref The reference to convert + * + * \remark It is an undefined behavior to cast between incompatible types + */ + template + ObjectRef ReinterpretRefCast(const ObjectRef& ref) + { + return ObjectRef(static_cast(ref.Get())); + } + + /*! + * \brief Casts an ObjectRef from one type to another using static_cast + * \return Reference to the casted object + * + * \param ref The reference to convert + * + * \remark It is an undefined behavior to cast between incompatible types + */ + template + ObjectRef StaticRefCast(const ObjectRef& ref) + { + return ObjectRef(static_cast(ref.Get())); + } } namespace std @@ -504,3 +558,4 @@ namespace std } #include +#include "ObjectRef.hpp" diff --git a/include/Nazara/Core/ResourceLoader.hpp b/include/Nazara/Core/ResourceLoader.hpp index 3fce094e0..1bee093ee 100644 --- a/include/Nazara/Core/ResourceLoader.hpp +++ b/include/Nazara/Core/ResourceLoader.hpp @@ -8,6 +8,8 @@ #define NAZARA_RESOURCELOADER_HPP #include +#include +#include #include #include #include @@ -28,19 +30,19 @@ namespace Nz public: using ExtensionGetter = bool (*)(const String& extension); - using FileLoader = bool (*)(Type* resource, const String& filePath, const Parameters& parameters); - using MemoryLoader = bool (*)(Type* resource, const void* data, std::size_t size, const Parameters& parameters); + using FileLoader = ObjectRef (*)(const String& filePath, const Parameters& parameters); + using MemoryLoader = ObjectRef (*)(const void* data, std::size_t size, const Parameters& parameters); using StreamChecker = Ternary (*)(Stream& stream, const Parameters& parameters); - using StreamLoader = bool (*)(Type* resource, Stream& stream, const Parameters& parameters); + using StreamLoader = ObjectRef (*)(Stream& stream, const Parameters& parameters); ResourceLoader() = delete; ~ResourceLoader() = delete; static bool IsExtensionSupported(const String& extension); - static bool LoadFromFile(Type* resource, const String& filePath, const Parameters& parameters = Parameters()); - static bool LoadFromMemory(Type* resource, const void* data, std::size_t size, const Parameters& parameters = Parameters()); - static bool LoadFromStream(Type* resource, Stream& stream, const Parameters& parameters = Parameters()); + static ObjectRef LoadFromFile(const String& filePath, const Parameters& parameters = Parameters()); + static ObjectRef LoadFromMemory(const void* data, std::size_t size, const Parameters& parameters = Parameters()); + static ObjectRef LoadFromStream(Stream& stream, const Parameters& parameters = Parameters()); static void RegisterLoader(ExtensionGetter extensionGetter, StreamChecker checkFunc, StreamLoader streamLoader, FileLoader fileLoader = nullptr, MemoryLoader memoryLoader = nullptr); static void UnregisterLoader(ExtensionGetter extensionGetter, StreamChecker checkFunc, StreamLoader streamLoader, FileLoader fileLoader = nullptr, MemoryLoader memoryLoader = nullptr); diff --git a/include/Nazara/Core/ResourceLoader.inl b/include/Nazara/Core/ResourceLoader.inl index c60be5674..db143c3b0 100644 --- a/include/Nazara/Core/ResourceLoader.inl +++ b/include/Nazara/Core/ResourceLoader.inl @@ -53,9 +53,8 @@ namespace Nz * \remark Produces a NazaraError if all loaders failed or no loader was found */ template - bool ResourceLoader::LoadFromFile(Type* resource, const String& filePath, const Parameters& parameters) + ObjectRef ResourceLoader::LoadFromFile(const String& filePath, const Parameters& parameters) { - NazaraAssert(resource, "Invalid resource"); NazaraAssert(parameters.IsValid(), "Invalid parameters"); String path = File::NormalizePath(filePath); @@ -63,7 +62,7 @@ namespace Nz if (ext.IsEmpty()) { NazaraError("Failed to get file extension from \"" + filePath + '"'); - return false; + return nullptr; } File file(path); // Open only if needed @@ -84,7 +83,7 @@ namespace Nz if (!file.Open(OpenMode_ReadOnly)) { NazaraError("Failed to load file: unable to open \"" + filePath + '"'); - return false; + return nullptr; } } @@ -107,10 +106,11 @@ namespace Nz found = true; } - if (fileLoader(resource, filePath, parameters)) + ObjectRef resource = fileLoader(filePath, parameters); + if (resource) { resource->SetFilePath(filePath); - return true; + return resource; } } else @@ -125,10 +125,11 @@ namespace Nz file.SetCursorPos(0); - if (streamLoader(resource, file, parameters)) + ObjectRef resource = streamLoader(file, parameters); + if (resource) { resource->SetFilePath(filePath); - return true; + return resource; } } @@ -141,7 +142,7 @@ namespace Nz else NazaraError("Failed to load file: no loader found for extension \"" + ext + '"'); - return false; + return nullptr; } /*! @@ -160,9 +161,8 @@ namespace Nz * \remark Produces a NazaraError if all loaders failed or no loader was found */ template - bool ResourceLoader::LoadFromMemory(Type* resource, const void* data, std::size_t size, const Parameters& parameters) + ObjectRef ResourceLoader::LoadFromMemory(const void* data, std::size_t size, const Parameters& parameters) { - NazaraAssert(resource, "Invalid resource"); NazaraAssert(data, "Invalid data pointer"); NazaraAssert(size, "No data to load"); NazaraAssert(parameters.IsValid(), "Invalid parameters"); @@ -195,8 +195,9 @@ namespace Nz found = true; } - if (memoryLoader(resource, data, size, parameters)) - return true; + ObjectRef resource = memoryLoader(data, size, parameters); + if (resource) + return resource; } else { @@ -210,8 +211,9 @@ namespace Nz stream.SetCursorPos(0); - if (streamLoader(resource, stream, parameters)) - return true; + ObjectRef resource = streamLoader(stream, parameters); + if (resource) + return resource; } if (recognized == Ternary_True) @@ -223,7 +225,7 @@ namespace Nz else NazaraError("Failed to load file: no loader found"); - return false; + return nullptr; } /*! @@ -241,9 +243,8 @@ namespace Nz * \remark Produces a NazaraError if all loaders failed or no loader was found */ template - bool ResourceLoader::LoadFromStream(Type* resource, Stream& stream, const Parameters& parameters) + ObjectRef ResourceLoader::LoadFromStream(Stream& stream, const Parameters& parameters) { - NazaraAssert(resource, "Invalid resource"); NazaraAssert(stream.GetCursorPos() < stream.GetSize(), "No data to load"); NazaraAssert(parameters.IsValid(), "Invalid parameters"); @@ -267,8 +268,9 @@ namespace Nz stream.SetCursorPos(streamPos); // Load of the resource - if (streamLoader(resource, stream, parameters)) - return true; + ObjectRef resource = streamLoader(stream, parameters); + if (resource) + return resource; if (recognized == Ternary_True) NazaraWarning("Loader failed"); @@ -279,7 +281,7 @@ namespace Nz else NazaraError("Failed to load file: no loader found"); - return false; + return nullptr; } /*! diff --git a/include/Nazara/Core/ResourceManager.inl b/include/Nazara/Core/ResourceManager.inl index d590cc680..ca381fce7 100644 --- a/include/Nazara/Core/ResourceManager.inl +++ b/include/Nazara/Core/ResourceManager.inl @@ -37,14 +37,8 @@ namespace Nz auto it = Type::s_managerMap.find(absolutePath); if (it == Type::s_managerMap.end()) { - ObjectRef resource = Type::New(); + ObjectRef resource = Type::LoadFromFile(absolutePath, GetDefaultParameters()); if (!resource) - { - NazaraError("Failed to create resource"); - return ObjectRef(); - } - - if (!resource->LoadFromFile(absolutePath, GetDefaultParameters())) { NazaraError("Failed to load resource from file: " + absolutePath); return ObjectRef(); diff --git a/include/Nazara/Graphics/Material.hpp b/include/Nazara/Graphics/Material.hpp index 9903553a5..00cbbcbdb 100644 --- a/include/Nazara/Graphics/Material.hpp +++ b/include/Nazara/Graphics/Material.hpp @@ -137,10 +137,6 @@ namespace Nz inline bool IsShadowCastingEnabled() const; inline bool IsShadowReceiveEnabled() const; - inline bool LoadFromFile(const String& filePath, const MaterialParams& params = MaterialParams()); - inline bool LoadFromMemory(const void* data, std::size_t size, const MaterialParams& params = MaterialParams()); - inline bool LoadFromStream(Stream& stream, const MaterialParams& params = MaterialParams()); - void Reset(); void SaveToParameters(ParameterList* matData); @@ -180,6 +176,11 @@ namespace Nz inline static MaterialRef GetDefault(); inline static int GetTextureUnit(TextureMap textureMap); + + static inline MaterialRef LoadFromFile(const String& filePath, const MaterialParams& params = MaterialParams()); + static inline MaterialRef LoadFromMemory(const void* data, std::size_t size, const MaterialParams& params = MaterialParams()); + static inline MaterialRef LoadFromStream(Stream& stream, const MaterialParams& params = MaterialParams()); + template static MaterialRef New(Args&&... args); // Signals: diff --git a/include/Nazara/Graphics/Material.inl b/include/Nazara/Graphics/Material.inl index bf96d6bc5..32a59b1bb 100644 --- a/include/Nazara/Graphics/Material.inl +++ b/include/Nazara/Graphics/Material.inl @@ -895,43 +895,6 @@ namespace Nz return m_pipelineInfo.shadowReceive; } - /*! - * \brief Loads the material from file - * \return true if loading is successful - * - * \param filePath Path to the file - * \param params Parameters for the material - */ - inline bool Material::LoadFromFile(const String& filePath, const MaterialParams& params) - { - return MaterialLoader::LoadFromFile(this, filePath, params); - } - - /*! - * \brief Loads the material from memory - * \return true if loading is successful - * - * \param data Raw memory - * \param size Size of the memory - * \param params Parameters for the material - */ - inline bool Material::LoadFromMemory(const void* data, std::size_t size, const MaterialParams& params) - { - return MaterialLoader::LoadFromMemory(this, data, size, params); - } - - /*! - * \brief Loads the material from stream - * \return true if loading is successful - * - * \param stream Stream to the material - * \param params Parameters for the material - */ - inline bool Material::LoadFromStream(Stream& stream, const MaterialParams& params) - { - return MaterialLoader::LoadFromStream(this, stream, params); - } - /*! * \brief Sets the alpha map by name * \return true If successful @@ -1466,6 +1429,43 @@ namespace Nz return s_textureUnits[textureMap]; } + /*! + * \brief Loads the material from file + * \return true if loading is successful + * + * \param filePath Path to the file + * \param params Parameters for the material + */ + inline MaterialRef Material::LoadFromFile(const String& filePath, const MaterialParams& params) + { + return MaterialLoader::LoadFromFile(filePath, params); + } + + /*! + * \brief Loads the material from memory + * \return true if loading is successful + * + * \param data Raw memory + * \param size Size of the memory + * \param params Parameters for the material + */ + inline MaterialRef Material::LoadFromMemory(const void* data, std::size_t size, const MaterialParams& params) + { + return MaterialLoader::LoadFromMemory(data, size, params); + } + + /*! + * \brief Loads the material from stream + * \return true if loading is successful + * + * \param stream Stream to the material + * \param params Parameters for the material + */ + inline MaterialRef Material::LoadFromStream(Stream& stream, const MaterialParams& params) + { + return MaterialLoader::LoadFromStream(stream, params); + } + inline void Material::InvalidatePipeline() { m_pipelineUpdated = false; diff --git a/include/Nazara/Graphics/Model.hpp b/include/Nazara/Graphics/Model.hpp index dd2258e26..db73d4f98 100644 --- a/include/Nazara/Graphics/Model.hpp +++ b/include/Nazara/Graphics/Model.hpp @@ -65,10 +65,6 @@ namespace Nz virtual bool IsAnimated() const; - bool LoadFromFile(const String& filePath, const ModelParameters& params = ModelParameters()); - bool LoadFromMemory(const void* data, std::size_t size, const ModelParameters& params = ModelParameters()); - bool LoadFromStream(Stream& stream, const ModelParameters& params = ModelParameters()); - using InstancedRenderable::SetMaterial; bool SetMaterial(const String& subMeshName, MaterialRef material); bool SetMaterial(std::size_t skinIndex, const String& subMeshName, MaterialRef material); @@ -78,6 +74,10 @@ namespace Nz Model& operator=(const Model& node) = default; Model& operator=(Model&& node) = delete; + static ModelRef LoadFromFile(const String& filePath, const ModelParameters& params = ModelParameters()); + static ModelRef LoadFromMemory(const void* data, std::size_t size, const ModelParameters& params = ModelParameters()); + static ModelRef LoadFromStream(Stream& stream, const ModelParameters& params = ModelParameters()); + template static ModelRef New(Args&&... args); protected: diff --git a/include/Nazara/Graphics/Model.inl b/include/Nazara/Graphics/Model.inl index ee0ce7a41..9c1809368 100644 --- a/include/Nazara/Graphics/Model.inl +++ b/include/Nazara/Graphics/Model.inl @@ -59,7 +59,6 @@ namespace Nz * * \param args Arguments for the model */ - template ModelRef Model::New(Args&&... args) { diff --git a/include/Nazara/Graphics/SkeletalModel.hpp b/include/Nazara/Graphics/SkeletalModel.hpp index a36082619..b7ed266e2 100644 --- a/include/Nazara/Graphics/SkeletalModel.hpp +++ b/include/Nazara/Graphics/SkeletalModel.hpp @@ -26,12 +26,10 @@ namespace Nz class SkeletalModel; - using SkeletalModelLoader = ResourceLoader; + using SkeletalModelRef = ObjectRef; class NAZARA_GRAPHICS_API SkeletalModel : public Model, Updatable { - friend SkeletalModelLoader; - public: SkeletalModel(); SkeletalModel(const SkeletalModel& model) = default; @@ -55,10 +53,6 @@ namespace Nz bool IsAnimated() const override; bool IsAnimationEnabled() const; - bool LoadFromFile(const String& filePath, const SkeletalModelParameters& params = SkeletalModelParameters()); - bool LoadFromMemory(const void* data, std::size_t size, const SkeletalModelParameters& params = SkeletalModelParameters()); - bool LoadFromStream(Stream& stream, const SkeletalModelParameters& params = SkeletalModelParameters()); - bool SetAnimation(Animation* animation); void SetMesh(Mesh* mesh) override; bool SetSequence(const String& sequenceName); @@ -67,6 +61,8 @@ namespace Nz SkeletalModel& operator=(const SkeletalModel& node) = default; SkeletalModel& operator=(SkeletalModel&& node) = default; + template static SkeletalModelRef New(Args&&... args); + private: void MakeBoundingVolume() const override; /*void Register() override; @@ -80,9 +76,9 @@ namespace Nz float m_interpolation; unsigned int m_currentFrame; unsigned int m_nextFrame; - - static SkeletalModelLoader::LoaderList s_loaders; }; } +#include + #endif // NAZARA_SKELETALMODEL_HPP diff --git a/include/Nazara/Graphics/SkeletalModel.inl b/include/Nazara/Graphics/SkeletalModel.inl new file mode 100644 index 000000000..4bb2df2b6 --- /dev/null +++ b/include/Nazara/Graphics/SkeletalModel.inl @@ -0,0 +1,27 @@ +// Copyright (C) 2017 Jérôme Leclercq +// This file is part of the "Nazara Engine - Graphics module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +namespace Nz +{ + /*! + * \brief Creates a new SkeletalModel from the arguments + * \return A reference to the newly created SkeletalModel + * + * \param args Arguments for the skeletal model + */ + template + SkeletalModelRef SkeletalModel::New(Args&&... args) + { + std::unique_ptr object(new SkeletalModel(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } +} + +#include diff --git a/include/Nazara/Renderer/Texture.hpp b/include/Nazara/Renderer/Texture.hpp index ef90efcf6..6d33dcdd5 100644 --- a/include/Nazara/Renderer/Texture.hpp +++ b/include/Nazara/Renderer/Texture.hpp @@ -38,7 +38,7 @@ 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); + explicit Texture(const Image* image); Texture(const Texture&) = delete; Texture(Texture&&) = delete; ~Texture(); @@ -68,24 +68,6 @@ namespace Nz void InvalidateMipmaps(); bool IsValid() const; - // Load - bool LoadFromFile(const String& filePath, const ImageParams& params = ImageParams(), bool generateMipmaps = true); - bool LoadFromImage(const Image& image, bool generateMipmaps = true); - bool LoadFromMemory(const void* data, std::size_t size, const ImageParams& params = ImageParams(), bool generateMipmaps = true); - bool LoadFromStream(Stream& stream, const ImageParams& params = ImageParams(), bool generateMipmaps = true); - - // LoadArray - bool LoadArrayFromFile(const String& filePath, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); - bool LoadArrayFromImage(const Image& image, bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); - bool LoadArrayFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); - bool LoadArrayFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); - - // LoadCubemap - bool LoadCubemapFromFile(const String& filePath, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); - bool LoadCubemapFromImage(const Image& image, bool generateMipmaps = true, const CubemapParams& params = CubemapParams()); - bool LoadCubemapFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); - bool LoadCubemapFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); - // LoadFace bool LoadFaceFromFile(CubemapFace face, const String& filePath, const ImageParams& params = ImageParams()); bool LoadFaceFromMemory(CubemapFace face, const void* data, std::size_t size, const ImageParams& params = ImageParams()); @@ -97,9 +79,9 @@ namespace Nz bool SetMipmapRange(UInt8 minLevel, UInt8 maxLevel); - bool Update(const Image& image, UInt8 level = 0); - bool Update(const Image& image, const Boxui& box, UInt8 level = 0); - bool Update(const Image& image, const Rectui& rect, unsigned int z = 0, UInt8 level = 0); + bool Update(const Image* image, UInt8 level = 0); + bool Update(const Image* image, const Boxui& box, UInt8 level = 0); + bool Update(const Image* image, const Rectui& rect, unsigned int z = 0, UInt8 level = 0); bool Update(const UInt8* pixels, unsigned int srcWidth = 0, unsigned int srcHeight = 0, UInt8 level = 0) override; bool Update(const UInt8* pixels, const Boxui& box, unsigned int srcWidth = 0, unsigned int srcHeight = 0, UInt8 level = 0) override; bool Update(const UInt8* pixels, const Rectui& rect, unsigned int z = 0, unsigned int srcWidth = 0, unsigned int srcHeight = 0, UInt8 level = 0) override; @@ -113,6 +95,25 @@ namespace Nz static bool IsFormatSupported(PixelFormatType format); static bool IsMipmappingSupported(); static bool IsTypeSupported(ImageType type); + + // Load + static TextureRef LoadFromFile(const String& filePath, const ImageParams& params = ImageParams(), bool generateMipmaps = true); + static TextureRef LoadFromImage(const Image* image, bool generateMipmaps = true); + static TextureRef LoadFromMemory(const void* data, std::size_t size, const ImageParams& params = ImageParams(), bool generateMipmaps = true); + static TextureRef LoadFromStream(Stream& stream, const ImageParams& params = ImageParams(), bool generateMipmaps = true); + + // LoadArray + static TextureRef LoadArrayFromFile(const String& filePath, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); + static TextureRef LoadArrayFromImage(const Image* image, bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); + static TextureRef LoadArrayFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); + static TextureRef LoadArrayFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const Vector2ui& atlasSize = Vector2ui(2, 2)); + + // LoadCubemap + static TextureRef LoadCubemapFromFile(const String& filePath, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); + static TextureRef LoadCubemapFromImage(const Image* image, bool generateMipmaps = true, const CubemapParams& params = CubemapParams()); + static TextureRef LoadCubemapFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); + static TextureRef LoadCubemapFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), bool generateMipmaps = true, const CubemapParams& cubemapParams = CubemapParams()); + template static TextureRef New(Args&&... args); // Signals: diff --git a/include/Nazara/Utility/Animation.hpp b/include/Nazara/Utility/Animation.hpp index f714aa5a6..85f3f3bc8 100644 --- a/include/Nazara/Utility/Animation.hpp +++ b/include/Nazara/Utility/Animation.hpp @@ -83,15 +83,15 @@ namespace Nz bool IsLoopPointInterpolationEnabled() const; bool IsValid() const; - bool LoadFromFile(const String& filePath, const AnimationParams& params = AnimationParams()); - bool LoadFromMemory(const void* data, std::size_t size, const AnimationParams& params = AnimationParams()); - bool LoadFromStream(Stream& stream, const AnimationParams& params = AnimationParams()); - void RemoveSequence(const String& sequenceName); void RemoveSequence(UInt32 index); template static AnimationRef New(Args&&... args); + static AnimationRef LoadFromFile(const String& filePath, const AnimationParams& params = AnimationParams()); + static AnimationRef LoadFromMemory(const void* data, std::size_t size, const AnimationParams& params = AnimationParams()); + static AnimationRef LoadFromStream(Stream& stream, const AnimationParams& params = AnimationParams()); + // Signals: NazaraSignal(OnAnimationDestroy, const Animation* /*animation*/); NazaraSignal(OnAnimationRelease, const Animation* /*animation*/); diff --git a/include/Nazara/Utility/Font.hpp b/include/Nazara/Utility/Font.hpp index 7f1a411cd..be67c92e7 100644 --- a/include/Nazara/Utility/Font.hpp +++ b/include/Nazara/Utility/Font.hpp @@ -76,11 +76,6 @@ namespace Nz bool Precache(unsigned int characterSize, UInt32 style, char32_t character) const; bool Precache(unsigned int characterSize, UInt32 style, const String& characterSet) const; - // Open - bool OpenFromFile(const String& filePath, const FontParams& params = FontParams()); - bool OpenFromMemory(const void* data, std::size_t size, const FontParams& params = FontParams()); - bool OpenFromStream(Stream& stream, const FontParams& params = FontParams()); - void SetAtlas(const std::shared_ptr& atlas); void SetGlyphBorder(unsigned int borderSize); void SetMinimumStepSize(unsigned int minimumStepSize); @@ -93,6 +88,10 @@ namespace Nz static unsigned int GetDefaultGlyphBorder(); static unsigned int GetDefaultMinimumStepSize(); + static FontRef OpenFromFile(const String& filePath, const FontParams& params = FontParams()); + static FontRef OpenFromMemory(const void* data, std::size_t size, const FontParams& params = FontParams()); + static FontRef OpenFromStream(Stream& stream, const FontParams& params = FontParams()); + template static FontRef New(Args&&... args); static void SetDefaultAtlas(const std::shared_ptr& atlas); diff --git a/include/Nazara/Utility/Image.hpp b/include/Nazara/Utility/Image.hpp index ccefd2fee..3c3427b88 100644 --- a/include/Nazara/Utility/Image.hpp +++ b/include/Nazara/Utility/Image.hpp @@ -63,7 +63,7 @@ namespace Nz bool Convert(PixelFormatType format); - void Copy(const Image& source, const Boxui& srcBox, const Vector3ui& dstPos); + void Copy(const Image* source, const Boxui& srcBox, const Vector3ui& dstPos); bool Create(ImageType type, PixelFormatType format, unsigned int width, unsigned int height, unsigned int depth = 1, UInt8 levelCount = 1); void Destroy(); @@ -93,23 +93,6 @@ namespace Nz bool IsValid() const; - // Load - bool LoadFromFile(const String& filePath, const ImageParams& params = ImageParams()); - bool LoadFromMemory(const void* data, std::size_t size, const ImageParams& params = ImageParams()); - bool LoadFromStream(Stream& stream, const ImageParams& params = ImageParams()); - - // LoadArray - bool LoadArrayFromFile(const String& filePath, const ImageParams& imageParams = ImageParams(), const Vector2ui& atlasSize = Vector2ui(2, 2)); - bool LoadArrayFromImage(const Image& image, const Vector2ui& atlasSize = Vector2ui(2, 2)); - bool LoadArrayFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), const Vector2ui& atlasSize = Vector2ui(2, 2)); - bool LoadArrayFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), const Vector2ui& atlasSize = Vector2ui(2, 2)); - - // LoadCubemap - bool LoadCubemapFromFile(const String& filePath, const ImageParams& imageParams = ImageParams(), const CubemapParams& cubemapParams = CubemapParams()); - bool LoadCubemapFromImage(const Image& image, const CubemapParams& params = CubemapParams()); - bool LoadCubemapFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), const CubemapParams& cubemapParams = CubemapParams()); - bool LoadCubemapFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), const CubemapParams& cubemapParams = CubemapParams()); - // LoadFace bool LoadFaceFromFile(CubemapFace face, const String& filePath, const ImageParams& params = ImageParams()); bool LoadFaceFromMemory(CubemapFace face, const void* data, std::size_t size, const ImageParams& params = ImageParams()); @@ -133,6 +116,24 @@ namespace Nz static void Copy(UInt8* destination, const UInt8* source, PixelFormatType format, unsigned int width, unsigned int height, unsigned int depth = 1, unsigned int dstWidth = 0, unsigned int dstHeight = 0, unsigned int srcWidth = 0, unsigned int srcHeight = 0); static UInt8 GetMaxLevel(unsigned int width, unsigned int height, unsigned int depth = 1); static UInt8 GetMaxLevel(ImageType type, unsigned int width, unsigned int height, unsigned int depth = 1); + + // Load + static ImageRef LoadFromFile(const String& filePath, const ImageParams& params = ImageParams()); + static ImageRef LoadFromMemory(const void* data, std::size_t size, const ImageParams& params = ImageParams()); + static ImageRef LoadFromStream(Stream& stream, const ImageParams& params = ImageParams()); + + // LoadArray + static ImageRef LoadArrayFromFile(const String& filePath, const ImageParams& imageParams = ImageParams(), const Vector2ui& atlasSize = Vector2ui(2, 2)); + static ImageRef LoadArrayFromImage(const Image* image, const Vector2ui& atlasSize = Vector2ui(2, 2)); + static ImageRef LoadArrayFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), const Vector2ui& atlasSize = Vector2ui(2, 2)); + static ImageRef LoadArrayFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), const Vector2ui& atlasSize = Vector2ui(2, 2)); + + // LoadCubemap + static ImageRef LoadCubemapFromFile(const String& filePath, const ImageParams& imageParams = ImageParams(), const CubemapParams& cubemapParams = CubemapParams()); + static ImageRef LoadCubemapFromImage(const Image* image, const CubemapParams& params = CubemapParams()); + static ImageRef LoadCubemapFromMemory(const void* data, std::size_t size, const ImageParams& imageParams = ImageParams(), const CubemapParams& cubemapParams = CubemapParams()); + static ImageRef LoadCubemapFromStream(Stream& stream, const ImageParams& imageParams = ImageParams(), const CubemapParams& cubemapParams = CubemapParams()); + template static ImageRef New(Args&&... args); struct SharedImage diff --git a/include/Nazara/Utility/Mesh.hpp b/include/Nazara/Utility/Mesh.hpp index 0ecd9eb3a..3c1169bfc 100644 --- a/include/Nazara/Utility/Mesh.hpp +++ b/include/Nazara/Utility/Mesh.hpp @@ -128,10 +128,6 @@ namespace Nz bool IsAnimable() const; bool IsValid() const; - bool LoadFromFile(const String& filePath, const MeshParams& params = MeshParams()); - bool LoadFromMemory(const void* data, std::size_t size, const MeshParams& params = MeshParams()); - bool LoadFromStream(Stream& stream, const MeshParams& params = MeshParams()); - void Recenter(); void RemoveSubMesh(const String& identifier); @@ -149,6 +145,10 @@ namespace Nz Mesh& operator=(const Mesh&) = delete; Mesh& operator=(Mesh&&) = delete; + static MeshRef LoadFromFile(const String& filePath, const MeshParams& params = MeshParams()); + static MeshRef LoadFromMemory(const void* data, std::size_t size, const MeshParams& params = MeshParams()); + static MeshRef LoadFromStream(Stream& stream, const MeshParams& params = MeshParams()); + template static MeshRef New(Args&&... args); // Signals: diff --git a/plugins/Assimp/Plugin.cpp b/plugins/Assimp/Plugin.cpp index 4320ae098..b91337f9a 100644 --- a/plugins/Assimp/Plugin.cpp +++ b/plugins/Assimp/Plugin.cpp @@ -59,6 +59,8 @@ void ProcessJoints(aiNode* node, Skeleton* skeleton, const std::set& node->mTransformation.c1, node->mTransformation.c2, node->mTransformation.c3, node->mTransformation.c4, node->mTransformation.d1, node->mTransformation.d2, node->mTransformation.d3, node->mTransformation.d4); + transformMatrix.Transpose(); + transformMatrix.InverseAffine(); joint->SetInverseBindMatrix(transformMatrix); @@ -84,7 +86,7 @@ Ternary Check(Stream& /*stream*/, const MeshParams& parameters) return Ternary_Unknown; } -bool Load(Mesh* mesh, Stream& stream, const MeshParams& parameters) +MeshRef Load(Stream& stream, const MeshParams& parameters) { Nz::String streamPath = stream.GetPath(); @@ -147,7 +149,7 @@ bool Load(Mesh* mesh, Stream& stream, const MeshParams& parameters) if (!scene) { NazaraError("Assimp failed to import file: " + Nz::String(aiGetErrorString())); - return false; + return nullptr; } std::set joints; @@ -167,6 +169,7 @@ bool Load(Mesh* mesh, Stream& stream, const MeshParams& parameters) } } + MeshRef mesh = Mesh::New(); if (animatedMesh) { mesh->CreateSkeletal(UInt32(joints.size())); @@ -180,7 +183,7 @@ bool Load(Mesh* mesh, Stream& stream, const MeshParams& parameters) ProcessJoints(scene->mRootNode, skeleton, joints); - return false; + return nullptr; } else { @@ -375,7 +378,7 @@ bool Load(Mesh* mesh, Stream& stream, const MeshParams& parameters) aiReleaseImport(scene); - return true; + return mesh; } extern "C" diff --git a/src/Nazara/Audio/Formats/sndfileLoader.cpp b/src/Nazara/Audio/Formats/sndfileLoader.cpp index 25c30e4ad..75bb3e62f 100644 --- a/src/Nazara/Audio/Formats/sndfileLoader.cpp +++ b/src/Nazara/Audio/Formats/sndfileLoader.cpp @@ -14,7 +14,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -97,6 +99,11 @@ namespace Nz return m_format; } + Mutex& GetMutex() override + { + return m_mutex; + } + UInt64 GetSampleCount() const override { return m_sampleCount; @@ -124,7 +131,7 @@ namespace Nz bool Open(const void* data, std::size_t size, bool forceMono) { - m_ownedStream.reset(new MemoryView(data, size)); + m_ownedStream = std::make_unique(data, size); return Open(*m_ownedStream, forceMono); } @@ -201,12 +208,18 @@ namespace Nz sf_seek(m_handle, offset*m_sampleRate / 1000, SEEK_SET); } + UInt64 Tell() override + { + return sf_seek(m_handle, 0, SEEK_CUR) * 1000 / m_sampleRate; + } + private: std::vector m_mixBuffer; std::unique_ptr m_ownedStream; AudioFormat m_format; SNDFILE* m_handle; bool m_mixToMono; + Mutex m_mutex; UInt32 m_duration; UInt32 m_sampleRate; UInt64 m_sampleCount; @@ -222,7 +235,7 @@ namespace Nz return supportedExtensions.find(extension) != supportedExtensions.end(); } - Ternary CheckMusic(Stream& stream, const MusicParams& parameters) + Ternary CheckSoundStream(Stream& stream, const SoundStreamParams& parameters) { NazaraUnused(parameters); @@ -240,67 +253,43 @@ namespace Nz return Ternary_False; } - bool LoadMusicFile(Music* music, const String& filePath, const MusicParams& parameters) + SoundStreamRef LoadSoundStreamFile(const String& filePath, const SoundStreamParams& parameters) { - std::unique_ptr musicStream(new sndfileStream); - if (!musicStream->Open(filePath, parameters.forceMono)) + std::unique_ptr soundStream(new sndfileStream); + if (!soundStream->Open(filePath, parameters.forceMono)) { - NazaraError("Failed to open music stream"); - return false; + NazaraError("Failed to open sound stream"); + return nullptr; } - if (!music->Create(musicStream.get())) // Transfert de propriété - { - NazaraError("Failed to create music"); - return false; - } - - // Le pointeur a été transféré avec succès, nous pouvons laisser tomber la propriété - musicStream.release(); - - return true; + soundStream->SetPersistent(false); + return soundStream.release(); } - bool LoadMusicMemory(Music* music, const void* data, std::size_t size, const MusicParams& parameters) + SoundStreamRef LoadSoundStreamMemory(const void* data, std::size_t size, const SoundStreamParams& parameters) { - std::unique_ptr musicStream(new sndfileStream); - if (!musicStream->Open(data, size, parameters.forceMono)) + std::unique_ptr soundStream(new sndfileStream); + if (!soundStream->Open(data, size, parameters.forceMono)) { NazaraError("Failed to open music stream"); - return false; + return nullptr; } - if (!music->Create(musicStream.get())) // Transfert de propriété - { - NazaraError("Failed to create music"); - return false; - } - - // Le pointeur a été transféré avec succès, nous pouvons laisser tomber la propriété - musicStream.release(); - - return true; + soundStream->SetPersistent(false); + return soundStream.release(); } - bool LoadMusicStream(Music* music, Stream& stream, const MusicParams& parameters) + SoundStreamRef LoadSoundStreamStream(Stream& stream, const SoundStreamParams& parameters) { - std::unique_ptr musicStream(new sndfileStream); - if (!musicStream->Open(stream, parameters.forceMono)) + std::unique_ptr soundStream(new sndfileStream); + if (!soundStream->Open(stream, parameters.forceMono)) { NazaraError("Failed to open music stream"); - return false; + return nullptr; } - if (!music->Create(musicStream.get())) // Transfert de propriété - { - NazaraError("Failed to create music"); - return false; - } - - // Le pointeur a été transféré avec succès, nous pouvons laisser tomber la propriété - musicStream.release(); - - return true; + soundStream->SetPersistent(false); + return soundStream.release(); } Ternary CheckSoundBuffer(Stream& stream, const SoundBufferParams& parameters) @@ -320,7 +309,7 @@ namespace Nz return Ternary_False; } - bool LoadSoundBuffer(SoundBuffer* soundBuffer, Stream& stream, const SoundBufferParams& parameters) + SoundBufferRef LoadSoundBuffer(Stream& stream, const SoundBufferParams& parameters) { SF_INFO info; info.format = 0; @@ -329,7 +318,7 @@ namespace Nz if (!file) { NazaraError("Failed to load sound file: " + String(sf_strerror(file))); - return false; + return nullptr; } // Lynix utilise RAII... @@ -344,7 +333,7 @@ namespace Nz if (format == AudioFormat_Unknown) { NazaraError("Channel count not handled"); - return false; + return nullptr; } // https://github.com/LaurentGomila/SFML/issues/271 @@ -359,7 +348,7 @@ namespace Nz if (sf_read_short(file, samples.get(), sampleCount) != sampleCount) { NazaraError("Failed to read samples"); - return false; + return nullptr; } // Une conversion en mono est-elle nécessaire ? @@ -372,13 +361,7 @@ namespace Nz sampleCount = static_cast(info.frames); } - if (!soundBuffer->Create(format, sampleCount, info.samplerate, samples.get())) - { - NazaraError("Failed to create sound buffer"); - return false; - } - - return true; + return SoundBuffer::New(format, sampleCount, info.samplerate, samples.get()); } } @@ -386,14 +369,14 @@ namespace Nz { void Register_sndfile() { - MusicLoader::RegisterLoader(Detail::IsSupported, Detail::CheckMusic, Detail::LoadMusicStream, Detail::LoadMusicFile, Detail::LoadMusicMemory); SoundBufferLoader::RegisterLoader(Detail::IsSupported, Detail::CheckSoundBuffer, Detail::LoadSoundBuffer); + SoundStreamLoader::RegisterLoader(Detail::IsSupported, Detail::CheckSoundStream, Detail::LoadSoundStreamStream, Detail::LoadSoundStreamFile, Detail::LoadSoundStreamMemory); } void Unregister_sndfile() { - MusicLoader::UnregisterLoader(Detail::IsSupported, Detail::CheckMusic, Detail::LoadMusicStream, Detail::LoadMusicFile, Detail::LoadMusicMemory); SoundBufferLoader::UnregisterLoader(Detail::IsSupported, Detail::CheckSoundBuffer, Detail::LoadSoundBuffer); + SoundStreamLoader::UnregisterLoader(Detail::IsSupported, Detail::CheckSoundStream, Detail::LoadSoundStreamStream, Detail::LoadSoundStreamFile, Detail::LoadSoundStreamMemory); } } } diff --git a/src/Nazara/Audio/Music.cpp b/src/Nazara/Audio/Music.cpp index 221cb9d50..356b1b51a 100644 --- a/src/Nazara/Audio/Music.cpp +++ b/src/Nazara/Audio/Music.cpp @@ -5,9 +5,12 @@ #include #include #include +#include #include #include +#include #include +#include #include #include @@ -21,24 +24,15 @@ namespace Nz * \remark Module Audio needs to be initialized to use this class */ - /*! - * \brief Checks whether the parameters for the loading of the music are correct - * \return true If parameters are valid - */ - - bool MusicParams::IsValid() const - { - return true; - } - struct MusicImpl { ALenum audioFormat; - std::unique_ptr stream; + std::atomic processedSamples; std::vector chunkSamples; Mutex bufferLock; + SoundStreamRef stream; Thread thread; - UInt64 processedSamples; + UInt64 playingOffset; bool loop = false; bool streaming = false; unsigned int sampleRate; @@ -74,7 +68,7 @@ namespace Nz m_impl->sampleRate = soundStream->GetSampleRate(); m_impl->audioFormat = OpenAL::AudioFormat[format]; m_impl->chunkSamples.resize(format * m_impl->sampleRate); // One second of samples - m_impl->stream.reset(soundStream); + m_impl->stream = soundStream; SetPlayingOffset(0); @@ -221,9 +215,12 @@ namespace Nz * \param filePath Path to the file * \param params Parameters for the music */ - bool Music::OpenFromFile(const String& filePath, const MusicParams& params) + bool Music::OpenFromFile(const String& filePath, const SoundStreamParams& params) { - return MusicLoader::LoadFromFile(this, filePath, params); + if (SoundStreamRef soundStream = SoundStream::OpenFromFile(filePath, params)) + return Create(soundStream); + else + return false; } /*! @@ -236,9 +233,12 @@ namespace Nz * * \remark The memory pointer must stay valid (accessible) as long as the music is playing */ - bool Music::OpenFromMemory(const void* data, std::size_t size, const MusicParams& params) + bool Music::OpenFromMemory(const void* data, std::size_t size, const SoundStreamParams& params) { - return MusicLoader::LoadFromMemory(this, data, size, params); + if (SoundStreamRef soundStream = SoundStream::OpenFromMemory(data, size, params)) + return Create(soundStream); + else + return false; } /*! @@ -250,9 +250,12 @@ namespace Nz * * \remark The stream must stay valid as long as the music is playing */ - bool Music::OpenFromStream(Stream& stream, const MusicParams& params) + bool Music::OpenFromStream(Stream& stream, const SoundStreamParams& params) { - return MusicLoader::LoadFromStream(this, stream, params); + if (SoundStreamRef soundStream = SoundStream::OpenFromStream(stream, params)) + return Create(soundStream); + else + return false; } /*! @@ -324,7 +327,7 @@ namespace Nz if (isPlaying) Stop(); - m_impl->stream->Seek(offset); + m_impl->playingOffset = offset; m_impl->processedSamples = UInt64(offset) * m_impl->sampleRate * m_impl->stream->GetFormat() / 1000ULL; if (isPlaying) @@ -349,6 +352,10 @@ namespace Nz std::size_t sampleCount = m_impl->chunkSamples.size(); std::size_t sampleRead = 0; + Nz::LockGuard lock(m_impl->stream->GetMutex()); + + m_impl->stream->Seek(m_impl->playingOffset); + // Fill the buffer by reading from the stream for (;;) { @@ -364,6 +371,10 @@ namespace Nz break; } + m_impl->playingOffset = m_impl->stream->Tell(); + + lock.Unlock(); + // Update the buffer (send it to OpenAL) and queue it if we got any data if (sampleRead > 0) { @@ -380,9 +391,9 @@ namespace Nz ALuint buffers[NAZARA_AUDIO_STREAMED_BUFFER_COUNT]; alGenBuffers(NAZARA_AUDIO_STREAMED_BUFFER_COUNT, buffers); - for (unsigned int i = 0; i < NAZARA_AUDIO_STREAMED_BUFFER_COUNT; ++i) + for (unsigned int buffer : buffers) { - if (FillAndQueueBuffer(buffers[i])) + if (FillAndQueueBuffer(buffer)) break; // We have reached the end of the stream, there is no use to add new buffers } @@ -448,6 +459,4 @@ namespace Nz m_impl->thread.Join(); } } - - MusicLoader::LoaderList Music::s_loaders; } diff --git a/src/Nazara/Audio/Sound.cpp b/src/Nazara/Audio/Sound.cpp index 6937e1ec2..d4a9e8e06 100644 --- a/src/Nazara/Audio/Sound.cpp +++ b/src/Nazara/Audio/Sound.cpp @@ -151,8 +151,8 @@ namespace Nz */ bool Sound::LoadFromFile(const String& filePath, const SoundBufferParams& params) { - SoundBufferRef buffer = SoundBuffer::New(); - if (!buffer->LoadFromFile(filePath, params)) + SoundBufferRef buffer = SoundBuffer::LoadFromFile(filePath, params); + if (!buffer) { NazaraError("Failed to load buffer from file (" + filePath + ')'); return false; @@ -174,8 +174,8 @@ namespace Nz */ bool Sound::LoadFromMemory(const void* data, std::size_t size, const SoundBufferParams& params) { - SoundBufferRef buffer = SoundBuffer::New(); - if (!buffer->LoadFromMemory(data, size, params)) + SoundBufferRef buffer = SoundBuffer::LoadFromMemory(data, size, params); + if (!buffer) { NazaraError("Failed to load buffer from memory (" + String::Pointer(data) + ')'); return false; @@ -196,8 +196,8 @@ namespace Nz */ bool Sound::LoadFromStream(Stream& stream, const SoundBufferParams& params) { - SoundBufferRef buffer = SoundBuffer::New(); - if (!buffer->LoadFromStream(stream, params)) + SoundBufferRef buffer = SoundBuffer::LoadFromStream(stream, params); + if (!buffer) { NazaraError("Failed to load buffer from stream"); return false; diff --git a/src/Nazara/Audio/SoundBuffer.cpp b/src/Nazara/Audio/SoundBuffer.cpp index 2888710f1..e1570b36e 100644 --- a/src/Nazara/Audio/SoundBuffer.cpp +++ b/src/Nazara/Audio/SoundBuffer.cpp @@ -152,7 +152,7 @@ namespace Nz m_impl->format = format; m_impl->sampleCount = sampleCount; m_impl->sampleRate = sampleRate; - m_impl->samples.reset(new Int16[sampleCount]); + m_impl->samples = std::make_unique(sampleCount); std::memcpy(&m_impl->samples[0], samples, sampleCount*sizeof(Int16)); clearBufferOnExit.Reset(); @@ -251,6 +251,17 @@ namespace Nz return m_impl != nullptr; } + /*! + * \brief Checks whether the format is supported by the engine + * \return true if it is the case + * + * \param format Format to check + */ + bool SoundBuffer::IsFormatSupported(AudioFormat format) + { + return Audio::IsFormatSupported(format); + } + /*! * \brief Loads the sound buffer from file * \return true if loading is successful @@ -258,9 +269,9 @@ namespace Nz * \param filePath Path to the file * \param params Parameters for the sound buffer */ - bool SoundBuffer::LoadFromFile(const String& filePath, const SoundBufferParams& params) + SoundBufferRef SoundBuffer::LoadFromFile(const String& filePath, const SoundBufferParams& params) { - return SoundBufferLoader::LoadFromFile(this, filePath, params); + return SoundBufferLoader::LoadFromFile(filePath, params); } /*! @@ -271,9 +282,9 @@ namespace Nz * \param size Size of the memory * \param params Parameters for the sound buffer */ - bool SoundBuffer::LoadFromMemory(const void* data, std::size_t size, const SoundBufferParams& params) + SoundBufferRef SoundBuffer::LoadFromMemory(const void* data, std::size_t size, const SoundBufferParams& params) { - return SoundBufferLoader::LoadFromMemory(this, data, size, params); + return SoundBufferLoader::LoadFromMemory(data, size, params); } /*! @@ -283,20 +294,9 @@ namespace Nz * \param stream Stream to the sound buffer * \param params Parameters for the sound buffer */ - bool SoundBuffer::LoadFromStream(Stream& stream, const SoundBufferParams& params) + SoundBufferRef SoundBuffer::LoadFromStream(Stream& stream, const SoundBufferParams& params) { - return SoundBufferLoader::LoadFromStream(this, stream, params); - } - - /*! - * \brief Checks whether the format is supported by the engine - * \return true if it is the case - * - * \param format Format to check - */ - bool SoundBuffer::IsFormatSupported(AudioFormat format) - { - return Audio::IsFormatSupported(format); + return SoundBufferLoader::LoadFromStream(stream, params); } /*! diff --git a/src/Nazara/Audio/SoundStream.cpp b/src/Nazara/Audio/SoundStream.cpp index eec87ccc1..0051b5596 100644 --- a/src/Nazara/Audio/SoundStream.cpp +++ b/src/Nazara/Audio/SoundStream.cpp @@ -6,6 +6,11 @@ namespace Nz { + bool SoundStreamParams::IsValid() const + { + return true; + } + /*! * \ingroup audio * \class Nz::SoundStream @@ -15,4 +20,21 @@ namespace Nz */ SoundStream::~SoundStream() = default; + + SoundStreamRef SoundStream::OpenFromFile(const String& filePath, const SoundStreamParams& params) + { + return SoundStreamLoader::LoadFromFile(filePath, params); + } + + SoundStreamRef SoundStream::OpenFromMemory(const void* data, std::size_t size, const SoundStreamParams& params) + { + return SoundStreamLoader::LoadFromMemory(data, size, params); + } + + SoundStreamRef SoundStream::OpenFromStream(Stream& stream, const SoundStreamParams& params) + { + return SoundStreamLoader::LoadFromStream(stream, params); + } + + SoundStreamLoader::LoaderList SoundStream::s_loaders; } diff --git a/src/Nazara/Graphics/Formats/MeshLoader.cpp b/src/Nazara/Graphics/Formats/MeshLoader.cpp index 439039cad..d21ed58c1 100644 --- a/src/Nazara/Graphics/Formats/MeshLoader.cpp +++ b/src/Nazara/Graphics/Formats/MeshLoader.cpp @@ -31,8 +31,7 @@ namespace Nz filePath += ".tga"; } - MaterialRef material = Material::New(); - if (material->LoadFromFile(filePath, parameters.material)) + if (MaterialRef material = Material::LoadFromFile(filePath, parameters.material)) model->SetMaterial(i, std::move(material)); else NazaraWarning("Failed to load material from file " + String::Number(i)); @@ -47,7 +46,7 @@ namespace Nz } } - Ternary CheckStatic(Stream& stream, const ModelParameters& parameters) + Ternary Check(Stream& stream, const ModelParameters& parameters) { NazaraUnused(stream); @@ -58,65 +57,29 @@ namespace Nz return Ternary_Unknown; } - bool LoadStatic(Model* model, Stream& stream, const ModelParameters& parameters) + ModelRef Load(Stream& stream, const ModelParameters& parameters) { NazaraUnused(parameters); - MeshRef mesh = Mesh::New(); - if (!mesh->LoadFromStream(stream, parameters.mesh)) + MeshRef mesh = Mesh::LoadFromStream(stream, parameters.mesh); + if (!mesh) { NazaraError("Failed to load model mesh"); - return false; + return nullptr; } + ModelRef model; if (mesh->IsAnimable()) - { - NazaraError("Can't load animated mesh into static model"); - return false; - } + model = SkeletalModel::New(); + else + model = Model::New(); model->SetMesh(mesh); if (parameters.loadMaterials) LoadMaterials(model, parameters); - return true; - } - - Ternary CheckAnimated(Stream& stream, const SkeletalModelParameters& parameters) - { - NazaraUnused(stream); - - bool skip; - if (parameters.custom.GetBooleanParameter("SkipNativeAnimatedMeshLoader", &skip) && skip) - return Ternary_False; - - return Ternary_Unknown; - } - - bool LoadAnimated(SkeletalModel* model, Stream& stream, const SkeletalModelParameters& parameters) - { - NazaraUnused(parameters); - - MeshRef mesh = Mesh::New(); - if (!mesh->LoadFromStream(stream, parameters.mesh)) - { - NazaraError("Failed to load model mesh"); - return false; - } - - if (!mesh->IsAnimable()) - { - NazaraError("Can't load static mesh into animated model"); - return false; - } - - model->SetMesh(mesh); - - if (parameters.loadMaterials) - LoadMaterials(model, parameters); - - return true; + return model; } } @@ -124,14 +87,12 @@ namespace Nz { void RegisterMesh() { - ModelLoader::RegisterLoader(MeshLoader::IsExtensionSupported, CheckStatic, LoadStatic); - SkeletalModelLoader::RegisterLoader(MeshLoader::IsExtensionSupported, CheckAnimated, LoadAnimated); + ModelLoader::RegisterLoader(MeshLoader::IsExtensionSupported, Check, Load); } void UnregisterMesh() { - ModelLoader::UnregisterLoader(MeshLoader::IsExtensionSupported, CheckStatic, LoadStatic); - SkeletalModelLoader::UnregisterLoader(MeshLoader::IsExtensionSupported, CheckAnimated, LoadAnimated); + ModelLoader::UnregisterLoader(MeshLoader::IsExtensionSupported, Check, Load); } } } diff --git a/src/Nazara/Graphics/Formats/TextureLoader.cpp b/src/Nazara/Graphics/Formats/TextureLoader.cpp index 02f51d5ad..cda56c187 100644 --- a/src/Nazara/Graphics/Formats/TextureLoader.cpp +++ b/src/Nazara/Graphics/Formats/TextureLoader.cpp @@ -22,22 +22,22 @@ namespace Nz return Ternary_Unknown; } - bool Load(Material* material, Stream& stream, const MaterialParams& parameters) + MaterialRef Load(Stream& stream, const MaterialParams& parameters) { NazaraUnused(parameters); - TextureRef texture = Texture::New(); - if (!texture->LoadFromStream(stream)) + TextureRef texture = Texture::LoadFromStream(stream); + if (!texture) { NazaraError("Failed to load diffuse map"); - return false; + return nullptr; } - material->Reset(); + MaterialRef material = Material::New(); material->SetDiffuseMap(texture); material->SetShader(parameters.shaderName); - return true; + return material; } } diff --git a/src/Nazara/Graphics/GuillotineTextureAtlas.cpp b/src/Nazara/Graphics/GuillotineTextureAtlas.cpp index 16ae46be4..9c59baa7b 100644 --- a/src/Nazara/Graphics/GuillotineTextureAtlas.cpp +++ b/src/Nazara/Graphics/GuillotineTextureAtlas.cpp @@ -52,7 +52,7 @@ namespace Nz return nullptr; } - if (!newTexture->Update(image, Rectui(0, 0, image.GetWidth(), image.GetHeight()))) + if (!newTexture->Update(&image, Rectui(0, 0, image.GetWidth(), image.GetHeight()))) { NazaraError("Failed to update texture"); return nullptr; diff --git a/src/Nazara/Graphics/Model.cpp b/src/Nazara/Graphics/Model.cpp index b725caef8..5a6b1cfca 100644 --- a/src/Nazara/Graphics/Model.cpp +++ b/src/Nazara/Graphics/Model.cpp @@ -149,46 +149,6 @@ namespace Nz return false; } - /*! - * \brief Loads the model from file - * \return true if loading is successful - * - * \param filePath Path to the file - * \param params Parameters for the model - */ - - bool Model::LoadFromFile(const String& filePath, const ModelParameters& params) - { - return ModelLoader::LoadFromFile(this, filePath, params); - } - - /*! - * \brief Loads the model from memory - * \return true if loading is successful - * - * \param data Raw memory - * \param size Size of the memory - * \param params Parameters for the model - */ - - bool Model::LoadFromMemory(const void* data, std::size_t size, const ModelParameters& params) - { - return ModelLoader::LoadFromMemory(this, data, size, params); - } - - /*! - * \brief Loads the model from stream - * \return true if loading is successful - * - * \param stream Stream to the model - * \param params Parameters for the model - */ - - bool Model::LoadFromStream(Stream& stream, const ModelParameters& params) - { - return ModelLoader::LoadFromStream(this, stream, params); - } - /*! * \brief Sets the material of the named submesh * \return true If successful @@ -272,6 +232,43 @@ namespace Nz InvalidateBoundingVolume(); } + /*! + * \brief Loads the model from file + * \return true if loading is successful + * + * \param filePath Path to the file + * \param params Parameters for the model + */ + ModelRef Model::LoadFromFile(const String& filePath, const ModelParameters& params) + { + return ModelLoader::LoadFromFile(filePath, params); + } + + /*! + * \brief Loads the model from memory + * \return true if loading is successful + * + * \param data Raw memory + * \param size Size of the memory + * \param params Parameters for the model + */ + ModelRef Model::LoadFromMemory(const void* data, std::size_t size, const ModelParameters& params) + { + return ModelLoader::LoadFromMemory(data, size, params); + } + + /*! + * \brief Loads the model from stream + * \return true if loading is successful + * + * \param stream Stream to the model + * \param params Parameters for the model + */ + ModelRef Model::LoadFromStream(Stream& stream, const ModelParameters& params) + { + return ModelLoader::LoadFromStream(stream, params); + } + /* * \brief Makes the bounding volume of this billboard */ diff --git a/src/Nazara/Graphics/SkeletalModel.cpp b/src/Nazara/Graphics/SkeletalModel.cpp index 03d22f648..30ee9396d 100644 --- a/src/Nazara/Graphics/SkeletalModel.cpp +++ b/src/Nazara/Graphics/SkeletalModel.cpp @@ -220,46 +220,6 @@ namespace Nz return m_animationEnabled; } - /*! - * \brief Loads the skeleton model from file - * \return true if loading is successful - * - * \param filePath Path to the file - * \param params Parameters for the skeleton model - */ - - bool SkeletalModel::LoadFromFile(const String& filePath, const SkeletalModelParameters& params) - { - return SkeletalModelLoader::LoadFromFile(this, filePath, params); - } - - /*! - * \brief Loads the skeleton model from memory - * \return true if loading is successful - * - * \param data Raw memory - * \param size Size of the memory - * \param params Parameters for the skeleton model - */ - - bool SkeletalModel::LoadFromMemory(const void* data, std::size_t size, const SkeletalModelParameters& params) - { - return SkeletalModelLoader::LoadFromMemory(this, data, size, params); - } - - /*! - * \brief Loads the skeleton model from stream - * \return true if loading is successful - * - * \param stream Stream to the skeleton model - * \param params Parameters for the skeleton model - */ - - bool SkeletalModel::LoadFromStream(Stream& stream, const SkeletalModelParameters& params) - { - return SkeletalModelLoader::LoadFromStream(this, stream, params); - } - /*! * \brief Sets the animation for the model * \return true If successful @@ -432,6 +392,4 @@ namespace Nz /*if (m_animationEnabled && m_animation) AdvanceAnimation(m_scene->GetUpdateTime());*/ } - - SkeletalModelLoader::LoaderList SkeletalModel::s_loaders; } diff --git a/src/Nazara/Renderer/Texture.cpp b/src/Nazara/Renderer/Texture.cpp index bba567cf4..483f60709 100644 --- a/src/Nazara/Renderer/Texture.cpp +++ b/src/Nazara/Renderer/Texture.cpp @@ -54,7 +54,7 @@ namespace Nz Create(type, format, width, height, depth, levelCount); } - Texture::Texture(const Image& image) + Texture::Texture(const Image* image) { ErrorFlags flags(ErrorFlag_ThrowException); LoadFromImage(image); @@ -489,225 +489,6 @@ namespace Nz return m_impl != nullptr; } - bool Texture::LoadFromFile(const String& filePath, const ImageParams& params, bool generateMipmaps) - { - Image image; - if (!image.LoadFromFile(filePath, params)) - { - NazaraError("Failed to load image"); - return false; - } - - return LoadFromImage(image, generateMipmaps); - } - - bool Texture::LoadFromImage(const Image& image, bool generateMipmaps) - { - #if NAZARA_RENDERER_SAFE - if (!image.IsValid()) - { - NazaraError("Image must be valid"); - return false; - } - #endif - - // Vive le Copy-On-Write - Image newImage(image); - - PixelFormatType format = newImage.GetFormat(); - if (!IsFormatSupported(format)) - { - ///TODO: Sélectionner le format le plus adapté selon les composantes présentes dans le premier format - PixelFormatType newFormat = (PixelFormat::HasAlpha(format)) ? PixelFormatType_BGRA8 : PixelFormatType_BGR8; - NazaraWarning("Format " + PixelFormat::GetName(format) + " not supported, trying to convert it to " + PixelFormat::GetName(newFormat) + "..."); - - if (PixelFormat::IsConversionSupported(format, newFormat)) - { - if (newImage.Convert(newFormat)) - { - NazaraWarning("Conversion succeed"); - format = newFormat; - } - else - { - NazaraError("Conversion failed"); - return false; - } - } - else - { - NazaraError("Conversion not supported"); - return false; - } - } - - ImageType type = newImage.GetType(); - UInt8 levelCount = newImage.GetLevelCount(); - if (!Create(type, format, newImage.GetWidth(), newImage.GetHeight(), newImage.GetDepth(), (generateMipmaps) ? 0xFF : levelCount)) - { - NazaraError("Failed to create texture"); - return false; - } - - CallOnExit destroyOnExit([this]() - { - Destroy(); - }); - - if (type == ImageType_Cubemap) - { - for (UInt8 level = 0; level < levelCount; ++level) - { - for (unsigned int i = 0; i <= CubemapFace_Max; ++i) - { - if (!Update(newImage.GetConstPixels(0, 0, i, level), Rectui(0, 0, newImage.GetWidth(level), newImage.GetHeight(level)), i, level)) - { - NazaraError("Failed to update texture"); - return false; - } - } - } - } - else - { - for (UInt8 level = 0; level < levelCount; ++level) - { - if (!Update(newImage.GetConstPixels(0, 0, 0, level), level)) - { - NazaraError("Failed to update texture"); - return false; - } - } - } - - // Keep resource path info - SetFilePath(image.GetFilePath()); - - destroyOnExit.Reset(); - - return true; - } - - bool Texture::LoadFromMemory(const void* data, std::size_t size, const ImageParams& params, bool generateMipmaps) - { - Image image; - if (!image.LoadFromMemory(data, size, params)) - { - NazaraError("Failed to load image"); - return false; - } - - return LoadFromImage(image, generateMipmaps); - } - - bool Texture::LoadFromStream(Stream& stream, const ImageParams& params, bool generateMipmaps) - { - Image image; - if (!image.LoadFromStream(stream, params)) - { - NazaraError("Failed to load image"); - return false; - } - - return LoadFromImage(image, generateMipmaps); - } - - bool Texture::LoadArrayFromFile(const String& filePath, const ImageParams& imageParams, bool generateMipmaps, const Vector2ui& atlasSize) - { - Image cubemap; - if (!cubemap.LoadArrayFromFile(filePath, imageParams, atlasSize)) - { - NazaraError("Failed to load cubemap"); - return false; - } - - return LoadFromImage(cubemap, generateMipmaps); - } - - bool Texture::LoadArrayFromImage(const Image& image, bool generateMipmaps, const Vector2ui& atlasSize) - { - Image cubemap; - if (!cubemap.LoadArrayFromImage(image, atlasSize)) - { - NazaraError("Failed to load cubemap"); - return false; - } - - return LoadFromImage(cubemap, generateMipmaps); - } - - bool Texture::LoadArrayFromMemory(const void* data, std::size_t size, const ImageParams& imageParams, bool generateMipmaps, const Vector2ui& atlasSize) - { - Image cubemap; - if (!cubemap.LoadArrayFromMemory(data, size, imageParams, atlasSize)) - { - NazaraError("Failed to load cubemap"); - return false; - } - - return LoadFromImage(cubemap, generateMipmaps); - } - - bool Texture::LoadArrayFromStream(Stream& stream, const ImageParams& imageParams, bool generateMipmaps, const Vector2ui& atlasSize) - { - Image cubemap; - if (!cubemap.LoadArrayFromStream(stream, imageParams, atlasSize)) - { - NazaraError("Failed to load cubemap"); - return false; - } - - return LoadFromImage(cubemap, generateMipmaps); - } - - bool Texture::LoadCubemapFromFile(const String& filePath, const ImageParams& imageParams, bool generateMipmaps, const CubemapParams& cubemapParams) - { - Image cubemap; - if (!cubemap.LoadCubemapFromFile(filePath, imageParams, cubemapParams)) - { - NazaraError("Failed to load cubemap"); - return false; - } - - return LoadFromImage(cubemap, generateMipmaps); - } - - bool Texture::LoadCubemapFromImage(const Image& image, bool generateMipmaps, const CubemapParams& params) - { - Image cubemap; - if (!cubemap.LoadCubemapFromImage(image, params)) - { - NazaraError("Failed to load cubemap"); - return false; - } - - return LoadFromImage(cubemap, generateMipmaps); - } - - bool Texture::LoadCubemapFromMemory(const void* data, std::size_t size, const ImageParams& imageParams, bool generateMipmaps, const CubemapParams& cubemapParams) - { - Image cubemap; - if (!cubemap.LoadCubemapFromMemory(data, size, imageParams, cubemapParams)) - { - NazaraError("Failed to load cubemap"); - return false; - } - - return LoadFromImage(cubemap, generateMipmaps); - } - - bool Texture::LoadCubemapFromStream(Stream& stream, const ImageParams& imageParams, bool generateMipmaps, const CubemapParams& cubemapParams) - { - Image cubemap; - if (!cubemap.LoadCubemapFromStream(stream, imageParams, cubemapParams)) - { - NazaraError("Failed to load cubemap"); - return false; - } - - return LoadFromImage(cubemap, generateMipmaps); - } - bool Texture::LoadFaceFromFile(CubemapFace face, const String& filePath, const ImageParams& params) { #if NAZARA_RENDERER_SAFE @@ -724,21 +505,21 @@ namespace Nz } #endif - Image image; - if (!image.LoadFromFile(filePath, params)) + ImageRef image = Image::LoadFromFile(filePath, params); + if (!image) { NazaraError("Failed to load image"); return false; } - if (!image.Convert(m_impl->format)) + if (!image->Convert(m_impl->format)) { NazaraError("Failed to convert image to texture format"); return false; } unsigned int faceSize = m_impl->width; - if (image.GetWidth() != faceSize || image.GetHeight() != faceSize) + if (image->GetWidth() != faceSize || image->GetHeight() != faceSize) { NazaraError("Image size must match texture face size"); return false; @@ -763,21 +544,21 @@ namespace Nz } #endif - Image image; - if (!image.LoadFromMemory(data, size, params)) + ImageRef image = Image::LoadFromMemory(data, size, params); + if (!image) { NazaraError("Failed to load image"); return false; } - if (!image.Convert(m_impl->format)) + if (!image->Convert(m_impl->format)) { NazaraError("Failed to convert image to texture format"); return false; } unsigned int faceSize = m_impl->width; - if (image.GetWidth() != faceSize || image.GetHeight() != faceSize) + if (image->GetWidth() != faceSize || image->GetHeight() != faceSize) { NazaraError("Image size must match texture face size"); return false; @@ -802,14 +583,14 @@ namespace Nz } #endif - Image image; - if (!image.LoadFromStream(stream, params)) + ImageRef image = Image::LoadFromStream(stream, params); + if (!image) { NazaraError("Failed to load image"); return false; } - if (!image.Convert(m_impl->format)) + if (!image->Convert(m_impl->format)) { NazaraError("Failed to convert image to texture format"); return false; @@ -817,7 +598,7 @@ namespace Nz unsigned int faceSize = m_impl->width; - if (image.GetWidth() != faceSize || image.GetHeight() != faceSize) + if (image->GetWidth() != faceSize || image->GetHeight() != faceSize) { NazaraError("Image size must match texture face size"); return false; @@ -879,82 +660,49 @@ namespace Nz return true; } - bool Texture::Update(const Image& image, UInt8 level) + bool Texture::Update(const Image* image, UInt8 level) { - #if NAZARA_RENDERER_SAFE - if (!image.IsValid()) - { - NazaraError("Image must be valid"); - return false; - } + NazaraAssert(image && image->IsValid(), "Invalid image"); + NazaraAssert(image->GetFormat() == m_impl->format, "Image format doesn't match texture format"); - if (image.GetFormat() != m_impl->format) - { - NazaraError("Image format does not match texture format"); - return false; - } - #endif - - const UInt8* pixels = image.GetConstPixels(0, 0, 0, level); + const UInt8* pixels = image->GetConstPixels(0, 0, 0, level); if (!pixels) { NazaraError("Failed to access image's pixels"); return false; } - return Update(pixels, image.GetWidth(level), image.GetHeight(level), level); + return Update(pixels, image->GetWidth(level), image->GetHeight(level), level); } - bool Texture::Update(const Image& image, const Boxui& box, UInt8 level) + bool Texture::Update(const Image* image, const Boxui& box, UInt8 level) { - #if NAZARA_RENDERER_SAFE - if (!image.IsValid()) - { - NazaraError("Image must be valid"); - return false; - } + NazaraAssert(image && image->IsValid(), "Invalid image"); + NazaraAssert(image->GetFormat() == m_impl->format, "Image format doesn't match texture format"); - if (image.GetFormat() != m_impl->format) - { - NazaraError("Image format does not match texture format"); - return false; - } - #endif - - const UInt8* pixels = image.GetConstPixels(0, 0, 0, level); + const UInt8* pixels = image->GetConstPixels(0, 0, 0, level); if (!pixels) { NazaraError("Failed to access image's pixels"); return false; } - return Update(pixels, box, image.GetWidth(level), image.GetHeight(level), level); + return Update(pixels, box, image->GetWidth(level), image->GetHeight(level), level); } - bool Texture::Update(const Image& image, const Rectui& rect, unsigned int z, UInt8 level) + bool Texture::Update(const Image* image, const Rectui& rect, unsigned int z, UInt8 level) { - #if NAZARA_RENDERER_SAFE - if (!image.IsValid()) - { - NazaraError("Image must be valid"); - return false; - } + NazaraAssert(image && image->IsValid(), "Invalid image"); + NazaraAssert(image->GetFormat() == m_impl->format, "Image format doesn't match texture format"); - if (image.GetFormat() != m_impl->format) - { - NazaraError("Image format does not match texture format"); - return false; - } - #endif - - const UInt8* pixels = image.GetConstPixels(0, 0, 0, level); + const UInt8* pixels = image->GetConstPixels(0, 0, 0, level); if (!pixels) { NazaraError("Failed to access image's pixels"); return false; } - return Update(pixels, rect, z, image.GetWidth(level), image.GetHeight(level), level); + return Update(pixels, rect, z, image->GetWidth(level), image->GetHeight(level), level); } bool Texture::Update(const UInt8* pixels, unsigned int srcWidth, unsigned int srcHeight, UInt8 level) @@ -1193,6 +941,214 @@ namespace Nz return false; } + TextureRef Texture::LoadFromFile(const String& filePath, const ImageParams& params, bool generateMipmaps) + { + ImageRef image = Image::LoadFromFile(filePath, params); + if (!image) + { + NazaraError("Failed to load image"); + return nullptr; + } + + return LoadFromImage(image, generateMipmaps); + } + + TextureRef Texture::LoadFromImage(const Image* image, bool generateMipmaps) + { + NazaraAssert(image && image->IsValid(), "Invalid image"); + + // Make use of COW + Image newImage(*image); + + PixelFormatType format = newImage.GetFormat(); + if (!IsFormatSupported(format)) + { + ///TODO: Sélectionner le format le plus adapté selon les composantes présentes dans le premier format + PixelFormatType newFormat = (PixelFormat::HasAlpha(format)) ? PixelFormatType_BGRA8 : PixelFormatType_BGR8; + NazaraWarning("Format " + PixelFormat::GetName(format) + " not supported, trying to convert it to " + PixelFormat::GetName(newFormat) + "..."); + + if (PixelFormat::IsConversionSupported(format, newFormat)) + { + if (newImage.Convert(newFormat)) + { + NazaraWarning("Conversion succeed"); + format = newFormat; + } + else + { + NazaraError("Conversion failed"); + return nullptr; + } + } + else + { + NazaraError("Conversion not supported"); + return nullptr; + } + } + + ImageType type = newImage.GetType(); + UInt8 levelCount = newImage.GetLevelCount(); + + TextureRef texture = New(); + if (!texture->Create(type, format, newImage.GetWidth(), newImage.GetHeight(), newImage.GetDepth(), (generateMipmaps) ? 0xFF : levelCount)) + { + NazaraError("Failed to create texture"); + return nullptr; + } + + if (type == ImageType_Cubemap) + { + for (UInt8 level = 0; level < levelCount; ++level) + { + for (unsigned int i = 0; i <= CubemapFace_Max; ++i) + { + if (!texture->Update(newImage.GetConstPixels(0, 0, i, level), Rectui(0, 0, newImage.GetWidth(level), newImage.GetHeight(level)), i, level)) + { + NazaraError("Failed to update texture"); + return nullptr; + } + } + } + } + else + { + for (UInt8 level = 0; level < levelCount; ++level) + { + if (!texture->Update(newImage.GetConstPixels(0, 0, 0, level), level)) + { + NazaraError("Failed to update texture"); + return nullptr; + } + } + } + + // Keep resource path info + texture->SetFilePath(image->GetFilePath()); + + return texture; + } + + TextureRef Texture::LoadFromMemory(const void* data, std::size_t size, const ImageParams& params, bool generateMipmaps) + { + ImageRef image = Image::LoadFromMemory(data, size, params); + if (!image) + { + NazaraError("Failed to load image"); + return nullptr; + } + + return LoadFromImage(image, generateMipmaps); + } + + TextureRef Texture::LoadFromStream(Stream& stream, const ImageParams& params, bool generateMipmaps) + { + ImageRef image = Image::LoadFromStream(stream, params); + if (!image) + { + NazaraError("Failed to load image"); + return nullptr; + } + + return LoadFromImage(image, generateMipmaps); + } + + TextureRef Texture::LoadArrayFromFile(const String& filePath, const ImageParams& imageParams, bool generateMipmaps, const Vector2ui& atlasSize) + { + ImageRef cubemap = Image::LoadArrayFromFile(filePath, imageParams, atlasSize); + if (!cubemap) + { + NazaraError("Failed to load cubemap"); + return nullptr; + } + + return LoadFromImage(cubemap, generateMipmaps); + } + + TextureRef Texture::LoadArrayFromImage(const Image* image, bool generateMipmaps, const Vector2ui& atlasSize) + { + ImageRef cubemap = Image::LoadArrayFromImage(image, atlasSize); + if (!cubemap) + { + NazaraError("Failed to load cubemap"); + return nullptr; + } + + return LoadFromImage(cubemap, generateMipmaps); + } + + TextureRef Texture::LoadArrayFromMemory(const void* data, std::size_t size, const ImageParams& imageParams, bool generateMipmaps, const Vector2ui& atlasSize) + { + ImageRef cubemap = Image::LoadArrayFromMemory(data, size, imageParams, atlasSize); + if (!cubemap) + { + NazaraError("Failed to load cubemap"); + return nullptr; + } + + return LoadFromImage(cubemap, generateMipmaps); + } + + TextureRef Texture::LoadArrayFromStream(Stream& stream, const ImageParams& imageParams, bool generateMipmaps, const Vector2ui& atlasSize) + { + ImageRef cubemap = Image::LoadArrayFromStream(stream, imageParams, atlasSize); + if (!cubemap) + { + NazaraError("Failed to load cubemap"); + return nullptr; + } + + return LoadFromImage(cubemap, generateMipmaps); + } + + TextureRef Texture::LoadCubemapFromFile(const String& filePath, const ImageParams& imageParams, bool generateMipmaps, const CubemapParams& cubemapParams) + { + ImageRef cubemap = Image::LoadCubemapFromFile(filePath, imageParams, cubemapParams); + if (!cubemap) + { + NazaraError("Failed to load cubemap"); + return nullptr; + } + + return LoadFromImage(cubemap, generateMipmaps); + } + + TextureRef Texture::LoadCubemapFromImage(const Image* image, bool generateMipmaps, const CubemapParams& params) + { + ImageRef cubemap = Image::LoadCubemapFromImage(image, params); + if (!cubemap) + { + NazaraError("Failed to load cubemap"); + return nullptr; + } + + return LoadFromImage(cubemap, generateMipmaps); + } + + TextureRef Texture::LoadCubemapFromMemory(const void* data, std::size_t size, const ImageParams& imageParams, bool generateMipmaps, const CubemapParams& cubemapParams) + { + ImageRef cubemap = Image::LoadCubemapFromMemory(data, size, imageParams, cubemapParams); + if (!cubemap) + { + NazaraError("Failed to load cubemap"); + return nullptr; + } + + return LoadFromImage(cubemap, generateMipmaps); + } + + TextureRef Texture::LoadCubemapFromStream(Stream& stream, const ImageParams& imageParams, bool generateMipmaps, const CubemapParams& cubemapParams) + { + ImageRef cubemap = Image::LoadCubemapFromStream(stream, imageParams, cubemapParams); + if (!cubemap) + { + NazaraError("Failed to load cubemap"); + return nullptr; + } + + return LoadFromImage(cubemap, generateMipmaps); + } + bool Texture::CreateTexture(bool proxy) { OpenGL::Format openGLFormat; diff --git a/src/Nazara/Utility/Animation.cpp b/src/Nazara/Utility/Animation.cpp index f851a430b..d60e095ee 100644 --- a/src/Nazara/Utility/Animation.cpp +++ b/src/Nazara/Utility/Animation.cpp @@ -261,21 +261,6 @@ namespace Nz return m_impl != nullptr; } - bool Animation::LoadFromFile(const String& filePath, const AnimationParams& params) - { - return AnimationLoader::LoadFromFile(this, filePath, params); - } - - bool Animation::LoadFromMemory(const void* data, std::size_t size, const AnimationParams& params) - { - return AnimationLoader::LoadFromMemory(this, data, size, params); - } - - bool Animation::LoadFromStream(Stream& stream, const AnimationParams& params) - { - return AnimationLoader::LoadFromStream(this, stream, params); - } - void Animation::RemoveSequence(const String& identifier) { NazaraAssert(m_impl, "Animation not created"); @@ -304,6 +289,21 @@ namespace Nz m_impl->sequences.erase(it); } + AnimationRef Animation::LoadFromFile(const String& filePath, const AnimationParams& params) + { + return AnimationLoader::LoadFromFile(filePath, params); + } + + AnimationRef Animation::LoadFromMemory(const void* data, std::size_t size, const AnimationParams& params) + { + return AnimationLoader::LoadFromMemory(data, size, params); + } + + AnimationRef Animation::LoadFromStream(Stream& stream, const AnimationParams& params) + { + return AnimationLoader::LoadFromStream(stream, params); + } + bool Animation::Initialize() { if (!AnimationLibrary::Initialize()) diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index a0264b9ee..731557628 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -280,21 +280,6 @@ namespace Nz return true; } - bool Font::OpenFromFile(const String& filePath, const FontParams& params) - { - return FontLoader::LoadFromFile(this, filePath, params); - } - - bool Font::OpenFromMemory(const void* data, std::size_t size, const FontParams& params) - { - return FontLoader::LoadFromMemory(this, data, size, params); - } - - bool Font::OpenFromStream(Stream& stream, const FontParams& params) - { - return FontLoader::LoadFromStream(this, stream, params); - } - void Font::SetAtlas(const std::shared_ptr& atlas) { if (m_atlas != atlas) @@ -358,10 +343,8 @@ namespace Nz if (!s_defaultFont) { - FontRef cabin = Font::New(); - if (cabin->OpenFromMemory(r_cabinRegular, sizeof(r_cabinRegular))) - s_defaultFont = cabin; - else + s_defaultFont = Font::OpenFromMemory(r_cabinRegular, sizeof(r_cabinRegular)); + if (!s_defaultFont) NazaraError("Failed to open default font"); } @@ -378,6 +361,21 @@ namespace Nz return s_defaultMinimumStepSize; } + FontRef Font::OpenFromFile(const String& filePath, const FontParams& params) + { + return FontLoader::LoadFromFile(filePath, params); + } + + FontRef Font::OpenFromMemory(const void* data, std::size_t size, const FontParams& params) + { + return FontLoader::LoadFromMemory(data, size, params); + } + + FontRef Font::OpenFromStream(Stream& stream, const FontParams& params) + { + return FontLoader::LoadFromStream(stream, params); + } + void Font::SetDefaultAtlas(const std::shared_ptr& atlas) { s_defaultAtlas = atlas; diff --git a/src/Nazara/Utility/Formats/DDSLoader.cpp b/src/Nazara/Utility/Formats/DDSLoader.cpp index dd24a1469..e4c6f2d57 100644 --- a/src/Nazara/Utility/Formats/DDSLoader.cpp +++ b/src/Nazara/Utility/Formats/DDSLoader.cpp @@ -38,7 +38,7 @@ namespace Nz return (magic == DDS_Magic) ? Ternary_True : Ternary_False; } - static bool Load(Image* image, Stream& stream, const ImageParams& parameters) + static ImageRef Load(Stream& stream, const ImageParams& parameters) { NazaraUnused(parameters); @@ -81,14 +81,14 @@ namespace Nz // First, identify the type ImageType type; if (!IdentifyImageType(header, headerDX10, &type)) - return false; + return nullptr; // Then the format PixelFormatType format; if (!IdentifyPixelFormat(header, headerDX10, &format)) - return false; + return nullptr; - image->Create(type, format, width, height, depth, levelCount); + ImageRef image = Image::New(type, format, width, height, depth, levelCount); // Read all mipmap levels for (unsigned int i = 0; i < image->GetLevelCount(); i++) @@ -100,7 +100,7 @@ namespace Nz if (byteStream.Read(ptr, byteCount) != byteCount) { NazaraError("Failed to read level #" + String::Number(i)); - return false; + return nullptr; } if (width > 1) @@ -117,7 +117,7 @@ namespace Nz if (parameters.loadFormat != PixelFormatType_Undefined) image->Convert(parameters.loadFormat); - return true; + return image; } private: diff --git a/src/Nazara/Utility/Formats/FreeTypeLoader.cpp b/src/Nazara/Utility/Formats/FreeTypeLoader.cpp index f6ab78b1d..2cd2c51e3 100644 --- a/src/Nazara/Utility/Formats/FreeTypeLoader.cpp +++ b/src/Nazara/Utility/Formats/FreeTypeLoader.cpp @@ -361,7 +361,7 @@ namespace Nz return Ternary_False; } - bool LoadFile(Font* font, const String& filePath, const FontParams& parameters) + FontRef LoadFile(const String& filePath, const FontParams& parameters) { NazaraUnused(parameters); @@ -370,25 +370,26 @@ namespace Nz if (!face->SetFile(filePath)) { NazaraError("Failed to open file"); - return false; + return nullptr; } if (!face->Open()) { NazaraError("Failed to open face"); - return false; + return nullptr; } + FontRef font = Font::New(); if (font->Create(face.get())) { face.release(); - return true; + return font; } else - return false; + return nullptr; } - bool LoadMemory(Font* font, const void* data, std::size_t size, const FontParams& parameters) + FontRef LoadMemory(const void* data, std::size_t size, const FontParams& parameters) { NazaraUnused(parameters); @@ -398,19 +399,20 @@ namespace Nz if (!face->Open()) { NazaraError("Failed to open face"); - return false; + return nullptr; } + FontRef font = Font::New(); if (font->Create(face.get())) { face.release(); - return true; + return font; } else - return false; + return nullptr; } - bool LoadStream(Font* font, Stream& stream, const FontParams& parameters) + FontRef LoadStream(Stream& stream, const FontParams& parameters) { NazaraUnused(parameters); @@ -420,16 +422,17 @@ namespace Nz if (!face->Open()) { NazaraError("Failed to open face"); - return false; + return nullptr; } + FontRef font = Font::New(); if (font->Create(face.get())) { face.release(); - return true; + return font; } else - return false; + return nullptr; } } @@ -439,7 +442,7 @@ namespace Nz { if (FT_Init_FreeType(&s_library) == 0) { - s_libraryOwner.reset(new FreeTypeLibrary); + s_libraryOwner = std::make_shared(); FontLoader::RegisterLoader(IsSupported, Check, LoadStream, LoadFile, LoadMemory); } else diff --git a/src/Nazara/Utility/Formats/MD2Loader.cpp b/src/Nazara/Utility/Formats/MD2Loader.cpp index ac7d6e5d7..b58799978 100644 --- a/src/Nazara/Utility/Formats/MD2Loader.cpp +++ b/src/Nazara/Utility/Formats/MD2Loader.cpp @@ -46,13 +46,13 @@ namespace Nz return Ternary_False; } - bool Load(Mesh* mesh, Stream& stream, const MeshParams& parameters) + MeshRef Load(Stream& stream, const MeshParams& parameters) { MD2_Header header; if (stream.Read(&header, sizeof(MD2_Header)) != sizeof(MD2_Header)) { NazaraError("Failed to read header"); - return false; + return nullptr; } #ifdef NAZARA_BIG_ENDIAN @@ -76,14 +76,15 @@ namespace Nz if (stream.GetSize() < header.offset_end) { NazaraError("Incomplete MD2 file"); - return false; + return nullptr; } // Since the engine no longer supports keyframe animations, let's make a static mesh + MeshRef mesh = Nz::Mesh::New(); if (!mesh->CreateStatic()) { NazaraInternalError("Failed to create mesh"); - return false; + return nullptr; } // Extract skins (texture name) @@ -253,7 +254,7 @@ namespace Nz if (parameters.center) mesh->Recenter(); - return true; + return mesh; } } diff --git a/src/Nazara/Utility/Formats/MD5AnimLoader.cpp b/src/Nazara/Utility/Formats/MD5AnimLoader.cpp index e67389409..84f0baeaf 100644 --- a/src/Nazara/Utility/Formats/MD5AnimLoader.cpp +++ b/src/Nazara/Utility/Formats/MD5AnimLoader.cpp @@ -28,7 +28,7 @@ namespace Nz return parser.Check(); } - bool Load(Animation* animation, Stream& stream, const AnimationParams& /*parameters*/) + AnimationRef Load(Stream& stream, const AnimationParams& /*parameters*/) { ///TODO: Utiliser les paramètres MD5AnimParser parser(stream); @@ -36,7 +36,7 @@ namespace Nz if (!parser.Parse()) { NazaraError("MD5Anim parser failed"); - return false; + return nullptr; } const MD5AnimParser::Frame* frames = parser.GetFrames(); @@ -46,6 +46,7 @@ namespace Nz UInt32 jointCount = parser.GetJointCount(); // À ce stade, nous sommes censés avoir assez d'informations pour créer l'animation + AnimationRef animation = Animation::New(); animation->CreateSkeletal(frameCount, jointCount); Sequence sequence; @@ -84,7 +85,7 @@ namespace Nz } } - return true; + return animation; } } diff --git a/src/Nazara/Utility/Formats/MD5MeshLoader.cpp b/src/Nazara/Utility/Formats/MD5MeshLoader.cpp index 84197e1c9..31b3a64a7 100644 --- a/src/Nazara/Utility/Formats/MD5MeshLoader.cpp +++ b/src/Nazara/Utility/Formats/MD5MeshLoader.cpp @@ -35,13 +35,13 @@ namespace Nz return parser.Check(); } - bool Load(Mesh* mesh, Stream& stream, const MeshParams& parameters) + MeshRef Load(Stream& stream, const MeshParams& parameters) { MD5MeshParser parser(stream); if (!parser.Parse()) { NazaraError("MD5Mesh parser failed"); - return false; + return nullptr; } // Pour que le squelette soit correctement aligné, il faut appliquer un quaternion "de correction" aux joints à la base du squelette @@ -62,6 +62,7 @@ namespace Nz if (parameters.animated) { + MeshRef mesh = Mesh::New(); mesh->CreateSkeletal(jointCount); Skeleton* skeleton = mesh->GetSkeleton(); @@ -218,13 +219,16 @@ namespace Nz mesh->SetAnimation(path); } } + + return mesh; } else { + MeshRef mesh = Mesh::New(); if (!mesh->CreateStatic()) // Ne devrait jamais échouer { NazaraInternalError("Failed to create mesh"); - return false; + return nullptr; } mesh->SetMaterialCount(meshCount); @@ -309,9 +313,9 @@ namespace Nz if (parameters.center) mesh->Recenter(); - } - return true; + return mesh; + } } } diff --git a/src/Nazara/Utility/Formats/OBJLoader.cpp b/src/Nazara/Utility/Formats/OBJLoader.cpp index 23a569337..b8ff362f1 100644 --- a/src/Nazara/Utility/Formats/OBJLoader.cpp +++ b/src/Nazara/Utility/Formats/OBJLoader.cpp @@ -153,7 +153,7 @@ namespace Nz return true; } - bool Load(Mesh* mesh, Stream& stream, const MeshParams& parameters) + MeshRef Load(Stream& stream, const MeshParams& parameters) { long long reservedVertexCount; if (!parameters.custom.GetIntegerParameter("NativeOBJLoader_VertexCount", &reservedVertexCount)) @@ -163,9 +163,10 @@ namespace Nz if (!parser.Parse(stream, reservedVertexCount)) { NazaraError("OBJ parser failed"); - return false; + return nullptr; } + MeshRef mesh = Mesh::New(); mesh->CreateStatic(); const String* materials = parser.GetMaterials(); @@ -341,7 +342,7 @@ namespace Nz ParseMTL(mesh, stream.GetDirectory() + mtlLib, materials, meshes, meshCount); } - return true; + return mesh; } } diff --git a/src/Nazara/Utility/Formats/PCXLoader.cpp b/src/Nazara/Utility/Formats/PCXLoader.cpp index bb0e1b43b..5de1aa29d 100644 --- a/src/Nazara/Utility/Formats/PCXLoader.cpp +++ b/src/Nazara/Utility/Formats/PCXLoader.cpp @@ -61,7 +61,7 @@ namespace Nz return Ternary_False; } - bool Load(Image* image, Stream& stream, const ImageParams& parameters) + ImageRef Load(Stream& stream, const ImageParams& parameters) { NazaraUnused(parameters); @@ -69,7 +69,7 @@ namespace Nz if (stream.Read(&header, sizeof(pcx_header)) != sizeof(pcx_header)) { NazaraError("Failed to read header"); - return false; + return nullptr; } #ifdef NAZARA_BIG_ENDIAN @@ -91,10 +91,11 @@ namespace Nz unsigned int width = header.xmax - header.xmin+1; unsigned int height = header.ymax - header.ymin+1; + ImageRef image = Image::New(); if (!image->Create(ImageType_2D, PixelFormatType_RGB8, width, height, 1, (parameters.levelCount > 0) ? parameters.levelCount : 1)) { NazaraError("Failed to create image"); - return false; + return nullptr; } UInt8* pixels = image->GetPixels(); @@ -119,7 +120,7 @@ namespace Nz if (!stream.Read(&rle_value, 1)) { NazaraError("Failed to read stream (byte " + String::Number(stream.GetCursorPos()) + ')'); - return false; + return nullptr; } if (rle_value < 0xc0) @@ -130,7 +131,7 @@ namespace Nz if (!stream.Read(&rle_value, 1)) { NazaraError("Failed to read stream (byte " + String::Number(stream.GetCursorPos()) + ')'); - return false; + return nullptr; } } } @@ -174,7 +175,7 @@ namespace Nz if (!stream.Read(&rle_value, 1)) { NazaraError("Failed to read stream (byte " + String::Number(stream.GetCursorPos()) + ')'); - return false; + return nullptr; } if (rle_value < 0xc0) @@ -185,7 +186,7 @@ namespace Nz if (!stream.Read(&rle_value, 1)) { NazaraError("Failed to read stream (byte " + String::Number(stream.GetCursorPos()) + ')'); - return false; + return nullptr; } } } @@ -225,21 +226,21 @@ namespace Nz if (!stream.Read(&magic, 1)) { NazaraError("Failed to read stream (byte " + String::Number(stream.GetCursorPos()) + ')'); - return false; + return nullptr; } /* first byte must be equal to 0x0c (12) */ if (magic != 0x0c) { NazaraError("Colormap's first byte must be 0x0c (0x" + String::Number(magic, 16) + ')'); - return false; + return nullptr; } /* read palette */ if (stream.Read(palette, 768) != 768) { NazaraError("Failed to read palette"); - return false; + return nullptr; } stream.SetCursorPos(curPos); @@ -258,7 +259,7 @@ namespace Nz if (!stream.Read(&rle_value, 1)) { NazaraError("Failed to read stream (byte " + String::Number(stream.GetCursorPos()) + ')'); - return false; + return nullptr; } if (rle_value < 0xc0) @@ -269,7 +270,7 @@ namespace Nz if (!stream.Read(&rle_value, 1)) { NazaraError("Failed to read stream (byte " + String::Number(stream.GetCursorPos()) + ')'); - return false; + return nullptr; } } } @@ -302,7 +303,7 @@ namespace Nz if (!stream.Read(&rle_value, 1)) { NazaraError("Failed to read stream (byte " + String::Number(stream.GetCursorPos()) + ')'); - return false; + return nullptr; } if (rle_value < 0xc0) @@ -313,7 +314,7 @@ namespace Nz if (!stream.Read(&rle_value, 1)) { NazaraError("Failed to read stream (byte " + String::Number(stream.GetCursorPos()) + ')'); - return false; + return nullptr; } } } @@ -329,13 +330,13 @@ namespace Nz default: NazaraError("Unsupported " + String::Number(bitCount) + " bitcount for pcx files"); - return false; + return nullptr; } if (parameters.loadFormat != PixelFormatType_Undefined) image->Convert(parameters.loadFormat); - return true; + return image; } } diff --git a/src/Nazara/Utility/Formats/STBLoader.cpp b/src/Nazara/Utility/Formats/STBLoader.cpp index c7fcc7e8f..132886175 100644 --- a/src/Nazara/Utility/Formats/STBLoader.cpp +++ b/src/Nazara/Utility/Formats/STBLoader.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -54,7 +55,7 @@ namespace Nz return Ternary_False; } - bool Load(Image* image, Stream& stream, const ImageParams& parameters) + ImageRef Load(Stream& stream, const ImageParams& parameters) { // Je charge tout en RGBA8 et je converti ensuite via la méthode Convert // Ceci à cause d'un bug de STB lorsqu'il s'agit de charger certaines images (ex: JPG) en "default" @@ -64,24 +65,29 @@ namespace Nz if (!ptr) { NazaraError("Failed to load image: " + String(stbi_failure_reason())); - return false; + return nullptr; } + CallOnExit freeStbiImage([ptr]() + { + stbi_image_free(ptr); + }); + + ImageRef image = Image::New(); if (!image->Create(ImageType_2D, PixelFormatType_RGBA8, width, height, 1, (parameters.levelCount > 0) ? parameters.levelCount : 1)) { NazaraError("Failed to create image"); - stbi_image_free(ptr); - - return false; + return nullptr; } image->Update(ptr); - stbi_image_free(ptr); + + freeStbiImage.CallAndReset(); if (parameters.loadFormat != PixelFormatType_Undefined) image->Convert(parameters.loadFormat); - return true; + return image; } } diff --git a/src/Nazara/Utility/GuillotineImageAtlas.cpp b/src/Nazara/Utility/GuillotineImageAtlas.cpp index 74cff70db..4660a69b8 100644 --- a/src/Nazara/Utility/GuillotineImageAtlas.cpp +++ b/src/Nazara/Utility/GuillotineImageAtlas.cpp @@ -166,8 +166,7 @@ namespace Nz std::unique_ptr newImage(new Image(ImageType_2D, PixelFormatType_A8, size.x, size.y)); if (oldImage) { - Image& image = *static_cast(oldImage); - newImage->Copy(image, Rectui(size), Vector2ui(0, 0)); // Copie des anciennes données + newImage->Copy(static_cast(oldImage), Rectui(size), Vector2ui(0, 0)); // Copie des anciennes données } return newImage.release(); diff --git a/src/Nazara/Utility/Image.cpp b/src/Nazara/Utility/Image.cpp index 81a810e1a..da5ec120c 100644 --- a/src/Nazara/Utility/Image.cpp +++ b/src/Nazara/Utility/Image.cpp @@ -106,7 +106,7 @@ namespace Nz for (unsigned int i = 0; i < levels.size(); ++i) { unsigned int pixelsPerFace = width * height; - levels[i].reset(new UInt8[pixelsPerFace * depth * PixelFormat::GetBytesPerPixel(newFormat)]); + levels[i] = std::make_unique(pixelsPerFace * depth * PixelFormat::GetBytesPerPixel(newFormat)); UInt8* dst = levels[i].get(); UInt8* src = m_sharedImage->levels[i].get(); @@ -143,29 +143,13 @@ namespace Nz return true; } - void Image::Copy(const Image& source, const Boxui& srcBox, const Vector3ui& dstPos) + void Image::Copy(const Image* source, const Boxui& srcBox, const Vector3ui& dstPos) { - #if NAZARA_UTILITY_SAFE - if (m_sharedImage == &emptyImage) - { - NazaraError("Image must be valid"); - return; - } + NazaraAssert(IsValid(), "Invalid image"); + NazaraAssert(source && source->IsValid(), "Invalid source image"); + NazaraAssert(source->GetFormat() == m_sharedImage->format, "Image formats don't match"); - if (!source.IsValid()) - { - NazaraError("Source image must be valid"); - return; - } - - if (source.GetFormat() != m_sharedImage->format) - { - NazaraError("Source image format does not match destination image format"); - return; - } - #endif - - const UInt8* srcPtr = source.GetConstPixels(srcBox.x, srcBox.y, srcBox.z); + const UInt8* srcPtr = source->GetConstPixels(srcBox.x, srcBox.y, srcBox.z); #if NAZARA_UTILITY_SAFE if (!srcPtr) { @@ -177,7 +161,7 @@ namespace Nz UInt8 bpp = PixelFormat::GetBytesPerPixel(m_sharedImage->format); UInt8* dstPtr = GetPixelPtr(m_sharedImage->levels[0].get(), bpp, dstPos.x, dstPos.y, dstPos.z, m_sharedImage->width, m_sharedImage->height); - Copy(dstPtr, srcPtr, m_sharedImage->format, srcBox.width, srcBox.height, srcBox.depth, m_sharedImage->width, m_sharedImage->height, source.GetWidth(), source.GetHeight()); + Copy(dstPtr, srcPtr, m_sharedImage->format, srcBox.width, srcBox.height, srcBox.depth, m_sharedImage->width, m_sharedImage->height, source->GetWidth(), source->GetHeight()); } bool Image::Create(ImageType type, PixelFormatType format, unsigned int width, unsigned int height, unsigned int depth, UInt8 levelCount) @@ -271,7 +255,7 @@ namespace Nz // Cette allocation est protégée car sa taille dépend directement de paramètres utilisateurs try { - levels[i].reset(new UInt8[PixelFormat::ComputeSize(format, w, h, d)]); + levels[i] = std::make_unique(PixelFormat::ComputeSize(format, w, h, d)); if (w > 1) w >>= 1; @@ -337,12 +321,12 @@ namespace Nz // Les images 3D et cubemaps sont stockés de la même façon unsigned int depth = (m_sharedImage->type == ImageType_Cubemap) ? 6 : m_sharedImage->depth; - for (unsigned int i = 0; i < levels.size(); ++i) + for (auto & level : levels) { std::size_t size = PixelFormat::ComputeSize(m_sharedImage->format, width, height, depth); - levels[i].reset(new UInt8[size]); + level = std::make_unique(size); - UInt8* ptr = levels[i].get(); + UInt8* ptr = level.get(); UInt8* end = &ptr[size]; while (ptr < end) @@ -514,9 +498,9 @@ namespace Nz unsigned int width = m_sharedImage->width; unsigned int height = m_sharedImage->height; unsigned int depth = (m_sharedImage->type == ImageType_Cubemap) ? 6 : m_sharedImage->depth; - for (unsigned int level = 0; level < m_sharedImage->levels.size(); ++level) + for (auto& level : m_sharedImage->levels) { - UInt8* ptr = m_sharedImage->levels[level].get(); + UInt8* ptr = level.get(); if (!PixelFormat::Flip(PixelFlipping_Horizontally, m_sharedImage->format, width, height, depth, ptr, ptr)) { NazaraError("Failed to flip image"); @@ -557,9 +541,9 @@ namespace Nz unsigned int width = m_sharedImage->width; unsigned int height = m_sharedImage->height; unsigned int depth = (m_sharedImage->type == ImageType_Cubemap) ? 6 : m_sharedImage->depth; - for (unsigned int level = 0; level < m_sharedImage->levels.size(); ++level) + for (auto& level : m_sharedImage->levels) { - UInt8* ptr = m_sharedImage->levels[level].get(); + UInt8* ptr = level.get(); if (!PixelFormat::Flip(PixelFlipping_Vertically, m_sharedImage->format, width, height, depth, ptr, ptr)) { NazaraError("Failed to flip image"); @@ -805,7 +789,7 @@ namespace Nz return Vector3ui(GetLevelSize(m_sharedImage->width, level), GetLevelSize(m_sharedImage->height, level), GetLevelSize(m_sharedImage->depth, level)); } - ImageType Image::GetType() const + ImageType Image::GetType() const { return m_sharedImage->type; } @@ -865,67 +849,48 @@ namespace Nz return m_sharedImage != &emptyImage; } - bool Image::LoadFromFile(const String& filePath, const ImageParams& params) - { - return ImageLoader::LoadFromFile(this, filePath, params); - } - - bool Image::LoadFromMemory(const void* data, std::size_t size, const ImageParams& params) - { - return ImageLoader::LoadFromMemory(this, data, size, params); - } - - bool Image::LoadFromStream(Stream& stream, const ImageParams& params) - { - return ImageLoader::LoadFromStream(this, stream, params); - } - // LoadArray - bool Image::LoadArrayFromFile(const String& filePath, const ImageParams& imageParams, const Vector2ui& atlasSize) + ImageRef Image::LoadArrayFromFile(const String& filePath, const ImageParams& imageParams, const Vector2ui& atlasSize) { - Image image; - if (!image.LoadFromFile(filePath, imageParams)) + ImageRef image = Image::LoadFromFile(filePath, imageParams); + if (!image) { NazaraError("Failed to load image"); - return false; + return nullptr; } return LoadArrayFromImage(image, atlasSize); } - bool Image::LoadArrayFromImage(const Image& image, const Vector2ui& atlasSize) + ImageRef Image::LoadArrayFromImage(const Image* image, const Vector2ui& atlasSize) { - #if NAZARA_UTILITY_SAFE - if (!image.IsValid()) - { - NazaraError("Image must be valid"); - return false; - } + NazaraAssert(image && image->IsValid(), "Invalid image"); + #if NAZARA_UTILITY_SAFE if (atlasSize.x == 0) { NazaraError("Atlas width must be over zero"); - return false; + return nullptr; } if (atlasSize.y == 0) { NazaraError("Atlas height must be over zero"); - return false; + return nullptr; } #endif - ImageType type = image.GetType(); + ImageType type = image->GetType(); #if NAZARA_UTILITY_SAFE if (type != ImageType_1D && type != ImageType_2D) { NazaraError("Image type not handled (0x" + String::Number(type, 16) + ')'); - return false; + return nullptr; } #endif - Vector2ui imageSize(image.GetWidth(), image.GetHeight()); + Vector2ui imageSize(image->GetWidth(), image->GetHeight()); if (imageSize.x % atlasSize.x != 0) { @@ -941,82 +906,85 @@ namespace Nz unsigned int layerCount = atlasSize.x*atlasSize.y; + ImageRef arrayImage = New(); // Selon le type de l'image de base, on va créer un array d'images 2D ou 1D if (type == ImageType_2D) - Create(ImageType_2D_Array, image.GetFormat(), faceSize.x, faceSize.y, layerCount); + arrayImage->Create(ImageType_2D_Array, image->GetFormat(), faceSize.x, faceSize.y, layerCount); else - Create(ImageType_1D_Array, image.GetFormat(), faceSize.x, layerCount); + arrayImage->Create(ImageType_1D_Array, image->GetFormat(), faceSize.x, layerCount); + + if (!arrayImage->IsValid()) + { + NazaraError("Failed to create image"); + return nullptr; + } unsigned int layer = 0; for (unsigned int j = 0; j < atlasSize.y; ++j) for (unsigned int i = 0; i < atlasSize.x; ++i) - Copy(image, Rectui(i*faceSize.x, j*faceSize.y, faceSize.x, faceSize.y), Vector3ui(0, 0, layer++)); + arrayImage->Copy(image, Rectui(i*faceSize.x, j*faceSize.y, faceSize.x, faceSize.y), Vector3ui(0, 0, layer++)); - return true; + return arrayImage; } - bool Image::LoadArrayFromMemory(const void* data, std::size_t size, const ImageParams& imageParams, const Vector2ui& atlasSize) + ImageRef Image::LoadArrayFromMemory(const void* data, std::size_t size, const ImageParams& imageParams, const Vector2ui& atlasSize) { - Image image; - if (!image.LoadFromMemory(data, size, imageParams)) + ImageRef image = Image::LoadFromMemory(data, size, imageParams); + if (!image) { NazaraError("Failed to load image"); - return false; + return nullptr; } return LoadArrayFromImage(image, atlasSize); } - bool Image::LoadArrayFromStream(Stream& stream, const ImageParams& imageParams, const Vector2ui& atlasSize) + ImageRef Image::LoadArrayFromStream(Stream& stream, const ImageParams& imageParams, const Vector2ui& atlasSize) { - Image image; - if (!image.LoadFromStream(stream, imageParams)) + ImageRef image = Image::LoadFromStream(stream, imageParams); + if (!image) { NazaraError("Failed to load image"); - return false; + return nullptr; } return LoadArrayFromImage(image, atlasSize); } - bool Image::LoadCubemapFromFile(const String& filePath, const ImageParams& imageParams, const CubemapParams& cubemapParams) + ImageRef Image::LoadCubemapFromFile(const String& filePath, const ImageParams& imageParams, const CubemapParams& cubemapParams) { - Image image; - if (!image.LoadFromFile(filePath, imageParams)) + ImageRef image = Image::LoadFromFile(filePath, imageParams); + if (!image) { NazaraError("Failed to load image"); - return false; + return nullptr; } return LoadCubemapFromImage(image, cubemapParams); } - bool Image::LoadCubemapFromImage(const Image& image, const CubemapParams& params) + ImageRef Image::LoadCubemapFromImage(const Image* image, const CubemapParams& params) { - #if NAZARA_UTILITY_SAFE - if (!image.IsValid()) - { - NazaraError("Image must be valid"); - return false; - } + NazaraAssert(image && image->IsValid(), "Invalid image"); - ImageType type = image.GetType(); + #if NAZARA_UTILITY_SAFE + ImageType type = image->GetType(); if (type != ImageType_2D) { NazaraError("Image type not handled (0x" + String::Number(type, 16) + ')'); - return false; + return nullptr; } #endif - unsigned int width = image.GetWidth(); - unsigned int height = image.GetHeight(); + unsigned int width = image->GetWidth(); + unsigned int height = image->GetHeight(); unsigned int faceSize = (params.faceSize == 0) ? std::max(width, height)/4 : params.faceSize; // Sans cette vérification, celles des rectangles pourrait réussir via un overflow if (width < faceSize || height < faceSize) { NazaraError("Image is too small for this face size"); - return false; + return nullptr; } // Calcul et vérification des surfaces @@ -1027,84 +995,80 @@ namespace Nz if (backPos.x > limitX || backPos.y > limitY) { NazaraError("Back rectangle is out of image"); - return false; + return nullptr; } Vector2ui downPos = params.downPosition * faceSize; if (downPos.x > limitX || downPos.y > limitY) { NazaraError("Down rectangle is out of image"); - return false; + return nullptr; } Vector2ui forwardPos = params.forwardPosition * faceSize; if (forwardPos.x > limitX || forwardPos.y > limitY) { NazaraError("Forward rectangle is out of image"); - return false; + return nullptr; } Vector2ui leftPos = params.leftPosition * faceSize; if (leftPos.x > limitX || leftPos.y > limitY) { NazaraError("Left rectangle is out of image"); - return false; + return nullptr; } Vector2ui rightPos = params.rightPosition * faceSize; if (rightPos.x > limitX || rightPos.y > limitY) { NazaraError("Right rectangle is out of image"); - return false; + return nullptr; } Vector2ui upPos = params.upPosition * faceSize; if (upPos.x > limitX || upPos.y > limitY) { NazaraError("Up rectangle is out of image"); - return false; + return nullptr; } - Create(ImageType_Cubemap, image.GetFormat(), faceSize, faceSize); - - #ifdef NAZARA_DEBUG - // Les paramètres sont valides, que Create ne fonctionne pas relèverait d'un bug - if (m_sharedImage == &emptyImage) + ImageRef cubemap = New(); + if (!cubemap->Create(ImageType_Cubemap, image->GetFormat(), faceSize, faceSize)) { - NazaraInternalError("Failed to create cubemap"); - return false; + NazaraError("Failed to create cubemap"); + return nullptr; } - #endif - Copy(image, Rectui(backPos.x, backPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_NegativeZ)); - Copy(image, Rectui(downPos.x, downPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_NegativeY)); - Copy(image, Rectui(forwardPos.x, forwardPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_PositiveZ)); - Copy(image, Rectui(leftPos.x, leftPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_NegativeX)); - Copy(image, Rectui(rightPos.x, rightPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_PositiveX)); - Copy(image, Rectui(upPos.x, upPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_PositiveY)); + cubemap->Copy(image, Rectui(backPos.x, backPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_NegativeZ)); + cubemap->Copy(image, Rectui(downPos.x, downPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_NegativeY)); + cubemap->Copy(image, Rectui(forwardPos.x, forwardPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_PositiveZ)); + cubemap->Copy(image, Rectui(leftPos.x, leftPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_NegativeX)); + cubemap->Copy(image, Rectui(rightPos.x, rightPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_PositiveX)); + cubemap->Copy(image, Rectui(upPos.x, upPos.y, faceSize, faceSize), Vector3ui(0, 0, CubemapFace_PositiveY)); - return true; + return cubemap; } - bool Image::LoadCubemapFromMemory(const void* data, std::size_t size, const ImageParams& imageParams, const CubemapParams& cubemapParams) + ImageRef Image::LoadCubemapFromMemory(const void* data, std::size_t size, const ImageParams& imageParams, const CubemapParams& cubemapParams) { - Image image; - if (!image.LoadFromMemory(data, size, imageParams)) + ImageRef image = Image::LoadFromMemory(data, size, imageParams); + if (!image) { NazaraError("Failed to load image"); - return false; + return nullptr; } return LoadCubemapFromImage(image, cubemapParams); } - bool Image::LoadCubemapFromStream(Stream& stream, const ImageParams& imageParams, const CubemapParams& cubemapParams) + ImageRef Image::LoadCubemapFromStream(Stream& stream, const ImageParams& imageParams, const CubemapParams& cubemapParams) { - Image image; - if (!image.LoadFromStream(stream, imageParams)) + ImageRef image = Image::LoadFromStream(stream, imageParams); + if (!image) { NazaraError("Failed to load image"); - return false; + return nullptr; } return LoadCubemapFromImage(image, cubemapParams); @@ -1114,21 +1078,21 @@ namespace Nz { NazaraAssert(IsValid() && IsCubemap(), "Texture must be a valid cubemap"); - Image image; - if (!image.LoadFromFile(filePath, params)) + ImageRef image = Image::LoadFromFile(filePath, params); + if (!image) { NazaraError("Failed to load image"); return false; } - if (!image.Convert(GetFormat())) + if (!image->Convert(GetFormat())) { NazaraError("Failed to convert image to texture format"); return false; } unsigned int faceSize = GetWidth(); - if (image.GetWidth() != faceSize || image.GetHeight() != faceSize) + if (image->GetWidth() != faceSize || image->GetHeight() != faceSize) { NazaraError("Image size must match texture face size"); return false; @@ -1142,21 +1106,21 @@ namespace Nz { NazaraAssert(IsValid() && IsCubemap(), "Texture must be a valid cubemap"); - Image image; - if (!image.LoadFromMemory(data, size, params)) + ImageRef image = Image::LoadFromMemory(data, size, params); + if (!image) { NazaraError("Failed to load image"); return false; } - if (!image.Convert(GetFormat())) + if (!image->Convert(GetFormat())) { NazaraError("Failed to convert image to texture format"); return false; } unsigned int faceSize = GetWidth(); - if (image.GetWidth() != faceSize || image.GetHeight() != faceSize) + if (image->GetWidth() != faceSize || image->GetHeight() != faceSize) { NazaraError("Image size must match texture face size"); return false; @@ -1170,21 +1134,21 @@ namespace Nz { NazaraAssert(IsValid() && IsCubemap(), "Texture must be a valid cubemap"); - Image image; - if (!image.LoadFromStream(stream, params)) + ImageRef image = Image::LoadFromStream(stream, params); + if (!image) { NazaraError("Failed to load image"); return false; } - if (!image.Convert(GetFormat())) + if (!image->Convert(GetFormat())) { NazaraError("Failed to convert image to texture format"); return false; } unsigned int faceSize = GetWidth(); - if (image.GetWidth() != faceSize || image.GetHeight() != faceSize) + if (image->GetWidth() != faceSize || image->GetHeight() != faceSize) { NazaraError("Image size must match texture face size"); return false; @@ -1232,7 +1196,7 @@ namespace Nz m_sharedImage->levels.resize(levelCount); for (UInt8 i = oldLevelCount; i < maxLevelCount; ++i) - m_sharedImage->levels[i].reset(new UInt8[GetMemoryUsage(i)]); + m_sharedImage->levels[i] = std::make_unique(GetMemoryUsage(i)); } bool Image::SetPixelColor(const Color& color, unsigned int x, unsigned int y, unsigned int z) @@ -1463,7 +1427,21 @@ namespace Nz NazaraError("Image type not handled (0x" + String::Number(type, 16) + ')'); return 0; + } + ImageRef Image::LoadFromFile(const String& filePath, const ImageParams& params) + { + return ImageLoader::LoadFromFile(filePath, params); + } + + ImageRef Image::LoadFromMemory(const void* data, std::size_t size, const ImageParams& params) + { + return ImageLoader::LoadFromMemory(data, size, params); + } + + ImageRef Image::LoadFromStream(Stream& stream, const ImageParams& params) + { + return ImageLoader::LoadFromStream(stream, params); } void Image::EnsureOwnership() @@ -1477,7 +1455,7 @@ namespace Nz for (unsigned int i = 0; i < levels.size(); ++i) { std::size_t size = GetMemoryUsage(i); - levels[i].reset(new UInt8[size]); + levels[i] = std::make_unique(size); std::memcpy(levels[i].get(), m_sharedImage->levels[i].get(), size); } diff --git a/src/Nazara/Utility/Mesh.cpp b/src/Nazara/Utility/Mesh.cpp index 015ee520d..890577de4 100644 --- a/src/Nazara/Utility/Mesh.cpp +++ b/src/Nazara/Utility/Mesh.cpp @@ -521,21 +521,6 @@ namespace Nz return m_isValid; } - bool Mesh::LoadFromFile(const String& filePath, const MeshParams& params) - { - return MeshLoader::LoadFromFile(this, filePath, params); - } - - bool Mesh::LoadFromMemory(const void* data, std::size_t size, const MeshParams& params) - { - return MeshLoader::LoadFromMemory(this, data, size, params); - } - - bool Mesh::LoadFromStream(Stream& stream, const MeshParams& params) - { - return MeshLoader::LoadFromStream(this, stream, params); - } - void Mesh::Recenter() { NazaraAssert(m_isValid, "Mesh should be created first"); @@ -663,6 +648,21 @@ namespace Nz } } + MeshRef Mesh::LoadFromFile(const String& filePath, const MeshParams& params) + { + return MeshLoader::LoadFromFile(filePath, params); + } + + MeshRef Mesh::LoadFromMemory(const void* data, std::size_t size, const MeshParams& params) + { + return MeshLoader::LoadFromMemory(data, size, params); + } + + MeshRef Mesh::LoadFromStream(Stream& stream, const MeshParams& params) + { + return MeshLoader::LoadFromStream(stream, params); + } + bool Mesh::Initialize() { if (!MeshLibrary::Initialize()) diff --git a/tests/Engine/Audio/Music.cpp b/tests/Engine/Audio/Music.cpp index 404c57c5f..2e0edd8c3 100644 --- a/tests/Engine/Audio/Music.cpp +++ b/tests/Engine/Audio/Music.cpp @@ -16,22 +16,22 @@ SCENARIO("Music", "[AUDIO][MUSIC]") THEN("We can ask the informations of the file") { - REQUIRE(music.GetDuration() <= 64000); // 1 min 03 = 63s = 63000ms - REQUIRE(music.GetDuration() >= 63000); - REQUIRE(music.GetFormat() == Nz::AudioFormat_Stereo); - REQUIRE(music.GetPlayingOffset() == 0); - REQUIRE(music.GetSampleCount() <= 5644800); // 64s * 44100 Hz * 2 (stereo) - REQUIRE(music.GetSampleCount() >= 5556600); // 63s * 44100 Hz * 2 (stereo) - REQUIRE(music.GetSampleRate() == 44100 /* Hz */); - REQUIRE(music.GetStatus() == Nz::SoundStatus_Stopped); - REQUIRE(music.IsLooping() == false); + CHECK(music.GetDuration() <= 64000); // 1 min 03 = 63s = 63000ms + CHECK(music.GetDuration() >= 63000); + CHECK(music.GetFormat() == Nz::AudioFormat_Stereo); + CHECK(music.GetPlayingOffset() == 0); + CHECK(music.GetSampleCount() <= 5644800); // 64s * 44100 Hz * 2 (stereo) + CHECK(music.GetSampleCount() >= 5556600); // 63s * 44100 Hz * 2 (stereo) + CHECK(music.GetSampleRate() == 44100 /* Hz */); + CHECK(music.GetStatus() == Nz::SoundStatus_Stopped); + CHECK(music.IsLooping() == false); } THEN("We can play it and get the time offset") { Nz::Audio::SetGlobalVolume(0.f); - music.Play(); + music.Play(); Nz::Thread::Sleep(1000); REQUIRE(music.GetPlayingOffset() >= 950); Nz::Thread::Sleep(200); diff --git a/tests/Engine/Audio/SoundBuffer.cpp b/tests/Engine/Audio/SoundBuffer.cpp index ed5f2f6c6..292a1e98e 100644 --- a/tests/Engine/Audio/SoundBuffer.cpp +++ b/tests/Engine/Audio/SoundBuffer.cpp @@ -5,16 +5,15 @@ SCENARIO("SoundBuffer", "[AUDIO][SOUNDBUFFER]") { GIVEN("A sound buffer") { - Nz::SoundBuffer soundBuffer; - WHEN("We load our sound") { - REQUIRE(soundBuffer.LoadFromFile("resources/Engine/Audio/Cat.flac")); + Nz::SoundBufferRef soundBuffer = Nz::SoundBuffer::LoadFromFile("resources/Engine/Audio/Cat.flac"); + REQUIRE(soundBuffer.IsValid()); THEN("We can ask the informations of the file") { - REQUIRE(soundBuffer.GetDuration() <= 8500); // 8s = 8000ms - REQUIRE(soundBuffer.GetDuration() >= 8000); + REQUIRE(soundBuffer->GetDuration() <= 8500); // 8s = 8000ms + REQUIRE(soundBuffer->GetDuration() >= 8000); } } } diff --git a/tests/Engine/Graphics/Billboard.cpp b/tests/Engine/Graphics/Billboard.cpp index 651274bfd..376d990b1 100644 --- a/tests/Engine/Graphics/Billboard.cpp +++ b/tests/Engine/Graphics/Billboard.cpp @@ -9,8 +9,7 @@ SCENARIO("Billboard", "[GRAPHICS][BILLBOARD]") WHEN("We assign it to another") { - Nz::MaterialRef materialRef = Nz::Material::New(); - materialRef->LoadFromFile("resources/Engine/Graphics/Nazara.png"); + Nz::MaterialRef materialRef = Nz::Material::LoadFromFile("resources/Engine/Graphics/Nazara.png"); Nz::Color materialColor = materialRef->GetDiffuseColor(); Nz::BillboardRef otherBillboard = Nz::Billboard::New(materialRef); diff --git a/tests/Engine/Graphics/Model.cpp b/tests/Engine/Graphics/Model.cpp index 270d15a0e..89c1988f0 100644 --- a/tests/Engine/Graphics/Model.cpp +++ b/tests/Engine/Graphics/Model.cpp @@ -12,8 +12,8 @@ SCENARIO("Model", "[GRAPHICS][MODEL]") Nz::ModelParameters params; params.mesh.optimizeIndexBuffers = false; - Nz::ModelRef model = Nz::Model::New(); - REQUIRE(model->LoadFromFile("resources/Engine/Graphics/dragon_recon/dragon_vrip_res4.obj", params)); + Nz::ModelRef model = Nz::Model::LoadFromFile("resources/Engine/Graphics/dragon_recon/dragon_vrip_res4.obj", params); + REQUIRE(model); REQUIRE(model->GetMaterialCount() == 1); REQUIRE(model->GetSkin() == 0); diff --git a/tests/Engine/Graphics/SkeletalModel.cpp b/tests/Engine/Graphics/SkeletalModel.cpp index 87d2e43f1..95d819c9a 100644 --- a/tests/Engine/Graphics/SkeletalModel.cpp +++ b/tests/Engine/Graphics/SkeletalModel.cpp @@ -5,21 +5,20 @@ SCENARIO("SkeletalModel", "[GRAPHICS][SKELETALMODEL]") { GIVEN("A default skeletal model") { - Nz::SkeletalModel skeletalModel; - Nz::AnimationRef animation = Nz::Animation::New(); - WHEN("We can load the bob lamp") { - REQUIRE(skeletalModel.LoadFromFile("resources/Engine/Graphics/Bob lamp/bob_lamp_update.md5mesh")); - REQUIRE(animation->LoadFromFile("resources/Engine/Graphics/Bob lamp/bob_lamp_update.md5anim")); - skeletalModel.SetAnimation(animation); + Nz::AnimationRef animation = Nz::Animation::LoadFromFile("resources/Engine/Graphics/Bob lamp/bob_lamp_update.md5anim"); + Nz::SkeletalModelRef skeletalModel = Nz::StaticRefCast(Nz::SkeletalModel::LoadFromFile("resources/Engine/Graphics/Bob lamp/bob_lamp_update.md5mesh")); + REQUIRE(skeletalModel); + REQUIRE(animation); + skeletalModel->SetAnimation(animation); THEN("We can enable its animation") { - REQUIRE(skeletalModel.HasAnimation()); - skeletalModel.EnableAnimation(true); - skeletalModel.AdvanceAnimation(0.10f); - REQUIRE(skeletalModel.IsAnimationEnabled()); + REQUIRE(skeletalModel->HasAnimation()); + skeletalModel->EnableAnimation(true); + skeletalModel->AdvanceAnimation(0.10f); + REQUIRE(skeletalModel->IsAnimationEnabled()); } } } diff --git a/tests/Engine/Graphics/SkyboxBackground.cpp b/tests/Engine/Graphics/SkyboxBackground.cpp index 36ceb0db5..c2b1910ab 100644 --- a/tests/Engine/Graphics/SkyboxBackground.cpp +++ b/tests/Engine/Graphics/SkyboxBackground.cpp @@ -5,8 +5,7 @@ SCENARIO("SkyboxBackground", "[GRAPHICS][SKYBOXBACKGROUND]") { GIVEN("A skybox background with a loaded image") { - Nz::TextureRef textureRef = Nz::Texture::New(); - textureRef->LoadCubemapFromFile("resources/Engine/Graphics/skybox.png"); + Nz::TextureRef textureRef = Nz::Texture::LoadCubemapFromFile("resources/Engine/Graphics/skybox.png"); Nz::SkyboxBackgroundRef skyboxBackgroundRef = Nz::SkyboxBackground::New(textureRef); WHEN("We assign it parameters") diff --git a/tests/Engine/Graphics/TextureBackground.cpp b/tests/Engine/Graphics/TextureBackground.cpp index 33178d87f..ff89cc46f 100644 --- a/tests/Engine/Graphics/TextureBackground.cpp +++ b/tests/Engine/Graphics/TextureBackground.cpp @@ -5,8 +5,7 @@ SCENARIO("TextureBackground", "[GRAPHICS][TEXTUREBACKGROUND]") { GIVEN("A default texture background") { - Nz::TextureRef textureRef = Nz::Texture::New(); - textureRef->LoadFromFile("resources/Engine/Graphics/skybox.png"); + Nz::TextureRef textureRef = Nz::Texture::LoadFromFile("resources/Engine/Graphics/skybox.png"); Nz::TextureBackgroundRef textureBackgroundRef = Nz::TextureBackground::New(textureRef); WHEN("We assign it parameters") @@ -17,4 +16,4 @@ SCENARIO("TextureBackground", "[GRAPHICS][TEXTUREBACKGROUND]") } } } -} \ No newline at end of file +} From c4cf6d2f53d1230239b64be6cbe1db756ef25b7b Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 29 Oct 2018 22:06:09 +0100 Subject: [PATCH 146/352] Graphics/BasicRenderQueue: Extends maximum layer count to 65535 --- src/Nazara/Graphics/BasicRenderQueue.cpp | 106 +++++++++++------------ 1 file changed, 50 insertions(+), 56 deletions(-) diff --git a/src/Nazara/Graphics/BasicRenderQueue.cpp b/src/Nazara/Graphics/BasicRenderQueue.cpp index 2068a21ff..ece80a421 100644 --- a/src/Nazara/Graphics/BasicRenderQueue.cpp +++ b/src/Nazara/Graphics/BasicRenderQueue.cpp @@ -742,14 +742,14 @@ namespace Nz basicSprites.Sort([&](const SpriteChain& vertices) { // RQ index: - // - Layer (4bits) + // - Layer (16bits) // - Pipeline (8bits) // - Material (8bits) // - Shader? (8bits) // - Textures (8bits) // - Overlay (8bits) // - Scissor (4bits) - // - Depth? (16bits) + // - ??? (4bits) UInt64 layerIndex = m_layerCache[vertices.layerIndex]; UInt64 pipelineIndex = GetOrInsert(m_pipelineCache, vertices.material->GetPipeline()); @@ -758,16 +758,14 @@ namespace Nz UInt64 textureIndex = GetOrInsert(m_textureCache, vertices.material->GetDiffuseMap()); UInt64 overlayIndex = GetOrInsert(m_overlayCache, vertices.overlay); UInt64 scissorIndex = 0; //< TODO - UInt64 depthIndex = 0; //< TODO - UInt64 index = (layerIndex & 0x0F) << 60 | - (pipelineIndex & 0xFF) << 52 | - (materialIndex & 0xFF) << 44 | - (shaderIndex & 0xFF) << 36 | - (textureIndex & 0xFF) << 28 | - (overlayIndex & 0xFF) << 20 | - (scissorIndex & 0x0F) << 16 | - (depthIndex & 0xFFFF) << 0; + UInt64 index = (layerIndex & 0xFFFF) << 48 | + (pipelineIndex & 0xFF) << 40 | + (materialIndex & 0xFF) << 32 | + (shaderIndex & 0xFF) << 24 | + (textureIndex & 0xFF) << 16 | + (overlayIndex & 0xFF) << 8 | + (scissorIndex & 0x0F) << 4; return index; }); @@ -775,14 +773,13 @@ namespace Nz billboards.Sort([&](const BillboardChain& billboard) { // RQ index: - // - Layer (4bits) + // - Layer (16bits) // - Pipeline (8bits) // - Material (8bits) // - Shader? (8bits) // - Textures (8bits) - // - ??? (8bits) // - Scissor (4bits) - // - Depth? (16bits) + // - ??? (12bits) UInt64 layerIndex = m_layerCache[billboard.layerIndex]; UInt64 pipelineIndex = GetOrInsert(m_pipelineCache, billboard.material->GetPipeline()); @@ -791,16 +788,14 @@ namespace Nz UInt64 textureIndex = GetOrInsert(m_textureCache, billboard.material->GetDiffuseMap()); UInt64 unknownIndex = 0; //< ??? UInt64 scissorIndex = 0; //< TODO - UInt64 depthIndex = 0; //< TODO? - UInt64 index = (layerIndex & 0x0F) << 60 | - (pipelineIndex & 0xFF) << 52 | - (materialIndex & 0xFF) << 44 | - (shaderIndex & 0xFF) << 36 | - (textureIndex & 0xFF) << 28 | - (unknownIndex & 0xFF) << 20 | - (scissorIndex & 0x0F) << 16 | - (depthIndex & 0xFFFF) << 0; + UInt64 index = (layerIndex & 0xFFFF) << 48 | + (pipelineIndex & 0xFF) << 40 | + (materialIndex & 0xFF) << 32 | + (shaderIndex & 0xFF) << 24 | + (textureIndex & 0xFF) << 16 | + (scissorIndex & 0x0F) << 12 | + (unknownIndex & 0xFF) << 0; return index; }); @@ -808,11 +803,11 @@ namespace Nz customDrawables.Sort([&](const CustomDrawable& drawable) { // RQ index: - // - Layer (4bits) + // - Layer (16bits) UInt64 layerIndex = m_layerCache[drawable.layerIndex]; - UInt64 index = (layerIndex & 0x0F) << 60; + UInt64 index = (layerIndex & 0xFFFF) << 48; return index; @@ -821,14 +816,14 @@ namespace Nz models.Sort([&](const Model& renderData) { // RQ index: - // - Layer (4bits) + // - Layer (16bits) // - Pipeline (8bits) // - Material (8bits) // - Shader? (8bits) // - Textures (8bits) // - Buffers (8bits) // - Scissor (4bits) - // - Depth? (16bits) + // - ??? (4bits) UInt64 layerIndex = m_layerCache[renderData.layerIndex]; UInt64 pipelineIndex = GetOrInsert(m_pipelineCache, renderData.material->GetPipeline()); @@ -839,14 +834,13 @@ namespace Nz UInt64 scissorIndex = 0; //< TODO UInt64 depthIndex = 0; //< TODO - UInt64 index = (layerIndex & 0x0F) << 60 | - (pipelineIndex & 0xFF) << 52 | - (materialIndex & 0xFF) << 44 | - (shaderIndex & 0xFF) << 36 | - (textureIndex & 0xFF) << 28 | - (bufferIndex & 0xFF) << 20 | - (scissorIndex & 0x0F) << 16 | - (depthIndex & 0xFFFF) << 0; + UInt64 index = (layerIndex & 0xFFFF) << 48 | + (pipelineIndex & 0xFF) << 40 | + (materialIndex & 0xFF) << 32 | + (shaderIndex & 0xFF) << 24 | + (textureIndex & 0xFF) << 16 | + (bufferIndex & 0xFF) << 8 | + (scissorIndex & 0x0F) << 4; return index; }); @@ -864,19 +858,19 @@ namespace Nz depthSortedBillboards.Sort([&](const Billboard& billboard) { // RQ index: - // - Layer (4bits) + // - Layer (16bits) // - Depth (32bits) - // - ?? (28bits) + // - ?? (16bits) // Reinterpret depth as UInt32 (this will work as long as they're all either positive or negative, - // a negative distance may happen with billboard behind the camera which we don't care about since they'll be rendered) + // a negative distance may happen with billboard behind the camera which we don't care about since they'll not be rendered) float depth = nearPlane.Distance(billboard.data.center); UInt64 layerIndex = m_layerCache[billboard.layerIndex]; UInt64 depthIndex = ~reinterpret_cast(depth); - UInt64 index = (layerIndex & 0x0F) << 60 | - (depthIndex & 0xFFFFFFFF) << 28; + UInt64 index = (layerIndex & 0xFFFF) << 48 | + (depthIndex & 0xFFFFFFFF) << 16; return index; }); @@ -886,17 +880,17 @@ namespace Nz depthSortedModels.Sort([&](const Model& model) { // RQ index: - // - Layer (4bits) + // - Layer (16bits) // - Depth (32bits) - // - ?? (28bits) + // - ?? (16bits) float depth = nearPlane.Distance(model.obbSphere.GetPosition()); UInt64 layerIndex = m_layerCache[model.layerIndex]; UInt64 depthIndex = ~reinterpret_cast(depth); - UInt64 index = (layerIndex & 0x0F) << 60 | - (depthIndex & 0xFFFFFFFF) << 28; + UInt64 index = (layerIndex & 0xFFFF) << 48 | + (depthIndex & 0xFFFFFFFF) << 16; return index; }); @@ -904,17 +898,17 @@ namespace Nz depthSortedSprites.Sort([&](const SpriteChain& spriteChain) { // RQ index: - // - Layer (4bits) + // - Layer (16bits) // - Depth (32bits) - // - ?? (28bits) + // - ?? (16bits) float depth = nearPlane.Distance(spriteChain.vertices[0].position); UInt64 layerIndex = m_layerCache[spriteChain.layerIndex]; UInt64 depthIndex = ~reinterpret_cast(depth); - UInt64 index = (layerIndex & 0x0F) << 60 | - (depthIndex & 0xFFFFFFFF) << 28; + UInt64 index = (layerIndex & 0xFFFF) << 48 | + (depthIndex & 0xFFFFFFFF) << 16; return index; }); @@ -926,17 +920,17 @@ namespace Nz depthSortedModels.Sort([&](const Model& model) { // RQ index: - // - Layer (4bits) + // - Layer (16bits) // - Depth (32bits) - // - ?? (28bits) + // - ?? (16bits) float depth = viewerPos.SquaredDistance(model.obbSphere.GetPosition()); UInt64 layerIndex = m_layerCache[model.layerIndex]; UInt64 depthIndex = ~reinterpret_cast(depth); - UInt64 index = (layerIndex & 0x0F) << 60 | - (depthIndex & 0xFFFFFFFF) << 28; + UInt64 index = (layerIndex & 0x0F) << 48 | + (depthIndex & 0xFFFFFFFF) << 16; return index; }); @@ -944,17 +938,17 @@ namespace Nz depthSortedSprites.Sort([&](const SpriteChain& sprites) { // RQ index: - // - Layer (4bits) + // - Layer (16bits) // - Depth (32bits) - // - ?? (28bits) + // - ?? (16bits) float depth = viewerPos.SquaredDistance(sprites.vertices[0].position); UInt64 layerIndex = m_layerCache[sprites.layerIndex]; UInt64 depthIndex = ~reinterpret_cast(depth); - UInt64 index = (layerIndex & 0x0F) << 60 | - (depthIndex & 0xFFFFFFFF) << 28; + UInt64 index = (layerIndex & 0xFFFF) << 48 | + (depthIndex & 0xFFFFFFFF) << 16; return index; }); From 1c0a234d04fce869c5f60823c267783741199bd4 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 31 Oct 2018 18:39:14 +0100 Subject: [PATCH 147/352] 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 a3fd69a453f929780c8c9dc26b31a10d3042705c Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 14 Nov 2018 23:54:31 +0100 Subject: [PATCH 148/352] Lua/LuaState: Add RawEqual function --- ChangeLog.md | 1 + include/Nazara/Lua/LuaState.hpp | 2 ++ src/Nazara/Lua/LuaState.cpp | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index ad2dd0a55..4f37e76d8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -155,6 +155,7 @@ Nazara Engine: - Added ENetHost and ENetPeer accessor to total packet/data received/sent/lost - ⚠ **Changed the way resources were Loaded, almost every LoadFromX and OpenFromX methods are now static and create the object themselves.** - ⚠ SoundStream is now responsible for loaders instead of Music, and is now threadsafe (you can now load a stream only once and play it multiple times at the same time) +- Added LuaState::RawEqual Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Lua/LuaState.hpp b/include/Nazara/Lua/LuaState.hpp index 47c6d07cf..4890eae30 100644 --- a/include/Nazara/Lua/LuaState.hpp +++ b/include/Nazara/Lua/LuaState.hpp @@ -157,6 +157,8 @@ namespace Nz void* PushUserdata(std::size_t size) const; void PushValue(int index) const; + bool RawEqual(int index1, int index2) const; + void Remove(int index) const; void Replace(int index) const; diff --git a/src/Nazara/Lua/LuaState.cpp b/src/Nazara/Lua/LuaState.cpp index dfbec1117..6065087d6 100644 --- a/src/Nazara/Lua/LuaState.cpp +++ b/src/Nazara/Lua/LuaState.cpp @@ -712,6 +712,11 @@ namespace Nz lua_pushvalue(m_state, index); } + bool LuaState::RawEqual(int index1, int index2) const + { + return lua_rawequal(m_state, index1, index2); + } + void LuaState::Remove(int index) const { lua_remove(m_state, index); From beed59b94c5fcbaaee8f81af69bf73d7037f6c9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 16 Nov 2018 17:42:59 +0100 Subject: [PATCH 149/352] Physics2D/RigidBody2D: Fix potential crash if closestDistance is passed as nullptr --- src/Nazara/Physics2D/RigidBody2D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 4abd6505b..97b778089 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -156,7 +156,7 @@ namespace Nz if (closestPoint) *closestPoint = closest; - if (minDistance) + if (closestDistance) *closestDistance = minDistance; return true; From 0740ee456a4c1b49b9185ca497ef03e2299a00fe Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 19 Dec 2018 22:08:50 +0100 Subject: [PATCH 150/352] Lua/LuaCoroutine: Fixed movement assignation operator --- ChangeLog.md | 1 + include/Nazara/Lua/LuaCoroutine.inl | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 4f37e76d8..1c4e14c6a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -156,6 +156,7 @@ Nazara Engine: - ⚠ **Changed the way resources were Loaded, almost every LoadFromX and OpenFromX methods are now static and create the object themselves.** - ⚠ SoundStream is now responsible for loaders instead of Music, and is now threadsafe (you can now load a stream only once and play it multiple times at the same time) - Added LuaState::RawEqual +- Fixed LuaCoroutine movement assignation operator Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Lua/LuaCoroutine.inl b/include/Nazara/Lua/LuaCoroutine.inl index 63c7d0eda..43a3f87cb 100644 --- a/include/Nazara/Lua/LuaCoroutine.inl +++ b/include/Nazara/Lua/LuaCoroutine.inl @@ -15,8 +15,7 @@ namespace Nz { LuaState::operator=(std::move(instance)); - m_ref = instance.m_ref; - instance.m_ref = -1; + std::swap(m_ref, instance.m_ref); return *this; } From cd54cf641bce1d960352b57765cdcb96c7ad617c Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 19 Dec 2018 22:22:30 +0100 Subject: [PATCH 151/352] Alignment fix --- src/Nazara/Physics2D/RigidBody2D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 97b778089..cbeb23cd1 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -105,7 +105,7 @@ namespace Nz cpBodyApplyForceAtLocalPoint(m_handle, cpv(force.x, force.y), cpv(point.x, point.y)); break; } -} + } void RigidBody2D::AddImpulse(const Vector2f& impulse, CoordSys coordSys) { From fc86d098c3b146a89fe5e8f7a2ded36cc1825728 Mon Sep 17 00:00:00 2001 From: Faymoon Date: Fri, 11 Jan 2019 09:29:37 +0100 Subject: [PATCH 152/352] Update Velocity[System/Component] to add CoordSys_Local support (#193) --- SDK/include/NDK/Components/VelocityComponent.hpp | 3 ++- SDK/include/NDK/Components/VelocityComponent.inl | 5 +++-- SDK/src/NDK/Systems/VelocitySystem.cpp | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/SDK/include/NDK/Components/VelocityComponent.hpp b/SDK/include/NDK/Components/VelocityComponent.hpp index 8785f6861..2c619da76 100644 --- a/SDK/include/NDK/Components/VelocityComponent.hpp +++ b/SDK/include/NDK/Components/VelocityComponent.hpp @@ -19,10 +19,11 @@ namespace Ndk class NDK_API VelocityComponent : public Component { public: - VelocityComponent(const Nz::Vector3f& velocity = Nz::Vector3f::Zero()); + VelocityComponent(const Nz::Vector3f& velocity = Nz::Vector3f::Zero(), Nz::CoordSys coordSystem = Nz::CoordSys_Global); ~VelocityComponent() = default; Nz::Vector3f linearVelocity; + Nz::CoordSys coordSys; VelocityComponent& operator=(const Nz::Vector3f& vel); diff --git a/SDK/include/NDK/Components/VelocityComponent.inl b/SDK/include/NDK/Components/VelocityComponent.inl index 3ca449132..2adedf413 100644 --- a/SDK/include/NDK/Components/VelocityComponent.inl +++ b/SDK/include/NDK/Components/VelocityComponent.inl @@ -16,8 +16,9 @@ namespace Ndk * \param velocity Linear velocity */ - inline VelocityComponent::VelocityComponent(const Nz::Vector3f& velocity) : - linearVelocity(velocity) + inline VelocityComponent::VelocityComponent(const Nz::Vector3f& velocity, Nz::CoordSys coordSystem) : + linearVelocity(velocity), + coordSys(coordSystem) { } diff --git a/SDK/src/NDK/Systems/VelocitySystem.cpp b/SDK/src/NDK/Systems/VelocitySystem.cpp index 0b1845bfb..b633d7b68 100644 --- a/SDK/src/NDK/Systems/VelocitySystem.cpp +++ b/SDK/src/NDK/Systems/VelocitySystem.cpp @@ -43,7 +43,7 @@ namespace Ndk NodeComponent& node = entity->GetComponent(); const VelocityComponent& velocity = entity->GetComponent(); - node.Move(velocity.linearVelocity * elapsedTime, Nz::CoordSys_Global); + node.Move(velocity.linearVelocity * elapsedTime, velocity.coordSys); } } From c152d2b62bbc696e86e08e3f84c129b4d3400c67 Mon Sep 17 00:00:00 2001 From: Alexandre Janniaux Date: Mon, 14 Jan 2019 22:09:03 +0100 Subject: [PATCH 153/352] unicode: silence shadow variable warnings (#194) --- src/Nazara/Core/Unicode.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Nazara/Core/Unicode.cpp b/src/Nazara/Core/Unicode.cpp index 477a77ff4..5b20ebce6 100644 --- a/src/Nazara/Core/Unicode.cpp +++ b/src/Nazara/Core/Unicode.cpp @@ -37,13 +37,13 @@ namespace Nz { const UnicodeCharacter* GetCharacter(Nz::UInt32 codepoint) { - auto it = std::lower_bound(std::begin(unicodeCharacters), std::end(unicodeCharacters), codepoint, [](const UnicodeCharacter& character, Nz::UInt32 codepoint) { return character.codepoint < codepoint; }); + auto it = std::lower_bound(std::begin(unicodeCharacters), std::end(unicodeCharacters), codepoint, [](const UnicodeCharacter& character, Nz::UInt32 otherCodepoint) { return character.codepoint < otherCodepoint; }); if (it != std::end(unicodeCharacters) && it->codepoint == codepoint) return &*it; else { // Character is not part of the common character array, search in set - auto itSet = std::lower_bound(std::begin(unicodeSets), std::end(unicodeSets), codepoint, [](const UnicodeSet& character, Nz::UInt32 codepoint) { return character.firstCodepoint < codepoint; }); + auto itSet = std::lower_bound(std::begin(unicodeSets), std::end(unicodeSets), codepoint, [](const UnicodeSet& character, Nz::UInt32 otherCodepoint) { return character.firstCodepoint < otherCodepoint; }); if (itSet != std::begin(unicodeSets)) { --itSet; @@ -58,7 +58,7 @@ namespace Nz template const UnicodeCharacterSimpleMapping* GetCharacterMapping(Nz::UInt32 codepoint, const UnicodeCharacterSimpleMapping(&mapping)[N]) { - auto it = std::lower_bound(std::begin(mapping), std::end(mapping), codepoint, [](const UnicodeCharacterSimpleMapping& character, Nz::UInt32 codepoint) { return character.codepoint < codepoint; }); + auto it = std::lower_bound(std::begin(mapping), std::end(mapping), codepoint, [](const UnicodeCharacterSimpleMapping& character, Nz::UInt32 otherCodepoint) { return character.codepoint < otherCodepoint; }); if (it != std::end(mapping) && it->codepoint == codepoint) return &*it; else From ecd42704a610f2fc063162674ca580bb5420ca1d Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 19 Jan 2019 02:21:29 +0100 Subject: [PATCH 154/352] Remove MSVC-specific fix --- include/Nazara/Graphics/CullingList.inl | 5 ----- 1 file changed, 5 deletions(-) diff --git a/include/Nazara/Graphics/CullingList.inl b/include/Nazara/Graphics/CullingList.inl index 5e924d013..341508351 100644 --- a/include/Nazara/Graphics/CullingList.inl +++ b/include/Nazara/Graphics/CullingList.inl @@ -408,12 +408,7 @@ namespace Nz template template - #ifdef NAZARA_COMPILER_MSVC - // MSVC bug - typename CullingList::Entry& CullingList::Entry::operator=(Entry&& entry) - #else typename CullingList::template Entry& CullingList::Entry::operator=(Entry&& entry) - #endif { m_index = entry.m_index; m_parent = entry.m_parent; From 9be8d0eae45ff1d6fce91bcfbdbe9e95864af4a6 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 19 Jan 2019 02:25:45 +0100 Subject: [PATCH 155/352] Add RigidBody2D::GetBodies --- ChangeLog.md | 1 + include/Nazara/Physics2D/Arbiter2D.hpp | 14 +++++++++----- src/Nazara/Physics2D/Arbiter2D.cpp | 13 +++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 1c4e14c6a..7ca8835ef 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -157,6 +157,7 @@ Nazara Engine: - ⚠ SoundStream is now responsible for loaders instead of Music, and is now threadsafe (you can now load a stream only once and play it multiple times at the same time) - Added LuaState::RawEqual - Fixed LuaCoroutine movement assignation operator +- Added Arbiter2D::GetBodies Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Physics2D/Arbiter2D.hpp b/include/Nazara/Physics2D/Arbiter2D.hpp index 64c38dd8d..b8683e2eb 100644 --- a/include/Nazara/Physics2D/Arbiter2D.hpp +++ b/include/Nazara/Physics2D/Arbiter2D.hpp @@ -16,6 +16,8 @@ struct cpArbiter; namespace Nz { + class RigidBody2D; + class NAZARA_PHYSICS2D_API Arbiter2D { public: @@ -27,22 +29,24 @@ namespace Nz float ComputeTotalKinematicEnergy() const; Nz::Vector2f ComputeTotalImpulse() const; + std::pair GetBodies() const; + std::size_t GetContactCount() const; float GetContactDepth(std::size_t i) const; - Nz::Vector2f GetContactPointA(std::size_t i) const; - Nz::Vector2f GetContactPointB(std::size_t i) const; + Vector2f GetContactPointA(std::size_t i) const; + Vector2f GetContactPointB(std::size_t i) const; float GetElasticity() const; float GetFriction() const; - Nz::Vector2f GetNormal() const; - Nz::Vector2f GetSurfaceVelocity() const; + Vector2f GetNormal() const; + Vector2f GetSurfaceVelocity() const; bool IsFirstContact() const; bool IsRemoval() const; void SetElasticity(float elasticity); void SetFriction(float friction); - void SetSurfaceVelocity(const Nz::Vector2f& surfaceVelocity); + void SetSurfaceVelocity(const Vector2f& surfaceVelocity); Arbiter2D& operator=(const Arbiter2D&) = delete; Arbiter2D& operator=(Arbiter2D&&) = default; diff --git a/src/Nazara/Physics2D/Arbiter2D.cpp b/src/Nazara/Physics2D/Arbiter2D.cpp index 8a1243d26..56668bbe5 100644 --- a/src/Nazara/Physics2D/Arbiter2D.cpp +++ b/src/Nazara/Physics2D/Arbiter2D.cpp @@ -19,6 +19,19 @@ namespace Nz return Nz::Vector2f(Nz::Vector2(impulse.x, impulse.y)); } + std::pair Arbiter2D::GetBodies() const + { + std::pair bodies; + cpBody* firstBody; + cpBody* secondBody; + cpArbiterGetBodies(m_arbiter, &firstBody, &secondBody); + + bodies.first = static_cast(cpBodyGetUserData(firstBody)); + bodies.second = static_cast(cpBodyGetUserData(secondBody)); + + return bodies; + } + std::size_t Arbiter2D::GetContactCount() const { return cpArbiterGetCount(m_arbiter); From 40cd8a798778c2bb14cd5606ea0319f514973bf5 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 19 Jan 2019 02:29:27 +0100 Subject: [PATCH 156/352] Physics2D/RigidBody2D: Add ForEachArbiter method --- ChangeLog.md | 1 + .../NDK/Components/PhysicsComponent2D.hpp | 2 ++ .../NDK/Components/PhysicsComponent2D.inl | 9 +++++++++ include/Nazara/Physics2D/RigidBody2D.hpp | 2 ++ src/Nazara/Physics2D/RigidBody2D.cpp | 16 ++++++++++++++++ 5 files changed, 30 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 7ca8835ef..7ad72fb66 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -158,6 +158,7 @@ Nazara Engine: - Added LuaState::RawEqual - Fixed LuaCoroutine movement assignation operator - Added Arbiter2D::GetBodies +- Added RigidBody2D::ForEachArbiter Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index 696a8f99d..38a8c0608 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -38,6 +38,8 @@ namespace Ndk inline void EnableNodeSynchronization(bool nodeSynchronization); + inline void ForEachArbiter(const std::function& callback); + inline Nz::Rectf GetAABB() const; inline float GetAngularDamping() const; inline Nz::RadianAnglef GetAngularVelocity() const; diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index dd90b5f9a..74de89e65 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -138,6 +138,15 @@ namespace Ndk m_entity->Invalidate(); } + /*! + TODO + */ + inline void PhysicsComponent2D::ForEachArbiter(const std::function& callback) + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->ForEachArbiter(callback); + } /*! * \brief Gets the AABB of the physics object * \return AABB of the object diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index 39dbb0b83..da5646fb0 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -41,6 +41,8 @@ namespace Nz void EnableSimulation(bool simulation); + void ForEachArbiter(std::function callback); + Rectf GetAABB() const; inline float GetAngularDamping() const; RadianAnglef GetAngularVelocity() const; diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index cbeb23cd1..1f4ca07a4 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -3,6 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include #include #include @@ -175,6 +176,21 @@ namespace Nz } } + void RigidBody2D::ForEachArbiter(std::function callback) + { + using CallbackType = decltype(callback); + + auto RealCallback = [](cpBody* body, cpArbiter* arbiter, void* data) + { + CallbackType& cb = *static_cast(data); + + Arbiter2D nzArbiter(arbiter); + cb(nzArbiter); + }; + + cpBodyEachArbiter(m_handle, RealCallback, &callback); + } + Rectf RigidBody2D::GetAABB() const { if (m_shapes.empty()) From 662ccbd5d00bc0b3ce28e8fa56535299109ddf61 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 19 Jan 2019 02:31:29 +0100 Subject: [PATCH 157/352] Physics2D/RigidBody2D: Add possibility to setup a custom velocity function --- ChangeLog.md | 1 + .../NDK/Components/PhysicsComponent2D.hpp | 8 +++ .../NDK/Components/PhysicsComponent2D.inl | 59 ++++++++++++++++++- include/Nazara/Physics2D/RigidBody2D.hpp | 11 ++++ src/Nazara/Physics2D/RigidBody2D.cpp | 35 +++++++++++ 5 files changed, 113 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7ad72fb66..ba7748cda 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -159,6 +159,7 @@ Nazara Engine: - Fixed LuaCoroutine movement assignation operator - Added Arbiter2D::GetBodies - Added RigidBody2D::ForEachArbiter +- Added possibility to change the RigidBody2D velocity function called by the physics engine Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index 38a8c0608..63abb6c40 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -24,6 +24,8 @@ namespace Ndk friend class ConstraintComponent2D; public: + using VelocityFunc = Nz::RigidBody2D::VelocityFunc; + PhysicsComponent2D(); PhysicsComponent2D(const PhysicsComponent2D& physics); ~PhysicsComponent2D() = default; @@ -55,10 +57,13 @@ namespace Ndk inline Nz::Vector2f GetSurfaceVelocity(std::size_t shapeIndex = 0) const; inline std::size_t GetShapeCount() const; inline Nz::Vector2f GetVelocity() const; + const VelocityFunc& GetVelocityFunction() const; inline bool IsNodeSynchronizationEnabled() const; inline bool IsSleeping() const; + inline void ResetVelocityFunction(); + inline void SetAngularDamping(float angularDamping); inline void SetAngularVelocity(const Nz::RadianAnglef& angularVelocity); inline void SetElasticity(float elasticity); @@ -73,6 +78,9 @@ namespace Ndk inline void SetSurfaceVelocity(const Nz::Vector2f& velocity); inline void SetSurfaceVelocity(std::size_t shapeIndex, const Nz::Vector2f& velocity); inline void SetVelocity(const Nz::Vector2f& velocity); + inline void SetVelocityFunction(VelocityFunc velocityFunc); + + inline void UpdateVelocity(const Nz::Vector2f& gravity, float damping, float deltaTime); static ComponentIndex componentIndex; diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index 74de89e65..6a4ae478a 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -338,7 +338,6 @@ namespace Ndk * * \remark Produces a NazaraAssert if the physics object is invalid */ - inline Nz::Vector2f PhysicsComponent2D::GetVelocity() const { NazaraAssert(m_object, "Invalid physics object"); @@ -346,6 +345,19 @@ namespace Ndk return m_object->GetVelocity(); } + /*! + * \brief Gets the custom velocity function of the physics object + * \return Velocity function of the object (may be empty if default function is used) + * + * \remark Produces a NazaraAssert if the physics object is invalid + */ + inline auto PhysicsComponent2D::GetVelocityFunction() const -> const VelocityFunc& + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->GetVelocityFunction(); + } + /*! * \brief Checks if position & rotation are synchronized with NodeComponent * \return true If synchronization is enabled @@ -370,6 +382,18 @@ namespace Ndk return m_object->IsSleeping(); } + /*! + * \brief Reset velocity function to default one + * + * \remark Produces a NazaraAssert if the physics object is invalid + */ + inline void PhysicsComponent2D::ResetVelocityFunction() + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->ResetVelocityFunction(); + } + /*! * \brief Sets the angular damping or moment of inertia of the physics object * @@ -580,6 +604,39 @@ namespace Ndk m_object->SetVelocity(velocity); } + /*! + * \brief Sets a custom velocity function for the physics object + * + * A velocity function is called (for non-kinematic and non-static objects) at every physics update to compute the new velocity of the object. + * You may call UpdateVelocity (the default velocity function) to let the physics engine compute that itself and then adjust it using GetVelocity/SetVelocity as you need. + * + * \param velocityFunc New custom velocity function + * + * \remark Passing an empty VelocityFunc has the same effect as calling ResetVelocityFunction + * \see ResetVelocityFunction + * \see UpdateVelocity + */ + inline void PhysicsComponent2D::SetVelocityFunction(VelocityFunc velocityFunc) + { + NazaraAssert(m_object, "Invalid physics object"); + + m_object->SetVelocityFunction(std::move(velocityFunc)); + } + + /*! + * \brief Calls the physics engine default velocity function + * + * \param gravity Physics system gravity + * \param damping Physics system damping (adjusted to deltaTime) + * \param deltaTime Elapsed time since last physics update + */ + inline void PhysicsComponent2D::UpdateVelocity(const Nz::Vector2f& gravity, float damping, float deltaTime) + { + NazaraAssert(m_object, "Invalid physics object"); + + m_object->UpdateVelocity(gravity, damping, deltaTime); + } + /*! * \brief Gets the underlying physics object * \return A reference to the physics object diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index da5646fb0..aa5664978 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -14,17 +14,21 @@ #include #include #include +#include #include struct cpBody; namespace Nz { + class Arbiter2D; class PhysWorld2D; class NAZARA_PHYSICS2D_API RigidBody2D { public: + using VelocityFunc = std::function; + RigidBody2D(PhysWorld2D* world, float mass); RigidBody2D(PhysWorld2D* world, float mass, Collider2DRef geom); RigidBody2D(const RigidBody2D& object); @@ -62,6 +66,7 @@ namespace Nz Vector2f GetSurfaceVelocity(std::size_t shapeIndex = 0) const; void* GetUserdata() const; Vector2f GetVelocity() const; + const VelocityFunc& GetVelocityFunction() const; PhysWorld2D* GetWorld() const; bool IsKinematic() const; @@ -69,6 +74,8 @@ namespace Nz bool IsSleeping() const; bool IsStatic() const; + void ResetVelocityFunction(); + inline void SetAngularDamping(float angularDamping); void SetAngularVelocity(const RadianAnglef& angularVelocity); void SetElasticity(float elasticity); @@ -86,6 +93,9 @@ namespace Nz void SetStatic(bool setStaticBody = true); void SetUserdata(void* ud); void SetVelocity(const Vector2f& velocity); + void SetVelocityFunction(VelocityFunc velocityFunc); + + void UpdateVelocity(const Nz::Vector2f& gravity, float damping, float deltaTime); RigidBody2D& operator=(const RigidBody2D& object); RigidBody2D& operator=(RigidBody2D&& object); @@ -104,6 +114,7 @@ namespace Nz static void CopyBodyData(cpBody* from, cpBody* to); static void CopyShapeData(cpShape* from, cpShape* to); + VelocityFunc m_velocityFunc; std::vector m_shapes; Collider2DRef m_geom; cpBody* m_handle; diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 1f4ca07a4..88fd792f8 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -296,6 +296,11 @@ namespace Nz return Vector2f(static_cast(vel.x), static_cast(vel.y)); } + const RigidBody2D::VelocityFunc& RigidBody2D::GetVelocityFunction() const + { + return m_velocityFunc; + } + PhysWorld2D* RigidBody2D::GetWorld() const { return m_world; @@ -321,6 +326,11 @@ namespace Nz return m_isStatic; } + void RigidBody2D::ResetVelocityFunction() + { + m_handle->velocity_func = cpBodyUpdateVelocity; + } + void RigidBody2D::SetAngularVelocity(const RadianAnglef& angularVelocity) { cpBodySetAngularVelocity(m_handle, angularVelocity.value); @@ -516,6 +526,30 @@ namespace Nz cpBodySetVelocity(m_handle, cpv(velocity.x, velocity.y)); } + void RigidBody2D::SetVelocityFunction(VelocityFunc velocityFunc) + { + m_velocityFunc = std::move(velocityFunc); + + if (m_velocityFunc) + { + m_handle->velocity_func = [](cpBody* body, cpVect gravity, cpFloat damping, cpFloat dt) + { + RigidBody2D* rigidBody = static_cast(cpBodyGetUserData(body)); + const auto& callback = rigidBody->GetVelocityFunction(); + assert(callback); + + callback(*rigidBody, Nz::Vector2f(float(gravity.x), float(gravity.y)), float(damping), float(dt)); + }; + } + else + m_handle->velocity_func = cpBodyUpdateVelocity; + } + + void RigidBody2D::UpdateVelocity(const Nz::Vector2f & gravity, float damping, float deltaTime) + { + cpBodyUpdateVelocity(m_handle, cpv(gravity.x, gravity.y), damping, deltaTime); + } + RigidBody2D& RigidBody2D::operator=(const RigidBody2D& object) { RigidBody2D physObj(object); @@ -538,6 +572,7 @@ namespace Nz m_mass = object.m_mass; m_shapes = std::move(object.m_shapes); m_userData = object.m_userData; + m_velocityFunc = std::move(object.m_velocityFunc); m_world = object.m_world; cpBodySetUserData(m_handle, this); From b0679533738480a485d320bfabcf15013154ee07 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 19 Jan 2019 02:31:53 +0100 Subject: [PATCH 158/352] I can't remember why I did this, but it fixes something --- thirdparty/src/Lua/loadlib.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/thirdparty/src/Lua/loadlib.cpp b/thirdparty/src/Lua/loadlib.cpp index a20e68efc..f5319da42 100644 --- a/thirdparty/src/Lua/loadlib.cpp +++ b/thirdparty/src/Lua/loadlib.cpp @@ -176,6 +176,8 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { ** ======================================================================= */ +#define WIN32_LEAN_AND_MEAN + #include #undef setprogdir From e075b590197fe421bc933790151ce89c3a112e1a Mon Sep 17 00:00:00 2001 From: Alexandre Janniaux Date: Mon, 21 Jan 2019 15:27:40 +0100 Subject: [PATCH 159/352] premake: use omitframepointer instead of deprecated NoFramePointer (#195) * premake: update to version 5 alpha 13 * premake: use omitframepointer instead of deprecated NoFramePointer --- build/scripts/common.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/scripts/common.lua b/build/scripts/common.lua index 20472cf0d..ad37e7fd7 100644 --- a/build/scripts/common.lua +++ b/build/scripts/common.lua @@ -841,7 +841,7 @@ function NazaraBuild:PrepareGeneric() symbols("On") filter("configurations:not *Debug*") - flags("NoFramePointer") + omitframepointer("On") -- Setup some optimizations for release filter("configurations:Release*") From 58c99e80f18602aff9f9804f7fec26ed03ab3f71 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 2 Feb 2019 02:09:34 +0100 Subject: [PATCH 160/352] Enable MSVC conformance options --- build/scripts/common.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/scripts/common.lua b/build/scripts/common.lua index 20472cf0d..b2ba6d4f3 100644 --- a/build/scripts/common.lua +++ b/build/scripts/common.lua @@ -855,6 +855,10 @@ function NazaraBuild:PrepareGeneric() filter("configurations:*Dynamic") kind("SharedLib") + -- Enable MSVC conformance (not required but better) + filter("action:vs*") + buildoptions({"/permissive-", "/Zc:__cplusplus", "/Zc:referenceBinding", "/Zc:throwingNew"}) + -- Enable SSE math and vectorization optimizations filter({"configurations:Release*", clangGccActions}) buildoptions("-mfpmath=sse") From 2873a60775cb9ce808c48ba49d463986447b02f1 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 2 Feb 2019 03:00:48 +0100 Subject: [PATCH 161/352] SDK/GraphicsComponent: Fix AABB miscalculation (may occur with 2D objects when depth is zero) --- SDK/src/NDK/Components/GraphicsComponent.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/SDK/src/NDK/Components/GraphicsComponent.cpp b/SDK/src/NDK/Components/GraphicsComponent.cpp index 5182e2d2d..ac1029742 100644 --- a/SDK/src/NDK/Components/GraphicsComponent.cpp +++ b/SDK/src/NDK/Components/GraphicsComponent.cpp @@ -297,6 +297,9 @@ namespace Ndk RenderSystem& renderSystem = m_entity->GetWorld()->GetSystem(); m_aabb.Set(-1.f, -1.f, -1.f); + + bool isAabbSet = false; + for (const Renderable& r : m_renderables) { r.boundingVolume = r.renderable->GetBoundingVolume(); @@ -305,10 +308,13 @@ namespace Ndk { r.boundingVolume.Update(r.data.transformMatrix); - if (m_aabb.IsValid()) + if (isAabbSet) m_aabb.ExtendTo(r.boundingVolume.aabb); else + { m_aabb.Set(r.boundingVolume.aabb); + isAabbSet = true; + } } } From 54fb983f9e1d38b6565f89d1bd4d69e7ae15ef0c Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 2 Feb 2019 03:01:07 +0100 Subject: [PATCH 162/352] Sdk/PhysicsComponent2D: Add IsValid() method --- SDK/include/NDK/Components/PhysicsComponent2D.hpp | 1 + SDK/include/NDK/Components/PhysicsComponent2D.inl | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index 63abb6c40..93383d707 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -61,6 +61,7 @@ namespace Ndk inline bool IsNodeSynchronizationEnabled() const; inline bool IsSleeping() const; + inline bool IsValid() const; inline void ResetVelocityFunction(); diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index 6a4ae478a..f30dd8618 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -382,6 +382,18 @@ namespace Ndk return m_object->IsSleeping(); } + /*! + * \brief Checks if this component is bound to a valid rigid body + * + * A component may not be bound to a rigid body if the component is not bound to an entity or if this entity is being destroyed + * + * \return true If bound, false otherwise + */ + inline bool PhysicsComponent2D::IsValid() const + { + return bool(m_object); + } + /*! * \brief Reset velocity function to default one * From a18dbf6bc48746d077d4ee305b17d0e32137526f Mon Sep 17 00:00:00 2001 From: larnin Date: Wed, 13 Feb 2019 01:02:57 +0100 Subject: [PATCH 163/352] Fix empty tilemap (#198) * Fix empty tilemap * Yay --- src/Nazara/Graphics/TileMap.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Nazara/Graphics/TileMap.cpp b/src/Nazara/Graphics/TileMap.cpp index eb1831bcf..4ff59ec7b 100644 --- a/src/Nazara/Graphics/TileMap.cpp +++ b/src/Nazara/Graphics/TileMap.cpp @@ -31,6 +31,9 @@ namespace Nz std::size_t spriteCount = 0; for (const Layer& layer : m_layers) { + if (layer.tiles.empty()) + continue; + renderQueue->AddSprites(instanceData.renderOrder, GetMaterial(matCount++), &vertices[4 * spriteCount], layer.tiles.size(), scissorRect); spriteCount += layer.tiles.size(); From b002a054dfc47222defe8972d7062324647d64ff Mon Sep 17 00:00:00 2001 From: larnin Date: Wed, 13 Feb 2019 01:03:47 +0100 Subject: [PATCH 164/352] Fix tilemap multimaterial (#197) --- include/Nazara/Graphics/TileMap.inl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/Nazara/Graphics/TileMap.inl b/include/Nazara/Graphics/TileMap.inl index 23065d429..bb24ea3d4 100644 --- a/include/Nazara/Graphics/TileMap.inl +++ b/include/Nazara/Graphics/TileMap.inl @@ -149,8 +149,8 @@ namespace Nz m_layers[materialIndex].tiles.insert(tileIndex); else if (materialIndex != tile.layerIndex) { - m_layers[materialIndex].tiles.erase(tileIndex); - m_layers[tile.layerIndex].tiles.insert(tileIndex); + m_layers[tile.layerIndex].tiles.erase(tileIndex); + m_layers[materialIndex].tiles.insert(tileIndex); invalidatedLayers |= 1U << tile.layerIndex; } @@ -285,8 +285,8 @@ namespace Nz m_layers[materialIndex].tiles.insert(tileIndex); else if (materialIndex != tile.layerIndex) { - m_layers[materialIndex].tiles.erase(tileIndex); - m_layers[tile.layerIndex].tiles.insert(tileIndex); + m_layers[tile.layerIndex].tiles.erase(tileIndex); + m_layers[materialIndex].tiles.insert(tileIndex); invalidatedLayers |= 1U << tile.layerIndex; } From 5343b581ad3e41570f4d7ad515b84887136a4d9e Mon Sep 17 00:00:00 2001 From: Alexandre Janniaux Date: Wed, 13 Feb 2019 01:05:07 +0100 Subject: [PATCH 165/352] Warnings: fix opengl redefined name (#196) * opengl: use official include names * thirdparty: rename GL3 into GL --- include/Nazara/Renderer/OpenGL.hpp | 10 ++++++---- thirdparty/include/{GL3 => GL}/glcorearb.h | 0 thirdparty/include/{GL3 => GL}/glext.h | 0 thirdparty/include/{GL3 => GL}/glxext.h | 0 thirdparty/include/{GL3 => GL}/wglext.h | 0 5 files changed, 6 insertions(+), 4 deletions(-) rename thirdparty/include/{GL3 => GL}/glcorearb.h (100%) rename thirdparty/include/{GL3 => GL}/glext.h (100%) rename thirdparty/include/{GL3 => GL}/glxext.h (100%) rename thirdparty/include/{GL3 => GL}/wglext.h (100%) diff --git a/include/Nazara/Renderer/OpenGL.hpp b/include/Nazara/Renderer/OpenGL.hpp index c87426f12..77fe10ad3 100644 --- a/include/Nazara/Renderer/OpenGL.hpp +++ b/include/Nazara/Renderer/OpenGL.hpp @@ -17,16 +17,18 @@ #include // Inclusion des headers OpenGL -#include -#include + +#include +#include + #if defined(NAZARA_PLATFORM_WINDOWS) - #include + #include #elif defined(NAZARA_PLATFORM_GLX) namespace GLX { #include // Defined in a namespace to avoid conflict } - #include + #include #endif namespace Nz diff --git a/thirdparty/include/GL3/glcorearb.h b/thirdparty/include/GL/glcorearb.h similarity index 100% rename from thirdparty/include/GL3/glcorearb.h rename to thirdparty/include/GL/glcorearb.h diff --git a/thirdparty/include/GL3/glext.h b/thirdparty/include/GL/glext.h similarity index 100% rename from thirdparty/include/GL3/glext.h rename to thirdparty/include/GL/glext.h diff --git a/thirdparty/include/GL3/glxext.h b/thirdparty/include/GL/glxext.h similarity index 100% rename from thirdparty/include/GL3/glxext.h rename to thirdparty/include/GL/glxext.h diff --git a/thirdparty/include/GL3/wglext.h b/thirdparty/include/GL/wglext.h similarity index 100% rename from thirdparty/include/GL3/wglext.h rename to thirdparty/include/GL/wglext.h From 90609476e9a725b56498f74af4e77df1aa98944e Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 6 Mar 2019 21:17:01 +0100 Subject: [PATCH 166/352] Platform/Event: Change mouse absolute position from unsigned to signed Fixes cases where mouse is out of the window by either up or left sides --- include/Nazara/Platform/Event.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/Nazara/Platform/Event.hpp b/include/Nazara/Platform/Event.hpp index ece401890..1fe219e8e 100644 --- a/include/Nazara/Platform/Event.hpp +++ b/include/Nazara/Platform/Event.hpp @@ -36,8 +36,8 @@ namespace Nz struct MouseButtonEvent { Mouse::Button button; - unsigned int x; - unsigned int y; + int x; + int y; }; // Used by: @@ -46,8 +46,8 @@ namespace Nz { int deltaX; int deltaY; - unsigned int x; - unsigned int y; + int x; + int y; }; // Used by: From f4e6f6a44f401e0b5cee516f8d767770d1d303f6 Mon Sep 17 00:00:00 2001 From: Apjue Date: Wed, 6 Mar 2019 23:00:30 +0100 Subject: [PATCH 167/352] Premake: Set libraries' rpath to current folder (#199) * Set libraries' rpath to . * Update changelog --- ChangeLog.md | 1 + build/scripts/common.lua | 1 + 2 files changed, 2 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index ba7748cda..3e9a527be 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -19,6 +19,7 @@ Miscellaneous: - When supported, projects are now parts of a virtual "workspace group" according to their kind - 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 (.) 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/build/scripts/common.lua b/build/scripts/common.lua index ac854c29c..f5f50a9f8 100644 --- a/build/scripts/common.lua +++ b/build/scripts/common.lua @@ -876,6 +876,7 @@ function NazaraBuild:PrepareMainWorkspace() -- Add lib/conf/arch to library search path self:FilterLibDirectory("../lib/", libdirs) + self:FilterLibDirectory("../lib/", runpathdirs) filter("action:vs*") buildoptions({"/MP", "/bigobj"}) -- Multiprocessus build and big .obj From e0d460eb95599ea6ff67569bbde49f2833f98339 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 6 Mar 2019 23:01:42 +0100 Subject: [PATCH 168/352] Update ChangeLog.md --- ChangeLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog.md b/ChangeLog.md index 3e9a527be..a5606276d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -161,6 +161,7 @@ Nazara Engine: - Added Arbiter2D::GetBodies - Added RigidBody2D::ForEachArbiter - Added possibility to change the RigidBody2D velocity function called by the physics engine +- Fixed MouseButtonEvent and MouseMoveEvent mouse absolute position being unsigned (now signed) Nazara Development Kit: - Added ImageWidget (#139) From 8c91d6a77d387c1b91a1d4be438f6418cf97b704 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 10 Mar 2019 15:11:16 +0100 Subject: [PATCH 169/352] Platform/Window: Fix SetCursor always changing cursor --- ChangeLog.md | 1 + src/Nazara/Platform/Win32/WindowImpl.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index a5606276d..58c91edc9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -162,6 +162,7 @@ Nazara Engine: - Added RigidBody2D::ForEachArbiter - Added possibility to change the RigidBody2D velocity function called by the physics engine - Fixed MouseButtonEvent and MouseMoveEvent mouse absolute position being unsigned (now signed) +- Fixed Window::SetCursor changing cursor even if window was in foreground on Windows Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Platform/Win32/WindowImpl.cpp b/src/Nazara/Platform/Win32/WindowImpl.cpp index 07f952e96..f22569872 100644 --- a/src/Nazara/Platform/Win32/WindowImpl.cpp +++ b/src/Nazara/Platform/Win32/WindowImpl.cpp @@ -289,7 +289,9 @@ namespace Nz { m_cursor = cursor.m_impl->GetCursor(); - ::SetCursor(m_cursor); + // Applies cursor only if we have focus + if (GetForegroundWindow() == m_handle) + ::SetCursor(m_cursor); } void WindowImpl::SetEventListener(bool listener) @@ -653,7 +655,7 @@ namespace Nz { m_mouseInside = true; - // On créé un évènement pour être informé de la sortie de la fenêtre + // Track mouse event to be notified when mouse leaves window TRACKMOUSEEVENT mouseEvent; mouseEvent.cbSize = sizeof(TRACKMOUSEEVENT); mouseEvent.dwFlags = TME_LEAVE; From ec3cb12451c780a8907cb39e038ef894bf2e8295 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 10 Mar 2019 15:12:20 +0100 Subject: [PATCH 170/352] Platform/Cursor: Fixed SystemCursor_Move on Windows --- ChangeLog.md | 1 + src/Nazara/Platform/Win32/CursorImpl.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 58c91edc9..66c7756aa 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -163,6 +163,7 @@ Nazara Engine: - Added possibility to change the RigidBody2D velocity function called by the physics engine - Fixed MouseButtonEvent and MouseMoveEvent mouse absolute position being unsigned (now signed) - Fixed Window::SetCursor changing cursor even if window was in foreground on Windows +- Fixed SystemCursor_Move not showing up on Windows Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Platform/Win32/CursorImpl.cpp b/src/Nazara/Platform/Win32/CursorImpl.cpp index 399320c59..48d960f92 100644 --- a/src/Nazara/Platform/Win32/CursorImpl.cpp +++ b/src/Nazara/Platform/Win32/CursorImpl.cpp @@ -48,7 +48,7 @@ namespace Nz bool CursorImpl::Create(SystemCursor cursor) { - if (cursor != SystemCursor_Move) + if (cursor != SystemCursor_None) m_cursor = static_cast(LoadImage(nullptr, s_systemCursorIds[cursor], IMAGE_CURSOR, 0, 0, LR_SHARED)); else m_cursor = nullptr; From 097d16f664e7fd37830bd52164206ee34fea62fa Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 10 Mar 2019 15:13:16 +0100 Subject: [PATCH 171/352] SDK/GraphicsComponent: Fix material update not invalidating culling --- ChangeLog.md | 1 + SDK/src/NDK/Components/GraphicsComponent.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 66c7756aa..712e89340 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -235,6 +235,7 @@ Nazara Development Kit: - Added EntityOwner::Release - 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) # 0.4: diff --git a/SDK/src/NDK/Components/GraphicsComponent.cpp b/SDK/src/NDK/Components/GraphicsComponent.cpp index ac1029742..43bfa3b54 100644 --- a/SDK/src/NDK/Components/GraphicsComponent.cpp +++ b/SDK/src/NDK/Components/GraphicsComponent.cpp @@ -124,9 +124,11 @@ namespace Ndk const Nz::MaterialRef& oldMat = renderable->GetMaterial(skinIndex, matIndex); UnregisterMaterial(oldMat); + + ForceCullingInvalidation(); } - void Ndk::GraphicsComponent::InvalidateReflectionMap() + void GraphicsComponent::InvalidateReflectionMap() { m_entity->Invalidate(); @@ -230,6 +232,8 @@ namespace Ndk std::size_t materialCount = renderable->GetMaterialCount(); for (std::size_t i = 0; i < materialCount; ++i) UnregisterMaterial(renderable->GetMaterial(i)); + + ForceCullingInvalidation(); } void GraphicsComponent::OnInstancedRenderableSkinChange(const Nz::InstancedRenderable* renderable, std::size_t newSkinIndex) @@ -240,6 +244,8 @@ namespace Ndk for (std::size_t i = 0; i < materialCount; ++i) UnregisterMaterial(renderable->GetMaterial(i)); + + ForceCullingInvalidation(); } void GraphicsComponent::OnMaterialReflectionChange(const Nz::Material* material, Nz::ReflectionMode reflectionMode) From 23b2f0a48dd5d84e0d7e8c30da9bacee46e26162 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 10 Mar 2019 15:50:16 +0100 Subject: [PATCH 172/352] Platform/Window: Make PushEvent public --- ChangeLog.md | 2 + include/Nazara/Platform/Window.hpp | 14 +++- include/Nazara/Platform/Window.inl | 15 +--- src/Nazara/Platform/Win32/WindowImpl.cpp | 14 ++-- src/Nazara/Platform/Win32/WindowImpl.hpp | 2 + src/Nazara/Platform/Window.cpp | 93 ++++++++++++++++++++++-- src/Nazara/Platform/X11/WindowImpl.cpp | 4 + src/Nazara/Platform/X11/WindowImpl.hpp | 2 + 8 files changed, 118 insertions(+), 28 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 712e89340..0225f87aa 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -164,6 +164,8 @@ Nazara Engine: - Fixed MouseButtonEvent and MouseMoveEvent mouse absolute position being unsigned (now signed) - Fixed Window::SetCursor changing cursor even if window was in foreground on Windows - Fixed SystemCursor_Move not showing up on Windows +- Fixed Window movement constructor/assignation operator +- Window::PushEvent is now public (useful for pushing external events ie. when using Qt or similar framework controlling window) Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Platform/Window.hpp b/include/Nazara/Platform/Window.hpp index 7eb5f449a..47d416930 100644 --- a/include/Nazara/Platform/Window.hpp +++ b/include/Nazara/Platform/Window.hpp @@ -40,7 +40,7 @@ namespace Nz inline Window(VideoMode mode, const String& title, WindowStyleFlags style = WindowStyle_Default); inline explicit Window(WindowHandle handle); Window(const Window&) = delete; - Window(Window&&) = default; + Window(Window&& window); virtual ~Window(); inline void Close(); @@ -78,6 +78,8 @@ namespace Nz NAZARA_DEPRECATED("Event pooling/waiting is deprecated, please use the EventHandler system") bool PollEvent(WindowEvent* event); + void PushEvent(const WindowEvent& event); + void ProcessEvents(bool block = false); void SetCursor(CursorRef cursor); @@ -101,7 +103,7 @@ namespace Nz bool WaitEvent(WindowEvent* event); Window& operator=(const Window&) = delete; - Window& operator=(Window&&) = default; + Window& operator=(Window&& window); protected: virtual bool OnWindowCreated(); @@ -111,13 +113,17 @@ namespace Nz MovablePtr m_impl; private: + void ConnectSlots(); + void DisconnectSlots(); + void IgnoreNextMouseEvent(int mouseX, int mouseY) const; - inline void HandleEvent(const WindowEvent& event); - inline void PushEvent(const WindowEvent& event); + void HandleEvent(const WindowEvent& event); static bool Initialize(); static void Uninitialize(); + NazaraSlot(CursorController, OnCursorUpdated, m_cursorUpdateSlot); + std::queue m_events; std::vector m_pendingEvents; ConditionVariable m_eventCondition; diff --git a/include/Nazara/Platform/Window.inl b/include/Nazara/Platform/Window.inl index 9ce95a78a..1be1a773f 100644 --- a/include/Nazara/Platform/Window.inl +++ b/include/Nazara/Platform/Window.inl @@ -2,6 +2,7 @@ // This file is part of the "Nazara Engine - Platform module" // For conditions of distribution and use, see copyright notice in Config.hpp +#include #include #include #include @@ -90,20 +91,6 @@ namespace Nz SetCursor(Cursor::Get(systemCursor)); } - inline void Window::HandleEvent(const WindowEvent& event) - { - if (m_eventPolling) - m_events.push(event); - - m_eventHandler.Dispatch(event); - - if (event.type == WindowEventType_Resized) - OnWindowResized(); - - if (event.type == WindowEventType_Quit && m_closeOnQuit) - Close(); - } - inline void Window::PushEvent(const WindowEvent& event) { if (!m_asyncWindow) diff --git a/src/Nazara/Platform/Win32/WindowImpl.cpp b/src/Nazara/Platform/Win32/WindowImpl.cpp index f22569872..9d7c6e9a6 100644 --- a/src/Nazara/Platform/Win32/WindowImpl.cpp +++ b/src/Nazara/Platform/Win32/WindowImpl.cpp @@ -269,6 +269,11 @@ namespace Nz return IsWindowVisible(m_handle) == TRUE; } + void WindowImpl::RefreshCursor() + { + ::SetCursor(m_cursor); + } + void WindowImpl::ProcessEvents(bool block) { if (m_ownsWindow) @@ -289,9 +294,8 @@ namespace Nz { m_cursor = cursor.m_impl->GetCursor(); - // Applies cursor only if we have focus - if (GetForegroundWindow() == m_handle) - ::SetCursor(m_cursor); + if (HasFocus()) + RefreshCursor(); } void WindowImpl::SetEventListener(bool listener) @@ -405,12 +409,12 @@ namespace Nz break; - case WM_SETCURSOR: + /*case WM_SETCURSOR: // http://msdn.microsoft.com/en-us/library/windows/desktop/ms648382(v=vs.85).aspx if (LOWORD(lParam) == HTCLIENT) ::SetCursor(m_cursor); - break; + break;*/ case WM_WINDOWPOSCHANGING: { diff --git a/src/Nazara/Platform/Win32/WindowImpl.hpp b/src/Nazara/Platform/Win32/WindowImpl.hpp index b9d18dcd9..e05a86fdf 100644 --- a/src/Nazara/Platform/Win32/WindowImpl.hpp +++ b/src/Nazara/Platform/Win32/WindowImpl.hpp @@ -58,6 +58,8 @@ namespace Nz bool IsMinimized() const; bool IsVisible() const; + void RefreshCursor(); + void ProcessEvents(bool block); void SetCursor(const Cursor& cursor); diff --git a/src/Nazara/Platform/Window.cpp b/src/Nazara/Platform/Window.cpp index 69758cdb0..e3b9c913c 100644 --- a/src/Nazara/Platform/Window.cpp +++ b/src/Nazara/Platform/Window.cpp @@ -33,11 +33,28 @@ namespace Nz m_eventPolling(false), m_waitForEvent(false) { - m_cursorController.OnCursorUpdated.Connect([this](const CursorController*, const CursorRef& cursor) - { - if (IsValid()) - SetCursor(cursor); - }); + ConnectSlots(); + } + + Window::Window(Window&& window) : + m_events(std::move(window.m_events)), + m_pendingEvents(std::move(window.m_pendingEvents)), + m_eventCondition(std::move(window.m_eventCondition)), + m_cursorController(std::move(window.m_cursorController)), + m_cursor(std::move(window.m_cursor)), + m_eventHandler(std::move(window.m_eventHandler)), + m_icon(std::move(window.m_icon)), + m_eventMutex(std::move(window.m_eventMutex)), + m_eventConditionMutex(std::move(window.m_eventConditionMutex)), + m_asyncWindow(window.m_asyncWindow), + m_closed(window.m_asyncWindow), + m_closeOnQuit(window.m_closeOnQuit), + m_eventPolling(window.m_eventPolling), + m_ownsWindow(window.m_asyncWindow), + m_waitForEvent(window.m_waitForEvent) + { + window.DisconnectSlots(); + ConnectSlots(); } Window::~Window() @@ -582,6 +599,30 @@ namespace Nz } } + Window& Window::operator=(Window&& window) + { + m_events = std::move(window.m_events); + m_pendingEvents = std::move(window.m_pendingEvents); + m_eventCondition = std::move(window.m_eventCondition); + m_cursorController = std::move(window.m_cursorController); + m_cursor = std::move(window.m_cursor); + m_eventHandler = std::move(window.m_eventHandler); + m_icon = std::move(window.m_icon); + m_eventMutex = std::move(window.m_eventMutex); + m_eventConditionMutex = std::move(window.m_eventConditionMutex); + m_asyncWindow = window.m_asyncWindow; + m_closed = window.m_asyncWindow; + m_closeOnQuit = window.m_closeOnQuit; + m_eventPolling = window.m_eventPolling; + m_ownsWindow = window.m_asyncWindow; + m_waitForEvent = window.m_waitForEvent; + + window.DisconnectSlots(); + ConnectSlots(); + + return *this; + } + bool Window::OnWindowCreated() { return true; @@ -595,6 +636,20 @@ namespace Nz { } + void Window::ConnectSlots() + { + m_cursorUpdateSlot.Connect(m_cursorController.OnCursorUpdated, [this](const CursorController*, const CursorRef& cursor) + { + if (IsValid()) + SetCursor(cursor); + }); + } + + void Window::DisconnectSlots() + { + m_cursorUpdateSlot.Disconnect(); + } + void Window::IgnoreNextMouseEvent(int mouseX, int mouseY) const { #if NAZARA_PLATFORM_SAFE @@ -608,6 +663,34 @@ namespace Nz m_impl->IgnoreNextMouseEvent(mouseX, mouseY); } + void Window::HandleEvent(const WindowEvent& event) + { + if (m_eventPolling) + m_events.push(event); + + m_eventHandler.Dispatch(event); + + switch (event.type) + { + case WindowEventType_MouseEntered: + m_impl->RefreshCursor(); + break; + + case WindowEventType_Resized: + OnWindowResized(); + break; + + case WindowEventType_Quit: + if (m_closeOnQuit) + Close(); + + break; + + default: + break; + } + } + bool Window::Initialize() { return WindowImpl::Initialize(); diff --git a/src/Nazara/Platform/X11/WindowImpl.cpp b/src/Nazara/Platform/X11/WindowImpl.cpp index 4a5f8208e..0e8215e37 100644 --- a/src/Nazara/Platform/X11/WindowImpl.cpp +++ b/src/Nazara/Platform/X11/WindowImpl.cpp @@ -412,6 +412,10 @@ namespace Nz } } + void WindowImpl::RefreshCursor() + { + } + void WindowImpl::SetCursor(const Cursor& cursor) { xcb_cursor_t cursorImpl = cursor.m_impl->GetCursor(); diff --git a/src/Nazara/Platform/X11/WindowImpl.hpp b/src/Nazara/Platform/X11/WindowImpl.hpp index d9e9d8652..ecf5e0233 100644 --- a/src/Nazara/Platform/X11/WindowImpl.hpp +++ b/src/Nazara/Platform/X11/WindowImpl.hpp @@ -58,6 +58,8 @@ namespace Nz bool IsMinimized() const; bool IsVisible() const; + void RefreshCursor(); + void ProcessEvents(bool block); void SetCursor(const Cursor& cursor); From 4bf92457c537dc6b1a834a13f1ae4ace7812bde5 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 10 Mar 2019 15:56:42 +0100 Subject: [PATCH 173/352] Platform: Fix cursor disappearing on Windows in some cases --- src/Nazara/Platform/Win32/WindowImpl.cpp | 1 + src/Nazara/Platform/Window.cpp | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Nazara/Platform/Win32/WindowImpl.cpp b/src/Nazara/Platform/Win32/WindowImpl.cpp index 9d7c6e9a6..1e5135168 100644 --- a/src/Nazara/Platform/Win32/WindowImpl.cpp +++ b/src/Nazara/Platform/Win32/WindowImpl.cpp @@ -53,6 +53,7 @@ namespace Nz m_smoothScrolling(false), m_scrolling(0) { + m_cursor = static_cast(LoadImage(nullptr, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED)); } bool WindowImpl::Create(const VideoMode& mode, const String& title, WindowStyleFlags style) diff --git a/src/Nazara/Platform/Window.cpp b/src/Nazara/Platform/Window.cpp index e3b9c913c..9ce743ad4 100644 --- a/src/Nazara/Platform/Window.cpp +++ b/src/Nazara/Platform/Window.cpp @@ -122,8 +122,6 @@ namespace Nz m_impl->SetMinimumSize(-1, -1); m_impl->SetVisible(true); - SetCursor(Cursor::Get(SystemCursor_Default)); - if (opened) m_impl->SetPosition(position.x, position.y); From cdf9611080c433bd81f55b121661017a414b742f Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 10 Mar 2019 18:13:03 +0100 Subject: [PATCH 174/352] Graphics/TileMap: Fix material index rendering --- ChangeLog.md | 1 + src/Nazara/Graphics/TileMap.cpp | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 0225f87aa..313c52f49 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -166,6 +166,7 @@ Nazara Engine: - Fixed SystemCursor_Move not showing up on Windows - Fixed Window movement constructor/assignation operator - Window::PushEvent is now public (useful for pushing external events ie. when using Qt or similar framework controlling window) +- Fixed TileMap not rendering the right materials if it had no tile using some materials in-between Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Graphics/TileMap.cpp b/src/Nazara/Graphics/TileMap.cpp index 4ff59ec7b..4789f4a8b 100644 --- a/src/Nazara/Graphics/TileMap.cpp +++ b/src/Nazara/Graphics/TileMap.cpp @@ -27,14 +27,14 @@ namespace Nz { const VertexStruct_XYZ_Color_UV* vertices = reinterpret_cast(instanceData.data.data()); - std::size_t matCount = 0; std::size_t spriteCount = 0; - for (const Layer& layer : m_layers) + for (std::size_t layerIndex = 0; layerIndex < m_layers.size(); ++layerIndex) { + const auto& layer = m_layers[layerIndex]; if (layer.tiles.empty()) continue; - renderQueue->AddSprites(instanceData.renderOrder, GetMaterial(matCount++), &vertices[4 * spriteCount], layer.tiles.size(), scissorRect); + renderQueue->AddSprites(instanceData.renderOrder, GetMaterial(layerIndex), &vertices[4 * spriteCount], layer.tiles.size(), scissorRect); spriteCount += layer.tiles.size(); } From c2a44f76165fd1dbacc62a7d92bb94db6c817821 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 16 Mar 2019 15:40:52 +0100 Subject: [PATCH 175/352] Math: Added Vector[2|3|4](u)i64 typedefs --- ChangeLog.md | 1 + include/Nazara/Math/Vector2.hpp | 2 ++ include/Nazara/Math/Vector3.hpp | 2 ++ include/Nazara/Math/Vector4.hpp | 2 ++ 4 files changed, 7 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 313c52f49..3894c28f3 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -167,6 +167,7 @@ Nazara Engine: - Fixed Window movement constructor/assignation operator - Window::PushEvent is now public (useful for pushing external events ie. when using Qt or similar framework controlling window) - 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 Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Math/Vector2.hpp b/include/Nazara/Math/Vector2.hpp index 28985305e..d8a53eb47 100644 --- a/include/Nazara/Math/Vector2.hpp +++ b/include/Nazara/Math/Vector2.hpp @@ -109,7 +109,9 @@ namespace Nz using Vector2i = Vector2; using Vector2ui = Vector2; using Vector2i32 = Vector2; + using Vector2i64 = Vector2; using Vector2ui32 = Vector2; + using Vector2ui64 = Vector2; template bool Serialize(SerializationContext& context, const Vector2& vector, TypeTag>); template bool Unserialize(SerializationContext& context, Vector2* vector, TypeTag>); diff --git a/include/Nazara/Math/Vector3.hpp b/include/Nazara/Math/Vector3.hpp index 4bd026acf..b46f2e40b 100644 --- a/include/Nazara/Math/Vector3.hpp +++ b/include/Nazara/Math/Vector3.hpp @@ -129,7 +129,9 @@ namespace Nz using Vector3i = Vector3; using Vector3ui = Vector3; using Vector3i32 = Vector3; + using Vector3i64 = Vector3; using Vector3ui32 = Vector3; + using Vector3ui64 = Vector3; template bool Serialize(SerializationContext& context, const Vector3& vector, TypeTag>); template bool Unserialize(SerializationContext& context, Vector3* vector, TypeTag>); diff --git a/include/Nazara/Math/Vector4.hpp b/include/Nazara/Math/Vector4.hpp index f1a799fb3..7a34a6d11 100644 --- a/include/Nazara/Math/Vector4.hpp +++ b/include/Nazara/Math/Vector4.hpp @@ -106,7 +106,9 @@ namespace Nz using Vector4i = Vector4; using Vector4ui = Vector4; using Vector4i32 = Vector4; + using Vector4i64 = Vector4; using Vector4ui32 = Vector4; + using Vector4ui64 = Vector4; template bool Serialize(SerializationContext& context, const Vector4& vector, TypeTag>); template bool Unserialize(SerializationContext& context, Vector4* vector, TypeTag>); From b6c1bfb5d01a26d8625c6656e47070a5111f382a Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 16 Mar 2019 15:43:37 +0100 Subject: [PATCH 176/352] Math/Vector4: Fixed missing implementation --- ChangeLog.md | 1 + include/Nazara/Math/Vector4.inl | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 3894c28f3..8be3f7553 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -168,6 +168,7 @@ Nazara Engine: - Window::PushEvent is now public (useful for pushing external events ie. when using Qt or similar framework controlling window) - 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 Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Math/Vector4.inl b/include/Nazara/Math/Vector4.inl index 69d0b513f..8c602d214 100644 --- a/include/Nazara/Math/Vector4.inl +++ b/include/Nazara/Math/Vector4.inl @@ -899,6 +899,21 @@ namespace Nz return !operator<(vec); } + /*! + * \brief Calculates the dot (scalar) product with two vectors + * \return The value of the dot product + * + * \param vec1 The first vector to calculate the dot product with + * \param vec2 The second vector to calculate the dot product with + * + * \see AbsDotProduct, DotProduct + */ + template + T Vector4::DotProduct(const Vector4& vec1, const Vector4& vec2) + { + return vec1.DotProduct(vec2); + } + /*! * \brief Interpolates the vector to other one with a factor of interpolation * \return A new vector which is the interpolation of two vectors @@ -911,7 +926,6 @@ namespace Nz * * \see Lerp */ - template Vector4 Vector4::Lerp(const Vector4& from, const Vector4& to, T interpolation) { From 439a62a7f87aaf25e4fe3dc28af6a695f8799b8b Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 17 Mar 2019 15:56:38 +0100 Subject: [PATCH 177/352] Physics2D: Automatically compute center of mass --- ChangeLog.md | 2 ++ include/Nazara/Physics2D/Collider2D.hpp | 7 +++++ include/Nazara/Physics2D/RigidBody2D.hpp | 2 +- src/Nazara/Physics2D/Collider2D.cpp | 40 +++++++++++++++++++++++- src/Nazara/Physics2D/RigidBody2D.cpp | 7 +++-- 5 files changed, 54 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8be3f7553..2909afceb 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -169,6 +169,8 @@ 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** +- ⚠ Added Collider2D::ComputeCenterOfMass Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index 8b69bd780..cc2f62eac 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -41,6 +41,7 @@ namespace Nz Collider2D(Collider2D&&) = delete; virtual ~Collider2D(); + virtual Nz::Vector2f ComputeCenterOfMass() const = 0; virtual float ComputeMomentOfInertia(float mass) const = 0; inline UInt32 GetCategoryMask() const; @@ -99,6 +100,7 @@ namespace Nz BoxCollider2D(const Vector2f& size, float radius = 0.f); BoxCollider2D(const Rectf& rect, float radius = 0.f); + Nz::Vector2f ComputeCenterOfMass() const override; float ComputeMomentOfInertia(float mass) const override; inline float GetRadius() const; @@ -125,6 +127,7 @@ namespace Nz public: CircleCollider2D(float radius, const Vector2f& offset = Vector2f::Zero()); + Nz::Vector2f ComputeCenterOfMass() const override; float ComputeMomentOfInertia(float mass) const override; inline const Vector2f& GetOffset() const; @@ -150,6 +153,7 @@ namespace Nz public: CompoundCollider2D(std::vector geoms); + Nz::Vector2f ComputeCenterOfMass() const override; float ComputeMomentOfInertia(float mass) const override; inline bool DoesOverrideCollisionProperties() const; @@ -179,6 +183,7 @@ namespace Nz public: ConvexCollider2D(SparsePtr vertices, std::size_t vertexCount, float radius = 0.f); + Nz::Vector2f ComputeCenterOfMass() const override; float ComputeMomentOfInertia(float mass) const override; ColliderType2D GetType() const override; @@ -203,6 +208,7 @@ namespace Nz public: NullCollider2D() = default; + Nz::Vector2f ComputeCenterOfMass() const override; float ComputeMomentOfInertia(float mass) const override; ColliderType2D GetType() const override; @@ -223,6 +229,7 @@ namespace Nz public: inline SegmentCollider2D(const Vector2f& first, const Vector2f& second, float thickness = 1.f); + Nz::Vector2f ComputeCenterOfMass() const override; float ComputeMomentOfInertia(float mass) const override; inline const Vector2f& GetFirstPoint() const; diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index aa5664978..be90acc92 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -82,7 +82,7 @@ namespace Nz void SetElasticity(std::size_t shapeIndex, float elasticity); void SetFriction(float friction); void SetFriction(std::size_t shapeIndex, float friction); - void SetGeom(Collider2DRef geom, bool recomputeMoment = true); + void SetGeom(Collider2DRef geom, bool recomputeMoment = true, bool recomputeMassCenter = true); void SetMass(float mass, bool recomputeMoment = true); void SetMassCenter(const Vector2f& center, CoordSys coordSys = CoordSys_Local); void SetMomentOfInertia(float moment); diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index 0be746838..75f5fe332 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -20,7 +20,7 @@ namespace Nz { cpShape* shape = (*shapes)[i]; - cpShapeSetCollisionType(shape, cpFloat(m_collisionId)); + cpShapeSetCollisionType(shape, m_collisionId); cpShapeSetElasticity(shape, cpFloat(m_elasticity)); cpShapeSetFilter(shape, filter); cpShapeSetFriction(shape, cpFloat(m_friction)); @@ -44,6 +44,11 @@ namespace Nz { } + Nz::Vector2f BoxCollider2D::ComputeCenterOfMass() const + { + return m_rect.GetCenter(); + } + float BoxCollider2D::ComputeMomentOfInertia(float mass) const { return static_cast(cpMomentForBox2(mass, cpBBNew(m_rect.x, m_rect.y, m_rect.x + m_rect.width, m_rect.y + m_rect.height))); @@ -68,6 +73,11 @@ namespace Nz { } + Nz::Vector2f CircleCollider2D::ComputeCenterOfMass() const + { + return m_offset + Nz::Vector2f(m_radius, m_radius); + } + float CircleCollider2D::ComputeMomentOfInertia(float mass) const { return static_cast(cpMomentForCircle(mass, 0.f, m_radius, cpv(m_offset.x, m_offset.y))); @@ -92,6 +102,15 @@ namespace Nz { } + Nz::Vector2f CompoundCollider2D::ComputeCenterOfMass() const + { + Nz::Vector2f centerOfMass = Nz::Vector2f::Zero(); + for (const auto& geom : m_geoms) + centerOfMass += geom->ComputeCenterOfMass(); + + return centerOfMass / float(m_geoms.size()); + } + float CompoundCollider2D::ComputeMomentOfInertia(float mass) const { ///TODO: Correctly compute moment using parallel axis theorem: @@ -144,6 +163,15 @@ namespace Nz m_vertices[i].Set(*vertices++); } + Nz::Vector2f ConvexCollider2D::ComputeCenterOfMass() const + { + static_assert(sizeof(cpVect) == sizeof(Vector2d), "Chipmunk vector is not equivalent to Vector2d"); + + cpVect center = cpCentroidForPoly(int(m_vertices.size()), reinterpret_cast(m_vertices.data())); + + return Nz::Vector2f(float(center.x), float(center.y)); + } + float ConvexCollider2D::ComputeMomentOfInertia(float mass) const { static_assert(sizeof(cpVect) == sizeof(Vector2d), "Chipmunk vector is not equivalent to Vector2d"); @@ -169,6 +197,11 @@ namespace Nz return ColliderType2D_Null; } + Nz::Vector2f NullCollider2D::ComputeCenterOfMass() const + { + return Nz::Vector2f::Zero(); + } + float NullCollider2D::ComputeMomentOfInertia(float mass) const { return (mass > 0.f) ? 1.f : 0.f; //< Null inertia is only possible for static/kinematic objects @@ -181,6 +214,11 @@ namespace Nz /******************************** SegmentCollider2D *********************************/ + Nz::Vector2f SegmentCollider2D::ComputeCenterOfMass() const + { + return (m_first + m_second) / 2.f; + } + float SegmentCollider2D::ComputeMomentOfInertia(float mass) const { return static_cast(cpMomentForSegment(mass, cpv(m_first.x, m_first.y), cpv(m_second.x, m_second.y), m_thickness)); diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 88fd792f8..cc181930f 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -48,7 +48,7 @@ namespace Nz NazaraAssert(m_geom, "Invalid geometry"); m_handle = Create(m_mass, object.GetMomentOfInertia()); - SetGeom(object.GetGeom(), false); + SetGeom(object.GetGeom(), false, false); CopyBodyData(object.GetHandle(), m_handle); @@ -362,7 +362,7 @@ namespace Nz cpShapeSetFriction(m_shapes[shapeIndex], cpFloat(friction)); } - void RigidBody2D::SetGeom(Collider2DRef geom, bool recomputeMoment) + void RigidBody2D::SetGeom(Collider2DRef geom, bool recomputeMoment, bool recomputeMassCenter) { // We have no public way of getting rid of an existing geom without removing the whole body // So let's save some attributes of the body, destroy it and rebuild it @@ -399,6 +399,9 @@ namespace Nz if (!IsStatic() && !IsKinematic()) cpBodySetMoment(m_handle, m_geom->ComputeMomentOfInertia(m_mass)); } + + if (recomputeMassCenter) + SetMassCenter(m_geom->ComputeCenterOfMass()); } void RigidBody2D::SetMass(float mass, bool recomputeMoment) From bdb5a4b3bde3918abcc9e0aa788f0ef7ba903590 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 17 Mar 2019 18:06:05 +0100 Subject: [PATCH 178/352] Core/Signal: Implement copy constructor/copy assignation operator --- ChangeLog.md | 1 + include/Nazara/Core/Signal.hpp | 4 ++-- include/Nazara/Core/Signal.inl | 25 +++++++++++++++++++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 2909afceb..945d1f3ab 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -171,6 +171,7 @@ Nazara Engine: - Fixed missing static Vector4::DotProduct implementation - ⚠ **By default, Nazara 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 Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Core/Signal.hpp b/include/Nazara/Core/Signal.hpp index 1569c5d0e..973181e47 100644 --- a/include/Nazara/Core/Signal.hpp +++ b/include/Nazara/Core/Signal.hpp @@ -32,7 +32,7 @@ namespace Nz class ConnectionGuard; Signal(); - Signal(const Signal&) = delete; + Signal(const Signal&); Signal(Signal&& signal) noexcept; ~Signal() = default; @@ -47,7 +47,7 @@ namespace Nz void operator()(Args... args) const; - Signal& operator=(const Signal&) = delete; + Signal& operator=(const Signal&); Signal& operator=(Signal&& signal) noexcept; private: diff --git a/include/Nazara/Core/Signal.inl b/include/Nazara/Core/Signal.inl index c4e89bd40..47d490a09 100644 --- a/include/Nazara/Core/Signal.inl +++ b/include/Nazara/Core/Signal.inl @@ -18,13 +18,23 @@ namespace Nz /*! * \brief Constructs a Signal object by default */ - template Signal::Signal() : m_slotIterator(0) { } + /*! + * \brief Constructs a Signal object by default + * + * \remark It doesn't make sense to copy a signal, this is only available for convenience to allow compiler-generated copy constructors + */ + template + Signal::Signal(const Signal&) : + Signal() + { + } + /*! * \brief Constructs a Signal object by move semantic * @@ -174,13 +184,24 @@ namespace Nz m_slots[m_slotIterator]->callback(args...); } + /*! + * \brief Doesn't do anything + * \return A reference to this + * + * \remark This is only for convenience to allow compiled-generated assignation operator + */ + template + Signal& Signal::operator=(const Signal&) + { + return *this; + } + /*! * \brief Moves the signal into this * \return A reference to this * * \param signal Signal to move in this */ - template Signal& Signal::operator=(Signal&& signal) noexcept { From 853e01c192888b30d1cdc277b2033e2ba97a5fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 20 Mar 2019 17:12:34 +0100 Subject: [PATCH 179/352] Enet fixes (#200) * Network/ENet: Fix UnreliableFragment flag * Network/ENet: Match libenet new behavior on DisconnectLater --- ChangeLog.md | 2 ++ include/Nazara/Network/ENetPeer.inl | 2 +- src/Nazara/Network/ENetPeer.cpp | 15 +++++++++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 945d1f3ab..410312517 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -172,6 +172,8 @@ Nazara Engine: - ⚠ **By default, Nazara 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) +- ENet DisconnectLater now reflects libenet behavior (and is waiting for unreliable commands to be sent before disconnecting for good) Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Network/ENetPeer.inl b/include/Nazara/Network/ENetPeer.inl index 04ec4aae2..7820620ca 100644 --- a/include/Nazara/Network/ENetPeer.inl +++ b/include/Nazara/Network/ENetPeer.inl @@ -74,7 +74,7 @@ namespace Nz inline bool ENetPeer::HasPendingCommands() { - return m_outgoingReliableCommands.empty() && m_outgoingUnreliableCommands.empty() && m_sentReliableCommands.empty(); + return m_outgoingReliableCommands.empty() && m_outgoingUnreliableCommands.empty() && m_sentReliableCommands.empty() && m_sentUnreliableCommands.empty(); } inline bool ENetPeer::IsConnected() const diff --git a/src/Nazara/Network/ENetPeer.cpp b/src/Nazara/Network/ENetPeer.cpp index fbae65e14..823eaaf18 100644 --- a/src/Nazara/Network/ENetPeer.cpp +++ b/src/Nazara/Network/ENetPeer.cpp @@ -212,7 +212,7 @@ namespace Nz if ((packetRef->flags & (ENetPacketFlag_Reliable | ENetPacketFlag_UnreliableFragment)) == ENetPacketFlag_UnreliableFragment && channel.outgoingUnreliableSequenceNumber < 0xFFFF) { - commandNumber = ENetProtocolCommand_SendUnreliable; + commandNumber = ENetProtocolCommand_SendUnreliableFragment; startSequenceNumber = HostToNet(channel.outgoingUnreliableSequenceNumber + 1); } else @@ -770,7 +770,7 @@ namespace Nz break; if ((incomingCommand.command.header.command & ENetProtocolCommand_Mask) != ENetProtocolCommand_SendUnreliableFragment || - totalLength != incomingCommand.packet->data.GetDataSize() || fragmentCount != incomingCommand.fragments.GetSize()) + totalLength != incomingCommand.packet->data.GetDataSize() || fragmentCount != incomingCommand.fragments.GetSize()) return false; startCommand = &incomingCommand; @@ -778,9 +778,10 @@ namespace Nz } } - if (startCommand) + if (!startCommand) { - if (!QueueIncomingCommand(*command, nullptr, totalLength, ENetPacketFlag_UnreliableFragment, fragmentCount)) + startCommand = QueueIncomingCommand(*command, nullptr, totalLength, ENetPacketFlag_UnreliableFragment, fragmentCount); + if (!startCommand) return false; } @@ -1040,7 +1041,13 @@ namespace Nz void ENetPeer::RemoveSentUnreliableCommands() { + if (m_sentUnreliableCommands.empty()) + return; + m_sentUnreliableCommands.clear(); + + if (m_state == ENetPeerState::DisconnectLater && !HasPendingCommands()) + Disconnect(m_eventData); } void ENetPeer::ResetQueues() From ffc58e9806176caca24d1bc9b569b88794e7849a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 20 Mar 2019 17:18:45 +0100 Subject: [PATCH 180/352] Fix compilation --- include/Nazara/Utility/GuillotineImageAtlas.hpp | 7 ++++++- src/Nazara/Utility/GuillotineImageAtlas.cpp | 2 -- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/include/Nazara/Utility/GuillotineImageAtlas.hpp b/include/Nazara/Utility/GuillotineImageAtlas.hpp index 5a1633113..506922c46 100644 --- a/include/Nazara/Utility/GuillotineImageAtlas.hpp +++ b/include/Nazara/Utility/GuillotineImageAtlas.hpp @@ -21,7 +21,9 @@ namespace Nz { public: GuillotineImageAtlas(); - virtual ~GuillotineImageAtlas(); + GuillotineImageAtlas(const GuillotineImageAtlas&) = delete; + GuillotineImageAtlas(GuillotineImageAtlas&&) noexcept = default; + ~GuillotineImageAtlas() = default; void Clear() override; @@ -38,6 +40,9 @@ namespace Nz void SetRectChoiceHeuristic(GuillotineBinPack::FreeRectChoiceHeuristic heuristic); void SetRectSplitHeuristic(GuillotineBinPack::GuillotineSplitHeuristic heuristic); + GuillotineImageAtlas& operator=(const GuillotineImageAtlas&) = delete; + GuillotineImageAtlas& operator=(GuillotineImageAtlas&&) noexcept = default; + protected: struct Layer; diff --git a/src/Nazara/Utility/GuillotineImageAtlas.cpp b/src/Nazara/Utility/GuillotineImageAtlas.cpp index 4660a69b8..2593bc368 100644 --- a/src/Nazara/Utility/GuillotineImageAtlas.cpp +++ b/src/Nazara/Utility/GuillotineImageAtlas.cpp @@ -19,8 +19,6 @@ namespace Nz { } - GuillotineImageAtlas::~GuillotineImageAtlas() = default; - void GuillotineImageAtlas::Clear() { m_layers.clear(); From 3beeeebc1da4a270d1438ce2cbefa543c44ca84a Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Mar 2019 18:59:18 +0100 Subject: [PATCH 181/352] 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 182/352] 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 183/352] 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 184/352] 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 185/352] 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 186/352] 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 187/352] 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 188/352] 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 189/352] 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 190/352] 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 191/352] 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 192/352] 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 193/352] 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 194/352] 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 195/352] 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 196/352] 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 197/352] 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 198/352] 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 199/352] 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 200/352] 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 201/352] 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 202/352] 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 203/352] 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 204/352] 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 205/352] 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 206/352] 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 207/352] 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 208/352] 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 209/352] 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 210/352] 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 211/352] 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 212/352] 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 213/352] 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 214/352] 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 215/352] 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 216/352] 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 217/352] 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 218/352] 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 219/352] 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 220/352] 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 221/352] 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 222/352] 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 223/352] 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 224/352] 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 225/352] 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 226/352] 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 227/352] 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 228/352] 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 229/352] 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 230/352] 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 231/352] 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 232/352] 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 233/352] 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 234/352] 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 235/352] 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 236/352] 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 237/352] 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 238/352] 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 239/352] 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 240/352] 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 241/352] 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 242/352] 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 243/352] 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 244/352] 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 245/352] 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 246/352] 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 247/352] 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 248/352] 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 249/352] 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 250/352] 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 251/352] 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 252/352] 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 253/352] 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 254/352] 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 255/352] 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 256/352] 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 259/352] 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 260/352] 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 261/352] 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 262/352] 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 263/352] 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 264/352] 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 265/352] 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 266/352] 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 267/352] 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 268/352] 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 269/352] 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 270/352] 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 271/352] 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 272/352] 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 273/352] 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 274/352] 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 275/352] 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 276/352] 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 277/352] 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 278/352] 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 279/352] 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 280/352] 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 281/352] 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 282/352] 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 283/352] 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 284/352] 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 285/352] 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 286/352] 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 287/352] 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 288/352] 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 289/352] 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 290/352] 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 291/352] 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 292/352] 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 293/352] 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 294/352] 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 295/352] 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 296/352] 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 297/352] 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 298/352] 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 299/352] 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 300/352] 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 301/352] 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 302/352] 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 303/352] 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 304/352] 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 305/352] 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 306/352] 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 307/352] 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 308/352] 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 309/352] 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 310/352] 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 311/352] 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 312/352] 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 313/352] 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 314/352] 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 315/352] 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 316/352] 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 317/352] 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 318/352] 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 319/352] 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 320/352] =?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 321/352] 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 322/352] 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 323/352] 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 324/352] 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 325/352] 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 326/352] 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 327/352] 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 328/352] 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 329/352] 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 330/352] 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 331/352] 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 332/352] 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 zcmd?S2Yg+{nfHIry^^j~Em@K!Te5T|*^+ycCAmxPHa6IRn`~@TY-2ivYRD!|77RGq zg-teLH_4l@2`L*AAp53(Aqh#AK*&OzLJh_AX54LTithXUJ#*&jxR?snP!Tb|%X#I50APDCL!GddMow#V~ncrSIGzgCW1G%1^ zxA4T-+t+WpAc%cqAbCpWpEzRlS!;{?1;Gio^Zew+(~n)ccjQycgV^t%4}$#7r=4@k z`G5TJ_WnU|Vr3A-A3p7pi;{VdhebiKcqjP>u08+sb8o0jG2)}q^5FE%l`@GXm z8T09nHwLlK-V_9}>T^!H?EH9R)_pG1FG^#rR+(l_DLhF zU0Feldo0K+KPd>0*=Bjy1&;??!@glM{A74n_+a>Gtaog6?5nZw#C{mNE4Dp$AU-^P zQ~bZ;kH(+P%F61U_35myX5F53fA+%ck7eJM-IcR0=a-4%#LUFJ9(g^gdwe^$f9|=t zH|72^@9ez)%6mS)K7V2UC-d*h-(ApAaAv`c1zm+B3(qaQuc)SIbvw~GK~d0>x<6=3Jr;~j zy%Nky?GBDjy%j7+RI*VLY{sHg<*CsTXNyAMNa>odaMvJheS&3G#!spg0&CIrJw&d@%_xb*_3($wQY87Y;iM;X%+FzQ7wd#0h5)Wh`uA^QI;`0fJF z9pL#Kcy3eQ!RaY*Isi^jgVW34^kh&P6sPW?hW+&XF?#+yIKB>EkJHm9!R>xt@ zaC((qzCKJh947mym`{~f6my$ea(0cG-_Z6W!3Qm%!%+o1PYa*rp^1WHU| ze3x^b2fedY1OM-!hkL^{2_A;&AOKX2%e0R~B8;PB%Z&3Ta z)cywJ`*T`&2>#j(5C1Z#fF`?XZ96T!K?}QsA++!0ZX2y^rxoebowTqAD(s_`ZM5<# ztw>L82md$Vpx0?ZlJTa=WCHz_E9{{PbO)Eh)UAyD?~G^4X{C-d$;LR~+1#c5ucANS zMHX*?i=@BaLPNgI^Hl1G=mqKe7V2yxr|b2>2&V(!bO4+VfYY1wT;uo#HAo+6oJN4f zF2<$+EFJ=j2cYb0)c1S1@NsO%0XXp~IPod4x(BRYWDI-J=a;DeR^yR{q%R_UN$R__ z@k6-r+l*&96n+`3e?%+K!I4;oR9EmFF2|WQ;P6QBH4L#dT&wfSE zz5$0m1MPkf?e2$m583GSNc|T2Jq*{r04=@@hTo;v>QRao8|cp-`coYB=U0(Mc!K`C zNIwqHkB8{TYxJWZ{g5>M8qM|?eUOdWO&@mAhduP6AAQ(IAO4$GcEgvs;69WQ7)Wc6 zg7U>B`(E&V94t12_v_%i7hUQ&zXWWafx3@C*;l}17g#(E7CXSAFIY&9 zB-4AqKr;OX7#swHYFhs-txGDhqSpJU21Ujgq2BaYY)?!N@5 z7b#gx$wo?!FpB(`KHdW-rc$?{!6l*P(4>Oie3^Q04syudkK6;u{Tk9;!g!T~mGe># z;4O@TCVSC!y|F{J*r6)yP<1dD43CFi3!&~JY|s*DwG_A$ow^)db`>p&m%mC~H)FZK zi(b7Y7)C2E!C`NM)62nq&}lDpIv6CO*E7)TQSjUby`G}Cf26mMz+r!+$B(1mpNGSq zfWw}~B9>5dFGftZW(YlQK}Oo(&#^XQJHh5Duz3l~^f0v-QQH&Lwujmtqqb+M=@F!> z7j)?hB^uEdL%4>+iDQt+7Nn*XPHId2j2eH3o%=d{IY=*hL8DSIucVia_!dLB#4%&I zx1?^Slza!3`U9HcF-m?D3;7(S571sY7|CO4q|G5*($`}|+tg1eDNP{_wu@4aL#MZp zm;_H7)km)3U^oVfwNOJVa2uG8rQY%6oIqMpgxx;cc#%@OC?%b>hf?xt?u<(PmQoLa z-5yHbLdiYoss#NiM0SgzNI7lR(Wgf4L%4>M-U_zLIh&DN2_N0ch|7ZP#V%w+|03Fa z25tNprR3EPqttHN+(OCyVEP7azDb*J(&l!X1asQ^=#X-P9mDeuGkPQEDHh z-lD`~=ui2_(%txf)^0xaW{z76n76`fZR8wFE#v9)B1$h|+?H~$pw#PV_Lu4BbM*5W zH2X{RRsQaMw0l2&ewiBg(C0m1{~~yN&HCNO_p$U~9K1B1avIOc;3Rvzk``}evj&iS4QX}}-wFmhp-N9=?>X>!5qy3LF55G3Q7^w0 z^>TYgFXf>=Lk-)IrgET4+UlmwK1%(XQafm0Ub`qQI^bELW1t3C1+p;&Z91IP7U>~<(R}ii-ay-Frd5Zw8%j;DqU{c%$Bze~^)|HZwy4enXwKL0*2|%I1^p=l z=TgeZ-@ltOuh6?)l#!3H2gxhLPmo1BKpn3cg=M+kqW5o;Hw8ZOLVK8Bv>$wSGKP8d zvM}{MxZ+8;LAFw!muAJn=7DJ39%gQ$nk602Qv0u{^%ZJ;i`w3_S;r3iw_VskdHM2~ z_d!2-%x^JQ+Q&%mrXQ2RW+kav)cS-$zf1ihc!*2SnCtK?#+cS%8>`8ck9D0)?JLnm zJAn(JUq3WeKc38EG@F7+XpYH@iTv8%V()&3Kl=yn4{_fa9FHZ;hh|Ca+a&6kOo^4` z-WiNE-SmdZL_TyV1ZVl3lfY1ZooKicn(m}eiWLl??F1u`FU^P?*CA>0S^fhJ{GVuC z=dV=57hBB=?gVRBF6UkIgu!*-mkl+a2a+$IZ{w~pFAZW~q_GiIHD@mct4jEwFPJ46 zD^XB#zLFMqQo_xhw!?LM;ky0ND8IrezX>HZ16BVf!#gYKV;OaCrS84-WlaP|h#=p-~!vSh|6Z{?c*3=_k5W$?Hu+k{`27SJbm6w zuII@03Zwrd{l1$~_zk1JkCE8SsQ-@9xQ%)37I?Ch5h#O7l}KnW`WS1SNovsg;MlD} zXK*Z0*aNB0q@GB&RCC-s@5qmcS&YW>ll{H;>qyr;U`LLT`b z1^WMIsYl_`1F79`=^Na2Jp)a*BQt-44^r?5Sb!ZGK=>GL-2VKlK}|93MFE1-rwaSk)l)2i8Wmqz~#8rw_+c)Ego~cMV}7>NB9Un z`~!84l1iC_9|RNCN?WhH+SLog0n6yxXY3BRzB!z+O^5W;w}xhY9=$5Y+~Ie=8>~F37mtus8&h(M5Swo%(U=W_+_> z0{={zQa`a7iqVg6ccLr7Jo7`1Px{$2If&cwmjHUiqL42Vufyu5Kea>{17<8wr(Wal z;dJ_8fSdIw5l(*0?)&ku_o+nWIc_zL;4S8BvQURsf_BK5O>{rA^a`Y_vfI1oX+_kE z)$;zw0jwU^%*;xwKmD!eHo87dv5vp*2VQ?dlbH)Dr7e+iMVRe_$J1pj z{Rgb9raz`@BR*6ja<$c@<_(@m#v{FM&z?gknI%XUPXpa;r;{SU#R8~F9@rs%3K$=1 zEg$u~cz7M|J3dv^L-|{oql9HJAN1(u-YfO!-T)RVvMTRY_RoFRJuXM9=};+l+JG_H zb(jVGF)IOwd@{?yUr)2P60iyqn4cI$1XKXq!jljBfj?egrfd96G{@pQu8u>;@`Kj< zm&yMwqj}g^LX#)|GVNv7lF2bg>h8lvZ96+aG&_*|YrO@pULS1K?WwO~!5+r5X9i$4 zKkfNqbGDidv4{-0Gu96nmq$s#>+&D8%1hB)B16iKf?2wLS2FVTb|X`|GIhgl=XGTE z)VKCQ@0sz5qm@nbJNhRR2j$JwNqn;z(9!Dn>!wN0B3hYFWW)})0e^Dl_+c>2)Ea)? z*K8FLQA?2^+w*U6eE%@Wa&qO??-S=?~cd=isx0JWca~R$h$HWCOIykuhtA z10RA54)LSVB(IzQ_rdtg?4$9R<_8fkqg#HPx(V<1aWFn2ss}$l?L9KHPSLzuy=A`t z2>%~u2ac?xn^sopRr>#X`Y*r#^-RlqsI9X4GpzKXwft?rp)WEh4Q9V)H_y9%$h}p5 zt3EbLnOfte4`TydUDPJ4awsNg9&&l$qzsMZ%l$R)jOL@7uX>B;+d7;Nm}71A&;B-d zWbx^g_OI~q+-~q8J`vBJ^P}}Q!pmtd?XfsS()pI*Q5vROZH4hKj22qynQksT%uYUo zB_t|hqZ#q=hoKoeEuv4Rgj-E7y~jN65WnFNzsmce&jRc z_Rn>PviJNY{GZG^-y1%3UMURTJAd~$|EYW*{JB|4?cuVIr&siC7dvOuD{ay2)3}T^ z;a@O=e-S&R$k7{ULdCeALmwWM%J@;HlRh|pz68DiYk!dssk!hU4RdN$&Gg%mOMJV3>Yn;ux8_&0mUc7aOGhovF53s2G7#sf4&CY z;Y+QjA7Wc99f`=ycQp9WQmJ!&9{j9Zm^r>~JK$bT{UCL2>OMUDZ>IhWAOBpl0Xd{R zLhC+G|4XFuaBpo7mgAwL%n%)HM(>Dz}} zrj?`2X#b>!{4nkKGT54oIiyeh>)kWg(By+^o<-_z?`yc#= zT{z4;|2KU8l6auIBfDx`kzr$HZ{U+dW)*+B_r5meG~fS!N$dh_wsd2!I4m~jT|6A( z8o%n!`?rUPer1e9cl*rZ%^r29{NBRpJ0PjZ4zYgknf9aj=%!8gfI+y)* z+WsK59_}B0kg|XIyxm?8Hv8$r<>W8l-uthy+iygcUOF^__5N%5%jeAGE3*NArhojG z!;qL?+KXo_pX{C$|K-~Fa5ee)gi6~A!w0mxAFkDOsTgmZ#`z1_g`#&iIVpxWwR&=D zM1uEGYj`8Gj`Jw=2JUcjj^ZyFH1k$zT`)D6%{!&@c$=#^I5Akn`@~CvlX#o>6#ga$ z=LY8m?ZL7`z=U z4M8I~DU5}A!HTdTEC|-}R#_@Iop)q=r*Tb?DVM((_!jGpIKA!7+pm?pGg$|IxwLo^ zXGaK|DZyF%O$DcOgK5F#{7nb1&jmAr8-gDMD}o;dKM6h>{4BUHxH9-n@Nn?y;0bX0 zS8&=Fd_H(1I1qd(cr%OzUkW@F#$_q=EeGn&uA1KTpbylqg4+F{e=YQ`&yyt!7XS^j%IP!s|OpMYe={?KzUlDyM zivH9G{c(;5*!#Z#s4Duag&*2EIi>rri9R$%f9iq$I-(w^7sF{)eQ|%S^tsjW7($y( z&}WpiDU9;8=>P7A;{)G|?zE#p)8Wk7!JJ@ba14*<@)y9RGvLv=!F*B| z@c;3oodCZtgyR>(@k>cR7G8*j`IM}Pstpb5U>w9F8f!_|G1R8B{Q`Jp8vh5Bon`lc z(aM1zH0o81ySrD>u4tHuzUx^Hl&g)#zY-1z809HZ9VO7Ym;DV!3PkgE{%?VUlBBw; z6iW9ot{4iJ)mh1I{)j3{-^vU+8rSH-)O5aLaQAq<*YIek)?TKuL>JdHkDz!}l2ac2@6vm6E6eDG z&waG}cx13Q*YxOK4`0-qwp4mSlsX%(odCB@isVowLaGz~$fDS5*gZ1-pXX!Jc3*I%>b^sDtRJ0`%uQK^KKX z^k*D>l^y1UiLghQ8|DQmc$5jq1sOIPlmO;ytus|z=RrEn|q2C9;!U8=W zJQ6$_{5tq!@ZZ>?pOfz55we@InvY?pwgeAiq3*#_{etKB1-}eV#@3x0oEEGO)&y&@ zm+OKvf-|vvX9wqC`2sBR`N0LjM}iB3i-L=TOM**-%YyY-!zp zEBG-sI15V~K+_~pU-0>7>bwQ6EeuD6Cx)klmxUh-KND+<-5Yy6_C&HQ**95}tWP#3 zM<&N7&rhyTUYq<*T|J(HxItxa3~s}J7!{rno=n+)u(H3jvZcw&WOXuWWyewWqT~iw zmX+{v!C+$8KP8%ded_$w>eO+mV^VEhpY6(iXU{vkx8Ak&j;*(E{n6I%Z@qcz*S4O! z^{lOHwoZHcLGj{;{`~*7-_pJ_v83bS+}TjCC{+~n2s^l54f2rvqS(kFKej!{zMTVR z=iVOVE?D}#F#PAv+r!jVw+GYv-GPM1SFId&dk_vyCTE;6{kHIAzQl%-Ft`pVJ~TP= zw)lXVCoFB~Om0eUnzMRSa%OVfDXVYG8en%Gtl88#B6(YI;?gttf8o-)+d4X{(%_oT z&hgZfrFtkr_D!ACaAs5kcS{=a4wO662L)~o~Hf^ff zL_ebMw+DA0mJkMqCv-#!P=Y$3#Ejd+4GXA@TSHxy5*q3n>cF#eI&J3;oqOWa8DLu1 zIZVtPleIyfq-kfPm%kdW1FnX`Bc{addANeApFoVm5u`pba#UMGOY>KkEqfDn6GJx! z!H*cfI3CPRck*8r1}$sI6zl|Fin(HxPZTq}Tc#A6``nvHja+i~W^yg&%DKQw$Un-l z5;>HJs|3T38xY6b#}V5&3OCO25^+j^QZQpF*+x{|K|-&|ol!!T62LA{a`I%?J}To~K_&f~GhcX}QYIUib zp@e@P=Xn-rW$`=*T>Dz79;Ehh751?Tb76r#_NahI`Lx&DJ??FfHJj<3eq8PzmD{62 z@GQ4Sg_JC!sUn&Z_DbE1%U2#0*z*#e_u_dko@*kc)Xg>($~Q=cx`#p4X{aAgmwQ?h zp|BZ;(&6eyp|?h%cTkib`+OzjYwWwLzdfiBiF?vsxZ)06*4SRYeg#0h9ow=QkJ9(C zMmeu1!Pp**YZ&)DUn0+vb4bpoLp`|XaWCXv!@Zb$Kkg;mE4Y_&@6EkW^u0=~k!VOX zb2YTt)z;kBz}1}K>KXDVc4NPbMs8@le93|(S1nnv__6^Pj{I1^PaL!0n5*V4IOc*Y zM_w7eweX6C&+*~*Gd>HifI&m-+1Bu>*tTFuZ0BaCPbEQo2puT~gsb8>5)p8{2X6Dg zd1SUc^F5$Bt2ix2mJ%Dj*oZr5BWv$wYb$0073X zl30}_9#0al29II|Y!M@?sf7x0LWKkrsagQCCv(N?^=TxWBAl*?NBl*czxRdKxQ2=PH4$Z`0_ zaWAE;Kzt0qbgqS5tGO=XqB!OV-!9Wm>KStH7a%^Fp*toZDf+_h8IkD9Y+&Zwfn^G^841v$xc#<%zD-?y@U z%;4&lLDkt8Uz}5W^2qU3$%@LxNuzp?8d8S{K#7Lb?)ZS%&tLvSbgvRC*24a>Sz`M-B@{E?Rl*<= zCb=AwETNf%X)eb!61-|G5dRaxNvp<~5{Oi!6B?D!=Lv@y^(I)sEFBnc9lo9Ry2goVSS_6wRv<+OiUWDFX9d#x5CJ=_k8&J-0l9rO>Ik4 zMa96jex>z&d$tZ3*jm)LF8sy2J}QXa*Yz(emkysbvQOpkX+ww48r3K4DD6L{cH+#r z9sNeu_j+f|dp(8Y`=?%s9UuECT5U+s96x0<6ZJf2Z=~jp$i)W8Jl;VtAWQbPm~7Je z)g)B~*{IZ^JgSlsjWdZAm1Kyi%O#y|Mp#y8Xi!7aW@wxjRGS19Awj*x@*B_+DyLAT z>0>#I=1IlT+X6PjD>w+Q&a3%i_~m)v-#xI_0~Z^xnR;Biv~mq!gnALYU$17rg0eCm zY6qClwTdf#!Dhlw9Ia|7O8pN~-v2-cSew@yu$fSU%i{&LR8m)(A(z=oAk>@|)KCeb z5@ZxhgKTS|3Of`dpGc^dT{uro{p<|BID+*LhFQT%GC8P^#)UKlat%Gc znCmL8xQ$Dnz*)aihOagVZTMUoEuL<}$NY$gqj~65f+G1wrKPC8bzGNmnKYll;24J2 zdLYjO%RF$o2RhLkmO0m(#mG=98ehiXmN{j>QFqFhjY=y=#L8XjQX4yoEj@AdX!>9k zUhWa>1hF%?)_Vk(`o=HwfV^ZYl*WCj$E)1qrRj_1Df4Pzx(7JT-#r@OfmRPJ_P`=T z6-;M&;9484x`w8ru%UiKgA0z}d5I`bjczeAc9GLngGfl=Z6|a^{xf=gwI=ys@@w)bv3Y zb}paaG-+tXjB%H){l%cqeQ8y!_n48BrVT3TGqi92rgwI18MmZuh7^1-DExWwPc}!Y z$9UluYIfu~IddkanWE-e|J19amz(}r`N65ng4ZeEGx$6{7h+t19gz>_=N=(&4s29} zihvaSo(FVO12USL?nQPDzs_;lMtm+KdYcDs@W4ij+oKx{5EJ~He|D`0KJPPKZ9qlC z@VNO9&5-i-`87kUi;DUU?Kl65Ylf{j^P_X;ee}$ehTXS^1-y{Ar7sKqXnpw{69P>f zh-J72&o=;ppm&-bs)yNV1obYT-o@XocR3RE9C@v-cmIZnTNkeNz*rnIQnHycW)Yg> zM{Ud~-Qb>QqpY&%rIITeFeFXQHE|i2)8}7t#e6zKZ-!iR@7_K44Lj+~kItL>(KA=r zxYUK;3a^d54%vUU8NTj;KKG;ALn!rdGu@apT8Br)09+FFE*K$%vt@r-jKashfSiV_ zfakr*T<-v3pAYr~t7VhhXg5^8IRdOda-uA$1xgzQzUhG%ePu5}DIO)jG#{@bpLl9M z3MOnyG_^IgRp14-RU|6H32Rp;&;C-yzZMQJ{#?bEF9>hG>YC)mQwA;m(w7zwZoiOr zsCam=HoP(XZ_0lUUq@qk9W=CdZ}b4HP6~tQOn}g$-}-XB>fno=WKpnYy zd0W6U3pN%LD5rcs-HA~oAZmhHN`hGmIue@pP&Ff*(#f`Yuf7;nZ?#nCGv+a;9MDkS z&_YO~rMbL0yzyTa{0slKUvtgk4I5nF#-%<>q;xUFT6HJ?DR@qVMi$v2DaMRxUa#Pb zj04;mNIka0CU+gii@WAOFSnB$a4PAQS z{`C?SvLRhBNM~Q-#0;X|EwMgio1K5xNx`ZqXU-iw{P=U*C!cxjkRkKW8#icnOYPbv z%g^rDJhN!@NuOMB;-^k)Ygu{aaSN|Kr6u;sren^YaplJA{<&k#i~-_p+|(fGg75Q# z&%c)}A&kg)Hq%xd`XI>A1xN5!rno5@mPH|cyDG?%Cz&1SkoUK^=y-xwWB8ac<_)lx zLcaF{JkAv(E(iC+ip>orIf8b!mthp7%~k10d^T454uC)f- z0ETQBR1A*W4lWo3bBsaS{=@0U63Okmk0(pMp^<6 zr*mD(#V}{HM`kEPJycQ=XRL?1{$JvOB{(tSru;)zZ#=hJWO0+npq18UaxLas%XJCY zMlQo3$6*i$zbJZnh6gV9z+&HOx_LJ<1+%ODqh*E=DV-LOsX*U0wbj6WlbK%)j|~ai zEC6Fn89JuSNig3kioIAfsii4VQ9XD-V?|Bdz{--Q_7QXP1}vX<>7vmk#V58;J#j?I zz~+kv&R9{zxLmH>+ zmmUl_%|H620iGwLxkq<^Fq+R<+=1|e1+Qt`Es;16PU}k{?4}^O!!1X8O9;FThng%5 z7a#@t4*>rpz7?zJ7wZh0GX<;|If}HC3^aeXE^IErVM~O27p?C4eK>XgqC5WmCqMZ~ z*wwYPs|y_nshW}bSD;;O_>kfvnKCcI9zlw=Z-5i^C`G%l>`{jYPBuVmYIk6}r3FeT zuFwja827MP?%`q-gpbMgg8Zdqa#>21g^rh#+8Ze>c7xKym+pw{5rLjex6IZbM%o}c zQ|N@;FFuq;Lf#u8FE&~$5F~2Nrwa zQV;0&V=VJ53&?2_J;yh8wQp>iue!wnQVW%+g-VTeF7ebp7}h={_8}3cRSb}BVXSXq zoVCECc?LMqB%C41Y#b7n*0FFF#Y&&(-8yB#e0}@GuygS(eMTQUX6#8*`-^Y%dn~(S1@KK(Fd}x0mI))y+2I+c z)&oxFKuG?%5kaS-8F04)vQZ)xOx{==LbK*`ca|d`hLD3^XZ}VpQc}UUA$;@Fc7!99 z$qjO(Oo|Vhgo+nfJQWXin7gP|)?UUEB<&Gf;y}q6a9qPL>>6JrP;#-fLvPONCK9Xz z%l#l;<2_vczM?&v;oaA?XWQyiBF{D(t|~%57ioO;rHn5Yhs(xPltG3lD0el0)wvd_ zFkqtxF7?0?IKmz+PJ8j!I4qBX|J5Gb93Osr)1y7xBYBwz&ho(JU}{Y)L1Yb(?*njH z3{f4i#~VHH9(cRZA_K7O5YN4>q9~qd_3n%d>emqDclIUhGkU@J+DXgL7&2wxys2%a z!&ePEZd|gVqqDAGb7MtW|B+R7qw7lwYep2+Og?$)so%O{X4u$k_>9%F+pC)AjU2VG zy?=O0S^wtRx>0o{l>^80s~pw3XJNStfX(Nu-?%Al@0vsDD{2+E>dqsjd zN%yu2FT0EXYWy$4-toRMJKBn|trPr1PWX3`3JSllj( zYIj?gXg$ip+!7T+RxoWY6Y9E_a9h`JSBJS>_r&gcXL@X{wur>}Wvtz?0kL1<#S96? z#inHFd=pr;AIYgE$_f&judaD? z;8Zr4c46~~U&z?xy_q{aFvtL*-w+Iq(07p5E$(2Ty>b{GDF;n^BVDk}1De`GJ_VZWSaqQs_jGS zZVfI`6WUT-S?>yqs5jK-R1}fqtxz~{V&{Z@8&_10K5lI5yipbTRm19!pIg_l>e~~W z$4?mF+B*5tsmIQmnrt1|dwx;f*g1nPnl<~R{vE@sFhE9%tJn;yvXG(~?p8oUzrzD}dtieH z+U0SGw6zAvB=tVbBsoTwNz&GY!5NGj@o6{XMmEYs)XdTT40BW}b2J|rQOK|u-jvj6 zhU6KIrTfS`x!CiUwpkf^8$F<~UX&8;y~yzzexnB}93a*!g!Kx=JlW|@7sg3T%?5%{ zTESoAHTZh3>2onSeYmW^8Q%JA@<1odY?ySKJ(8od)?=AQcZpBA)C1`bRC;u;^?+Vp zu^QKSJETaLrOfg`8u3og#Opl1mji6#GJF?%?A$6*82LdB3YBPe$QFi5BO}vbE6Fvn zFgbYsqydvU*9@F9=){?$bIaxpS$%&0j?QFFb7SxFhRD|R8xgy|a{MWC&i&3MlN(E$ zXRU0ns#&|bdC}yCuCJ60XinCescEUM99~~8{v5|xe>TK`plsG=?D^ANIzjhbWSaec zKBBA@9i|B~1?lZMnTwp-0AxXRR_4vYRz%ty;&wU2gl@HCuf&CKmn{oVUEDQWCPBC; zwr#lN1=rlEuoEVU<;(-;_f;4>r(hybI!yrTJtc*KLR`LpwqlZ zcP;Sfo-1K!*LZtuqfq$j)fNmF&a=*T5pl#Dzwo$lDSKeEgE@{U+H2ur>vup{3sTX9 z0?|b4_Xd5Gt5QVd!nYJsabRs>5}a-808Q*93zx2X^wCw19{1pb4?>@*!HwbfL(Q-g zigagd?&jnEzDc(*MfbIR%f^BDvynOq!nX<9$ItGvdr!6=V;wf63;cD!his@ThaG3xfXMoL&v^P zm*;c`WD~xrvbs#K4D@wf>w!ML(oF`mHAuCvuWEQqYK2gpkBamRi^AFvseE=qymx(L zJsM?r-`+zS`eyejUEDhI*w%gxeVY3=guRw8zi(i6ZOf<;quP=+!)uER%PRAy^=qta zomST{FFB=dYQN`X7)GW3GxoLEAl|H*7yctVjl@YK@wOziBZ(>}fJfR;YHO~^^jes~ z2%wF`%GV)DpU%Kp>OCH4^+1aNd5YOSbbP6&G!7acyp9CmXm}>tfGw zuxEn%Yz^;i_%6h_z)8zPL&OgJ%Cp?RItzx^1w*W04EHjRM|Jisk8iBx`28-QuokIp zwFiFTfl&_7lBiq$Npcs%YS&~1)l@TfY61o?)MQ%`AQQYlD=w78r;ax%iakaVJfwpSbRtW5=)PsLw90t8S_qkXKxK z-iSobpwA^4_*;zvm^H7Gs~@ z2Dqg_sOgtSa}iSQz}7kkZ>ZW}%D@q+jq`eICGm!0KiIEY-Mpfl?*2JC&xUu@LrWkGHr~)yre$)58#z-9z_?OekLzZ+|mJ6_Buy zr`iQf_H6UTWXBaYm$fPe%5;pQKxp@XWX|X+=#q=TS1=e%)d(II5&>zjmbHV}MdfAo zx?SQ+J$qd2Mn#%Ga)8;A=}5iN0~HR?M#OvuDT<(8;={OFiL|j<kzFQ^nu`I}azV{(M!eJ(i<~03%42zn2d?rsUE+WQ9FjwCb1;y$;Zxh?q6yl1 z4_xCByxaq8JYI`EkjC^{T|t-^7EGLW!qA?v(;rOq9@<#fSeo7S#OsO5p^XhA`V~sff+pe;vzV_nhPP-ZVibE> zX8pCi%a`PQ@GoM{>uIp#O78mW$$L-bnqZrU)S} z!UUQafXh-3RQgHMQV*nEpfi2SEE`y9pGsGCHsxa$wlK+0H@FlLwCXE-^-^4yqs& zCiblE*{4ToMRs{b-jbp*CvQCA_>CvG3|d-NG5DCZ6DO>lJ2)244imhU+hgfK`K!`- zx1#e3f**2e{iLbrMV-Q`j?czSI0K(PR6y1QM9oS7c9VcnFI+XE+8 zU!2zKX}lx#CNA<;<~@`e^9nM!Xs;9zY%X-Qt;q0Rj6sNiNc^R& zEah|$u#1co4XEnjnVivVoKZO*q%QH5b^6NA@I{w-;0gl%+{AJ9_TQDwJt<5YYUeqPtb}fC{)WK#lIueBfSaWh%NY;n;HuUzsO#m?Uo5L@UU+lY_ro4t2f{_MyB0sNSm#xS;x}SQT37s< z;=x#P+1Kmz%o$LbQ2H*aceqqNj->RbUV09FiBCHd)j2nb^Ak|dPtlyY+ek+1i8hHA z^D*n9b9&=Yo6D$%&N1-fEbC55LrGou7M%%F!K(1)*xCmcci}h)JJYe}pkw=o^Ys>( z>DX*0+}T8+BIZc~*br?Xg8@ka5|ehH68Mw_KE?9jA{UV0g1`j~q%>}s^|cnLI)d~D zgzxQps9djUom$1kkE94iN&jo$5a%w`(0?t{JD)ABG}8++olwg9p^&Np2@I{1pLFgM zU8Z~{efdaLKGK<=b`$JPo0;@YyGOM5N-o1jE?akZwPh;73?0~}9fc)D@$h5EeC(v= zF)KcC>?O-`&saWbWqY!I+G$f~4?FjPvI$eB6}6!IPT06=%)k=|44QNLr1sNi4=lZ9 zao2tMr9GwOBwt@J`TA|fy2KXGaXfY-l=MJ{0CA<*Q!_g0AMM2>>8E~#dkWCNrWfdZ zOv5cCh)MN!p7#0V%3OAsi|5Dg1Nzsjc2J-EYwfm_f87%jhAZ$m>fqUC{%?+bVO7^f zt5$`dUKLL1`YGP-(_x+XRvnby=k2SE{Z_K6q;r`7a(8_`-vN3Ynjx^q=kvu#q6!UI zV1)49c@M2(`>C35UA4-@C) z)$Zu1Q>1?UGKpppgiOV$fS)3kapo*&J+lkM&9W6Yi@}a{4Y|BX6o(CClUB?6@!zLl z#0$eYT|esjr)b>G9_%#wenj;|b}sTY4x{e%Y3imopWNy?ql|u|s>l94+z7AUu~-O6 zxU=hIq=OZ`FHj9_jD+lOgHwL&bJ7jW9%Q2=F_F@a#^^>;ZsTH%^d@HzoUAX0nz3#@ zA+k^nFP^I!jc|++W{xa6*IdM4DSKD7d&L zW3SDfS*)+IeyN&!04Ua{h(JP1tmD9C4wqgsVbi1DL6Di16PRUj1jAMio!l-dEXP*1 zi6%Xly20EHs%r)Cx?XWfgwkG29=+{SvaO0M_+q5&v{Vg-2-m}GD^2;;Jh`T>vvg@8Dq}U* zMO-GQdjYJGFL+>v1G3Y34ZUef6-hs7k6o9%lD?Q$t&+=4U&-tIsF*^?YuVchrq?-z zIFIz6PA+pD6d=)z{5Zjks<1is_UfrW`T5kCQN>Cr6zb>4BsGp>25>cC9bN4Okg=u8QfhFn=N>%7sU6Js?MH z9fbshW)5h=x9RadVu8JT`-trvhn*+K2EFqLI%03E0J56j_ZWU(uV6s_Sf~4|4MXR&h~%Hd>;DDN(fc zoRrt3wk{B$$6En*`o|kwYMhyp9?QUM=Bq)_CR{~|yo!6bS83h4D4AV=M-DtYEF*s| ziXv);6EMRujivc-#AaszthX@+!=+BW3W#{+G7p^LjqNfAC?;1#oki4X8*Me0Vm(3B zy~G1O(Rj{JTt~z9Y?%ixcYs7Oi%4K3t`YldS7hWxFZLK*>Hsa>=ix*~PCyj5QTH4w zHoj?8To7jfVPUo_Z(1G5caUiQNZLt({85$G<9&U=hY^bF!LIi{$j`YGEC9TO%Yr- z@@Y+RI!`aZy zeX+ZGj#xZ%`tr64)&ie9cGiHFWY0`_E$1YPDs8Pnqia020`BB8E=gKk2YMPHBYhhw zcl*cZyT_94Tx2_+ROs2JQrwM2? zi&`8kL3Y|-Z!289)JwSrsn@YVgVPza1<;z#Fmziy2au<~^7OQwHhwsd*zD6Cs~2Wj zwqwU*26mW;a=6t+@3k=p|0EjZB#_Wc+N;cJyLXVZez~@3-(IrQ#+_&)(CN5AJu!bq z@*8nNr*jw-FtyNy1ik=)w>NPV$SFpci_sYzttsV^e%$=Qkrq7{_Llhe zF7@sCNoS-Pik;}F!EnWZMAKoqArVHK7Me%v)C@`Tn|nTp~Q=f<)J9kX_l6ve=WlUB?q+URw0g$LaGr94{eQx+E&4)KoWyw}(mh^<{zLT3=Uvvdl`RLM8biGOldE2r4;T^ugdd6n)QAsIfW zY83Tj9UxLQYfa+7VYRnG8$HllfNZN?O)wH%>VZzU)>8aCSyENGsH#YgFZLN_N-Sf# zjtZry)gEwPfAXkbm7Nts2oyPIy)@s!X@iH z>bS8}Pp=MVbafRcN7YT5hNSRrNNf;3#JKo5o7woq3ox2zxSdM?=Q(wwnMbre>_!i4 z^}yW@$i|s#!N+OwdMqjs*kj3iY0%;{5kaIDsHte6wkOc6rS~IUs%SvQz(xB9x-CNY z>XK&AsK@ges|{QxNyw|C+fD=A%tvuFjcH)V574V?jknw;gBmSTU*~thr3`Qz5uC~y z2p=gVB@2_!!a@u^7-Q`)h8}g{c8eD|Rs@}~u={K-LuZp0f-_98X=%3itY-VAn(-b; zzwDOYeswMC(70f|=bJM@W6 zd$iUAml~kAQwG5(S zs3u1>IjYh4)$Wa&i#&Z3p1x~65fdJ0^1vCMh}U}Hau4KsYM$wVD-6i4w^MmsXnsUE zoD&M1BWOqS*mi=7ns{wk6Y8p9gF#sNFAED-ezgCjVSW0Jm^NtUqB)i0PC2HgW5Vc? zypPT8H*RRv+DZ8h=*Nu=8dXRt>7E9+d1`R8f86xSCm$2KFfI zmAj_Bpl@T<&{36%tnB=ry%KrZeJjT{)l3@?S4mQ0IoJUV;hlU%tFmhhEh`1g)(CA? zvNxM+O$T}v`yOw|Xu|K}9n#fEl2lhiOIbeM=U+_!pQrw0N7(xiG>*lJB$iZd;^A2KaH zjgNfaj))>gud6W0(d1N4irlNBXr8Eb8>={dj@30@pRevFx~@wyewSqfguLSSxGNdYkA7br4x{rOkd23^=$Ur0MJy}7 z6dmre&GNuT54c&5Rb@I$HN>bvQ872H7Sz1fTNd{=(H#;BtO~ZpPfB1uEdf!}e2cDl z<~d?g6LFKxkhPUh0+kc7&PLabLOW*tM|`=L>k+P(xZdF6eLrn0&)xx8dRTqm}n zYwv3Q{qZq-&ET$gz89NMYi!Vu|BP`c2%l7V&1NuKLz27V)^==@M&v67c)B0q^JT{P zv`m+vH3bxN@jK$&)w)(j^11Y^AR3c_))}x8Az^@#<=SAkrvqks;0h1) zHO3@!z6Zv6sqgE70t1Me=Z6h(1^BAM_|G0V;WqA3ks=6}WRW+%m6iM*N`{H`_NR?fZyNiB3lo1tKB6!2=Z@XceGR z`+dq95A-)69ifm&XmYC4pL9Z|8&+F}X!XQ@!~+UU+qfv!W5A0J&?3GYKO5q2SgH>; zI(c<5TB6vBEg_J!DL!>=y2UlQpIR6rOV9USWIHq*DeT<@gp!{(u2SWM_vnyx4vc7B za~$l%LhriTi=qliT3^oez>(hAMSlFX{lhX}2|L3dU3~RccWgFzGt{qG+zN;}vy#o)7g9my9uXOtj^x#%6Kgmcdm?t5s ztoMVs)&q?mxYdscuVjE>V!hRw6)Zuu7IF5`j0l&Ji5q$FpeuD^2Ek%JMHz=n>Q2rzPjtj;k0ml*OOs` zdV@Fzu^Q--2=CL#Mr%18est1-x079p7Lj6RgpBt#SSrdLtW1>LR!g^tlC=f>Dx#d` z5uM=xE&GK`E^RlrX55jPB)j^N&H7)+`ky&a*^GI}m`8c{16WsynmD0j7UF>Z9{7mQ zv%vtz=(fkR(ho{{bjB-1vU`kwG{mR;gHK7XRiEus`no*XMA!8?3nofc9Q2QK-DACP z8`b_J_b3~I$>#8N*)%`yM_7Vxag)R7RdT8wkGYeOCFt;h}8mBFt6 zSWVZ};k>TO@UpHSpbx*W*!!_FQ|rT7?7>e2$3b%K*1pbFr7($Kt%Ypzr!|HQZjSAr zz!up$XM`e$U6F%a(j*C1jI-<5;lgY`oYj>I!&`2-I)3r=cX$JuN*g%0=S}!5^V}ZI zj|1k%upm3s6vY)MIZXz6(u>nkbIh}8LdP$@xuR?1ibb5+6Y{$}>-jka^@VpB?Ck3; zj#K4+N!K_G#h`lSL+UZ1_gU-+S?&6c=IquNEo^1>hYbRCdVeJhyHdB@65Iavr>1k% z7N0N}75*T6Aod0XU&X3!mVX;U^~+qVdcks`vbBv!yNvW!hI>_n&S{15EGoK!>r-6X z7A`E!q5FXuMHOd4(v)Z+TKfQRP&^p^;L%6VeDqOePi>4f^P8(|k#Lpk9T2q`qeZ=} zBZt9ZlF>T;PXZ4xBsv=sKaqo`QDe5#{LYrx$jcX7-^Rxl2K!>F`(qjfig>n2s)!_1 zuC2bv4YfnYyI&uXD0HZVoQtFZ>N(lMWMSJMdepsdV zYOirXHiwQ>;v-ecS=SVxihk-C=ql%9<`BAYs~bnwKG-*-x6+N0S9`!6=?UlPB|064 zU`8i83{-EdR?(~IU17DQ@U#}L6r#5G>e}2PHTF_>zmS(fn_BczC@Uo4qeY3Dfz_qC zlb6mop>5H+QO#pJrW8(HJ!0yh(z5=aIeW#t{?jJUPLx!a&7R-hJau46ICaF(In90A zmQ7hbe%REDvqrVe?GH~*Ozn^9cM!@sVG;M|&~;AnM=jK_UX2i-6z$E6ghPP*dB6M6 ztP~+VJx?G!CCv3okS2}=7t@{Wo=CNk1<})+AXPB2#xgT987+Kvvr)t~rsa&$GDDS? z(7ks>P8{KKcvQ0}R&$M8#i?$|L!L`AZI05*2kBSvm)MkA3($-3wl#IPVM}iq*TN(H z)4E0(4wK%K)Lyox1eT-Z-QT|-)@$(K0R?#rmW^3G>V)yh`iaMn>(?@{vSMIMO>#{C zva$hV^749Bl}zT)%6r=f&0NvkvSP--@Ro{UQw9&2I<$B7$c}~q9V1{8&hg(L-i#jU z6JC|El8`p@+NB77x#?Yst4KJH%LG5YThVRuw(+#h;8J!Gu*Kw^N0y?IgPu0j+UC~F z44rm_SEgUGk9H+?4_M~-Xp{@lm)h)&4n<-$1peg&6iM_h&@%W@el_G4aeF{qoN+au zj_j;Mh>Z8vp*oyIrWcFSF8M-=S*ElDex=R34j<8lzMJVIYu5Obs~nKPL#hO)O6H%H zj)y<(Fc5-$K(J3V`Yyz10Y-NeY8!jF%O@;jAMm8*6HaX@nmpzB1q+U!I=P@NuW81L zwy`Uw59oJ%&9a3HSJccN0Db9ql5yP;$zqe1>mvJboyD5WjOobNa)yO@DB@EN8QpGC z+jsY};;V2cNe1*rT;5A5`hZu7wT9w_#} z0s-vI(rYn=ru1~st81KumcSa-jDteud(?1(4xpmdH`7~IHZ zvYGatB&Z8WJy}m+NbR%DqTIMv!^A;da7&N{C!Ar620oPPgnX(SPuSxcJh?{grnO_cmA^lO&tF@n(LP?^fM{$olQUX(eIUX8`S6* zO}d4>dmiTwY+$m+C~88bLk1Jvb)Ybl6kD~;WwMxyPRxafxx^lFWo-yV0`%n?%r)K; z15))4UpdzRt`@GW6>im{t+{0k1~gix>BmfI(v`~=70j8?*3nqhuePKtKkLfyrmmC1 zn`VA=(%iy%xrsg_2kQ41`R$oh4!;w(m+Gbj$HlkGyJnY?q;r+`#*!Ym(ExX>x|`rQ z*u^U;5_o6(WDlfW^bI~G>4CdF;5>6#kYl0~YOvn>x6wt9iAgo`2gS#UaJ6b^L9?EE;w>u%S z&OP{z67?3IBf>V6MP&I(2*P;29K&UTphNa#H-^&QRG2`X`p{siDVS2QZO|(3c|il2 zDB2D%pUa9~=TbG@;4!MHfV(^7M%!uJn~Hid9b-N|Lq@7JXsNcSr`AxnYUYU`V! zaINpspif^1M97~^l_5`I-<>;O5f_w z(Wz*iz?lv8?#RT3dYwpL6JwoM>$`SXJ=$8Qe#YxL)!zTyMQZ%wan(ykSJf`6YMwh{ z>Vz@VdgNEsRt>9eo-@3uwlcqN!l=5L;~Hc2?I+D`n>b}m>*S7t63%)%ZpQ5SZ&nU! z?RQ+Vvaw`P&q=2Zp50Q@zj|V#wY_O(YcjW}IJYn_KR2gW&4`BDv4i`>zA>$B+_c$k z<0f~FFUT9+w_(_bT1FIx=65F1_r-eqKzsR2XFY8qNpF)L=rF)BeB?hoO>Sce+o2|J zVT4iy*gil+wtIiCouaeBkMs`jMAdrWHy*gv0Iy1pFcZ$Y|NCU1D7u!wc=-C&XQRjU0=^ zJ}knIwQ=ce&=#&4T-hsl9d>fuRakq*zE3`hid7>Bb%wV{UZN#G8 zW1Bgb&m{z?-%V1Wj=*t3fn)iES}oHH5FDf3T*7HUr43D=U$*S~=idLDbMHV9YoC0! z>%c*cRce3m0%KJWoF{!3y|b?0RgFd_0!FB#;>DEp7{CQCoCBnVCz6W29lzB)I(lRW zv?wgzz51jfmV?lSacDH&s)@Z&*l+5jW!c5GlV?wBj(zf-|Eg^&cTr+=MZ5(+vR|x7 zySk&_vy);r{8Aop8WtQnl!8ZYr#s0L>M*|ZjO8^j4^m$HCOv?=WuvKSvO5C0jJume z_koE-WD2e#2-of1MZYiCJv>#K##LoZ&~zGmJ6T6gD-d%y21l`DFDjo1^IHO?F4o7`9S8|<;BXgB-zblg2fwQIPD0IECr)0laYcgE7^WTubxyh+}qu(%4~ za~_LJT&ngPA9^m4cJM^rn+x+&^7Ev8!{a3c?WIduoN_Eq+VXHzAF~yipLol%)=8gS zHeu|_{>x_O4V*gY{MP0TcZJCr?bmcY9~Lc~iaiQn9n-(>si*#4{3x3gz5$;VhpRH| z{>g{Pf!JRkBVLDqbcz5=k<*#fBQ!+D8>`oOK20-hTFa+-*|G4UPJ&koN0|A@5$NW+ zceDFa5ALliHxu%PU%s)~a>c#11B^(ZkWX89XV^*krsWeK*c-{}>Oya67kY_Td83P5 z2?Np|Li!w!8|+c0t6*alzOih=j8ipEGf%oNESfK0fw7tVVibdmG~F*=VT9b z7$BAF_F=p5c?~MjkKPgC^KNbE!hhZG4e8WGC**64i)hgn(VR$UA=1%{I-O1rEAE-c z96!$qx|d6x+M-7Rk07H4cByyfqWvE_;w6uujg?d@(Q1hcryu^tj*i7}fmD3<@V}>= zKWtZi9r#nDvRAs2x=+wuwR$XFxR>G*o5M$QpR1J-1 zPsTHnbD0+^%^p`u@KR$KW5zM1>!jwkmD4!@r*hboK|`ku?Oipzqp_)D zcwdcwU8*SD8I3=u_UcuA8~!h@4emWO_~{LnnrC#vPRV^F6x#g7d6}9hJ|IDSOLpLK$b8SKBr>HwM5*z!6=Z&nEVIln<6cxwL0pplq#201Mdjf8*oUHWd>05b3X4gk!m!BW zsmhj;wwC(b0~-qlHZ6>Qb6r7sb>Yl=;vZf%qH3h?c@68cJ8_xfGjkl)x#eB}QFHm^ zWDaXj^V}vl5+IUzCghwjz=_Ai7mJOfG8#mbN4g=Oo;vb*r$uUV4c%4)0=c+I50J$- zvW{RBh7hbxNwV*`3|aFC?|=^Z4iz5fht-@PfKv{Txlld_8jtngY`H>;Xs=ZBIdH?{ zB-JcTi3Wq3o3!R#&H4P$Ee$bps=}iHs)4owR`vOql02yPs zn?7u{hig8JTESGgWI$CKP<8Rh^*?83`Ob zw!V}HS5twDQw7#;6?jfmIEndorf=>YIaHg&3AvRMGWcA*(#<5+(u^Q6&oxeA}6()`@2w#DtW+*7PQTFx3?mAHu+d`1_g zdi%SK%$>mDwAG2%GuA5m12?B22YM<}DTRVgZ-Rs2usj=F45>n%7G}a3UBusHtxVi$ z&v7~IBPe06UiFpgZ-Gf5@+4U2U_Os|bneL9;?0~)u*x@(c9V{h=9x(b=SHqeA04k6 z#ym`h_VLQpWveEyoPX(_-~au26@6VR*RNR=Ppmzj_v*DXGwnTWjr99o1XXx z9XoCLzTW|g>y?jG&|?T^hK*Vmy_%iY(XnBX_tduhfjuAHbK92oJ!4bP#7#55IkP0b z$!GzHIEuf=IOoQ7pVIEsW)vo!;)i|dOaL@1mh+qePT*$JJ+ZF#Bx4`V6o$7waea=8 zt;|#a#ARp!XAIvmVIAJe+Oe{-4bvqVa%rGVNK5!BHjXz9M~hPvhsnc_hmD~t7qcgR zKQCEMVlF#B*U5n@?hB)PM*tKU5MyGlL>+F3CAfTWBC zykOQ!Ddw~QHnjjno!v}2*W)1Zk8CyEIrAVZLc64Z ze}uaVV)W1w*BWnf2GH7bVOY8xOaKZ%Ti#Y`Zj3tHUe#gMJQ0A00&rIVdINAc06z2TeS{Um>#7K6Tve1qD4ATsb1`mAzHF0I2)pyV`$qhenQvTw>sPLS+o|}69BSsr z-Kt*z*{{`?f0J%BPU0q6)4M=VslefKD~@LN#X0{4ioI$rwku3yRDs=pFM5#C=w0r#Io}(UD|CwnU@^Zd zJ-kq6@29z+L+V@v?vHdUT|$h=y6c=xN%erxD?k!A2!j z5A%1ial#_$)o%Jua?sO>NA6-i>we1`$AKEvIU)EJjvphP@v35O_YPOr*hSxVw5S@0 zuSg`5>7K5(WHNEh9itQVIRs!&m8a|LTg!6+=Qk}Gy8XK1RL?+P{@8R~{q$IV-@=~M zx=r(@|k`7al?*_1*@AC zG@2Z!Y-7&3OqoH+Xkk6S#GoiDVA=5L-Mhb@{H(p1U><619zLMR|BNDo)WzVmGe}Zw z32xH(Kf*!u4Cx$6kgI)4Ej8Ld{xzon~#IhfyDk{xW_fuIJqT4i*^Wm!eZzmR0<%3|==xf6ha4QiOF- zky%OZ=kGjWQfbUiXqVmQmVGz|Y75xCbGJyGdK;xAX_Z`6wrtuMmHy&)d1+1~*g)+v8q<&ce0@>HN|1j@;_TbV*UiK)R@}p{-!)UzS#s zF3PKJt0^d{C>hS{#{?%@JewPR5Lt~PkG%I&G#GwfrwpyXxk1ykfbbdSNCF2Lfl(qF z7lC3Tcr(ts!hYgNB#aEC1ecj2CR?%YpSvtZ zQ#MR7o4baH_(_hei<_sKk6d}>uM=G_{C&dRZQeHfPx1Q`|4v-nmuDp7l7q^<#)6v3 zj)0nkpwl+;08a~04sss=QTCKcfNU!&TbTTl{FP2!2A`6cYATEQE8OVpjwStRHOXl} zTV4jv4yAUl))h}#1W)O&T^a&VI91(u*uh^X@$QiO*H$vX=E9LKV)$qI>!tEMVV&tb z(7{(rG(>0o=~_YsN!cp!kyi8>civ|40Cmt+jc3@>W{keuNGCHBH1?@Fzt-O zWv(h|l`yFMRqa`BD74<5<+S_V%Iz}5i?2xyaEX$?;zFx36;JLd8`!cW-8i;&xNJ{p z|3uCF=9TH*6}?rvwyan&zieot<<8u`)w{29*g zXS%evHE?BO77ij%xPxSD!6?8qX*qSt+esKzBmJ{K%y+(X!l+G0Lc%z0hqh5Pd|` zi!E!ay*Qb|vypqVBulc8B-J(Xnc{^FE$!v=9xwTLGAF;RD9)L=rmmy5G-rSD&Z4gA z@##y86BA7hrES9<`*w7VEn3vNqkYYWD;Dp#y=TKj+oDcz(+aE=MiXyma}C6s5pX$= zH_1E;XqnD`ber*#y>7d0O*vRC1cGYGv9Fxv-5ezuE6H?vfE+<$bxT<;=15#pE+|aY z$$pgb171}>WXxMH8Lo=;aO_+{vN3oFzy{ZwL*_)?v}inxR~OiBjAUgW0I;$TI@7@% zkY^vrv(G(#kO+`&{1v}I0o(1Z|K((7x^biwU5B+O3A-w5Z);7O*4XqYG?Aa!Zay`B z!FNS1`e=>+-2DI{T39z%YT=G$(ZSI7kJre?Fm+K(!I7q|Yd371-rBf%>$WY8TP|I* zZvD2#EnByZ_HFK7-dkPWyS!U}M{5svbserfbotFMzv2*Z_mSGem%sd`9r2}OO~Y&Z z`nY7KX=H7$A`3J0+&7iDAA7Ir_{K0YDN6(-lMdU_ME!TenDOs-`doKv z$)%W_0-Sur>JbWaiVq=aCul|K1uSc?;!>6eaE18s-8vm;Gt>s4+W_Zy=gK+z*=u3E8(^i^Z|TNk^+c+*QdX=OFu`_vL>iay1@0+CZ&4GOO;0Gz{{)$D&tXKY^c>=`kQQ(W0WY9G}uC0W3Z`)6MG zP}QG&xav<1kUm`Xj+qzsJwvq6nG<6x$KLP;{)tb_d^H}{oDscZb|5-qJgRvp=Q=Jm z#Pb!4#D`B9b=9OfnYY;u$_duk_$Hiq^v%xM zKabzVH%FqWtsDMH?S^8={6Sg$U0hfw9SxUZCk@a?d zV5lh}#bH@d0!2!A$sg}0a()L<6N*gF-W$Od*TF|@Y^vM6! zRpWt^(SULk5_JfH$B=7!l?$$=4lSZXi(Kxy5OV8q0JcZVcw2<6mbUkh=(&cnkmh(F zvb#bbG8Y?f_-&n$7me$T4d5w$SZhy)_E(1XcLv}fi@}%iz_F0?fa{u!hjcV$@D2sw z6`=#Zqax9ZLKzRJ+xFHK)=6IP3_vf;q&?beKxeZZVlff4*kOtS$<=e?A$C}B>}#G^ zRf)q{Ri)k18ZWD=DNI)OPWAV1t1MbGIW*q0f*@co>#nQlUD>~5MbVm-3rD(_O)u+y zrntSi^3OW@K3!Vh&|KM!L3nl9WN&X@dv|SB=Zeu+v^EYmwJ-0l>zV9d+|klm4={Y) z*W!Yjj=IbG@|SjAraithu`Ax{?U>iHA;s!A>83*x;)#SP=IPjFPt$=3oie~7SBFbP z1EBI4*``SG*0pOtyml?7#@EZHHp#ekCf=F&C_BCzZuVZbANzy*36pqed8YT~0O+Pd zp;a;Z;xn|(+PQ#kAvFmper~i1 zj-lhMsoB4oC;HT4wIm&4#6<=W_>dYFQ^UBPmMBad=fxf}R`5W7Cr#pk^(vz&0lzKL zUI3E?-2iZx%at5eWKJq?>dGi)I<>vU=EzB0m;TsZk)Nree%lXSBU>GQNDwcNdHwZMf8@Iy@;48x*&SwB? z11jnbLnW)HdN+XQ-N}2wARcAhiO z3hBF~dHX6dk*tdmV_+v`C&sMZRMOmGWSbKZ70xcWCN3Jd;W7IqG#y5g5@JicRaaOd$28}8gW zG_>P*e0}exBa@RyHud&xI-Zp$D-Ew!|_Do zn;`r4_)h8FnD_%MYi-(EZOhX}5I`1BJDei#uO=wJWA=0sl$N=IQZ5!m1sFm`)SxmQ zSE~4FH}oEGt4RV6TUL@z2oPSAB|??I?5CI) z=v%ZN-JbWrcU(>plw*FhiL{q=Bk69^Ye@uxOM;iYYOKxJ4kS9G0MjG|l~w4>J4h!< zR{SjhqPi(`IH^eHL|-PE%;N3tdr9Wrx1cN3-C=L7D*3H-znKE5eX>K!#*o00GS!Wd z@_7Ly;)ztlP({m%&c*E`OKTFt>EYb5@t5V59c&-(X^5X+(b6)|-PBc+ANN%*ueoVk zb7A3RTvwe2qbIkT9bKWP+0;B9M`u!xw7|DZ@jI_ezNJr!3 z2>F@`a>b8HPX=quFF6qtYL2`%!{^}$nIM|H1uRvL#Zk_F1 zOk5J{-&CUD;2Ym~@J+W~|He07|Hdr}M#Fz}hsLeOqoz2PtbeuEB;U1s&Fa%Cz?!na zGb$@dbDAW>K+!u39%IpR=!;}-oy6WG9!>H1%#HC^-tsrgDLWB;KfXC$12I`one%1V zd;`YD2$c!157-A;=n`HNbw*UqBhy;|PLL8#uji5tW?74#>9h7|DjD9g=1gJr|(b(Ki{xxZAQQB1)+XJul`M#GaIa zB0Zy^3oGj!HPaO%l9Tgt9i!W;5thPh4**xRkUfV|>jMcs;2EKA0N)@di?(J;AWg1V zXQR|2FcgmQ&YJwKYS(b2tta;vVA96+Hm<#XLG$7dmwS7G+>My2}2m3Z1UAgk;rMMvAs!yR|Ts}_zAcbvLzaji50jBy)LB>EFS z1(&qNFZZ1K&o%aJ1rtzjbwVxiu+A1#EW3q4dRPQNllwftEGdEB#4*j_3_Buw$qGkg zk3eRvYKBJN);F}t%UJBPTB@_fo`PIPOt9jK!~F~MmGUJl2fN<&Ril|Ru@mj zWr@FzYT`R&H0-0zxH|<9tx=zaKitMMo2s+{5}!%QEtXAqmpl3UAjyKMkAo`Lk#>>}ljQSm55_Kd1=s%S55?5tYz2Ij9KUJ_R^e_iocb$y4o(K-!a z)8)Mz!F?F>WNiB9K zbQ$_8>;?_7Y~3a0cl|c1>8!*DyL~qz-B(6+>0#| zZ2{i7g|&EsBt}AFXZTRQSqeFE8p2XFuSJX-8X+R~u#jAQIR^=`s!=E%X}0tpI=^~Z zn*!Y1h>QndX8?`_po?X0W!4#>m2%KMlUerpf$|M|9Sd*vhBr3^V5tEWoaRgl#p39X z$3>ew3onBU7vSJTS$lKMyz=ytEiL^cxec3_FRCu6U)3?xRMb6&vrN1sH!nYDb^Shy}{fpnSnel|wpQMQ@GRE|1u>|kRnXUfnOKso^8ezgqDDL@x_ zw2*Az6$ViX?xUpRq=!gvBjpJ9v2V?*oj{NZhxn$c-u-IB2K=)YaE@q*elsVU(!<*O z!tzl7(grw3RVfu7g8)^BOVl4`PJM9?NKYW_AZI8=oELfw%jqJ&#%u&DPd?|`JR3dr z#^&aYd-HBcUo85`oh`aWZlIg$I;=IX~$aE?SK2M?!`a?o@>{I5N+V-gD14U#$urnVpKOXTQuhuqm>=00y!p#E~qAVc<|m zvZ0W=R0C#5GqjBqBLZnjJRVo?8dx)SGUq-@QfEy(6}_DxVFl3#bpI*{*jbA_%#YI~ zW38W3Q4t&cS4v8g3=uv|`O_p{Ol*S{n{xp58%xT+9MCEvSVMSWrF)0n>~wi+5vZ#) z!AuWm54&v(s;xu0G#IFtautGMeE98~(iORRwN>TG3AlvH;^gwUsI*cnnv?NdhKvUv z+2{wh$|U0vOXm1W=a?$~K#uL$}9+G9`vKgyMT_jO&d2404OaG2E9#UBQN@S=} zO_J5ni&P@kQMPZAvI!5L@1fe=JKesdySl1-qP=}dPt`S*?d?51r1-miHQl2v&7<8l z{B2%wckQCiuA!kW>Fs-wqjY#V%HOc892VA+(Cjd+GCMm!^KK!X2+h=DlJ!tp8Q@~^ zg<>YfD~bNeP}yxjZRmVd`x2%wO*|LpKcBx6f1PibjEE(Yh()!T-5e#uMs`b#-{eVL zBYdvfwAu6cD{izv$^@0UHejxDya8y@x zCyTx-D(#EnRP=0o&&=mIWzY}>aJXpwUc@eXw>67uP|xSB?hfkyn5!ETA?of{-M7Z? zo_QQr<9Dt*8!^Gxo1XnZ@(S@<(QVY*%?x~liK5ksj=8PAh+XNE!m@9U;(MVo7P?pr zqiS^`T1o7(zrePvBkGCqQ>}_*ts~2mW$$&vg7q-@q2HbQHW61cE~!2+n9;UQ>gy4AJ;XaA^7@FRvm8NLKD9iq^!&C& z7=~mYaDW2aSHs0s!xoEMrV@pHGn{pljeMN+kT$fQ^aS^{Is-%p?+o=l6zZFxo(-hk z7t|+ps%Oa_3_x|Lu-kx&Vb1i$=;@qzTsBp1&H(t;?uVr-6;G*$#^FT{!QDtqxB~4weBbT(dUz%Rk zx~lnmvZ`P$gS!*gB>y7O1>dXnuqyhK=6$l(7u2YfGbUx*M-Zj^h z*Frh%-97= zB$ePIwNl)rBV*1LnI2lHd`iK#S}F1Wf@JSk#`MU@`Y63VuAXZm?od1S^~R&^sdm}x z%fGX#wX-alTt0K@x31b3?})!Q^TdDrN4$FG(hq#(BZ*J%{K}61^H_WZmvR^#n@X%p ze3|vt!8~%=siu?sZ7hO$h7-CxPWV06-9`p7*syM+iG~cFf`gVQ$EHX{B&gN8_WRo6 zH95TCcJqsTi%nM14o2%={><6i98EaPcon@oaBlSjm46_CHYmUZl zz8*U_Q7b2ctVdQaIOu1r!L#6?(x@f=L&YfYIOtwOH1@8J@&MXk0riOElQPSrA2FJR zY;rHHKcQ+gRgVWiG|qCK3xJUxaiuU0HO6;VP-hJru!_IZ-iGkgbix=te*(|${%rIC z>470ywy!H(hdqtS5S#r*b!2Q9~|NOeUS6sWMGvJ(ClA_BTRpCRvhOF`HQ5|i41RQsUq?T*RsIjaP!(Ts1e8<-N zkjGQnU(K#qm+Mmt``Pak<=8&y<{rVh@7>OoXkU-SlRPihQ7fb*0A~Y`Ho(;lPww}U zyJy|@l54}0(VtRRn^n=Py0iv+S%X;V_zoz0PCL|R_wLu2A&09}$~3*KYT^=pmoM_cH>+s}9V`7VZj+H-ww336I-_)35txjm z6@Fe=MtzWq7D8=xMI5~4KjPN4j&3?siBjexP{Q%n2s+=hoya4dyHa*qcNbS>T|jmI zLK&Qrg)(;+W0@S^)p0lfzq{kEyF2cAy8-Se%t80;KPSGE_zL^7HR?~Ebi2#^0u-FU z+9~Ic{Ulr1{<`e*ZpqGp5y;%AEzDZM$#m}Z+8jU>2|jx-c9Kp>A*dXND)852TaOoOca)9#=Pq*%(2vFX!x zzw!iW0+P+0oeBI&2zn*qY3vQ(!O4IT>|2;3#dgoZU1}dPb?jC2j)P z9-47100#pq&ya*nn6k{JE>a=c>$_->0Y?L{Cp74;0NfZ__F!nx!O)}a`a#m&QePaK)~`t07Y-=0`6(xql=vG&9}QyYb-i-+QC}y>@^6Ng}rh z|J!}A$-iJS$2|W3|Gc7-8t3Z+T?`^r9qgmO#qv!MhL&&A$)H*f7V1AdgS`*?&LH2xzxt*c4+O_ zqY-w66qGu|+j=blur{6zfShvNTFj7R*fj<@N^}^{)(~%Vp8H^D;eZ54&Kqew99Him z0l38gCp2}IR^?y=J3T%gzPK#_3eiAgRH<_ivL-$k9$U-kzFdXo`fqsO!z|vKdqfj) z^KKtjd*V z70HD+a|`B`p?3Lu`DecNu28$KH>e4BH4 z-o0|+!s*3r`SWXt`${ z;L!`;yM32?@7};^&jw(d0Iubu%FOqEkon$|Wl>ZM`neYx^DxO~@L2%Q)4T6{CR6@v z|Kh$gYleC>D;r!(&zX^Ntix<$i!;upw%=JICJy(B{2StuFsmsMAYN(`U@OVSM1bXf7T_tDo1*oVw7!y|qZTd3GhuHG3DCSf7nbo9z&4Uq z7g_FO_6^xS;tK&n5V?@*aMJ7{Ie>sN5Ehvi7bV!R(s4KPF^8@jdEQQG_e)ZOArMJF zTYQnB7Fh-@ap=TQNwZK1_Z((WNsltH`paZ^hS-!i_KLrB${Yh@6}85i2ILW1c7{ZU zbSjKl3r_PZk%I7$)4{rw2(ki|b8ZNek-(8tV_hoq-8` zC;)dlhD%`+8^Mc>;KfF|M(|QCoJV?&ELjYu=YB@(8kYWJJxo4&vmfT0t&A4M`qIvIf zz0kqY+lAZ^`gJ9Jxt=7K!uwpm^1#kb(IL_?(*30KJ9{wF%vvA)0pVom{sW==N38pu zt+K-)wuUZva^@MMBb@{2lFXQ%t3_5O&3rVM8=rvH9mSf7)^BRPUC?;qIFF zXM6S~^NI_mdv2XrK0W!tk`*IOYr6{?20B_6HWwc`P|$e#)?3dOHZ5$ODr*~VE3O5{ zwqn1)eSqMoHHOn)iCCioq?Tq(hDcMSq&Q;A+8t(w|JOSFf7s#U=P5l)vSqeSI|~&4 zBIR#CqVm!hLDaPmp9OfHB&+mHdEt9k|C8w`YNdP$XG1GL39yx9A9}=c0}gj>6ApLp z9$7#?aIkb-cn3}TM3fe00qbIB%pL6{nth!DvUIskp-hfOvpl40;KpBaJ4OONs z$J$-Yn_rq!-|eV($0_?Pyn}CdF75VugV~U)D?m<%+_dFd`)0pGeX|LTgKOWDuaBZ8 ztIs4YqGKL#4ikP1W}oN1e@$o%+9KLFPldtQ8i33=-5hdmp}1`p7dC>=7@+TMvqy^P@JYBKnHLm7 zC~A4L)9|(KxvJ*3u(z!1I-^=3UX;0?jsRsmmO#c~Oa+0c zz!Ct(D)^BYRyif(bd}L?U!;F;62WPjqkqpzmubxt)>Y^p_`eKnR%b1eY)Mk<3Tsha za4h#N%3*ajfM#@Wt2)`>$&0S4t)-qcHA%=qtuzj?5Q8HLG>#Bn0)0H3+-`J$lv4A- zZ{9D!$Jdrxyugir<}RuS9O6`1GYMLSneV!&vN?wMNy3)-I<61E$pE~LhT8O=3bh`$ zTB-B~1F{jHYltC>VGwsMwU2Y*0XQ+`{AH7d_M~ao)k?n_x@=i%{pOa&ftrEzXlGUbnk(Cz23pI@TL&7)R<9~dPiz_JyKJ(1ymowaVc}@r zcwYZl-*{t3Ve4?yWmg{>-h5RjQ)oHlPBQY(1Au$`e z&pIH7E!hSl5L%o2ZS8;e?I%av{RzQfNFsJD;| zZ4PRB9Da7?g)dzBBU4e-$i5WLd^qf1?LYA|twNqjIRDB-aRNgPP*8#F>f~Nuz-drE zc`^}_5s)(xbH8(fAC4@FWHJ~+66DEVI%;PvfQJHb0?N$>XHH}cby2|MEEZFn|9i2q>Uy8!{{jJv$dIQ`~u0FJo z%7ql&>HjK6J|&9HcjdgKS29`g=e)Tgd}wVL!JPrv2up8erjZB$C^pSP_|1jv4xz;D z7uC8q)avT^Ekf6%7rJ77ZD_5gqAPB09j#cGep&nKeM>urDmJ#=+`jti;dk{FbuR6$ z$}KFryJMoKYT!@1iVC_`U-r=0)zdwNJ*%&L5THB$qnVH8HZ5M$T{Y0#I@q{)x_8aC zctZ-@WpSYmFJVL^ymT*TO4{u&2$Iy*U7Ed(zjn$yXQ(>hhzsApo%fez-xr<&vkSoq zQ1oZR8qZoK@P*RGpC(BeANWF7r|^|))00aaKb6@<&xSqoZ~*L)rYf`d+-@{}%GD>l z**#Km;{wA{2BUDC|K^4WScb1cw&LE?pmSEr#tR?2! zxXjnPDrBvGM1a;|8bHO(=1b+pvPyj?c0xDfq3n_baEg-FvI7A)VL;gL-XbO|g1hL_ z5HEr=%RNI87h(j-0NpJG5l~Q&%afYeOr8-r%K6!vaVYQvb8bWT%z;yPXj^4U?{%-q znteWpMbEbE2z6xc2ieW~lKZ`_zBj{##axu`Y~06!Ahz4A-OURoHy${=XwRON2gY|z zwzW=P^_`8Iw`||OWy^;A)ici|pPhMPrEX}}t?09tA3S*ZWmjL#UUKV0>&&f>Bg8*~ z{uODR$%fs!r>KLPWGPE|NBZk^$&d0*2Wu*YpZ$lC+qW@)3fL!gv$gn~oeb4;qqpvS zV|TA7{)KnlS?encqo|T1EexxDONTB~KiK^h(Oa0we=;vW@nsq~l=vfwb-Yc; zIh#+YItx`sTlsPu2v(&w6sH45HGPGeesjnv3BYF!aJ7_6GkeZPf=Fvr8;n0>7UE(6 z$`?#e6pyVA{zJ@io1G-oj0LLTAtN3jtUQ1^QZLCg3h#4IB$t@0UA@Re_#&T$?DdPD zvd-0GBsdKy=m?*_%1wy86gfkYkTttcXLxoo-ls@5K&!3uvT-Xh_a~~jK5*4?DYMBv z8GtJsfN2mw1&Lsx)b7{{d^(}MHNvvA1$7g0x_UcBxWUtTLOyX#mZt*{e!G4{-|5y! z3Sy|BLMaXv-u@_aZ{hABdCy#nn+Z^qk=WeHrq$^}x5Kz=5Ui7Tx!UE!o8oZdtpxNb z>)tLffdM4G-H)_Va$tp z`7?*6Z(q6To;`~e@408=%G;;oKb-mUkA4(SzHkdV(U#`ryO&8f+OmB26{8DA4%~nF zrn2yHz> zk_C-4iilEZn@$$dqpDEC7Hc2=2mMG$4iemGwVAek-R%lh%4E*Ha3R>a5S(vdjfDY@Sl4E zustxMhXQcKod+eY^e4n)Y)`BCfdCw{!!`5pKmZ*3ul|L2;=Nq( z`fR7HcY55-V-S$OdvV7O*>MI@sw4y^N$oOGYSxd&q^RajgA{cjZp~i$)|I?|=6&g* z@tP~w<*&bN-=Ui7mtQimcdD&@)xL?wWurX>MSY9L8-})yw|wiy+85?c&0M}^+tw|c zHgEme#Jb+%&dur3vEd~>Yxj?jUA4NasJ^SNwyVCladgvA%iC`qTekPg?R&10tj;sUQ?bXpkC$9ww$*`Yc6fg>ybV{zi@d-vO% zw3X#2x_@tY^I5&AnJ3Pdy$BG+v;R0-65kG=k&gR61yh(KgxT)|eWLb~GANpu;Q?TW z+1zj0iaXJpD=)sm1Z(`Q&3KNtNT}B`N2qtvRW=@F8GEeQf?T!%PH~ZC1PN7CSe{x@ zP3?*yQ^&|jJAKlfPvxMTi^MV)i64=y)X_ukNe%+I685iG%j`BzhsSprpylyEC^!M2 z(5XzLg6fsP)%dquBt*(eKSOAO6rSMR9!5O2WO1@TM%q?^x_De_hWPeWQAKlqbLIRu z<-To4ZbQ1QsHkY7c-z&f19`cvi&nIkB|bYozqEU5aLEfl=~>cIHd(kko?Wt{dwCxd zsX4KGqu~RKqj$MDqQv&q8R`G|tp@y~;AC-yg`B?ePz3(26h(~XBS_9AcOzr^0lFYmbF2F9K??xKzV z;@cR@J|gS^Q8_v8CD;#w=gI8o#hkD85o?85Z(S0n(}RV>P&;-0aE{pK&`X6@nWS?+ zrmgCkPN6ank5k>FHRHaGpSte4-b*h9O+z>QCr*5URT$im>TKq9xka*m$i-WZfI?7 zsBdl6+PW&SGyYiOGx!_#fx~p_4Y!ZKNFaWmPVwBYcmbT0Um`TWJVl%*Meq|!v9#=t zZJQkGn-ts5$wkpeoEAqjCBxcW(0;CAP%{*jYwi+9IOKC%zz?&JlL)$kGhqcZ5{xXV zRR|j*X`T*$xiBobQ7_3q&Sxl%c*%&T01WMG!pPVTPKrwGKU&RqI8h1t_VR3kl-L*J z$a~Rk0GkRsdea5E4WP2wZUbn~x7z>`J1@EpfN`IQeiZ+e#q>f$X%4e4Yyw-EwQAwH z{%Yo)_&!D3*E~@^QD^0mPS^%luA!U@Urf}^q~qu8#W?Cu^hb{%+sciWI;tthU`4ny zG{-q0;9HMgO=RTat~unFLvt!H46mtb@843>-gbTB_g_}DGj9i9@1yRAU%c*lk)%eU zZhvaNsBXnOtB~pW=&rTfpBO{>nwkkLe^4{4+!QcXJ1Lhi|NKYkz!=Z|kuO+ln#UZ)t0xMI;Gr z^(p|H1L^XdbZuDYn11XyhdCuoqi?M z%v})Q&n}D50bO4d#U~TGV&re(hShrUy4q`yH2F~#LRk}g< z86k`+LK>eFQMk|x?-=C78l4w=I!d24)nvFr4= zL5*#ZvXaJXN?VmtYTA97AS>>(mB9Fy62oL%;!0d%87i@fy0()x0q=LE_uIqmWE^y* z50ViE>mmmpAE`fU8Q-PDDF?@liDOnE@Aif;ruIlRf3K^JyhL8)jjULJeasTQZLEg z`;y7$sX(ESsX$dPqH4m6ll-?v$rvSLG<-`|hxVd+Ld{h_P?<9lJLau|m!bh*-qsaeF%99yZxfN8A zI>RV_{-RNo=R*yt+l``{Y=fp->%0u`3t>3E;D#d^J!!^ouV&)I8-ZijpsIGS4k_7|n77=i;qGP0G`PxlWO+#(vFC2WSr!$Yg z)KlTt;%G};k4z&c`kx?&LCD*FFxSnbdr4BRaqN;B*q!Y;(Fw#4S>zz``>n(} zJVyMTil`;=kO;Q7W6T(JX3Q5gyw>BX0Gy+^ zh}r?tN|BQzREOY$HK_CP2576aZf0fRW3J{9tg?_`mFO$A=DPu`s<${G2X%E3*KVRW zPz|{N{w4xB$9VnZ#~hFY7AvO)xr|fxEdYISCn8|hm(KHk%_EMC&EcwPU3 zjbklMBkTGWZX9X)?9|HD)03C1X9#lQsd$jMad~v)jK;*T^V4CRwruQqmANNFB5N%hQJ_^*ip zw18h0YPJHmy7tjjJh*7%*-x!pboa*i(Zh%1iobvP%c-a~o`|dIPi?$T%(_|TNQ>YE zsWw%o`EizH3)h0pYG&l+V$)g*pvbfK*h0|iu?tEou3v6&iZY7iEvmFeE7Y70kz%rn z7!(-eAhG7$Gkd+)Ok?)pKzdM1Hp|It)H3mth zKA;-g@^bE|VEdW&O+v*A_69nfunR0)z>*)!d;8Si7waf*lN zkB%rfXsVrC1m#2a>avcO>azBcE!VBA`_%lq^S5uV?Hwh|e}2iTrWNB~TDvYDTbdqf zlWh}AC=EVcz`WFOPs6{;0+anEeZW%y_A%jg09m#w)|8Pyi4XnbDPFO1PX*xS0Gtj$ zsRJZMtl&-hteK0HOO${-{%tp@B4 zz;OrUfMHy0VHRpC>I8L+lBP*kL&gfk+i6K1tq( zh5+??8Lzu57wro&r?9da5A_SaX%c75Dr%%=Lh@{`=G}8NuJ4?f?igKByQp;0!gR8H z@z|QG&e77AuI`$qj^=pDx=lknS9doy^)ITb7$2)&*k1Xe=BC=F&iV>}-X-Q`+{T*9 ziLfpbr(-MXEFjI&HG#T%jKwDcb^#aQ5a>!ycN5$cNG_}e03T|X>d;jLwo=!YAbALR7qX|by_QEoF3%QE*C9aXc zz;=VY6rGyIn*3RQ*!T_wU>hajCuBFK;8vbkJg!{zamWA};bG@vm??#nqljF$?u+=P z$QTMdOmRiDG?j=VQZ6B_CnXV1$&Ss5h7{9=VyssMw{_R1B!P&zOkOzJEvg=d4f9GiP_L$LbaU-VxFa0^b%8cv^rV zaBv3eSD~E(0uNla7Fjt1Ue16U`ptuRE@!&SneK9?yIe;zm8zzci!><=jL3?WFhW}6 zR)pTuGD-1XiuY3PJzXQUl(dm#3n^%C3;Ml)I@eo&zGro&!}!dtQ};t@6?VG1)6~7t z-uag(pSm-B^J~}oR!dpNzBMZ2?$!@Py@^Z3CL)hhG>>}$r1Z9JvtRVxaYZ8ZPPQ8H zNwL^LDj;}1d8XdI1+*Co=8F=7#WNZ8;&q;e%CdxgKRlJ<5)HWFH)1`G$PD zYk-}^TQT`@k@k0i%BilN@1<3>Tu7-&20Uq2Q(A3Kf$-8`Sr@3^5Z@A+g?SNdrv&;X zRMJhgCJi$hQzHq*SuzZ}=>B8?qUQoUPnsoJRfBp$Rn3lRgCo0DWXSwd7yJYrn=EC%{;JX9pB*{J#j1Bl9Vv$w<9|XRGWYd(UtgWoB;Wz;4aF%u- ze0}Y8iNx;eON%GA9h^9_zHsk`Hw?sy+W$-@ep>s5Wp`}YTe$wnp?5qpUC~-xF+H(& zvaRjfuD48Al(m*lAL+Wb4Nu=h)DmBocn2|Q3Zu$+5-B?~EBUqEE9JCmOsumY6QeWF zYtd4Sn3k`XtchwsYZz?FkCZ8u8hgMiYNbk(I!S6T!FgJJBKq zUW#oVM`3Ezg|2!~A?1n*XXaiuEM1W_L(&<{2*X>xU1;pL*BKPvaZ^@-JuJ92f3iJoCkPVlm^l5k~qa z2{{K5Iyt^wtfaT#ha|d2o(sT~9%`jW0Hq|Bpl}7bLO0LZV~s5twnJU?S9ym>PgKcJ z<+DE|OP~^_l^-&>01FxGr$XXE@t=`H%hsr!io*nWpM=sEQGrMZKs)S{m7JGdU^3P2 zd}hVXvT>FqWO7Gmib~-Usm>%!n)?G0cg(dOF|8&0`Qtp)tCcv*b@cNTfG6MT?-(0B)K&mBi&CjgengyM67@XRhzoDS-(wkPTx^Z(~>&|rZ=%$4WH;p!@ccs~( zk~&0*E$s6`P7D8Ad(`jpr^4oDHM?m)8-NS~I1onWxd5aEI2OYL=fa~Y2T15WpPej6 zE@3`RtoFBddc_TS zRuH{avWE;_1Qgw;s06s~F z9X>Ly=#w|#}}?E+@Em$k+poB5Bw`@4PdP4TxM-1STPKvRX+64l_fbUY+^ zgU4%z8#EQSkSF?HsAo3d65I+qaXh2ta_p$}kb<%+9$%OcFWShqelE){4nk&M=c6c8 z6!fQ_nRe8tp8g1JU4W$?3`6O$R1TX^VJ}$GYIGHp$`(?W0U{+Ctn@&5Rgvo`ln0w! zU}Awg_$!)X#6?mHdwL-zvZpm#qWDP$#lqYReMd32s47mz8z*nvyr6&U%U2)Tl(%#1 zwbvg#yr}Q8vt^5xObD&4UUlQ8ed(PoH}ARn=7QU{{(62%p%jm{M-t0zkKC*E<>$jK zD@Sh?4~iZ+6`Gq1XE!2-M=ViZhFbWr&Dj~q8a+|e_7Uu$-$zna2sMZ;)WNTnOHwT! zU+d^_V)?$AC-&`&m+bo`3+LHqX_;$l^eAmjMlbsm8OZOPy?REPsA6im&B_S?o0SYg zJi!a(i2n&U1ckNp5}Vn1Og_4AA774VXJ(IC8}jA9iNy@lYc}&2Z@UvV^R9p5aLu^< ztXl;dPFoIAK6}7j*+7HL#6=$dbGM^V28e`}S<~JvG^o3v8msaOI~(?$THV&27<}Qe zS9m%R(Nb&^Vy+PO7(*)PD7uAYLz4zD^sk6CHby@V0Ds-1DVHNU5J3m@=A89VfLbxe z0wj*UMfyJJ=Ol=rSf?0aPW(d^T(khpn~NauhDsltY@Mu6z)xa9~@+NSX_fy87p zEGlq700>SN%tF6vco+)P zyNm3dT0|<`LWP4QYo!2Rms@jofvaI(U6R2Gj`uCx_AZ;fPndv7=8{;QhP9-dRIL*E zH|W#y8LNzinsv`2RR*>!gjRha8=tt~7HKs%&UmlLNT5A-5 zl(-CXPIME%J$kIJUJ7uPeyHq!0az>d2H=MQkSB=R?RXw+&1?W-JNA@@F)YkSizil2s@asg^*s{yXZ zqIud(PcYclc7JY>EvJT$M_+_JaO|;E4)Lw6?FAARG{nP+KfZSCPfm|rd)bz^{?V5B zK_ml3Gk3Deeie(Xvo>^IfQyXs62(F`KKezes!_{zZ^QwT_2-<+&0H-Z*4URj0q{sD zHx$aH1*kuf0Ybvgd{k7P>~mr8p9+9<`PL-`yf@$x1DJSTWz1NLxfwpg!Da_mHfwd);GM&p5Xs%l)--HR4*tw$^$9CP?=9 zQQy{#0O$(MnLfKFOy2eYj0T`906%kpNJ|O^Q3?exSLSU2uW?0kqH6(eBZ=5L5wBY$ z+rwU7XMlu?chS02p@sbb)}U!ulOm$~Wz{J_9}!N}fr@)3%D7T?IMKLe<~#ci#Fbaa zZ=Si4#q;X;_n6Uy@#wd~qnAgW3GN&#<2^fdYzh>}rDAgx2=2B(ag{oNwPZN?`?V)D zzo!CaeJHHuObmBx1grq3d9Bv*kXr-Qkwu0rk@rgWtd~p(tz}n@ zAfQXa0Oh_Hz(4lDogf2pbZKELN+$(Nq};oaE?c>e8K9$tZcVkU2SeNMzo_l^hqn7B zC!>#tR-V`PkA+q~>Hu|3x1`tV>k_dv(IemF_k|`u<^c7ml^*$)9s{uUzn7LGET@Lf z3vNS9n)7P7bZvAb(Q?I!shhU+_iwprioXlqws@}$Ku6JGS(zv2rkF0&Dme_&*#8vx<~7nDCmW!`V!@7l|3RrV|pL}CL+M|gh$g802gM{3rV5E*;8|x#i#lZcLUHNMgqbSv2E}Ju#wdQ%5Iskd9 z8L1Md<48CRKBz3nSi`Nfj-X0-e8K%#JJ^rbpDqK!ez*u%X2lTyFE7fX$I@_$10){D z`B!6&rV^i<`Gd0?uSOGidgg^Eo`?%({@}h-rxHWEAJ}!~b^q}n;1tPXzQ?>3AL#f}Do| z^IY$XArPqo;3$kkFe^7+mDEZr#l@s|*!Tg5?Q+>drWg+jGC*4VJ zbC>Hla=LPVz?c`7mi5PcwxZRV1Ft=w&FnuR3qURh#>CFcoFx@=V&<;6^_2%cGPYxR zQ^%6&m3xjXA07YnrxQaZ-D}2{Y+6_ucRn>dF-BmbIrzN_kGWsU&I@iwC!XgV&XDd# z=2+x7yDWfn;n9fz+#HaQMIhBaI~{Ud94>OiJ?O9_w*jZEk&8~mq(o=}6FhZS!iarv z5rAaV)y-t-?(zn^r-f>6FkA@W0%(A2sHL4++ND7pjHG4&xL1JCSPOu16*{Gp>ZC>B z`Je@!0N8IpSP$ODFS{PH$0D_Ho_9ZzN=K|mOv|fS#{R7J06(;yW!8Etj#%4(`M^{5iPa5hh!tz zNx!YC%Fxm~1gOWIA;-0y3z9A%SE+2^QeB*6{u7BCM<%vhKbL4N``>|Pty-{c_=?v0 z;SEbyE*PFmx(;rOPXy9cvwUjRz$OtfHWPy)zB~yY#KAd!Se&^@+!ProkJXX~hVw@c zaoyJLa{;&|06%tsP@Q|px}LFdcV=+(SW+Ngg$Ew799<*AhuyA_qcnx&8GpWVM8OPX z7i*FZY~m=T42O%|UXWbY$pVX6(%Qw6(uR$7(YY_XvGlsAsXJzJsAN-N+%w0b4P`ld zNvNLyHeMckA83%K>b&m|qzdk0yA9BtR$9k* z!>s7?fK1ttNM3j1*nzKn_2?}JZWvkmjc+7|{_N!=zxepj!abT#d@j(_{R6!6P~sUy zyM&wxlbS`T7TwKZjh6&KDr);?=JwK|kh3j#0-X!M(+<#`feXN<3t(!9cBYDl+!F~3 z7Eqrs6_BAA#f@0Nz%jTc+@@8QUr)a7_E1E%Fh^B#OhcIcB3fBSU%I`tr@|6BIE{vG zBa;Ir4?QxH{H6f;O#v8MhHuUl(_HZeLF3llM-0#tr@|F#c5a%Eruu82Wb#<--Z&nB z{s724n97O}^VA{cspCjf7abH9;U0d5$UsGIFGB(t*e4sH^P%{6( z;`ycZ<+b&d)s=a*?ZX|lONP>Jk71r}dOYsz{uDzB#&Htba~fY3o49j)(1YATBpAM4 z85!Qh;m)w?FXEZ!$`_n$%$Pn&Xq-hxYy9~ST>XLgBj^`<;&1PA?YabA))2V7D(;qj zu$Qr9L>QR{yLIT%?T8<3P@rLVtY_v9d>~3UaKN_3FqlJ`GHJ596tdk@ zCsk;zT`L;^t*-F^90`@}rlO-(8Mok=;zGJ`?!b`_BR5`p_dWZHJC-dRT;5i=@9u(= zcf_k^{&`@-a6|Lx`o6e%=CjA{bK{*0?d)T`bK_yR4&cs&ZQVKmI52lXND#Gz7p+mw zwA_k#7V8}QPm4!IrBfCA4t=U|2ZzHjGeb70PFrOwU4k^5g0o?zh-(qW(uMFY zzJhc(=li4EUDeW&*sDhj2o!BT-4XZgZbQq?4RYel+`J_3A&rz|&cPju=~oyb=S_D5 zfA1oR{n1p-*VBA^_p+1Zvnm&870bn=j zD9MQW+JG?*1z=|Yz8HXCxmlHWnq)@`VFL>(zI~&f2=K>K0oK|aR!SZ##kRgyN**gE zkCnnKORoN}Oztm8-~z3>d{$jPtBy0eYJ1QhS?4$$YMW;m`x_Z78QQ(Xl-AbZ#Oa3#Etw3(|cE0VHrOeV^XoPP7+uRL+n z8{TyItKa%oToc!Q^{X>KVR$v9{PPRucz#@Y9*rN;GtJN=26$qxJxL@(_arl$nfZ06 z6?@5#?U0SF+tDWR%Lr39XxHci1PF3~LVU$|x(L@h`_(LtLF1pnF)zVI=rx3YZfKn% zAS=)3TlWdMYqxC&I7pJT-cZ2L!;@TqYLebg-Wn&X+DA2v@h_e{@Z@!GeJdN}E5G?o zJn~Qf!(OjA6{hCd064No6AoAok| z-X4Ip0T91y1LrYaj)n~?kByL!${K(x^+RKO8-SHPVSrn^HV+=13HS24zSJLpn`|D) zc{l*C3c%g~7|wJ2s$>yRShw4JU2hKM23amIp^?mP5gl*EK{;b7ojmifXljjHN8@kI zd^66OxhC$P`7cJlXP4&#O<$6H1!uteXkp?n=E$TK4vAh15wTfGHWudqd~UEpp^vj+ zgorfahAP9=%w73*xkg6N=5E>G?R%|zd`S#%3&|PnNoeiHS}}GiIRA+-*Rh5=j^stm)2z%Sq&9 zE38dFHy-wbYz|wCa@{fDAwy*hqa$?yOM*T{*BtvY9(Z5K>0+SmQFqkofF5YEw!ugsz|sI@WPC3sA~UnFB=^I4<TM5QI&R$bvDx;yfkJRa*O!fyI9guF8q-5uM3saQwnQ`w~0AapjDjlVkyuhAn>1 zfItOb!k|lac-zZitQ7xz=AHZE9PMbejTEn6_OqFl`%9MpENV&q8#&RJf3W4P?(f!- z+3(Ee&U=0GZ~4tOQ!fAUUh?y^aKH0D#Pe^?d%e}OE ztqJ15CD%voiR)P9AB%e9oT!gf8^0f0e#N!^b~F*c7d`Y>xT%YXQHd`{lks&?TcR*p zoZxQ4#NhwW)|&=LdFAPz3DrHdxNLA$`xaGG-Cbr!0wfXyLV#nMMSuiKr6jZxp6CxV zF%iW0M%cM~+|C{;a z?7s;#&iX9S_>JWn+xk2GH=w_7{ICD*()v5J{|5qdW?v8Nn4Jjx**AW!V`WjACl|H3>UGq3y*9>KUr}F!OjoquDF;-xWHizX@!bbujRgS>eF< z6pQLv?`yv|0^gl=OMS#I)dv1T?>G9>k#7ZR_21dEuBm_H*#9mNob_wH@%X7?_#d>b zLmEhaC$MAIOMykRjt1IhYr0Rh5)aN+y3KA;+!TA3?bdHT4*XBEDg!^9wKnj5pU3P_ zVCU>dbQAPLX;dLU{!(|g{sX^VHv7LQR=)}?{KkLOG5$>R0z2maoqyl>+nF!X!5aL@ zKWVT){}xJzJNoaR&;Er*8vd&W*5Ob8%{s5|(p#IG(&114SqDuVta#0J%>R4;zVTOz zlXZ{=fBH`v+^c{0NrzwQ-ydiHdEm$YO#|!jr~euQo3)<@t;3)GvktSjN@xF9Uh{se z?VoAljBo7MHsl{`_}~0u&Hm?^-=O{Fz^+;Tw@~k1&kgLAhu6<;lBYdYs;g4x#c-f} z*8in^xlE2MnDq~Vs#(Fn^4UiM>;LRjVBxIIf%|4{QBGy$7j+Y6tyT;+OON@|sZ*ZQ zcNS(nrCj+Suz1!k{R``F|BLP_?~-S`0xR_2vRVIUV7b=)$?X3}=l2W6=-&nEX8%yJ z{*Qq=eP^d`*3b3-x9k7!SDp5e|IPfHJYT2vzBT(L&13bys+`l`|1fiR*1!GN@(=a9 z86DS6y$Se#1h&jx75E>%u|?${>v->~_IV>P=NtOXtP8FuU60%qmo@*L-qTt4vAgaw zcg1^WlHz?c?}~FM&z-rg@&hv;h(DP5Oni{P&Y!uV^2(VH#mzIHh+Ajg7q`J$xMSuc zEor3O1Y2f4)slTI?_moO7=wAV2bq*vit(;JOeMn zOYm9NybQ0h{%h?0hWM?3&-dGb`)B-Q*#kQAZ%e_q#2+dGdhSqaep_$F`gyX2EMG)< zFT{LCUKsuVG(nDQ}*6TkCI~`JK28 z*23*3gKV6xV5+_bKDRT5jV*5`pApU;y&e_|Jp&hOJ{wb za?R@;Wcdqh?J7&I@vE0u=e3!iX`LJ59FBGlN2__ybhLVINc)=O?@)@GAYnOwtMzz>nwGOw$t%`tNN`|#?2g@7SS_n3> zJWRQXax>+YnP2O-t*Xc72D%ihxq%+`9)VF9gK?OEy{dudDtbPi37CW_n1&gcg;N~u zG)Gm0C3pxPhDYFI@F+)k3?7Fk;7Ry|{5n_8_t$@(l1t|Xp5|Om@z>Mv3_J_Z!SnC} zXZj4h2rt3s*uwK1?G@I1QO=yJ2Z9{umlPSzEUPu|S3CZpI0w$v`u8i#J`?9lM}5mj z?z&$-ba_3jQ4Mgva>QHMq%62U@Q~EJKk%?xmirZLuNi?+7=v+`fKzPYD!j&aZfWn| z)A4*JeplQ4zW7I7V}D1~cT!ZVJfI9RzoT~W0Uh%lagKhgj}_^+`lbqht=1MEP^Nq= zZqRlf&=Gzix^90U@bCHS6o0)6ud$Bns|NzNv^5PoYmfTSoR4X38z9+vh2p{zdFk^yUQ~)+?yf4o|?7@M(_x6y?+K z3_J_Z!SnC}=k*M{2rt3s*uwK1+ZEP)kvRDJVV-iwakwP~e<-(nC|1cQKa?vz7pLG= zQSbCgwI50Gcf~ny?#%C1p0DlyNOhps*#LW35`j?|gK?OE*I4tGw)0nN6F;}|+WUjb zjxWS-!78q?wK#eMwU0hJ?aC@mjiXZtoBY<&T8-86gw6F`Koh17x(Gh=La5PJNx<71Wdvd zOv4P!!by%Z2lKE1r#RY!obOTAJO+=$6YwN_O8x5jfm4)E!!z(KJO|Ii3mpG5@FKhf zpXDqr!{=G^3cSiOygKt=wEfp+{z1G>`3B|NobMf}vp^nuTf9e07RVLmJk{X~q|_a8 zjjkOQ$e(YDuE7>aky%EGUcC9eu2Nf2(Pjiw*m{4*WTA1>9SB)wO7OkBsF-*= z`_$`ONRMtIJ-USf_vjV|+@o6`t2hYO`9OpCeBD@5jWed;2%g}wrg@G&ZWg__sysa}@B*(rf z-mBj(Qmy#0I9L6LMe5<-73ayNi{xG}nJ+CCsh<2ww1@Szb~$H}JnS{st1ew655FO9 zP&>Pb7I~38{5zF5v(6SB&mt-1Eo_6ea0lGUU+Z8!+yz|=EkeOXY9C#0WPK~RD9}XN z3N8w?Q1(^%B3&c+XuBvsEMF~BE9oT>7=q!DDo0ZUQ@laDDXOp-=KVx@-5WAqdI)CGVW9H0rinI|E=n% z#k4Prm2ob+ebL;u^2TE6Xx75*^21^>Zn5^Qx<=Amy{x%UN4{9C$z9Q{$zo-n>DFYivd?sDvRK(?x;0tM71Ls6pO5VrJPuF5 zlkf@kG8ZfFe7;X}Jf~QG8lHh?;W>C7Uf?*NffwN==<%GzQo(2KQJuvBw;+p^cP_hr zTO4?qsJ;Sk>%5j|?Cvx19{q2La`2)!2hN?jrt$;oU+IM+MMKZ5!ym&3)nioMfWI{$^$NM zgSBwGa$%`F;J><$u{7X5#!`8}bRT1>`h=$Y7)#{@vytDrr?FJEvA5~|#!`9UQ?XS? zzEpYbvd2i5Dz85lyI6jZ&zcnLnsk+@H?R5|OTa-U?WBJ8txN$V_A+&&jqYRNKXkjq|#aPqHlFKFP9x`y|WMyYrTR z3ZH;a!lzX8ETf)WrkHz8_fM7u+&@_saQ|dk!2OeD0ryXq1uk&R&%lfD67==>GU~}? zin+@_gYKU!Q$6Xkcu6cH@?}K6jL4S}`7$D3M&!$gd>N51Bl2ZLUbB8^n`QE?>Bwu^ z54P#Zml1j0UDF=Rh3lGX;%N1uI!!dXq zo`5Ie<9dX2xmwJ5;*-kr<%;kh#Z&zCG&}>(!gKIEyudL(124i$@L7)hGJKvRxx)G{ z5FhurmIvJ9S{}H~dEL=tGAlH$a#Z{lya(Pl^MaP#uUuQ9F_!nm2WFlZf23cn&=t_z z;zI3lg|sj$VGvf$Jf|gV6|oh%Cd!M|>ZPpE)zCq4)66CDA@u`SNU6`oZLk)4yk&)y z`ciCUNfX?|mfd=;kW$ygcD4H}q|`a_VScqwXSza4-4^$={sc_I6imYm%)&{IGY9jq z0H-)w-)mSQ9etd~;Bj~Yo`k31X?O;nh3DXT=r(tSa=~<)yF$5OKFjf6hR<_6S6Kfl zdw&@fUV*R99Mk%*!Rzn_yvt6;CGbKD>e4wCErsXt(0nBvOsP3N@-^< zf{Wo2xD+mfWw0DBhbv$Otc0sz5Uz$EkzOhF?~3c>oRw1F$Ka9ql~UjH&~KI-SE?5M zOx!9ru9OGNTDV=_SSb&DBJO0JI>ltAYEg3+OLoHsmV{sZ(g*wD033uva2SrjQ8)(2;RH;=6imYm%)&_`lY@C! zfWGgrGH`%(4id3xj=Ts<@DMx`t2hT%~6RwnpO^*|yVTgk|6rLMI<(-L0=RO%Y)9np8VDjEB#)YzA|P^0^Il^Xl{ zP~61&9>1-WnqP>%=BkvMrpLZ2rKahttxD-=`ii?!I-0)Ps^n^`QaXBx$G$41qnCT^ zt5Q0;?6I#(>FBb@bt^UY<)ii3S0$skl^XlvUN?By(`IE#a9XPP4~!V)|L z55ptyG3c?cN@;C+?5k2*n;!eBl-52%UoTfmYtv(2mD1XO_1IUXw07BJUzO6@^w?LW zv^G8VRVl4~b{<=ygXD6MTn>`UL2@}rE(giwAh{gm zUQCc&4wB13aydvY2g&6ixf~>ygXD6MTn>`UL2@}rE(giwAh{eQmxJVTkX#Ou%RzEE zNG=D-_E(~FIY=%C$>kuq93+>6ygXD6MTn>`U zL2@}rE(giwAh{eQmxJVTkX#Ou%RzEENG=CeZ~NGs%RzEEsFu`a=W zVwKciEtS6(YZRZ=^u||9O)qiHyjp60AZ~-T(D#p4(<@tzrmN9(HJYwQ)78@SuGVp$ zt|m`cOH*&hdAeGfy6ik%trpgFe{8i{SeJcwX|-Bdmmk*guhuB&$Kn)6c#tL29AOcb z;30Sz9)XX+qwMP#JPuF5lh8HrYE)Z|YO7IgwN&#Sou{j%nveE0JOj_dbMQQLk7%`2 zGu+tWlPIt+FG(M*W#jM7M)$i1Qli z!!^{0Yl!n2a%YX=>~%cqxJD5+J<_;F`QokZQEj|N5%v<_M_8i>e=2scU*Anwqdf8w zkC?5Ilf92bw1iiYVLX$>{f8fv69)JSV|rrwUn4Ah(Cr8 z>ItqY)mMKn`r5OKYtJgxU4Ky7SD;lI=QkhHlR8!M^A*uit&*QliQ8Z;+^*}CD#iIJ z(fy4o#rX@-qhwXYxr#VfDbB~WBm^7zZJ2Ts*>eJ)B(xMqv!bVFLEfoY!xCg8~#zg8LdnRu_VY^@w<&Q-0rR=&C;u9WN6s-^o{ zbdP1N{NwfAV_8d&WvyB_m$%C^YvmuWv9Wa-*aE9ob@)_*uHDUwepYI37xZR)#~|I5g3Ir7>5bi3;itUT6#EZ>EWzZ zd*|)DhqG4do9^MPReNW;hqG4go#`IVTD5nkdpK)VOPD`}PY|UiDZA!eEA@R;?%}Le z&1t%avsUe$=^oBnwRh$P)_(?GgqPs6oa1wB=Q8D=vA%mdYgMb5*VwP?mbGf{yyPal zCF%pW@E&QcFD=Lkni5ex-gVO2<+&Q=TgOwNn&(U-Me9`C{6YM&qO?vuSg$i*Pgbl` z4fCnE6s}b5v`#gQmjvNMdLn(D9P&$XtHx*6$s1-Z^xeaC^2X1_2KEwyjr=uCxruT! zW#1)SryBc@Vk=A96peMNJw6gUIHOM31s`Vb`&jc4Ic;6wQTEuwkw;(@#$X&KU@!aK z&-xQE2~#i)GcXJNl*>B#$7foEC3pxPhDYFI@F?3q29LuN@FaX(W4Y_pH(oA2sk=(+ zRBw38PjfD(Sm!i61JA;9@I1W0n$N(C@DhBM$UH~+GUewv{ww_IMb&}p)E?O(FXM+- zplghE@{f57-ewEG=C^nB3|uv%(A8?c?pOIi0#`&)pF6V#BHz^`VLyPT;#vj$@A5!Tg(PM zLsG5w$ZTZIFy$u7&6Hc%`yQQdwH)<^==){Wa+KM@-rd)#R(s?nesZ!}?a?2^9)25v zQ5b`9n1H=AuWHTxY-a){VG5>U24e&oH7=@FE#&jEi>g%%nRZdNY9aF|=W+}l zhbQ1k__(gBs#Oa)8un7PytGjC9p`F!$&t~UhT>^>2A+lI;Cbk`398krG5t0{wR$zC z`)}3i)p$GZzg4SO<9$8Pxm@A5FA@hoom(wOd7W3_>p0{lyoEz<6IDNyIS(k zC!*g~Subyxe&1xhTw$)!zSgS`^Vi~5d1<{|Vb;R!isX8^Lhsc{eJ^i&hbQ1k__&_jUN0?tj!){@j`h;wkK!r*dK#XAXW=<`9{OI!dZ}RgUdDQkr~mxKc-0Bh|bl2sbGL zHK_W+8Z`1yqbxQX`D>VR6Xj;gEqZ#PM(x6{#nze2 zVjE}Ct{kaR7T*;8tZ9w1_$|?QtZJmPkNFXf>QVWyMj7qnkH9F5!8lC7UXE%%znXwa zn1X4TfmwJEPIIP3Sb~S(VR!^S29I)H$KY{z0-l6^*QQ4PSu8%O5zHFeg&O6u<8z92 zPQx?sEIbF#!wbac8F&$1f_{p%M!D=b_*vE(WwBMe!mnOb->*jPf}{5`K6wScPMmMT zTktkf{WaV1Q_CCVt6zz}N47y;x+eZWwZR7Y!lrVUA&+oU=g=`4@3N$2I|zFa^^v1GDg;GJ1pRa38<#?{8qldjlih8&rpTiSO@k zV8nZaY7C#@8WnxAIbz?JC+sc&_z@Y@%O+e<{|Wz>8H-X=b-Pc};5cfO48ca0hgAn|RGshjn_1q%7WU|@H%k3qh;6DLHcEYOxr1Zq zWJ#CWtc|J-eB==rg)tb13D_%FZOhQ4TTv=Fvtu#Ak5~9)~C3N%*+lvKASYM`b)8f@*Z93Y?5BT5!-cko0P5p zB<|<86EF!=Fby*>3n$rf4(4G2PO<%G+1h3JJnLU&`D=>dCXEx`)C>=P197w3&Cf)? zhq#$hsm;1~{I<&9W66(Hv+3<{`G2$SAm0%esx8~BJIF3ChD+d5mM^1R2Fu}cxB~hr zd$ZoO^=~U#e--5*<<*q^M8{^0RX!oEl_xhVdOs7Zb>CsLqW74%iL&o2ZPxYp*Ww=O zwOR4}Q1o-Nn-$OZML)g2Sv8*byPv)Ev6p^000-d^9EKxs6pq1hIKdW@Fa^^v1G8|F zqsqZNEWjy_`~cfIsQ%<;^>ciLehXl;Y9~k4Pit(}IHAw+RrLWjYjpR#c%AYM%6HU? zZ9%&&^eVTY-4<#0hL+zW4{uTb=W}t6wA&&b-xI&j@_BOm7OD9=(c>Olr0ECZLe^hI zc`;l9m$G~rfS9<_L#VVv)IIvhoJS{B7MISeJ!&^`g%!+wB90>KNI}~;1+4^vwM_vJWjHOagr^% zJK(a%Nw(Y)9;aOQ7_u`dt_VG zi#Gk7$rioSYWg{oEqbTboZ@^BupN)pY>^*)E|=l+{PqR@dX+V=5gFG@TjY&%;%hUf z#n)MKoh3I|a+4*uh{Lbp9p$p7xIpV~l^?v$ zBFc;566jHpt@^gF*C~VLa5-E7eRp`P{NQywa z9D$>7430yOjck>srpHFMN>kHgBU`1ZImy2Kp7K`SQ{KvZ%3GzWkNg1JIm)pegU8_s zcoIHElul7T4bQ-{@Ekl3J({sq{T4^y1y*KAxE!v4E2YjhsqA(9HpDim?6Tj9 z*d~=-ULzlFQ%&wAe*bQpRQ^izn=;#^^4H=9{@TM)MPL-hU>qi(-+I_4WxeHoH~nwHe6PX0*rmA<}S3=rkL5p6kFHjVd@U|u{e_B8trYQg z7Q-cQDa)5pE`#N8Ia~o(O6yuF;@?)X{wm5r%Bv}_fmOP;szs4nDe|hy)pAR%>S1r8 zX68w81LaNX`P3>0%{KL#YE|p{XglGIIfxWu0rB^{cvW ztyMN%6t7dhLD^3zZI{09iTA2Uv|Y96JK`M5zMHUJHR`A0gQ}6XOWD`O1uR(v7sDlR z87zb4a5-E7SF+6t%B$dNxK?$`cGTIfD~PXE_Oq1RRX3V`mU6qUCI3}yr0l0Cx9jTf zTjD;Bs)wVBz$lEtI84Ak_SFvu;2<1=!*B$S!ZA1wCpp3#%)?bg{>yCrzCos3` zj)UnZFt@AbG_CA*UFln|SK#YJ_$IssZ!11Ks3&*m3Ee+ed9J>GutVAUd+{ggjqITQ z)R)PW#XFRz=3=-6>Z|u!QU=R)<+4NHnembpaHVRG9m-HISp`?aD&5c8p?v&YT&Gy= zP(J#rXzO8(dJ8+KCwFL+>4z%U>s_H8()2Gy*PJ_)eWq*99qQ+pt~qz8pJVp1mwq?^ z2jLJLh9htkj=^y_$x-EC9v0vfM|FU8{QS}m)r3Ay*MvLNKl!crn#QkoD1%(Sq4G}V zDbk1jwB}C5`7_batnO5wf`rV z%1&LUcss5$cS>=`!HVyc;+MqNW-f@=Dc_)cN1E1=Q+3kuuFCFv)X~GNqwi5C9lgYT zk2+mVe=54~QAgjSF5tdLo$|EhI*p}x3+`3c(W|VZS6N4|vW{M59ajo+# zAFcZyb&9{Y;C^78;_u~-zs8KTq@D=Z6XALyTu+4SiEup;t|!9vM7W*^*AwA-B3w^| z>xpnZ5w0h~^+dRy2-g$gdLmp;gzJfLJrS-a!u3SBo(R_y;d&xmuR7|kj?)pYR~=xpnZ5w0h~^+dRy2-g$gdLmp;gzJfLJrS-a!u3SBo(R_y;d&xmPlW4yJ&xR(f;nD{oO_TyNmXB7wzvZwZA@wWAHdU0Z+oG)Pvon_Sfs2hG*be zcn+S2&%-P5D#!3LF?Ww$V>y&R$zOA#~t(M{o(ca#zmcr$Gl)t;>@H?VM zqIS#SE_)k*M8ryXldr-EzC>k*M8rySLzxsNHhA>5-`2a=Yn~sNHhAk30wS zumGnxevd@$mdZZbW6v`!%AaY8`vVR12O8)PG|(Stpg+(+ zf1rW>Km+}O26^BUt?&Lo1O0&pdBA1&2O8u7m)##|kOxfn2O8u7)9pwD{ecGh0}b+k zm%BgEAP>0g{y+o$fd)C@ZI#_0Xpj?bitZ0I$Pb4__Xis24>ZspXrMpPK!2ct{y>AA za98WNKhQvbpn?8C1O0&p)s0_ix%&eRsvAxB2O3m2`gq(QXpmb>_Xir}7SsKK2D!y_ zf1p8bG2I_%kXuam2O8uS)BS-4`U4I02O8uSFL8gML2fbKA81hBXu3bppt{l9aettJ z{y+o$fd={m4fF>Z=nphdTQ<-iXrMpPK!2b?J-`e4t@{HZbPu7s=1x`ILg*es_Yk^= z&^?6iA#@L+dkEb_=pI7%5W0uZJ%sKdbPu6>2;D>I9zypJx`)s`gzh19521Sq-9zXe zLiZ55htNHQ?jdv!p?e73L+Bnt_Yk^=&^?6iA#@L+dkEb_=pI7%5W0uZJ%sKdbPu6> z2;D>I9zypJx`)s`gzh19521Sq-9zXeLiZ55htNHQ?jdv!p?e73L+Bnt_Yk^=&^?6i zA#@L+dkEb_=pI7%5W0uZJ%sKdbPu6>2;D>I-YCW2*H@H1LeeP3UH*=);~J&-yW;oM zrZj4V#R5wcZ4@8etH%fPxJyP8$-A#{FH%fPxJyP8$-A#{FH%fQY zBh`)4-DQtdH%fPxgOoi|-6-8Z6n*!hQM$XlPIt*0rTcYpy++;|rTa0_Bh`)Q-YDH~ zsO*vIM(O^g=#lD1YW_xznRv?{scvMXx=|kRd3mI|QBLsL`H8+pIl=Tub)%eMdZfBh zPVmusq`FZ~Fg;S;C?}X6scw`LOpjDI$_b`NsvG45(<9Z5a)RlR>P9)i^hkB1oM3vS zx{=;dBfX0h;6l zm*;7eph@cgR`j)GlhprM^xcXksqeC{C7Yza>1)X*sqeDKv74m6>1)X*sc*Uu&?NO; z_T7pmsqeC{C7Yza%WKp=Hc9;>;###|O;Z1tVzp`meSKR#Z<6}w#SN^#NxiHlss9Vn z_oSMnrjORwm`zgC^c7H()HHns)Fd^%M~`neNlnw&m`zgC^fhLa)HHpK*(5bhUt=~& zP1DzyO;XeJor@-^Y5LAZlhiaPIsP2X!vdV*_;mS1D}s~Q_@l4`Gt z*D2qid`I=FW`0+uG}D4NYjpGtmHid&W{r-z>~9P<>#ec3#Rrs4%~JCv@h5t+y; z?}#2RZI-5=i2jmuv(z+~K!3xzSvs2K(BE)wmX4<11!$IzF0X>CVU>C>%~I_PaUDyl zDX&-mty!x1s9cjbORryvn^k)^t8ee^_&v2|jj5V`FQZx4WiB_thoy3}`tv?(kEu3G zU(;i%&C=KOm};~1HT(EgKlIm|o29Hd1pW2qW+`j>>&?wl)*Oc(Q*BlbnjTYaRt}m| z9KXNM+^nZBeB?z~f`{N?cmzHMkFx$TcpUmk?`EF#Zq~@^EtOBPw6q6u=ll2y6;hhKN0;c&^?OhAH=P? zf3Zi|XV$_-*aRO|U9?Ae_o>*&Hv8cK9E3w~7>>YEI0na|N4EDUlBP$t_b8I4zeKu6 zk@S%tWsk?;ad-lrguaKnN15W|JPpslv+x`|53fLf-E@ysaD-n|F6@yCF5jShTW8ct ztJg}ar+J52;#RMfRm5gYm)oZ2IYo*m|B_mpC^;&85T50uKY4uuZ^;&85 zT50uK$%s~3y;d@!l~%8nRm5gYm)oZ2IYo*m|rPXUyM!c!xbgS1&tJg}a z*Gj9`N~_mOtJg}a*Gj9`O4hW}>b279wbJUf((1L+>b279wbJUf((1L+>b279wURZh zWKAns(@NH~k~OVlO)ITltF(Sk$L3bARa%>F^;)I%$D&)kR$9GQWsR4+)oYbruZwQ= zT50uKrI*WY_1dJ@hobAQHd?(l+PgNjcfZvVw|8x{bZt`bA60%({rNWO_)F2fmo^k^ zL%}u_Y(u*?v};4VHneL)yEbX}mVV_POB<@Sp;w!fI;kaVmFaC{R-2UaI_q_JsZC0~ zCT>t|)+UW^iksDNaU=`rYa_ zX==I;(}tRDsM&^^ZK&CXnr*1rhMH}t*@l{JQp(4lgLznhQyjmQYEw(+BlPz%+BAk~ z9)gGA5$Nw@v?+gm7RTUmcmke;Podo@%BSHOcov?6=iwFjB5}CNkz6B^uc~*~CT}>Z zZsXeI5HGpG61Q<}db{KeO&jZHZ`$b{waX{(sXRy5KJD_!+u~pF*Liw+zg<3gU3^e` zY?n`dE4oM2E}xk05w+7JYL`!3c8{o?9#Ok|;<9^0?efVxqI*Q`@`>plQM-I{T67KE zE}!@q?2~r+axLrPZQ+!B0fp+=iUqz30wlmtnq)J`v`onBD8yy0VZjonU--A;|&PL18J zEcUOaIocvD!9(ycJOUqs9{Fr%zJuDML;d70RQ`$9>5$eg zFO(lTq`1p|{;ETYn@d^l=dU`XyXohzI;6Yl=dU`X`&Xi$zv@uk?(O*bs}9xeF8leb z4thHsa>6l{*Q(y@zzH2Vp+g>cMN2lZrd#9=JkTKze5mp^SPOTsP9xcABpsxkgmWxJw7HHK+dbm*>!X;*Zp#_%~FgU8_scoIIv9#2s|4bQ-{@Ekl3 zpJ&Z0l-(2SkV72RmpPtS;H#=7I#hf7M!Zh>24#P>vP135T}}Sz_N9~drBn6B?^T`y zJ*!ctMn&Eb|3Vsds+GAa{zOk5cdGXAujZ?s@1*wVr1t2f_UNSc=%n`Or1t2f_UNSc z=%n`Oq?PHU_UNSc=%n`OlxL1>n{H(~7*v7*v7! zXP4A>+25(|QZ3<#y#im=6P{gC|Ci!*$~P$ACK`7X$-R14ira#TllT#x7w@sQ+_XcZlJvy|9n&Q^V@qh{^=!M zI+wl5dLOgDOukorOEU)jW%9l1TbldX+5}9(6imYm%)%*--`@|}t6cV36k!P-f`{P| z_!#t;8}~|6(_e1fD@{#*xpA*%hWf7fgx&(%t2a}Yi~hpTUcH&(v+(yD_bSItf4_0B za@_Ry8}~|U^8#^r23~}h;InMOUvS#15mayOdCtOLaonpq!N-4a5x4cj1Xu7w&Pv>a5x4chIHm|a^*L39jR8zebctoE3K(qrN(XstO z^oZOeI{v%jdY#K7I!>>-LFfL6{NVK?FbZQZ4im7KUwK}JN3=)tntuE5l?!i)KTytU z(t3@GJgPej=6vn_QT2b`6|3}(h(~n{x5a85&!akq--$J9NgvfQ{8rq<`W@QKqw?xq zu}fF$kLuXGod}G=7>vUN^t)7#DyrU^@0>oW5pwe~e1T)Q%3rUsub0@eXV!RB5&MTg zw~qE-ME421=?!+%8|It#f}{tWgcqt#iLEZf5xww%`%bZaK&Fh-kNJX>%ukty3-3t*3bY zLfplY-LQczgrLVxyH!hgUmij2RxROj3v6Xcha%Ih2zz-C#}|ZhDyA^f0^WVRqBQ?4~EsO;4bkoGbI9C|`neZOzYx;Tq9_ed(KAj$A<;SAi@gCao9;xQC+wmUS z@gCLiU#aYNyhpm2ZpVA1i|KZ}hjzS2y7>70Rj3}m3f03`p?Z|{J`2Bt+@o6E>$|P* zkuE+4&!^L)_Wd73&!^Kv?)T_By*^*hrxQW12zo`(D}r7T^opQY1id2Y6+y2EdPUGH zf?g5yilA2ny&~upL9YmUMbImPUJ>+)pjQOFBIp%CuLycY&?|yo5%h|nR|LHx=oL|` z{h7|fdPUGHqJEdl)+>Tu5%h|nR|LHx=oLY)2zo`(D}r7T^opQY1id2Y6+y2EdPUGH zf?g5yilA2ny&~upL9YmUMbImPUJ>+)pjQOFBIp%CuLycY&?|yo5%h|nR}{UX=oLk; zD0)TFD~euG^opWa6uqM86-BQodPUJIie6FlilSE(y`tz9MXxA&MbRsYUQzUlqE{5X zqUaSxuPAy&(JP8xQS^$UR}{UX=oLk;D0)TFD~euG^opWa6uqM86-BQodPUJIie6Fl zilSE(y`tz9MXxA&MbRsYUQzUlqE{5XqUaSxuPAy&(JP8xQS^$UR}{UX=oLk;D0)TF zD~euG^opWa483CL6+^EWdd1KyhF&rBilJ8wy<+GUL$4Tm#n3B;UNQ8Fp;rvOV(1k^ zuNZp8&?|;sG4zU|R}8&k=oLe+7<$FfD~4V%^opTZ483CL6+^EWdd1KyhF&rBilJ8w zy<+GUL$4Tm#n3B;UNQ8Fp;rvOV(1k^uNZp8&?|;sG4zU|R}8&k=oLe+7<$FfD~4V% z^opTZ483CL6+^EWdd1KyhF&rBilJ8=z2fK^HuBdn zWzT!ntDe7?`+JqW(&A&WRaYy$(!#%OXFL8MIMyjQ)7x#@YYdKGii^Ir8T=0476 zpy$2nRm@F)53^Ta9r1bjdzigMzE_cV*>CSNj#`E23xg+pjo(EG~tW zFbF-v&VI$&tcCs}>weR*{=wj&$Ip&=o$U?E4HS; z3e|^)`|xld9`3`#eR#MJ5BK5WK0Mrqhx_nwAF=Jj!+m(T4-fY#wqIz=_HZ8_?!&`< zc(@M__u=6_Jlv-Udrf<|4-fa@;XXXvhll&{a33D-!^3@exDOBa;o&~j72b|L+=qwz z@Nl0-q8`u^d$!S;@nT1 z`-yWuaqcJ1{lvMSIQJ9he&XCuocoD$KXL9S&i%x>pE&mu=YHbcPn`RSb3bwJC(ixE zxt}=q6X$;7+)teQiE}@3?kCRu#JQh1_Y>!S;@nT1`-yWuaqcJ1{lvMSIQJ9he&XCu zocoD$KXL9S&i%x>pE&mu=KW0C655&I81GfH)5j=KW0C659&V$5xkT?$#=Rx8;NSp_W^B{2^B+i4xd5|~{66ZnU zJV=}eiSrr27KNmgHIHcHqEV{iLQf$rbEO)V~EHPDf0fUYwRIK-evbXh7@_P>2cj5MgB9<&*~2; z@^{5f%Ko0rkRti1={>&*4`}+kXG6LVXnJ0=A;sK#aho`#n44}BhZJ-3 zakl(Z_yl|sKBd0O5Go8w1+VG$aY!ndZXbuFg6Z~gNGkZ4J+Il2R4^|=&ucb>3PV!C zWq&_;NGkYOFLH!_CV!a74-@%eB0o&zhl%_!ksl`V!$f`ksl@UqeOm` z$d3~FQ6fJ|ksl@UqeOm`$d3~FQ6fJ|#LcX;Mb`ym($rh<>_TJG)bulrV^Y(9_3T1pQq%Oz+GA4F z^p(_@)HFT2(3sS8*|Q6cNllkMyU>_)G&|V4XBQgNh{0Q;?_ZB`|9Xu3*JIqj9@Ddt zUhezXW15lVpG7}KFeb(QThFXLCdEz9tUV^h&BO2r^vv30Qrzo%Mv^fpZhCg1F)40( zZi_J~ZhCg1F)42P`fE&zo1R^0Op2SHU1&^-o1R^0Op2SH@nKAgo1TMaOp2Sn@*0!M z<`tHBcA+tiD)?MHv-X%2_mbCC6OQRg6)S#&vS-#FV@8rOjWB#37$+ac$;WZ>ah!Y{ zCm+Yj$8qv;oO~Q7AIHhZaq@ATd>khq$H~WW@^PGe948;g$;WZ>ah!Y{Cm+Yj$8qv; zoO~Q7AIHhZaq@ATd>khq$H~WW@^PGe948;g$;WZ>ah!Y{Cm+Yj$8qv;oO~Q7AIHhZ zaq@ATd>khq$H~WW@^PGe948;g$;WZ>ah!Y{Cm+Yj$8qv;oO~Q7AIHhZaq@ATd>khq z$H~WW@^M0ue=9JdeEe8+K29hf|0vE=u1zQt?}+o&qnJRQ31#9tDtn%<2{Lg)ndmKe zp05dI;)kN=`I=BBz9DXw;uBKyE76%aK_*U+i4$bvgmmqs`(NNXRJ=lPnD)~4tAnjjM=$ixXUaYFif%bw?J zLYZhqoQV@;;)F8MDmxP=m>Xz#SdBhki`#K{E)>DS^SX24_W+>#SdBhki`#K z{E)>DS^SX24_W+>#SdBhki`#K{E)>DS^SX24_W+>#SdBhki`#K{E)>DS^SX24_W+> z#SdBhki`#K{E)>DS^SX24_W+>#SdBhki`#K{E)>DS^SX24_W+>#SdBhki`#K{E)>D zS^SX24_W+>#SdBhki`#K{E)>DS^SX24_W+>#SdBhki`#K{E)>DS^SX24_W+>#SdBh zki`#K{E)>DS^SX24_W+>#SdBhki`#K{E)>DS^SX250mo4XMsui;S+HV^p{a5<$*h* z-wU3U%3q6~XKhl-dVN1%Iw@sMKVLej>%OnV9jvpHb?R7N4?WM?r1bq%Y+%bF=%-94 zrLXtpr%WfMugfizeJ6BMDto`4XKhl~eWvGGo7B~x>3P;BrMQ3Pud+-^anoOAnUvzD zzsfQx#Z5oiJ1MQbP0u7dDXmSGoq8y+VnG`lhWGsGoq8y+VnhYlhWF}2tCi*q^=Wvj-F?2QrC$t zd!DsP>2AIVud&~kh{NkF@jPpjQu&iW4t;azn?v86^8H;cx4t>_&7p4&eRJrWL*E?w z=Fm5XzB%;GDStoHZ>?`m`Ddpd_N{LYeRJrWL*E?w=5$^ErT%JtbLg8x z-yHhp&^L#^IrPn;Zw`HP=$k{|9Qx+aH;2AC^v$7f4t;azn?v6m`sUC#hrT)V&7p4& zeRJrWL*E?w=9J4{>o~1%4t;aVWuK$<&7p4&eRJrWL*E?w=Fm5XzB%;GDVKfL);EW~ zIrPn;Zw`HP=$lhUd%xBv>N8dd9=FvBgzIpV`qi-I4^XQvL z-#q%}(KnC2dGyVrZytT~=$l91Jo@I*H;=w~^v$Dh9)0uZn@8U~`sUF$kG^^I&7*G~ zee>v>N8dd9=FvBgzIpV`qi-I4^XQvL-#q%}(KnC2dGyVrZytT~=$l91Jo@I*H;=w~ z^v$Dh9(@bwTR`6e`WDc)fW8IvEue1!eGBMYK;HuT7SOkVz6JCxpl<K6!V}>=^pn#s_c2trkDq9ih0ncm9@ z>Uq$n~xlw9#E(et29F%R05?wk9VJrCNH zzNYniv4`XLJZMvLi|KjLrsNjW^Po-1Ej}vGgEpo6>}C>r9<(XlXE!|$+LZ3Io1O=4 zO1|=$dLFbX`O5S>XjAf)>3Ptm3PtmF+GZVK>b^%<3oNx8Qd)LVi$Bu6`uCUwTlU{6cI~FXf=zcvtky2nXdxFY)*B4l3H_ ztME0pbDi=H%6@ZmT6=j{^n1J0+Lz0Idv{v%B13J@9G07v{3Rd^@eT!(8^4Z>RN+n9H7n zXN=;roVhU zt=u#{2h+5k!Zq{Ib1+TIAwF_{`F2|Q`=#hPn5Lza={cCD^#vH8yXRnIYiK z+7;2Rh;~J^E23Qy?TTnuM7tu|716GUc15%+qFoW~ifC6vyCT{Z(XNPgMYJoTT~U7i zP$mC&w)b|thcp zN@!O?yAs-!(5{4bCA2G{T?y?<((dy>3GGT~S3$mC&w) zb|thcpN@!O?yAs-!(5{4bCA2G{T?y?1MhcPzE;y#&OioQO9wVzoSVdwR94aTCAj!lqTtsmvj5_i^ z=TtQfGBf_a?|Yu_d!GN}Z8&*ztM0w;J?H#>?|X0VeP3z!b!pcx?fRu%zqIR@cKy<> zU)uFcyMAfcFYWrJUB9&Jmv;Tqu3y^qOS^t)*Dvk*rCqz8)@(ym|H^-H^cY1c39 z`lVgJwCk64{nD;q+VxAjerR`((XY7cmv;Tqu3y^qOS^t)*Dvk*rCqz8)@(ym|H z^-H^cY1c39`lVgJwCk64{nD;q+VxAjereY)?fRu%zqIR@cKy<>U)uFcyMAfcFYWrJ zUB9&Jmv;Tqu3y^qOS^t)*AMOHai+|f{m_nO=F9q}_nD8<2Jb(r!T74M@8I zX*VG42Bh79v>T9i1JZ6l+6_p%0ckfN?FOXXfV3Nsb_3FGK-vvRy8&r8AngXE-GHq}_nD8<2Jb(r!T74M@8IX*VG4 z2Bh79v>T9i1JZ6l+6_p%0ckfN?FOXXfV3Nsb_3FGK-vvRy8&r8AngXE-GHjfnu4f;95PkUH133ccAawj4kRxyoLPsJ; z;2eaGT+b0W2caX8BXABvMgpQ8^ zIXBrLbX);)Zn8nBISS<5WP{43gV6LIlsPxqpnBkg(2;fKXmx|Qc3_!vlMUj!k9d=i zbCV6?x{t`Y$p)b^kNycE$L$=1%0!OaIS7@B9Jg~2Dib+w=O9!ja&EFgs7&PCWP?zd z$hpY|p)!&0p$|f3BHu$FgvvzDO*ROXxgX9=HVA!*bJ~jY>MBnsbv4LghM; zbCV51WtJa9pK1vDJ_h6rk3+cX{}GTgJPtwAr-7W|aR_Su7Rd2bhoC0Q9ARt-Y7#k~ z>JZdqnIlUKK}{k@mKcJXL|)SkK~0u9p6U?PWSQfs4na+pIm6=+)NBAb!{ZRtd>F{F zCWfHn4}qNFaR>@N0OSmhL%3H!%TDGX%YO6pr~Ygs3EP zRIwrGMf{ZT)56aP|A&yHiVZ<8?t$YZ4?!;?$4MT7UPO+QJOsU1XU_0A1igq~5pssd zA?U^ZaE8YrT+tIb!{ZRH=!u-+aR}G%WQj984&ln3$Qd4oaOF;{3OU2$5VYnI=T+XX zGG}-k!u2>6>=cRI9D(9tgUMlCMa$YLurE*>>=cRI9D(9tgUMlCM za$YLurE*>>=cRI9D(9tgUMlCMa$YLurE*>>=cRI9D(9tgUMlCMa$YLurE*>>W1Kl? zmzTr2StdV7IJ=yeNcq>St0vf`=AJs{jPmbgvfr^J}5%u95nl& z2$8d;?}H-5+f-YQ|GW<>@SE%@?Sl$D3yyEU4}XWu-G0J+rwge zSZoiA?P2_l%z^J*in(Qn#r&|C9~Se&Vt!c64~zL>F+VKkhsFG`m>(AN!(x6|%nytC zVZ;LKK<0F+VKkhsFG`m>(AN!(x6IvB15N`C&0XEar#B z{4kgg;%`@N7(;SI{EuM1VU}H()o%oUNn8u079-MPL|TkU3;e|kdmfP%Bhq3-T8v1G z5os|ZEk>lph_o1y79-MPL|TkUixFutA}vOw#fY>RkrpG;VnkYuNQ)8UuM7{4ek#Ut z9MNA7N2JJz6d92sBT{5Uii}8+5h*evMMk8^h!h!-A|p~{M2d_^kr62}B1J}|$cPjf zks>2fWJHRLNRbgKG9pDrq{xUA8Id9*Qe;Gmj7X6YDKa8OMx@Ayai_5wXLQJj0hd)? zQTZ{d1+MYj7ptRsWU2dMy1ZE)ESjJqf%#7>WoUAQK;j^9!`aSMxo9|AT!md)ESjJ zqf%#7>WoUAQK>U3bw;JmsMHyiI-^o&RO*aMol&VXDs@Js&ZyKGl{%wRXH@EpN}W-u zGb(jPrOv3-8I?MtQfE}^j7ptRsWU2dMy1Xu;$^dOJ6ivzfi`5Y+tK>7%z2P+N9+F> z(4+M}VFrBOj<)p~;HmnQBPHIB_Vh{Mow%~T9j(tJz`OMQWvyA!n!{T2L*Zj+HO4gi z-WZPlD9ZfH;~0+4GLJrnqdx@XEX-r*b^IF0d058aklz703-cHp@+6S6E{?$=#I?e8 zTF+S*$KVhmXI&hFLx`MpaZC;wgF{%}tnYKy#W6U9`{b;PW9oH`!6E%9bJoQ%IAjsX zSr^C9>-cvdXI&hVPsYFu*K-!;G2P!A!~MNyQGT2D$-mEzp$GB=kh3t4!9_e5&cZwf z7ZGm~eq4C7@K$a6x2g|kT^xgph@5qC3@##a*2OWnh{#zN$KWC&XI&hFi+Dz#6MkO! z1tDi)9)pXBoON*wE+TT)#WA>u$XOT1;3DpaPZ*A&AHw=`7UnVdirezaaSXoVH`xM? z!3k49&cZx~ehAB)b#V;+kcW(MDE=^z_W;MCILn-UZybt02;@9#`-Z*ssA&|50jYIdJ1F8EsbYB7Tp8Pm;|92qY z=pV;@U9REmd*e|5X&~S0ABP8cUN`7Fe9m(mP9X9*&v7_`$mcxAkxz)6eQzB3g!|#_ zd*g5dk+biO!wE#rzBdjh5IOtaIGjM_?0e&I0{6h#_r{S=h@5?I9QlOE+4shkPsWu` z#+6UTl~2au1fDNv-@{W0aKbp8z;of#1>}6<8T7M$(fkO@k9sLbN0P)_@NBs z?0e(z1Izd7+&TMRNvt|-YBCAp#`SCr(6l3Y=eD@t-jNvA0ESZ=!%kDQIac4az#n5D9IHi zxuPUjl;nz%Tv3uMN^(U>t|-YBCAp#`SCr(6l3Y=eD@t-jNvc_&S*|F{6=k`i zELW7}in3f$mMh9~MOm&W%N1q0qAXXG<%+UgQI;#paz$CLD9aUPxuPsrl;w)DTv3)Q z%5p_nt|-eDWx1j(SCr+7vRqM?E6Q?3S*|F{6=k`iELW7}in3f$mMh9~MOm&W%N1q0 zqAXXG<%+UgQI;#paz$CLD9aUPxuPsrl;w)DTv3)Q%5p_nt|-eDWx1j(SCr+7vRqM? zE6Q?3S*|F{6=k`iELW7}in3f$mMh9~MOm&W%N1q0qAXXG<%+UgQI;#paz$CLD9aUP zxuPsrl;w)DTv3)Q%5p_nuBgZr6}h4!S5)MRid<2VD=KnDMXspG6&1OnB3D%8ii%uO zkt-^4MMbWt$Q2d2q9RvRa6yoYi*%>OTbJtiBUa|A#=%>N^4TYe3HGI|227 z0p$FK6VUW$K;Da(fSN?!HJyN(MBX)>fSN?!HJyN(+yn2LPC!i}@0w0PO(O4_PC!i} z@7+y6O(O4_PC!lWf%onvpeB)bO(&oxk#|iepeF0j`3)zaCXw?SPC!l8pZD%2pdG)t zUuVtv4JV)-*K>Zu38;1_khA(uKsA;*zu~0xnv`CX(rZ$BO-ipx=`|_6CZ*S;^qQ1j zlhSKadQD2NN$E8yy(XpCr1YAUUX#*mQhH5FuSw}ODZM78*QE5ClwOn4Yf^emO0P-j zH7UI&rPrkNnv`CX(rZ$BO-ipx=`|_6CZ*S;^qQ1jlhSKadQD2NN$E8yy(XpCr1YAU zUX#*mQhH5FuSw}ODZM78*QE5ClwOn4Yf^emO0P-jH7UI&rPrkNnnbMCpau1slwOn4 zYf^emO0P-jRhM3M=~b6rb?H@?UUlhJmtJ-0RhM3M=~b6rb?H@?UUlhJmtJ-0RhM3M z=~b6rb?H@?UUlhJmtJ-0RhM3M=~b6rb?H@?UUlhJmtJ-0RhM3M=~b6rb?H@?UUlhJ zmtJ-0RhM3M=~b6rb?H@?UUlhJmtJ-0RhM3M=~b6rb?H@?UUlhJmtJ-0RhM3M=~b6r zb?H@?UU)YJy40mtU3%4}S6zD5rB_{g)umTmdex;@U3yJPuPNy@CB3Gk*Oc^{l3r8N zYf5@eNv|pCH6^{Kq}P=6nvz~q(rZe3O-ZjQ=`|(2rli-D^qP`hQ_^cndQC~MDd{yO zy{4qsl=PaCUQ^O*N_tI6uPNy@CB3Gk*Oc^{l3r8NYf5@eNv|pCH6^{Kq}P=6nvz~q z(rZe3O-ZjQ=`|(2rli-D^qP`hQ_^cndQC~MDd{yOy{4qsl=Q-zG|+2GdQC~MDd{yO zy{4qsl=PaCUQ^O*N_tI6uW9J@s4)$_eg))weA9UIg~<8%rqQ4IIgs=5O+&{;Am`(o z)_i=^Q1dX#oXv9@Iuh3i*9tkC=QI=~9wX#zp3_i}$XQ>fp&-l03tuMWe0uDh8 zooMb3&{ESrlAy%emd@LPUC5-XMmiKZyHZq5#ONooR4oB&s-5XAKx^T zkQmQh>U z7Or>#$Sg4nSNs;pr%Gnw2bTF%$*lSVv+57bsy{HR{=lsI1GDN6%&I>ytNy^O`UA7- z56r4RFsuH+toj49>JQASKQOEQz^wWMv+57bsy{HR{=lsI1GDN6%&I>ytLUCpbk8cf zXBFMEP@lEs_0g>Q1G9)_o*kbmnS~Zl8*>^Dd`{zm&w*R6;hbo5;D^XL(dOXx$AFv* zV-9X7z8*fDgXbRya#ZR$yy;BjTo`kB)0t(?BQS?Iomu8w7<0&Vr+?Ma+ z%^`pCo18~rPVXknfj1tPGiuG@+=-k~YYyj5g)xUW zj=3Msg)s+iS(AB{ITyy9#siSV@+RAyfl`QiOg?Y4-mPlJe*JD8w&GqK9O%I%)|Ll z0{Mo*Je1}4`G&$g^ktcED9pq8M82Ug59dDy!zV<(p)e1h5c!6}JYs~%Hx%X(BSgNT zFpn7Fe)xvMJTxWFX)FE>dLHq@?;Oxs^XcVz`!S9L*S}fFaY6TE90}st!gGY@2`>;bcJ?E79tU!4-u;T5{fM2X zP<{tuYQG|AKYAcs!*SjBV&kaQDO8M0$Hayv;Jby&vN< zuuNC)N4x)&v7okl0ls}4{$ptXa8lD2*E+|Vc zz@UQkY6 zP)=S@PF_$>UQkY6P)=S@PF_$>UVz_NH~MWsIe7s&nP;@9^~}i&Xdk}|JcK!L7vM3L zS5)S64vWYkj{seGvTG4NsP6+g0>+|7z*y7>7>gPKV^JeuENTRdMU8;5s1Yz0H3G(> zM!;Cq2pE`o7tbLqLc9Bc906kyT08*c2pEgtpU4p~7BvFKqDH`2M7w||6wxjaIReHa z+|Igj1dK(EfU&3%Fcvie#-c{RSVX(PZ*l~TMU8;52yfquGDpBzgtvJ{906ky-aZWE z2pEg-_Ah~#Vq}IzjexO;mV&k72pEgVGps*Hz*t0{A>Jh92pEgVGenMnu?Y3K6-U5W zgn~qlfUyV#i5vlA5egDH0>+|7z*y7>7>gPKV^JeuETY#mgHJgE#-c{RSVSAd^Wq2? zi)e$0906ldBVa7z`At8{906kyPk0>%PI|q1dK(rM?{W*v55AF$Pq9WH3G(> zM!;Cq2pEeR0b@}kVBjiT{BQ(}MZ_$*;s_XvXpgupN5EJ_Hh+;iwyEp)E z{2cf?;hDnM!}AB=jb8$p0}m(%9)M3CLirrwx%%dLDxa_N1u9>NxHzC3cmO{63Ciq0 z9Dq-VeD>)89P%viQq|!qIOhNy@@wF&s@p#ZKPUXW@C(9!6#kR&tGJ3h0L58<&WLdU ziW4~_#sMf!taecESEDI~b zs<0-U(D_aZ>%u7^pO`v;Tut`)+|&W(>H|=p>db4~1@X2dX6}%h2Zi^DpU3dbF`)LT-Nwm_ckVsqej{+`go~_mcYFOX_W43> zAHJl1_>%hJOUn66%K1ym`Af?AOUn66%K1yk`KsFR35C1kbRBIU#4` zT|$;17KOJXzLwBCb$yM$~&tOz+9?-H^Bk$>-4g32s&jQS-+HyJx9yc2KLEujUu z8@R0Uipuwh4UWxnhwk3oq5C#>pjCYmYfi*>?f~41d18v!?aZpD;sG}d$(GTkA z2X*v=I{HB!{h*G1P)9$gqaW1K59;U#5%s^q-gxwbI{HB!{h*G15Ph~su%1Uh2sU_J z9{o6LJX6SC+?~i>xa)y@brZns7pAG%2hLr-aiwqZ#d|q4K=GzaTc2bf!N9=ZBDUegkwF9YD`>JAq!@J30hK zSoWhYbO=3@L%<&Nd=4S=JP2GT+$7vA+#);$nf4I0!}C4R4(}F1JK~u_YIg|QjRMcc zUF$>8j(Dy zFfNhK^lQSeqyKOSEfmjvK$sN{3Ws!FIbmK{5D!I_@#X=x8pV4hhv0!nfMa4{T%VSN zWno2F71o3kI*UnRT{tD27Be$wp$?%{B1?0s|Gc(ZK>j&|{sr|~5_@+@_k+T_r2b*y z4~6%L+k3_8V|cIRF60f2@Q%DetiOfaI=u6|CopRB#a?vvSOLJJmT(k@~5}AvZ(O)7m z7cHahW38BrmeE5dG8ZkQ?ISW5Eh`r-D;MFJXsu^1T1GoaWG-4pub9YOw2WTy3Xr*I z8NFg6bI~%G|2dGkXc<0anYm~g{b91fT(pdS?~TTaa?y%%(TZ}>igMA4a?y%%(TZ}> zigMA4a?y%%(F&A$5PM)QT0u{S$Xv9dT(qKGw4z+JqFl5h?N*eFR+NiYl#5oBi&miB zBDQ5NT7h;fGZ(EW7p*84tw6iOSi@YjqFl71T(qKGw4z+JqFl71T(qKGv;sAk@O|c@ z6{tyME?R+_MCPIu<)Rhkq80RWcrMIEE9mDCnTuB7d?Itv3eJyoZR-iu1%tb58MJvihE6PQ9@?D=Y7p=epMCPIuc!0=U zv;q(CESQT{-~l3Y(F#03mY9oHl#5oBi*PqfTQL`{C>O0L7pF5I z$Xv97>!WW0nTu9%edI6>D;FJBE;_7SbXd9QuyWC1_~8kBhq>sma?xSsqQlBXhn0&C zD;FJBE;_7SbXd9QuyWC1<)Xt-g!^GGIt)dK%teQliw-Ln9ab(ntXyz%$Uty9XX7o+&(6c)sv9 zeP>AJoG>pe2#dmTVM$mPR)keyO*k)H)ZPx^3K1Lw?*+q;19`vnUPRw-fhWL$_oANj zz>}cGz2NhH;47f=y{I#;V9{6nF_2>z-isJ{7_H6G3hs1_(ziP6mPY>vbOWOY-v}^aG{{IS>^uS|};fTbK3O^>i zN%(Q$&B9yo{1xX4a{~Ehp9w#D`(+aK*8wm`%Tll*!+h1U^o@NC~{i#{jn3`w4w~-M7}?yy3IQd~Rdsv9V*%Kla1N){p(&rgfY4 z9@p6XrQ>hja^cHvJ)!62A3kaGNnboUbMiBt~m`FFoVZw_p0-?46h0eECJ&zOn7lwnyJ*eP7S}&VJv{E5CN-H?I8NmG^IN-=5fh z`u6v4zjgcQRf(%MUUkM*@4xEStG;^G#8uB;{ei2$boJcT5AO8t% z9J*o04PUz9;SZ%g^yLo+KXU6w9{p(jW52lRw2zP7{KcDxZ~oTJ%Qru8^B->s-m>nN zSKV^aEjw=g-rs)V6CeG%PkgfHlQ)0z;lHnZ%K53YK6TrtPx#D^|M9iYHa_S6+ykE< z{l^_&yzoobFP;C-&VQcxiuEhc-u9*c=c2DZ`Y*3CEQVq681KjZxYrx){0)oKFjg7u zVZ5cv-@7a~wALH=9=^`606Xwov%Csh?`oCXj5izCwaV?duQ=N(ccA>eR@sX3k6LA$ z@owXRR@rWxYI%LD>@a+mTUuqO@e#`xT4k3JSQToO-6;39${ypnRVTK}UL(W)Kt+K^%wjb9juQI&tuV|Iqj4!sozEy5F679$v+O`Ab-?qwDBhe9P zm2F0&sHxebXvEy%1+~t){nQ!E~Cfxu~ylQGRAq+{ymmI+7?=6uW^E7 z{nJt@-KR)x`4`$BY`raM8GH<;4nyou_Y~8(mQ|9{Xuiv!& z`Cl*Fb#>;AS8U(8EAtk7y7S2AS8dz9a}z$>lzGjL9U1L)PiFVFJ==C)x9##xuig6I z?K{ukcEz>WqxOGv_b=JIcHY{zK0LDPQ!?63=JZ`VEKGgQJ);!`s77l%WU71*_zqAd+X)fuHL%)s?4tU{qLUf{~lp~vi1M6Cja?{|BX`r zsZcLb<0UIza-7W@|CGSYx|eKqL|v$9dtEkV~sC*!8}>*Kggujr#4_e%ZF2d$wJkxpwE}+jeL6Ub!uE!5h!Y zoO8{#oy{+w)%?Q7%u!Pue`Ig1jpc*uP!-sHTSoQRnmO||=Vi9;JtcGH-o4kHa@=uy zF5A8Rn!S5A?Lmci?Y`o;bIv^Lzy9P!E;C+>bajpKL1VYE-MGTI(%5TcjCICk#(MnR zf)|dD$G?p6UVI~CoNH`FX$Q8*7;iML#&%or+YTVN-h{Q+>)$5)_R>!;!**9|%Pa8t zPVMC_t!;O{Wc#a(ZP@Eh?6tWa_x>6kE%So9?!nsK_~ssc`#Rv|*y6RSCy#MH)?8s+ z+p6Qy`u}IO|MPW!Blgv-`HSm)bjv@j^(m;|(b{B;({a{2P)DwBvb*_3pTD@i7wN3_ z;F!B`E*U7X35sksPJF>O$NtGVzVK)--dhIyAzxeZ|6Z`R74_H#MX26YShve~AMhwg z|2H)Lzj^fk{@DNL+bbe-+n%{u_V(d^Y1^_0Ktw z+3C+8>qdC}PiuM_qL*&pjtD%GRo3H(9(3}q$J)Kfei=p63$sbaI8)Kbym&UYz8W#} z!kFHq?JvZ(&FDJ%?F$r9d$Dgu7`JMEV+Vd-hTnH8Yh8}@*P_f=+>J78!S7yx40{%S zo`WpQ@4m1eXT4|-gSR9c*cq zUX19k8|W#vqX%w9&)bgs2Tok&xpCrN!-u~O2QbD=$T0DwQUrg&j2UrU{Uvc{HjQzW zx^ODpMvu{J^x+=a8jKgR4$a;MjBm2hI2I>zoSMHa#>p+U^E%kz zLE{6)4QTxT#`utNBi`@%y73X?!?=F_nDMajDBfat&SDtf$5;{L#xIOt;wkz24U8OW zaTs?SKgHGh5AY^@+4zQmx4-Z%X%$ag+=QpN{+1&!;n~G+TAUV_#clCeycVCuZwXj} zmXO7?ge?(E)DpAAEeT7~_>?7ONn1KCU6zcc+tOp{we(q5Th>_CTGmpZri=>^498C=;xM~X*XLopQPR3=LuYopC`6{zP$DG$oEce{jTk|Y(BZQ-O0x{ z*PpDzW4#WKpRN6!+}hvCt^J+c+TY2o{hj=Z_SapzdsqAEoAzAR{#wErgx3+yB)p#R z2ErQ&Zz8;z@EXEf2xk+{0d%}Z+nvkb&m){qxPWjW;jM&=2yY|2o$wCA#ej};wDDOe z8ZZQ+rH<>%He=N>mO27)6${@)fyrStA}xprwIB0MMCe-(F9%8V=*;Urv^{o49bs-aEPL>3PU|QB0NVQ9 zsh^J_De&_Qf9|a#ESo<+()y|O`1}qe4u0=9t)J&0iSYZc=1;7@z4i0Qt)E@3&p*=o z`D4_C-+Qk0a~FSN`;WAKViJ4&jvEFZ3zjVwxYp@p@yHTAQV6Cj2#z%ti+2mY=GfxI zZx)x+8-CH(@o~&z@vQb)EPZ`Guf^kbx-AxK+-k9Oa#v~Y&Yc9bv!un1usX6h*I?O# z#j?f8g$Lo%*ZlDkTpRRYL6qWq_Bf)}f|&cSmUW0(outLGuG?~KDq}%#W6NWE5bPFT z3gM1ZvbarT5H1_Qi{If|wQ5znwZm>*)z;SDzN&pyhqbMvwcwME_I8`Kqr=wGVYRMW zg@V=Ef#30)13%jEucHlL65{Kt?A)}iy{)6&iq&na+S<7jY}?+>{Q}zC+S)pBv{gWx zz1^xsn{}Wnt8f4=?N%EW?5kai4M*tE=luDirG1st&I;gQ?KrN!)s9nXZ?n2^N;n#p zcAQ;vvGP>fQ6(H7^}??@oetEX-QI3E-EF9_t;I(N`QWj6(j=hC2ez_y*lcZW;LT>Y z+PNF66U>kgoF>1`b6nNY=HSU-HNKCk@ubP3)wZgm-PVTFwBa-ChkWpq9W6eznUyuR z+3Z}}?c@XdYM%R1zIYDLFFNun7o@@WASU@hHBi7Ax7pk;;)B$*WB)umogAu#DyX7X zoK#1Lqup?MsG;5Juz^8v+p)@eL^B)tfXb{HD6rXi9u7PBKt1g?7Z4xw?8zM&2OnUG zWvs>~JazJcqhjCob{yP}dh(>(zz5FU37WY$Wea@LCN}K$4*kTwntV7!1O3zDLf>cE z*0IX%WCg$n1i%XMK{0F|@&XP>4vSn+e_4d;;w*SN*wzNSTdmFx!|i3A?N+Dwz`3om zLNh2s>S$@OhWa{eR=We|VRhOa_ywEW-B?XN0N|Jf9HGs{vjZQ^1E4B6eH_;gJ{;r& zJ4dC!2R^bn9Iog2;CAH0VRvxp5Mo{P{GH;1pQBnw7uK?)&ErA^Py-wTI)D!p;DC0! z7ewG_FXjU$enefIiQU29Kn#U+;l`>T$G|DO?C=M)wzkl~T(&=p zs%35Sc~Ak=pv4Cg0OJRI1ehws0*v2UoKC3Iay!lfzvA3*u5O^mYWRYzv&-%gA4qv^ zc9&w8zQqZGc^9e-3Y@O?c5LQyqw)^B%jp9mE0Yw4q4==1AK`<9+sOx9g9 zz&z`4Adakdm&*f>aPf!_FxBpIxw+WfWCe$4^5K?5?FfsUm0I)K? zgs4FvIfF`_bOlnH7HfwKr$V zYg2SMy$TQV0m7Sn5Lpc^o}+y509>>lwY0Sbyr_T!fx~=lcQ*Mz*%eYpfutO5Gg1Gh z+v!rc-3?M`cPiqu837Y@K(u(p2fW{gn8p_ThgHltO+FkhWNSo;+vD^&oesAv07Q~- zAPndwtDTIu`*>nZ*Wd#rp>@)6T?jR|73M_303YxgV%q6;`w%l+w3$PExY_0M*gWI| zhiLNQl|=j;730!G7VPaoA50HEKs=lWK9Id&*$$V<{t^xcyC4@d7m|F$?NHU_anOb6 zX#)K=BN$4x6mDe*9N_~MaHFmsE6j|V0MYG`>OA3TE7 zb%Yj|y*=c2!DdZ9P;K%-J6YWk#tm9iv>z=#Y*y|Rj*#1(aJz?gXZT}>0lN{3QbUi^ z?0UkQPuY5W{@i5v1CPG8z!3=|BUE zYyoc})NC-P4}74Z_aJEOZl5pYU|4uOL8S}&!{_sJarj9H_SNJgAc^RYX1c`(Em}Oz z_DBdh-tBDi!9YOZBac|UakL{%SC9`jRd$+Fb`NCIwL)gg0X75HG|=(PC~KpL5eF5;{4*7$gpx5IL_#()7Xhhr|8~o>iW0`L| zOsb784x9vwwfJzuTTW-dj$jSg$%mJGI6VG<+2X@g`XnC#e~^naNLH|~BYg1m$w#yK z@t_J^P)lb=Jd6r>T;#)slO-PrFPF`qVn<7^U|*06+K>SGaCv-;TJRBYH^U!7y24H) zmZqlzZqs*!4^KcI_PTwr6hZ+Zg00XL1g%!DI}`|dgI=#E;EMv$i$NEHULr9N&l)Bl z$iiTZe4sZ+N#QLQsPK{xUiWx?=q@?DfneCBJmCv7C_UmMAU<5;1BcLQyF;?Y3;7U% zZq(A%kqD#BBOgd;AP9W0aReV}^hV$bxWb7JESqkJog^#zp)StCA8dxdhv6S_8Sze3 z!Ws00eQ*>k@9OXb9cuDC;=|)ai1>W4L?8q{JZ3QD4f%YYpg)Ed0DO47pakg^NIoKT zzxW73Jn{h@U<9kn6?7n%1=UXjKj31^a69VIq2wl(96M zW3Nwqc-Y)^B%?mq%i#0zUk1YbuI14}2g1&}{)9Xm!yb*n?f{k;@h66lg)4ic>*@ z!01QX@{NfLX0>0@E|Z=%m@4;KFpY#X(AAa2DlyhFhgN3 z?l4)wI{L!niMVp5rb;(Bt{S0^lu4wkTkyacb zlhN0v_;|`OLFfSAw zfgrBaUH))5;ZgPs#)I6Be1w~Pcp`L(KcG1BdZX&Kl8&@P&yd!<097=Ks(_L_&_50NKkLIN(@Nxfu!K| zg-n~*6LAKRr+A+LK}SbP4vQu<*tdCgcN5aKXW`kPojl zlMK2+oC|!Q8y7@_iC&1u>oEI}N1Co6AMDY(oZ$$vAzXxP==UQVMqZE(Qy!yhHJT%L z#GeQu1ADx5qdjWqqYPSdd@klHf3k3ravl9qD{6U8ge2^HN zxh=`c;*tP-An4!^@Zs|#*1(6W#RrobyRd;sH0fp9426;*Zbv?%kr)?mjI0EMO&j>) z-Xs1w!iNmyM=ia!?iBh&0iO#A!2$7cb&oCv_z17Yl>$gW}j4CvTy(a3Delghd&UGAkoF#$n7!lVTQ>^ zC>BfmM2DGvo{!iOKIoEAsA&U#LcRDG@L|eO0o2lG>+M9JDCl=1AvkfexPC*Ii+rp@ zKa^MMxL^Pu?D~U`SWwxJd<2mVV}S@_59tut=`(uPqk%^2k`9v(Kl}kc&?N#NVeo;} z;ERXNa6A-@#vKkbkcuTjiLe=rN4n8NaDfr<5rW@fDmcO3N%w<~Ao?dwKJ4fsBi8&! z_`szZk{bB%gktedAJb+yoDOq4b`j#S1Q%a|F2Op+iQk`mo{wgCEd(*J1k6C#XY1=S z5q3>Ju&Tv}-x*yGBFG22U*dz;sIfTsXlBD8RE@@w4v+BB8_|&|UGyL!A+{(7piqNO*8c;3E>Y*^wIj3Gk6HL$Rd85e}x~scQ?6KDf)pGJH{$w$HiJ`%i-1U_&h!DA*8nHC>i>Tb{< ziFk^OKSh_A;T9ih@xlCpx^W51P{AR85q1HO-H-lnlMi$z1FqOHxGG1-4EH6` z1vtV-0RPzv3^U&=#R&N9!zC@@iiWbQqu>0*M`9O$-q6jfx$mdT+ z(GG+|@f7$7btcG1#7xHeB4P3o3cKLHFo}T^92smG79UB39QZ(^5ey;L0{)~2ZCz4) zM55rs8%`#>15BIIXeP?2As@*^ix0X4>tusqXMp|@AL_W8kc10r8L+SGj`%>F2MH40 z{0RJk_S7G6#WyzjK$JB3;5B<9X*OF2@L{5LNHQI=c|ZjA_>DE2&|&c<&5Za6l8+>G z42L73C^{VA11S{kK-f&AoX$w7E18a@qY*O|TOEyr-C!i*79SpEY)3cG3zv*05)|^S z!xdm}1FRC=udgk_NT;0RD48Isoo%)kyxxJ#w^n0qmxUZv&o0@N+{H& zt33Jx&N#}48AZ!y-_RQ+A71(+Y({Yx487Dq(49CAm$K-n;_93CFwiAIvy)7PpKl$) zXdTifn}=AW8|knwV65AW4xB#~?hzj$++q%=y*Q-^juf>!zz0%BES`>plbzxt)fMdm zAL+!}STy1RBheNg?7s#by*w|p(qSYhllSq&M?C2W2GZUr+A-XBbtB2+zNasmPWJ|x zHskT$IJYAo=~Ne&U>98yjkfs6JkJN~h6Po?0zTqF`!Rj!Ge<&RdoYO0z!+`})mZAgbQlQ=NyXtt zqhW>-YoS0V`RMeTNNll0laJ26=lS4v1I);U5cI&E_`K8&Nk2d)T$Dp-i z#^W zt_d0&w%`tFpfl2&KnooVIf9Nzr!Rtf#KMUfF1*44q)@br(MYPx<%)%SIy13MJRa#x zu8+r}-iS9GgGG>Qyvo?l)jTiMA`}CDcuu#Nsh!i*S#wdc_C77>mW# zpO3_$wPVxTIMR^#z-3^f#fRxhpWsDJ#0T$NqsuBjqG&D6I9i8jv@4O$sChthiFCLw zWNbVU9k^gubafK`2${I$9_{i+QIB{e8Fx5?kzgp3Oe8b0XlFP1=3M1o&|J|MDI@6ozO(tU9>5a)m+!ymjzJ^Zbv@4Gre5QUb-ZaP@auM`ostGOY`z3 zjw)b@CZZ|Rxp_UVA>v`b6MV#?N!&C=uN^mfI$w@EFXRK4Z@7VmE-P*$WxB~nIFUy5 z$1joc48POE@2t`9?cax8<9=AK$QnoH=4tU(`dTO6%KX#(HH9GeR*#(O+FIc zJ?q0wKGum3v^?%V;UmE`5s9o0^YqCFoWZ5VM-n|F=ke>4;3MKkgF!xUKMeg(Gwkg; z34icv-U&8w1NjIa@pw9l))IWgyHi~~Y97*wHSuULb8db<0#g!>pZNkpcWH80?U z-%OwiSYoJU*tumxGL%e20^q|NkEOr|dhKS!n>iVL;7=^b8m8`X@jh2~PaLgfgnY!~ zXf1nVY%bA#K=W`+*w}muI{2ZU__{QDEaD?UK9Dk==cBhX-PxOrXZqakRBUa}>g4Kl zD$(0@TsoQX#}Na*XcD=`k2cg9ac#hsN!)UZBVnWcad{(*)6R@5V)h1-X|or9r||hw zoi3jvW)*1mub9w7-yu*6Zzi1UPvX)~1sACZVR5eFYGT*8KF2o!bh?%m`EaJ#5>bXKKi;k zyZTaz9`KQlukT%x1|P}3%<-M#BLO~A$Tfj@5|QEF$b5iXPKkIQ8Y%FBPDLz^+!GD= z1yY@WIMP~Y7x)OJ`ua9T)cfi>ri6^Y=sNhkQgg$?-Vc@_A;pWu*1Blx=p@2G_Wy?x1KS3H`|fRAKfSNG~fH*yiW z56O6J6P`e~@Bw!{^2}$JgB|x9&)T2E%E#7%q16&7u2JgObO!y5LaqbyB)xQC_5%@ITg*gVe2_w!ujc59an=#_t zQ+OSbh}Re~s>91L?%b1jPlofco``Yhp2TDPCtx&;lQ2fd6L@ci_zH|H@dVxrI0@rU zyb>czJdXEhUJ3jw;i<-}Fvi-eg{NUuy2tQpz^j3$8>eARq1PI(0iGdz9mawA4c@mo z10$-v9%E=ciuZ1aZ^TF%kK+9sj+Xgmj0W=v-otql@GZi#F)rf6c;VnJz;lJ?VU(DM z@qP}+NW1`J#XN-fbT~%hTQOG5LwH~30*plQHjEYXAl}<~EASl{E9ODGzwu<9!&T<0|6{;11(T;MKpT%d>&&1{>b=(@E4-^JJ|cL+Il-@oFWux|qo8Q;bD zkarpX3S1Vh7~ezrFz`Egx9bkz-59;+J9wMxPT&tQhR?S#W(DycjDq-Wjmq+E1LNOd zbf6y_-v|E0xEuIW;|IW>0S_2IH+}^C1xEWhfcM1i1!8m=jPdd-<38X6#!rC1Hhv0x z(D)ff%Xvunu<>)0A2EIjeAKxAx&3%G=U2eTgpV5!p!|gKYm8d+r122&DdS<_)52$r zM=(0pZ;eNR&lFfPVyj3$N}x1N=))|4UB) 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 zcmcG%349dA);C;L-IE0ZWF>?pWU{h@2_b?5f~+FSq9C9mOGHEnh>D`@O$6(5HKPYB^PPwmNmH zMo1w)!AnFd0m-#npsb5&5Uq?fW;%i^BKq#^6Qtl*k77j5yeSvFr*U1U@*6~~xH6!ps zh!4*`&i60>5qVGPaD7|k{P0eA5h)bE<~-q@^lhSR3zvv+Epz3d$Og{c_*#rsvB+B~L&Xoh`lO_Y&LX8mx&Ep9%bf5| z@&mL!Uu07%ITzO@T)zlQT@?A@_lbP7zQ}hi!o5V~%UL2{-RxXOGm&p>)j6aA-sY#y zT}{UL_&_6XA?60REaQc(_k;-Qp!ZT=RC9dYU>fowJb%rjc6QUJdgn#IgpMfW4VO)rw&^Oc; z*OAiWL>oj)Jf1(GeHe2ZN9K!O=*!!1-2|F@9qHb|bpZLtqpUwf4bb;=6Ewi%jy@0N zL%+Z1>LK#OCZP@==Z#;?{1;Gxh);hcUMr>gQ&9*<3YF*O@0sDUc~bPl=n~E zyE$!OJ_^_Tni{sLWvzGprpULan?`?B=lGtl_oh|h@DnO3PB z>T@bTbSIidJ>}(1fIn;mdLj$mAJf_GQ&UKqNUx3_d`=$Yt-_^IlhWDoZR-%E9< zPpjU8eKtLK7iE11`s1zyRWbJOGe-AYI1K!2rx)<+H z;-2J;w`qf}7l9A@fd-bMexj94;K^MW|IdIYUHA^XB3v7SpGhas`%iI!Mhs|S;;FE4 zc;5$nHx}==i|JvbKG*dKB0DrTal2!zoRuzqk*0Q_bVTCusyGytrGx+mB zVMQLmd+6K9pK-qp_b>2$iFnu;Bpyb;KWq*{*$bh+r;1n2^Pu%~;By@B&*K^^hW_d5 zfc&_^T%ri(gc7i0@E0!(e)=4?%tm~U#yi=hEXslzxNjYkcdJM%JDOS8rTDis!{*r2U)tNgNkT#0%nQaYFnePKtkvrQ$_# zN?770@v?YDEEB(qSH)@ZoA@2Idc}XlHL*^t7k=@zcuagMwu>ENr#LTm0i!+Qg19Iy ziM`^oxFW6!(|}zhCc|!WiFRU!Y#`gn>ttuyOZJyf$|b6S+M_;G|1vU-8OD5Lf$@T| z)L3P_ZMtpkxZ72Wr}pmRGB8zrAvm%nwUME7e9z2Qc4B7>Md)@+TsndTHYZC z%0co@Sw}`oLz;5193qFxyTs?>3pq^QD`RA=94<%5k#dyGm-orh@_rd71r^E~L-}03F6@2>+B*%y1E%CP4 zAZCmA#WUdNf1nQ#>z9iAS3eR#L<0pYX5-wxj!ekP)BM0Ui;h#3(}BGyJ6 zh&UEmBQi6xSLC?JC6Q|)zluCvBcevb8lD<=*O*dcag7Z%w%0gOQ`M|p(^GR|&1p5~ z)m&P$u;$vDn`-W?`Blv$HBUt~jA|0qHmY+}pQyo6`B4+2rbW$*S{hXtwKi%~)Xu1{ zqK-tJin>&*cC8k*?x?k-)`42bYw6l;YLBVCy7rf~zpwp!o%lL^>Wr&n)!A6*cpV+x zJ9=jHn&{2ZpGOzR)Q{;9GXVdF#f*)a9J4y+WXz>l6xaqq=#j@un~Ans_~>9{NLD!z7n{rJrI?D$Uc{o)Jar^UY< zzb5{J_^t5=;{yrp5^hSkEn!^3(uCI&wj_L+aJp`M-EMVf)ZJP4Slw%hW@2<=+r%-6 zvlEvk?oT|OsOzQI>s4=Zy+!qQ*89HRl_WDMJ*ivLxg=dbwth zjG~OMGR|biXLimUnK?FddFIZ{gPGT|L{{glaanV+7H4hD+Mjj0iE5JGq+OGtO-44E z++<0UolTB6DQ;S?X`7~fnvQF_xaoUM4>l9cQk%7E)~;EnW`mlIY&Nmk;%4ic?QHgY z^BT=NH}BK@j^=kaAJ_bm=F^(bX}-4khUQzEf7Sfk=Es^Bw@@wOTQqEOeT&X5dbOC+ zVrGjqEk0N97-fB^+ZLN;C zj%c0TdQj_0trxZ4+WKf4vrTrJPHlR(8PsNEn}Rm4w>flO*mW(g8-3l%>rQ9a&mNX- zWgpKmbL!`G$Qhk8C#NXqP|oSLDQ)|-UEKCqZg%dB+%I!ax2xT*Gc* zA}7Wjli`kWXPY9BVr&a^c0neknA?!fg8u01vYd1>CM_l|AuU(-_4#}*tK^88UXtd+ zB&A^E=%7kKctJ(mX?G|PTLrz8}2w6=gxEUm4i>X!rgqO z#kmb5ZK#|&G;no@o{}t=4AB#kny$2JhW|ljr2l~wLpJf z(scJHt`_tx+sSws-y*;CimREc5dBtD#EAwXO$c|I%n?*>T53Xgv>Ro+Q>uQJ*X=X@ z*jKV;>EgvpXG2}Z>NEPZky7a+I`h#N7B5!P)B$Y={N>Ly4yCqPg0|HcsY1j>yR(Ch z%W>!CB<3WfB~Zm}^DReo`u6TcBRu*B{PRF5?ZQ78DqLoTJh3s+Mj8Rx=zq>*^i_LMPi+*C6P}kCo*14L zo|TuCmneHJPyV{iiPxTZ=%Hz=PPX}{%Q|)63(bq}-uLB@cbi%FGc8!g0AmhDNyr%R zL4q4J?#`8qE!jdJwDdtWIQSr2SV*5#8V0+|NA`J!krpS%SU$_ggbliq+tpw-n7)$< z?p!rkN2$RUILM(n*(jKgIH(ag$VcUY7C&mfVTSaq+x%C;7$uIdJRSC~3%H?><*8BFW)LzDql&xuLP&4?+s zWMA{=A^F9_`FqS1%xHWcjqh^>NHR4%w_Og=y*t5UG|+30?AUQc)v|Nd7nVwsU1jZp z!hC(VUZkT)G!UH|SCPLVsEzW)ht~y(r4k2$&eGhuZV)^Q&ELCM8C$m4_FnwS-T}Qy zb}!W%K?wOC{rK-g2AjBhIHsLna8CN$CN{)16j1m*lj9+|qw7PM- zy-l_DEnO<_u#B~VJ7hqceQ4T)ywgjsm^sLs0K71$2Dd4M7q#+LW4PU^-lMZrL;I_( zgwuGv;wK0-OZTX&N9(qPOgm{dVV=5TE^&P-qC{QdDVb;ni%V(8gOVB^mXNQO4A<7n zPx+Lxf3nZ7gON8v7af}2P-UtXa>A4A_1C$&lTNW|24I+(aw#Lzw3oquqxJSLC5 z|DAo!zGk%6U+bS_3)x%0qkS-1-~Msr11DsGUUK4rkw5C&j811xojPL=mUROGeVXbc z8L}VkeZ^@ntlO;gxUe)9S7F@V?7Vil<`TPLxEzZH+gdeNb=K*Z^lNeu8f-jZAJl() za=mPQqx@1Hv-C!NkQyA+CGbbE&XM4PGF@WU_xS>^ktT8K50f8ON=Kabp%0t}cLt?& zGzrrmJf5fEJElI&l?jnDA>Wu|C#iqS?G~6=|3iNQIz^jg3uAyf6RH~=4h}U2*s zlTC^OR{{?Kv1l%aLqLn*yS!ZWkStp9sQ%^kqN3O3!Tf!8GrP9(29_Dijg@-f`4@cp zS#{g$^INw)Ej!At@#EixK-cT-MT1pCYI{Ii#>>W>z%=`|OT*;pqN35?Q@=tkx!wY8 z)_`1qT#{)9RJ8nVo4R+O8oAG>vvQyfFT1SbvFJQCkNczu{7QPY2I!P*3R0&g@XdlG zaHr*_L-V;~iquH?vc4i4>Mk{<(C_q<%TDMqPzN7gdLUPy(?cw2+Eeq+?=1<*7xOs! zCI-Fi5TT>dP;7RddE9rHM)0uDx5NI2x_O5$+oOI}pMrPoZ)|T5^eu35O<^9Zg%Z$% zO=V0tp%(2{A3&~M)bIOLgxYO)u+-hEc8O)VEct0}F*)XO@7}=GvetFJ zd!q09n<_M~o;+Drr|SU+&m7WWxIlz4MLy$JFw2K%(0nzyc&wUlPi7p+Q!oqZNlziA zoCUm!$2vG++@;1NtU`%C$^`{VtsBS|E-MhG^DP->6cf!-zuwDb)No31M`GTbE9EGk z`IbFREzza6PxW&Ow(qfPsr3^TRUhmlvMC|nB=@KsrG5|G1%ndqy7GPun~M+dW}!`y zl9~hw8B_F|s-=vd-qa940pz&Te5ZJ<`C`d~bU9_arXwHvANfe7QzoDB;5uL6MWml; z&P4k8C6m#HDWzA!B3*x_UvE$~6&wZj? zR;0SgjrKd4a+B5?Ezz^|y>~C~BI}(gF{p06Fj#kNRo(823zsRfa`n2wsm1#9Dkv0< z(-+3c2SR=762K$63=i~HC6;?g{&q>X4{_T&`q#PkF!j{bF2%cn5SKxEW)1oSYs7iE zb-^RxT4IzS$HlwJE^wz7aZK76=XKQ1FS$Hco1;@P*Hct2B{QnhMD)=z&PI92Dbv%U-q5Ub#a>NoZ4|?~-QbAxaBe!aJZ2 z&{kYd9E4jOXYyP{I0$j(Bt&fKaeNgJVFCo?_C8+Pq6)&2SsqV7hq`FGSV&#IY89@y&WuTs;Z_T$P*+3+V z(x6nXu0DI#eCsSyIy&|{*a7jP5qheMUQEk^I*>sfn3*q&o_#i?1IKh;0i`F4NasDv zN^jKPN$G92TZ|dws5s2g*d8%EqwWaI&_o6qtYjD(IWZw)QTDxSwj8E+EH3c*9-AjG z*q4ug{EtTRdD*|68lVSc>j?X3bD)a$kv*^$xK^vDjJ2~Z`zzJPnmxNvzaYmK&Q4BN zZuv*Dm8@6jN0Xhl!VVAOA~PMn%S#MnO_iM(lVjXDak1VZJ1(B+`$V78&Ez0fd+DuBtR^Z+Nj;e6vY;olEz|Wm%|eJ3SsbJ`B0`L@!Y_s|$C(ZhD+PZa=uBD#D>B61a zVRU#_yWC*fS6`h@sRQlw_QD6AIb(e8MigRTmY>4Ouuzq?+J_3d6d%eQm+6K4H6a~3bw5802Z7k`^)N2n!d0J%Qy zPo^8fy;6DBboZ)Yhnn^0&aK>^`9hj~kgxiAY9o0AY~Njamrq`T2#M0QE%}6eST8im z{IV}mTiFISZ)94j$ctGaPJ|ZkJASV0sXtoqfbZ)cpy#NE6wx^vRj)^)+*6k!8R6f+bOLFpt?7cz_>3)g&KDchV#w#%%m# z$|s*{%XjLv#YE(D=gMc)3-;L4PpcBn3t)i%NshC*CDZo80n~i29tf!x_{_*FImzkL zp!<#?T~*zg_R(e;^Oj71d#670j{c`U?sc*`S&f*$S!74MpgXbdR==w5l&|Z@4r2kP z(P2GB&O5As);}MHp;t>kC8vW(F3RcpDJQ?4W-8=|)#>O?1+L6X`b;*JIXiWqM^5!z z-w!o^X|yfbqmTD|>Q)kos5c~^F_!QL1eNF%qpiJA-5dB)Jz>9M*0=141q;+QCp~oN zL*PAVN*NXt9bPvkIx#IXCORz_)3H4D(Ch;TX8Q=Zto8bUF1+OyU8oPNUoTt9;TG0? zTCI2Lg)R>IPaPia3m(39h7>UCSaqXQM;yurd7+}Tb|@beW&KvQ3ah+^TW)cxK)d8J z%xhcCat@@O!pL`Th05_mA^?qNnd%7W%GRu>7`MZ`Jo*v4TnXRDHh- zYxC8;Uj!dvb?)B!kee8UIDU#_9p81I&@x`a$_3ZdO#& zvVM)cQGQo$n^?)WR_s@_!wlzk_X@WAmJnW*-gm`1W)R;>?{^^*p}O~ru+~ZMXF~49 zarx&_z7h-JSj78MOgiPl3h%o@KvH_hM}@Tn^v8LamrCq<$4QUes$qrnixxWRS;z7F z{&-=aRy&9fbQr%M!0#8zf@yMp*veZPqM*^x2E&yX>gt2lFQa-?ED08ZC)d=O64V1LYEU!w))#~*a4 z@w{4qJgm=StE^a@th5$k$_lFwOo!;yjmQfRQ2E*l@j2K#9Bwkurs}Y6+=vk6jTpC1 zH!}}z-xgLkXbf9*!?x{cDbLC;xV+M%<~^=L0WOBuv8^J(N)9e*BhiAC-5%C|Bffn5|0| z547gyKYO3qJZ5Ck9Su{6)u|ug+un$}(?m<25r;Ip<9`jUtdMpOdcD;RBrTg`R${ID zxMW9xe);joogELru>)`w^J>bwFg z4mZtPv6$N~wTd;?(mXDX1#env{$c#7ZvZg10`6O=6XF3G0~y*B1_G>EI7&W(E%}ku zR(>Ipd?~ldEkpl^4LkD()DH3yt=#E)L8LhLd`e7$nGoMtlH)!tmm1kxLeginCHujW zU&;6MSNGiG(~~!D+BJCOn=<8!K4*L)59((I-t)J+($jivw>%MxJx}@sOd?4FC-!f@fZ|%Mt&h>}%^Gd#}2kH@M64eJ^&M24T%W(_g zIObDgvZxMRWm64W>SJ;&RTI<#d!9Z00rk83$!=`Nn~~Gs)Wc=ro71Piq(73~Uz*-e zJ*ghEpEcD!JI79wLvzrng*hWT=#O+^2dWo#tGeu3&%6SQKiL1dXl(=bSYcHxM!k6O zPOKsoT)Qy#wzJ(Yx~!h|8a1@1eXm+&`_*;0H@1JG3*|vSR+taxgr~`fvuEL6BI614 zX#QSdjTOw4hD$w_?hcOtK4f4dx(%!;Bw%ILxgw>}qJz%e4ux$_3(Py9 zp0c+emoL~y>`VFzR;t)N;J7o*L-uUc$!ia;%dSG$g|%qy!Lg`8D>PZo%7fK{HI?u* zGFV{l=H-~TJoL7GdHm$bA1EP8(6_0Jaa=iiJ-NvrJz6A-6~QsvJDm>P-2{oc(rioekRC zr17X5vJa7;{&5+Qd{~d#hwz(;hjm}sUeAMYnCElWh9#zwum&HtyIB(~{i(bWH=soP zf;k1*)iLQyt^4V=C~CPr!NxVo)A zXD2x2rH7pP`QP;Iu&CdlLH$m*%ItRcZkaV;>e%7en=Mz>$R1R`PrbMG^7QoLK|`BC zQaj~3ejfByxtyj2gS6C7SFBvQ;-2E-;%mmit(!M18K#RhbQFy#=8n73o(PO-YqTlk zM9Co6fDxJ~m90V0M6jX{LDhB~E8T-$gWG@niM%ak{+A}>r(O)Y7v6dCxjk6u;8lhA zc{1Lvy|mmP0~HYRHc&q^Ugi+sRgu<6E}{Cipf!jmht>>-)(oTjXua#Yhi@D#Z^)ed zfR0)^CVkffk4bsyje=&ojeD~6LhG*ajpP$E?|Aj8bM~cHt>-@_g{pP^_0)HIj&T)r z@%jyEs^AhAP1<=iEjv%WP3t$dEzjTX(^vH_*?a2&V}#FFGB6ts&bhLl9zY8?Ja@&K zYH(ePyp{&av%r?1n{)(8{EHX1z}srR@g35^2@wZ^%ys7*k6N}HUYChv-oWQJ)A+@; zEa)vst%JqvG($Oymf3l6X?Zz$vEVY}m&Og=ZC>v{@`2Si>+LD2^lA0hvomRzTmHe12Rosl0qhB(Csj*6 zrk};YKIYt!KO6ZMhVti8UKz(Q@VQi411t?NFEQx+EJ_I6#Wbs^IW9 ze+~SxBUu@?oxH=STM}VsTdF;TwLeVlvzF=&mVWhlNC&3b@D3Q$aLkC)ofRh1IMQJy zuoIL|B59)vPB?@VutUVi33AZ*srm@qUGR@Id}1=f6w7^cdPmS%qMw#Wz(0MyR#B?f zo;?*fhvtCW%|7LE2WFo@z4EvNxjn3N`FCNRi_?SOVLTDD1AT;6z`{TTM;xMd;?zZo zXuv<%g%x6U{`<6`W5k7o)|Y7Ic2-$wLWzrlsUvxC<7)QWsY2ZeL zijWnF&=E2y5k5jQXoQf!3`&Imgv9l?kBpx_Ztk@EW)@8D&~0YH%yHAFJ@&}>N7}z} z8Gq{1l!;Tjb(=bI%I!;^yJyP8Cp?}fCQiA3*0WDvxpIlyj5et@%sT=r4&b@`s*HwY z)HlMC+DYedSQ&2xS&HSv9JcAn!&SB_>DcwUuNUmvE+=HW~no5=@Z>7mcy{O ztD=259e=780P6YcSQq#RO2gFmL0;xa7^a=?gS5jDF~LRpaI&Mr54#F6Dxp}Y<|606 zi-$_DGW)1DKFYPP(wxNprqV~y@n3{XO{zF|acIT$7Sjqi8QAU$$`u$^=5T)R_!4%> ztZL=ZLV1PXS53c2MpgU1tBmLO2&PikaruZ6N4*P02Y%li?;AVsCF4`-_#~k1Rfh`c z7nQ!t=^@?ZyA|GdE#1KHtNJz;szKGh-$n8g{ZKW1SIhzEeN|t`LKRu<`(5(IYTtLI z{sdj+n@f0oir0+d(qKQzIBT7ipHDI;P*_NOkZ*p;X<&0zmB0zavg7X?E2(p9Xu&_c##vHm)55;b^TWFm$2EHNW|STOtEyq+ME3Pt-nIDVl9M>4@Q;RuGbTvA@aPeo4r zf_-hToP{W+7i3>2uE9uAlPQ!z&4;LrqUZ*adsySW33W%3r%1Min~8W zU=z(d|Eb&BAE->Jhc4{<*kj#NFrtrDCxaKtLZ*+ZGJBzfEXEjNq|C*@5p?dDV==U< z&e0>5Prf5xw)bR)*0H}tSkrW@s~7JMkp1S82Ybjg`V&V$X0_{g#b*ep*9p$UK9PFw$m0^N|Rh=k}O*WasD0y2FO))A{(DF=+Mc zgJI<~( z{jH99e)l$1$0LxlkLYfp&+=D5KQ;(txXbu>8!5<-0KJ_{$cQ*QFxSm;^ND zH)_nZL95@ma~c{`R%QI3TE#Y-tAOi_rTGuFDGp|6E+UVK-Vk3X|HsOwP($-x){3Vd-pEsTs;oOW39Pxo(zx?`da32^Z1`o!Fc1(yaBktheI=mj06{J^zd9zdRP51 z#l=`^ui9^KKC|JBU2LiNf(=9`H2}^cAM7K_mzNL@84{jb=(8Z0uK^AkdCpNjy{CCN*%;`XJQx<#JqZZSMl@xb ztn;pvgY-Mn`>yrwySfw`Vf5|qau6K=8D_A~sGfXr(zU>73to0&7fHgPb0KL`c>$j$ z!jQu$m`Y>CA|YRP-n(GIUfEf1qr2W_KK1JCDN|;@8c22Sn3iM}73uHvcSS`q>u>x= zeDC1f3N@l8M&tgE` z99#4@0;|xTNSSZW2=qp{>Iq|G$!wKq{|cpMw+WoKETgXa3i+T{Tt|?Pta(rarkF9V zBkKaGyyO%%?TLUO#xsg0fN!Gt(!ah_Y`f{lnD*r%Xhkz1VDkFcq10 ziyVJJp4wo){iZ&35(|dkhxNYpk?|bT6D<`R8;unBd!UbG*=id3YiNBf?oV%wjT6R? zA3Ju;{i7$2qx+cqs(c3FW#f;499H&7b@5ylV`k9GYYuSBh?Gg{-u-HXzJlm@s4_?q zvvbKdq$S^0O{8_vinKFv&xurWyN@(CcmwggREHzK zSy1CM^$no$sq1Lax5WkkxkwS+0YZRHA~!$x>WfQCg_`6u76m3D#^Y~TKm4_O$w^~T zFuy5+`JH_1Ya=#~Ni%vD4A%Q;vg?z-fB1#Zl^b`FqC=>ZUKD3!LjE5J8|>N%f8_u% z3_JX=YLFF^15uL}o|R_cAtpS*Al(}Jmykg(#vv|Nh(FaMXDljp)vMhiE? zFp&_C&{@PxV=Ma#`WcB&OAFZV@PiQZr%Fl4#^l6KVn$iko5lTx^>SR zkTE1~*ogRH<=@^LH{#y7p&9-1x`)1vlW)Pjwn$FGmccMNNiRy21N3`m&+7N&fU~mC z=vu0wo+wM3H`h`wwolX=ZJZpE(J!}a*W7+6efaRWVHrc)4(Qr_K--}i!{~FBZ?gvH z_V3Gt%AK(qW|Ffu#-kkYNx$t&S|f_{oEOOJC7@*xEuu@$C#5Wps-AiZJ{wE z`+G9RpVq>2XnLCiZp(jW_Uvci=0Y$QWOu+x_pQ9np&OciWA5d$wr)l7#3SZR)g&wp zvIbUKneQ>UO0ji57KVqOICkuW`8gJX)qw+FJ9*wRCeP#}6Z;~n>fnWPUA5^KO42Wwf9pXm+8Y8n%`w=O`l4bycCc4otr(VF z)k8(E*FBI8NbZqnawFbSrx-Met zD8Rfd)-Hqrx1IZ+?GIRapn!$aSEcPeg6|=7(YK)AO6&9sRZ~t6c||c_m{au+rk_|= z{+bGNu+Vxx*##BnV4*oiksgFS6&BG0f^|Uv!K-4!jTLq+Dzcd)r&4`+#_ym`UC z<(NB@ca@R%FSz7X!Sh#vlw~7w{hiSlz{qtZvUa%T9NyZ1})#fm~uAO>P zOx_xY=AS5Q@9_%#c{MnvqV_uWoYS9I#hJ4HoWkj|xZkeAF*^<8fb^~%=m&~{gzhbi zn5qzY2y-v4+UP_1A#BY*g&+pqKF%0c@|#qc7gvf2xQac_)s6YpU~ER!F~1sI^ClV* z+@{=Mn;d_{-!LFgGmQ+ydnK-7`IgEj{W*ctW2%U@UlkYG7f3qLk3OiyQ8bmJt;j1{ zA>zttj~17QU71ffjYZjxZ=^lw@_H`&lJv^Dc+a?VyvE?*d+Zm%`>H?!xFRHC0fIA5T; z^cQ5kP#Y?xzaT!VHa*%_ZTgGy$tr!+jK^}9{Lo2HF^5cVy@T(exhnOklm3ESU2Xac zI7_3t^krjErTmK$JwxU5JfRRY=am1M{F&?L7)TzA2IXtE&~J$}>7tE!<&n2FC3yR< zqi;_VgI61Y3wsC7FI4A@lj{NID|jrySG(j|ZYOLHvvGKH;CGAjzVtPmzU1s3arUdg zc7Rs`_6b>=IgJzo!`IW66(6>)nCnkEdsbZ5NvpWnu~j+Vm*%7im_$~HcE!XrLH3;+ z3{l1Mz*puYUseeFby*9*iNF;YR`RLt4*FCvVwK{EcE97at!nx`f02GqFg<)PsulM| z3rvm-aiMe*^+l=1d+-PP!iiJ5ungs+O=+-oUc*?SC&>3uQT^=oZF8(0ngf(;8zo%G zLeY!+A_ti7X8P^x zyf5|37b!h(fd3XaIO#u=^BFf6{JKNffH$yXdN7?a&Z3u=RA2F z+-ZLl(q9MM4Dp$Am-Q=R9Pr+;t3KmX9#!dB;QkcKsY5e-P$)TX%J`0?M{#*%crhu* zO3~pVM6oYUPvU)9pqdPtknq+lq6+iVz{~4sf7Yw7jxo)-C6j}jv^G;@{X@W!{2G%u z{(`8T{6&=A!Gp=l7>zK0pMwSn%Zc+3;_Hg@8Wd{@;eRX{a@gG7oCCN{)-)8 zX;q?h<=KsI{NV?l$ z7heBRd049vnOQZ`{->zhD#f;fuh+OppSBD3?+e`T6f1(*TD%_=eBXfIV~-T?X-gH3 zJ^5K^o`>pu?$cY=1H@K_bE+3QjsWx(R!$%#PS!wVn6G8FeMxdb+M< z&r~x(4p1d1h{{aB92eA2PCGiyA-E|ZH!at(QcInk0hXGoZYi?#Wot8S57>($NG8zU zI+k;ejk-IyPKR%Ub1KJ14aLM(O~2@gJSNg1XD6jslHLRP`%v8PrK#g4%Efm1|)x zm;>E`QFYT~xNO%%WvyzAelxg(!WW#RRoq2UQNg0k80&CnjkW`Dhh9X`2lYi7a6iU8 zJk)tFSM%6Fk5-CP*o7_ol)ma3*)E*x#5ki++LKk2q%wKiz#ORw*pIb**2ClH9S`lr zDtQ-WkdCOhejQqm<~ap$Q5^s8>|K5x{TqV{h&Hp~z(qhPoCBC5n=b^umM@*rN4D%j z=;v5_B__fpulymSEd7ASZmM8CBv+KkU>wW!9&jXTFEZY=<0&7$244t02fjZGUcgvz zJ1UHZ%Ep-_ZYXXt3FQTKNjD3e+azBzdLiyA2|FAE1MSu-7CRkFgnfo$9765mdY$!o zv@0SVY;a!3H#!2ln{Z8SQ=M%94@Lqa)3g zJqKCF~kpX&1`NBKw5;xBA{STU6Vb z)peXB+g!a-9%z~No6}st4VsoKjkP{|xBZT#=BvrDdW2319COB-_J)Jb+5jP@TkZ?y z1yEX$e6Z`gH6{~Z!ymp>jl%#fwZ}29v7UAnB0spaLVj3Vl$&ZVGFNdJK!{& zfw7vbFZHl`Of{bgG&jDXerDec^G7Z4M1wGw@=%7#QF$2;O-!|S*?Zj+WrQ&|UEimN86yKzQso-?8skX(4;!0hh!Y9O z!GOg-scd_HrJc-`w=r{{!4@IkWQ9H_rY-WRlZehDdzLzmSd`l0>|s8H^mXt7>4H)g zf(v`o4*7Qes%!b=?Z2!eW>Sw&l0QkW?x(jrttL3*6ZTH!x@e4xeDXB?4^`$8OzdQ9 z&It$khvrn2mM#ZBCr>$wWoWXF4I?@v`Bz2yA&R6_zD&|@xBO8Lvsc=iQLRxX{-EQS z$HK^8&bD&Z5+v%!Nq`m0F!vMg<%OW_)PC+S@T>Wr(}q8l6f9+zJVuyQE`s|Sc3+9B zkhn7sv;8=j8lb@7xjt|KO!w_j$xQ-tjVIjp_q3^s&H*{>JJ16=2IT1;g&zAxJJCbq zhBhH~Yc|TN&0c8g$yk_$(e4xjM~3l3OmxvE`C_VSqPp0h*!z?8IO9h-L(kTaf$`?6 znRFHrSZ{Lh^aT53l( zY?)@T6{46UIesX3$^xG%;%o#_JC|SVC)>@`(|qbS*>>k4{iaoDO-*~R05N!&g#PhH z-`o%N9_j~_XJEr3xFx6~Ew$M$#a_hV9%|@F*Uk98l8(%-pd)vy7`@1Tb<-tv0>Z8d zqWkQxNkwAy8fUt&iVXG@`KQrWz0g+%&D+CXGu>r65`jRu*|Dr6Re0S7l67QUY+j~f z9T^K9Sx34)dtvGP!WE<;M^B&p<{G=6&u*~h&B@b8lXhHDIDhF2SFS!G|FK3Nxh?_g zQ`by)$&Ym5fX(oP>ty;Gee)AnuTZ;5H;%x0x$u`%JvWNNEkUvzb%}GMEcx2}`Fe!4 zcdvEwWjZ$M)sxm<0qv@yvnTPL<@4fxial-iF3G5B=`wxaxYx81bjhpvHetsDB7H-dS*Cxx)M4 zNxx;6>$m?HDLy?w55!bym=wma&3sqb7lhIo{2@2kohR z&O+6_-S_Dgytf;boUCSVcaYz)8yPh0j5Q6|3Y3ew$zDZUbBz^xkxwsT{xRlYaH&7p zhDN#?v_42t>;KiBVd!7jr?i(QsDEj{Y6c`A^sXzWg8o(CL(EOyq$b<*H|aiVoZJwe zD$mJFsq#_1ps|k7QH}Kigl!kQ_1k)t`p!0!aUd*4nsFog18y{C6?E{q!`Kl$?67Pn z+a1=!a4?AeoVP;?QA%^^f2cBJPH>+%{B&V+ zow^7sN?VSflcyZTGBh1tIe~mJXdvle4qF3ZLM=cCx0lU!Z~S13yk9Ry@CSSzfhXU2 z*3#eVJ@E820{>`5~Ti)N)UaJPC>lbMAt?FR!wq|cgmU)(R)1e^Y_K&m# zOuU1AZ8tHG)`bNaRA4UZ&2l|#PUX!#XYE#-L(U3?{ByN zZT}_@f%{qi8b1TaD*88<^=~u1Y(7G;o;@usy;}}Y4UJio7j$_Fn+m@f@lP2OlAUO0 zrFE4>IK`QD4bDi!`EB4+G=lin+0%y43(+RVf39nOQs(BqI5sTccQBh=_odyQ;MJj4xRMKwH>UmImJ1R3Z<0% zqAH*G=->_iILeC(wwonhuyVP!!ZAZ<&sI8U$jRFtF<1t9La5K=UqoUtMk&>YV-Z?7 z!>#uJ6qAMZkl`34FYDbC7%xNqo#Hgg#~QSf&Y#H+{;z!s$WQ5q^E?c`0DR_{3;x_O zR34p`hVq+Jy_L=YL;t5&>3a#cMU|tt=p-=tsCvV`r}BAVMjrV<_JS6%HiPovMRoAu zbqpnF9fSFf&(#Zqyr)Psj`pG>^=$0FBJ1BgRMO1JS3buLmP3Af74+K^@AV4O7kDU- z+$*?fJ5#=KBG8a7k1;N=w6G9SFgmXgW&B^ydmY(kUXOZFC)HIJn`j&iXqfDy4Hal1 zU(^r6%VVFRU70u$H5PSOnjhmcc$&_@LVG+s4rtH+ySc7YUvM05;BlCO`clyjj5%?( z<4%NH4?d~$o8&g1{mdr&8K3HC3<^(wywAB@fwx`M?^j>ZV`T)r$ZqM(JIq$^@rXgDMYRvDC z2h&gF_cKv1pOqky4$GGt8sdiXt($ls<+`AuJC^J9zbW}maK;4smR!F_2& z)0Vc(5$H=)A4gL|toFf1a@LyRL(Jd_5+-AoJR_Ht$WD6Xys-~H`?FpsJ6*xqDVF)Q zYOUAn;u|ycDm{zB3uRk5x!tMFI=>_v<)@+jHGy{oNhPx1FidGXaMDWK9eOyK9`74{ zOHR_>reHf^*Y*KE+)k4@8cPYFRuLDHsb(MT(s9ao^LHag<9Ci~`7rsTT@GDpsD@HM z@hH6SyY!u=9EVW5$BFJ~Y@GQDVq`F1<*8CAqK6`YDclvCGuvB52QKf}9XNtXNs)f= z`>*7Sg*al^GiRl>!SWPl%NBd{Zg@}DC)X2|t0(dverR{d8W9tHgGAW73#+BDe9)89 zEn7pW-246C5k>xKk8cP4U5{6z=)g=1JL3oG^FQvNI=}nmTjVPFsa)xl$@GH$0$sxP zsv5iCFjjp=Ugn7h30*(Ld-QI+5U=kr^ID}IE+xQNlz`=T)LxF z5<-_w)ZZ-w@;vs0m~cH|(rm%BX!c;);lu2g`->PvXCD3kYrPhI2FY%=cC93PUS?ur zaGZ1Q-2S0!dR}-$ZrG1G{b!$@hk8wsT)ozG(CdWUoU?vF&I_GCIdsR#$UR4^v6?2^`?p=Bx`+$0b0G?0zp?8p+2M99g)Gg zm-xRwGwT`f#bD+ONU`Agbty3zFlIh5iR?UnnY;^x{GCr8muKyBOD6k{b;hd9P`!p? zr0wrLx|i`fnn`mVV;#zZpOIt0uhKmF`^o|(LER*8r1=HP42MUif@bA?w0=#{Xdlq)ERXvQKuFo%fN3*{8SZZTqm7>kIq1 zO6G{}WSita$=f-u4aiTUUY+jRyID^4+50!!`+bXz`GLuqGM`Q|)n<@ zmqmIo4rO816Gtt@;Q=`WqO)@Na0i35LUgfj_Tis=KOM%AS9;=a1N;4k?Osk($qqux z;(kKI5tDzT{*+paqG98mM`vO$6Z8=4CsB3=PbK|CdvzT>SGKN>UpjI0VnH?fjP&Kh z{GM^=@-H~))m_{s7}jCE5R>jkXMqdYGk|+&l?<`%EUKM2_pn|*-O;B#J~?B^z`nzG z;yC(X$U998DdwHy-tXkI4ZrD|6O4c7aX>xOgY{4)RV%=&@{o8Vu2LNo4qp}=U$q9r z#&f9rg21F;J+7x+2RW9jx_W5o4~-%hNR?WaKX&hs8OJ#QKN!7FCp3Q3y`ytdV|S{6 z=xGw~0l?a_tWZ900&pTMB6Lq*s9V$|1X%=2bM^v+B6t{AJ&F5110O2%GS+iA0*H#Q zPzBI7U`PeG7)(RKmBzxXAL{N<6_DkX$AkEl#``?RA%aG{{2b5nzUPrCJJr(^Wv6iNFJ_^F5y0Bl` z*oC@io!}PQ=GP`+DWxZXZ?Q_?-xZtmazA=)f|0 zRHxD}MM&|gK5A0?DXs<*wDRvn&<|JaQvrLG`_WPIlKs^N%i4+^*1LA>fT^Ji>eA`f z^g9u?opby#zcy#M?t$l}E=r@{iNM)p#Qqh2Ct?cyPDIhm6JC|q?91A<4nHDxtKP5) zzY`H5i{)KUuK%XF?xmYypQ21{(_|j^TNCu#=fIKdR)o2xNp}t7sQL;l=#L-8&u}TbuWkI%4CizPw z9VwNNR+j^pDaHr*hhmtCU{bLs2sSwO?%-2Of@=Bnh$SmF-ywC^UK4K_f?s6ouf>Ib z9=a&IzNlZkIAyv|O8m+NR@bt#t-f>hg5(=J_Pnh9LyHPty?4{J`-glWAF;R4*=mM^ z2j&2TNACYICOB4{0$u-GgtmlYVgDDr)UUw+*~<7`|9_01Q5N>`-=bI}v_0&9?L74> zrltX+M;^;yACm0+KO0SQ>HfFa$>CU=_+LBE*}L|CjTeG(|7*Oy;gHz>6|-P0y<^Lm zbT<8eAIBUF89;y2yr1%tU%fWZ{bT5?3XX=BnDgWV8P%aIAeu7r5f2oFowe!7T|qTk&fr4VkE;+44-FM z$Z!?IjSM$2vx3O5N@r}ZE&TkR@NCU^ww5tevLtL8m9Ln%6hIcc(hapi{9=9b=JiyOm89vBx9K-Pp3m8sd zIFaE)3@0&snBi20k28FN;WUQR8O~t%B*U2uXECHc%!Aj1;7bgtKl8Xh^TcX?re4kC zUdrK`9t2h9<)>h7k;FFpOeYn_)D=ScdToiFfj_|BWDxS02vEAxJ!) zhvUl$rZ7xpn9h*6EKfFJNEDtYTQKy{n99!l%p)jo<>$T(c^oB=pyaWWJZh51OY%rb z9wT`#rys$Ps4h?5$B=j=Px7cq9xurwC25S>GhMX@MJ>m34`9+>^kmqJVQ+^0_}l&r z2k@KQ`S}ih9>~vw`1u}wCTeNV)Y2Z*LM4x7_#ne^497DpU^s#EPGtBH!$}MuW;lh@ zOy%dt89u>q8pG)fi8k7UHmI(b_zlrUd!~){pbcsl(MEfwjrO1oN*Q2Cw9y{4fj3ey zG%39dV;I4(2E!oaV~Foj_%!*qt344W`)#;^s$ z&Rk}1hPN{8%kTR$yqzKUIVgc}9>Q<#Vt5b3QT+ZshW9h%QNZXg$9fb|qlaaPhh>Nd zBTjEfhIj-~phwV%dmuvyk__=chR`#~5RahRJz@|)59a5)7}Dr_AouzMj$%ku=fUU` zB---`k`*376zIV(01_lR^azp_9zn9gBS=XVn|fsVXE*zCewS87#@}w9;OYC zB#GexZ4e}h;gK~MlEm;xq79EE+VIF&hD0GA$aa**62k)up=Xj99+ns$mKYwE7#>Ly z!y|c&BuNYpOAL=}#?K@%JdhPsCQ*n7vVtJV3XddN;bB?ffvlkSL?IrQ6&{uq9+njz z$O?Ktf+10h2eN`7QHuw%f*?`LNRfv!N3u;a5}LO^p2;Q|2~7&fHpxh~Nk+=ylv0vS zGKzDJ;#{LR*C@_4igS(PT%$PGD9$yCa}{!~Le5plxe7T~A?GUOT!oygkaHDsu2r0C z73W&TxmIzmRh(-T=UTR`UgiQXbAeZq-t;mTc$o{l%mrTN0xxrcm$|^pdeh5X;AJlGG8cH6 z3%tw)I4gupBQEeV7kHTqyvzk&<^nHsftR_!D~Sud%mrTN0xxrcm$_gg)7VC)v5ib) z8=1y7GL3Cy8r#S;wvlOUBh%O>&b5hiZQ@*;IM*i5wTW}#NIc-ViF0k@Tz;lZKU1ck zDbvrC>1WFHGiCajGW|@Mex^)6Q>LFO)6bOYXUg<5W%`*i{Y;sDrc6Imrk^R(&y?wB z%Jeg3`k6BQOqqVBOg~empDEMNl<8;6^fP7pnKJ!MnSQ2BKU1ckDbvrC>1WFHGiCaj zGW|@Mex^)6Q>LFO)6bOYXUg<5W%`*i{Y;sDrc6Imrk^R(&y?wB%Jeg3`k6BQOqqVB zOg~empDEMNl<8;6^fP7pnKJ!MnSQ2BKU1ckDbvrC>1WFHGiCajGW|@Mex^)6Q>LFO z)6bOYXUg<5W%`*i{Y;sDrc6J}XFpS>pDEMNl<8;6^fP7pnKJ!MnSQ2BKU1ckDbvrC z`GX)G@dMA8e&89?4?JV~foDuVi1wJ9`~VN)F~EFIN!H*GJY)KSXG}lvjOhnZW@Egk z8Pg9uWBP$-Oh15D@t$W%Kk$6#2cGZz09tK~eQ|lPH*BVGnisfUr*hVYLEc zh6uQt;YNm=7#1@OFoe~LG_X$)bt4!mh9*PUCwLG01Q7NKAS5#&W;B49(E!FW#Eb^d zuwVfpnE?|S!al)seTIHNe*yzQGV&hBw<7e#)?vAbBJJlNdH&2ww!=WHD^YusOrq81`dG z9MOd_>B5+FVNAL(CS6Dl;9K}i012xu`HaO=Xjbs-6WXGj42 zHZc4ofP`BY@{<4(Ze19+F61Y{GvU@n5^h~2;nqbmZX`GG3_l4VP5I zto)gC;@zYA`}Xu-RbBP-&24eLefWo_$}>zOQHB*R${I+4uGA`+D|$J^Q|%eP7SMujc@$ z=;Z@n`oNbp01|KpNO0*TpSn9*^>?xAuUz$4uKJp+`aD;Co~u63+S|R_+r8S`z1rKo z+Kuvg?d@Le?OyHeUhVB(?d@Le?OyHeUhVB(?d@Le?OyHeUhVB(?d@KTao^?X>|Tx0 z-=)s()!y#a-tJ*nI)BDJN42+mwYPhd$qTFwYPhd$qTFwYPh zd$qTFwYPhdo{*=SBkTHwYPhd$qTFwYPhU-B({$+z$&-?o>0+g|eRdC9lKCEo&<{9QE2?ep=Cs8gta zW})~iSOTQ(NpIXN6sa4R8#fC@`Z|A%^%0J-K0=E15mK-ONWl^yb(XyGIBfj*+jtx{ z9*2#`VdHVwcpNq!hmFT!<8j!yStxRN#^-a}r(fdJH~aKUeTwxFuEF{UDb`0wu|7hI z^%2s)=C5(1aN}m7NWl^y{WgCFECG(e5+DUjfE3&jQm_O_9U2>t#>UM;aqQ5D{egYz zM&ZVzvGHhZ+$S(u@n~#3 z8XJ$s#-p)uvry=QB|r+60I3^)8;`@r6hYOp3dL;{D+Xf-KXzF z`qunuT>my)=~8#)+x(T!`ZLesuf6HD$ogX{foLHhpu13vwBm%@+p zBJ4K?UylFpA$Wtsaqi*?kLjeir-uxxL$6K6C2)QJlZLIc)ZalkslT zepUOs+T~JFv`>!qnyc-zyUk>{o&LNr+CJDB?!9ibx9_el9yLX_nGG{MV@N02INQZ> z8}Tvi?7Q%<#61=Gznz`TM%f|w_dr@0^VF5rza z$kW9=`Tw4OgNysQ_rDe*8qlIG+%-06#a+)MKI$l9W{;sw7tv-9qVHaec64dG?uzyZtQeH1#a^FH3r9pH_ z18uN{eQREay;5GEJ&`?`ePQ;7?2E7$?8WR7THrFcva4u=YiN_}XoaV;8)%uEXv^K~ zR`$idZ6;`~r?WR=58-Ff<6n}!8E<{OCHu1Mt=X4nZ_D1EJ)6BFduR3)*>l;uvaihE zoxKO|A-y;Is_d(?zl^r~+Uy&%Z_2&}d+dBG_8IxM?Ay_I-;Eu5{x;a4zl)u5z9;+M z?EA96pM8J!!R#MoKal;y>>p)6nEfzz(E1U4+wsS3~-?04`rzu(J#AKz~Lui1yQ z|Cap$-aGvt*ahx?Wq+9cM)n`G-@;c0-EH<*h%eF`J1*|$hmLJ2HCl(Rw`e6Q| z?D;&yI^a*`59JSIX8&pVORziMpU(eG{%7--A`th}^UuiJ2sS@~@RFD1e=g6lVe@C^ zufS(jA3@0XXXmfNd$Auu$o=Q!OL>u(2(hu)D|_>fj^Z0aQ=_;AHfIrehe>C{5WDs|7rdc z*m?1v=RcYMRQ}WX&*VRwe+U~s{9OL?`M=D60sBe)B0_L}DgQUv0Q8she}_-}{7U|- z`LE@_jtvlg1G`iGr~Ehb-^%}U{@eNQ z%>Q@(NBKt(J@iq;alj zg4haT;>GNRy>YWWd*IUf71SMB&JTl}Te-Y9dU`ZB^x|0m%6RX}!Od$sqcUd+$rQVoXig-%aLR`2w9H2SQy0X7e?{$*lNoB*mgQzSdEt~Y{$dntG>-c z1&(j4AIBa`y2q}kN)J4Y|_2XDGytTVO+1tH!eRO2dY#$k+tJmdTcjaE!!@cf$vABNy zpxGYo9o*a*9!wT@^{=^&P|v+k&ka@3@jdn9*k)>iWBcj&_@=t(_`d$JrGHG+kC`pk zV-we77ebF6gdV#fcX1$haUtBrLAZ+xy55Ti`q%sg>CJ;6k9|R^;juTW<0sVdGwFDC zXSdnjKRUcN9v4eXrI{WT-FVcCN7eMGT#83UJSyXnjYpk$v>cCO&SlKGj5(W_vxzyI zn6ruXGqDU4%P_GF6U#8M3=_++u?!o_u(1pq%doKw8_Te<3>(X^u?!o_SdJRYQDZr3 zEJuyysL_qJ>c+ZsV_mwjF5Q@OH|E@pId@~u-I#MP=G=?-+lyuNVi~j4GDVE#?oJ@sjBdW+%JN?*8J{@n~Dh z7FKp{T_5_xqr+x*GTIr9hsOuE_Q!y;KmEX9B7a|lQTL~guiqTIQ6c=epe|lmzd70t z7rl6l%kL;_)|WMNax@vvt`0FO&PzEnPvX=Olry_^9Y-^+pxMWVw{8t#0&iZvI&7Ui zXq`J~y?zWMzUkALU)$H!eh(;7S|7fgRI z4C9R-AE`Td02K($;p*>?9zFtDL*TBbJ zcGK!Scvtm~OP-;3-v3N3LBP)K_A%dKnIA+EQs-GI39 z!0plA?xVZ=*XA)N@pAG;|NH3VItD6t=7DRw2YcaQ{B*cxfBYtQ;^;o63XMM+jkm8) z{6)<;WHh_|=x}H9pc>5G?}cq|r`_SFqyatr#an-OID5mN2;*kBbhLL9L+0h3{YS41 z@d7VaXLwh)_s<1abZ+2{ity(pVavvB;L#hTc?itzIMU*ed$Dd?NocIz4gTT zLHp#&=Ab<|cPd7rGSs3 zOo|+?iU5`(p~Z4&DFR%Igcr-JoV@W92E&jmIG1|kW?fnSq@4?z*3RGWH~UE0Ze5AljXov1~8QgOdSqPr5Kw8 zrVa-B;+h}$gu%A z7<^(sa>%g(IW{4u%OS@G+6pq?s!AIOKE! zaxl_FMGiTgfEzkkwZ== zAO|B&ROFD;3CO`n6BRk+EC=LZq=||ga+U*fFw#sFD-Jo!0XZ0Hq9TW!<$xTFG*OX5 z&T>EwMw+O|A!j)t2O~{Xes6BRk+EC=LZq=||ga+U*fmJ@O+ z4msU`9E>!vL=HLKfE9trI_i`aMq%ja?^^OE=gZTF{P&! zKV5<(;_588QWSLwo`};GTqTyeU4rr9bOl$6l`cUuak_#lMNF3KvpzTt zX8m;U^l6e=7rwesgmno%h^mQD)`jA%OV+I*taX7=ETWY4We9OyDCW9ky%NG*7mBgrAwL;VYdrKZ=Ki+rx31z3s!FG%M}Asjg5v|K$% zo$O$cS~4g5?sa%j|T)8q0Q*^n-@`TeBq$$R{ARS7DaORMy&Y&Q; za%CE(d2_ylWge!u^MZ7|;<~V|Q1p2LR)DIs5a_N`r!%JlYjjRm=J$$3FG)rT1EJJ8 z4UUGLvkH@5C@S5+_H%U>U@11eSCZ6QA%r?)Y%D0VEiI#?V%0G$lh3~p>xE+0p-eu+ zLarBzT}QP^t0e@xvyfAOK$(0bgk*P*-&DC|V`hYAFBH#Sl5rY^5bcn$T*FTJglaD| z*G`596hgK`#&UZl8M1>pX?P?Q;ohTX^+LJ3;dt8800{XY3+rAa+Wn64wd=yGN*BaL zJz~Pd7mA7pV#ukDknwIBrS5}##DtG86d{l1Cm%7Pbe{X1)Xy$LR{(6gOXz9ib|$milwIqjY>vI#naPcMkTmXOnpgun1J12P83&9KZTXxO0o5L z{yAJ#f-A+>)8j=YxKfOLm%d-YmE!EXEMr&+t`cjn4d9An!IsKCX#nvQ`IdK2Q?w*_ zx|ydEoW1C#5wk}=9k4i}n=F_i85UR#(N!ZR8;2=8zI&SD{gUBruo_Zs8Zk@KZwsp- zx@kJbT6D%hUsE!B52g?Kk56$DkAibV*d+_aa;=oyXU-6(-v?O8%|fy zsMvoujp1|!jf(xpctz?88WsDGagx*(>?!u&jd5I^1$&A8#|tCessc-w&_{~vH>4LC zlS$D{R?cA3M%6h+s4FW+5_VuCrQBrYdOdQ|1HM_56R>(+(yxT6xF{z(hmy$$a~iO& z=zb`Z&%-omUGe?BE<2=51J@Pd-|Nx{5p*fWzt<(F5g<-NgDJ|tA_!_zRp%bP5K;KE~oND3!mUO9l_XjViTHAncL>0C0thZp2`l#;^Db zoLh5xzg;o_0B%$%H%;!kWZ(fPCecms>XIBEo+{BzQ@NfY`5#a{q8#UPZNttV#692` zpJ`(m(wPJwY$#W`2Mp<$DaAbinaXA7OA6R_UJpdWYHKd2Ll&E@0rAtl#B(T0z-T_0#8K6G`Hk5b3uw$Wk2TJ7~ zC|OKOgng;K1MD16yaTRZQvZ_kVet->$~#b!-r!O~?IBaSq-(Gg=K!SACGji)_oea; zlABk>EA$}eEZn441k0+6X(GH#|6 zzW`*?WnbYGzd)({0)~ByQ~Uy@@(UQ2ArZGgsoVmFd;r~m`|Fd&K;r~m`|FcZ8@c*Ue|5*-A`2SM#|74g;Df~ZVYG*Qp zq7?ogQt6U*qmqfc;{QvQe-r+{O#FY_;e^4Y5w;&P)tL;hF~askDqU_KYlQ8GRJz=_ zZ-niKRJxpW%(ea-0xqQNNM-t{%78|;-)yuIsdPFHZHd3%!JFv8nI zCQOnsOz;ha=U2t(yS}FCEWEw*5lo+b*Vmk`;7Y~l8`76#gtmuN<&wA(*50TXeb?7q zods8lw0C{Y=?bnCXKzU2+z4e4neLYiGcyvS52t_=FwM!6{D~1x z9x}G4A^8&{oIGUGCEapHIC)5=OWIQ5cn~O1x%I zj+Vm88^y{)nS6wWmN$x)hcdb56kgsaULMNifGNbhQN%oy$){MDd83$lD6_3C@KV$~ zl*zS)aP!VjtGbGu6bU(R6giKQNedzY`pz@0N+zcXLeD$bbW&#L2@;_1V!f0yi7*M! zH;SOgHV`DjBtqXPh91f!!i1tXilT=yiLjn<6N;mUGKnxD>5U@kp-du7SbC#adMJ|! z6Pn&AnjXp|!X!@LD4rh5B*KKKH;SmomK~%G6Q9!i1_fimHb)i7?^njpFK| zOd?FkdPHHV2ZQun8DZ-owK9n?q3eyJ>rrhIVZzrN#n(fbM3@lvMiKTfscD85hgpsTgBi*nM9cE4sR8O4`mWzMVRMX z#o35{>>jCB7=6fON!V>ttx)=qTA4(caQaq7+@sng!X)C}DpDWH zBuIqSw~E#8vFH?5-zrwWB0a@cSbfOYTovglwzBUIq|#+uIxrPhvHBI;(9>P!6{}y7 zo??Xhhapa}`W4$p)4k>ut6z~`W;@+(Ua|TW=_$5x$N4nSpACh_S)&b z^NQ84NN=y5ZauG9{fhMV+Uf4|iq)@3Z?BzhK(AQ+iuCqcVf7&so=K0b6%HR#>5`UK zqUfz+>?_h^YlX3gOy!auTPut`q|zk^a$)SPV(csO4L&Q3J)|m^G_u0jTNOoLk^662 zVeBDQxuks-#@;H%z9K!;Rv3FoRW3P%3uA8;V_%W4?pR^$Ayv8L04|KZRZ;X6>D{)% z*h8jrN$<85#vW4XlGqT&-l{12iu7(??9FBP)D8WGa{B`mNCQkV==d8^YFG#nx9O({F{Whg9W~*buJXDz3gFd44NV^pL7t z5*xzQTgB8@B+GAwsE1VLl6FIQdaHQ)isbmM(Dab1T+(g`OK%lRUy%$ywoVLlGey!@ zWF&wUjvg}AndJAaQ1p;Wm&BDY^j0zS70K>fA?P7hxg@THpSOyiuSj~{3Ox_0$|Y@% zu=7^2^A$8Z z|8|5;hvf1X0=+}7kvqbfLz4N2ajHYEg*(EGLz4N2h?fqz=Isdo4N2xN{Y!4+*b$Z+ zlFVQFmyB5M2$v1X%wPJKT!(gqNrvR|7xK76Mq+n_FNP%Zm;Sxansl?jv37o|eQxFKpnc-Za58QX zeYvvQKH)yleqzyolKafcxz)`lHszvIqie&1orzp_^%@StWv2%#TNgG4a@qRM)&0pc zJEQjL@%F*qXkV^(UvEFL*gmtq{`iIS?GyK0wdlSEE;;$a@62^`f^XCh_pY|j;9Kw$ zm9P6YyvkRuo2ctPZqCo_jQ1zwEA5q?$!M<`PGX(ix8_ye_`MqloL95np1gKPM=_%5V$za$*7$A!&~FYaHsuiciy4vC4q&nZ-7xi zi*)TFUC=(ivECnSZeH}?eV_g~yRz~4W_#t#nf9r*jX{5FZT(#P%+|)@+PRDU^>bT; z*KheErpGIr7dJ1Q+}v8*y5KHd#E-WAz`R>{-|>6-#NrpMZ9R6!NqqVv+z_-sehy5I zZn6@Zg2}Nuv`#qd8um|Ar^9k|6Cysx?jdz@QyxBtyW8pT96y1U2WfO~-??ehpSVtk z=ZJ|EpCj7z9z40J6`#Z1?R0pKc%W%CpiK{{6CPwbhr8=^c#fY4#!>pcby~vHIIWY& z^eCSioWA&iBf}@fcwmNhNTo6FjFrCI++dD&n1;H|do%!*dm9FG&lfHOP&h>6J`WOR zYKLju=fOePz#$s$?xx*!&wU&UTg*XUSOcwc?|mRt;)OL1H6iZqUa(e&0@vN$RO7y| zlfivDHvNAcs19%O`(X`4%V7<8Kd^x#IZWk#Xal`*n96y?#$Y`)o>C!`Yra)uAIMkdVS;U%2vB*FSYMHV{p#4 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 333/352] 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 334/352] 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 335/352] 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 zcmbTf2|!d;`v-i^y?0h-UqJ+B7zac|gaHvZMg(M25z!b^#2qbHTv9U^!UgvYcQZ3G zG8@gze9f{lGcz;Wd&|uB%=YC~xO~5JXGYPt{_ppFV~0EU-gD1+&a*$ydG16gA;gS7 z0_mJHsG#pIQ%)4&yYC>xI-_q+ZXSu_pCWw5{pc0lw`9Peunc_$&T*e~?K^02wl1;f zvp9c;5dPHxgOXDp?zQU-A@nHjSB{=Ea%#d8$yJ0H4r78gqi4-<==+85B_wJs?(Z2l zb^N3UMjkN|VtI=Y#o_TItEUnxabdiBao;fh-Z|rDblqA+h2p#Mt^hlR`r;Hw% zVEOmYSV|h^8!~C+eN$z9I5nQ%g6AERM@|}B?O#?)_^|s3k)578rFsU}=f`^qZ}bup zmpFC$*r|P&MvslT5+ z!{^}n3s~nx5`%kt1@MDBlh}n6jG-hPe}a_qO5m}IUc)h;tv`f&d_RH4a5E1rhV{Yv z=K;2K`93m+dza+#*GVbvRWaPNYXWJx&QBr>q-&>13U`_~rM3J<{IZ^88pAieK-{=q z%oCE0=S$>0NfBBnv^K!KN5VV9{T)r-)FLukNOWMd2sY56heV6UmKOG1cA6xI=)h>v zx&f|QcFt(gx=FOSf-$cHe+=(`)8wC!3W*k=1EWQ#fd(Ie7LVijG}=|+6q$CD4vZG9 z8{;!}&S=rPffkI`j3#W|Z2tc`V(n~xhJ(L7G9CrZ+4|X0!ViO!;pzW4GJa+}^^ZsJ zI$IBTp5SQV8e2ZcI@bc%9i+84l4u;?kZ2$$>A|BP@?0ipz@v~6++T-h&oEvU+-Q&& z;Ovp$(HA@huGipxGKu2sElrG$Z0&yh}32N)7Ne0ERLjnH?( za#G0j99y4!6z~ciC$AurcYl{6QVJ=|y4*cxS*&>w4-MS*v~4-)S(eFC0UOu<@r2m5@9_5DR6*;*yJ1YVeJ zke;1QbZjj7Nzk@|6v`vWS=IzRBij?eR|t@*`mmeYqg&lp-M}mRzJexNIa)@U_@^I%-;t$rBkWzRxQsWC-n&>bR zAvM@|cI3_l8s8JN7hsPpWFF6frg>zGY8M&9`~%(%A7Kh?>l9MLUxCe0i*xvRG6}dE zg_a|aB-@0eBul=9tO5;ZE1{3%>BP-=6+AXh-jno2a|DkQL09Ha#LJ+=K)YgmuL8fg zWqZkN-b6IPahVShXpLkF@D?StUF2g){}I@9LZ_iEg8hp}v!HcHOF+v+^Pst~e!{%E z&=EW-xp5SHFU*l-nb2+MaE^IPfe-qZvBu_MID#Eh3$>8Lqr}AImH7rCdm=9tFJa7? zyoYR2%p_5)VV(0K7u9k%>|!a|OGwioLYlQWM&O8{o4ZRq&iI<~8u&|Thb>(NJ3Wrr zWjbP43`ITg-5Z8yHAG2A^c6^KHU06pAF$h;l zg6uD>H5qnkQDDu=ci| zb?jjB54*{ZXM_V7?=a~p%Ojr9k?ALAN{zLRuLkUn@$DU`wp+xZ^c>X*wC?ml0{Q)27AkpIh@RJ062f1YSMF#nibmKqyT7m0HAw2#6J%;f5 ze;kJc?}h(#pV17qeO~amlkrz;ALowqk$0Tm@`*z7{XdR(`ZOVZ@V|}{Ux$2~)<@8a zkQ-k@k4(c6SZBwkDl}-ao2`oOB`IhTtno=C4ZcJ*_ZvxqZchMjR|snmv;0l`23->+ zA4-NXzeDoXzJ@KkqjBJWG#T2{T=$mKf$uF(;QOy=U*miT+P?(oEAC79L+FnvH_*tU_vy|5;`3HWFe80&Lp1{kO#cU*viV!VoOVNOA8=(0OCTjo4i5ZqV1`NjsnEH=~ICC zIu|ZM{3;;+01%U#5I+crSM!hXPw*E2F%fh^iBKsl6V?ka3U5V|=w8taqjyKY7JWAQ z7eGuLW{2J3kRVQVWCkIg0f-*~#82D-@!dg)jjbRa1BeMAZfa?1xk50WI2qrP1ABFz-D^H4E*2Ny2+k8>TSOIWUzC3l zer4_#^9fD<33z$+cV4U%}|0Gpe@ZWH$H zMYPc8r_h%>j-TQDI|{ACJ`}km+8M1F4H=lwhfc-$^w8Nq9ckr1-MRg`l+nT^zMkLA zZ{fG{+xYF|dwvJ`f!|4fpOqRF%~O##Py zXc|qYU1$dFN;7FU+MV{GJ!vnRMZL5)Eue+89d*+(I+zZjchPd{;~%EO=x|y=N6<>h z%P2aUj-g}eIDQYUq7&#udJnyqPNI_$%}k}!=yY05XV95+7XJuWMR(AhbQgVy?&kOM zkJ3lzUiv6)ppS7AxQX;T`aQi$f1uaskKpB>=`ZwG`WyY7yNCWk|Kv7s8@WwfJ-3P@AHrG`}jQmagK15pTbY& zr}5MIYJLVklWWVb;?lTuZa7y#h_~&B;xlG_WN;*3Hv@+MvyB)^7 zk*-|V$o!;^j@Gz`NxI21! z13kSrds2g=2kF74a5?9< zjK5@Hd2UXm)9Fj=jTw>bt8|qEF9%>7+iG+ zHJZAqxj;85Dfd%cKei&$pSRNIH&j;9ZU9wUdR}Rf-#qZ{azE$Jb5xB4GVouP%h@&3 zX}sA71N{AMgi(Ef9AMb#WN27%)JsO;#J_N0dEneZMnxVX-sD7|pQ~hdUJTu_4rX^2 zhVI;aywU~Q77Z$|LyD$gj4KxyUoq0Za1^*}A|s5;;Me^T>2%eZjE>A?z=*yM09`O< zg2OM1^UK*&tsekSvPbIh2PDz`5jgx1i3#G2CP$_V!?1C3UAdLP|7KN%V@3xMou3$B zgtBtKHwPH=jtnwM?!nHHJpLB=aV8aRS z+&hMGl}84K0R#G#Zl$A~i{yRiXut(W9=^D;d*H8M;Z~vj&d4FLcIZo zKf#eZHYeDRo!>SnPIz~p{LpA}c8YQOw}}+dqO$Cyj!OY9kop~rlP2;aaWML*5V+$FjUeEfGH`97bj`;;2MNQd zS1t1@y(+JU({hmq0W~1Qm1FRHRg^rfp;{Vw5KjR{Ts}${9#nZF13ea^hu0T?crXsZ zsRs`&e_BKEnDiGDWwQ_1CAQoe)V!n=_Ghh94NEd{8QN zhA)%6TUE|{$6yDI9vqX;4~~hZdN|!rMf3fN;$n)6JTXOi?wGhV!(g|k-QWmwON>Hj ziIMXyF@*)5m;&50drX66lpid3@H9{Ld=~!{&-cxXi1|K`x;(Li+j=4g+dS66Myeld z@aPBY^#k-=jQ+fy)9YLGoE-LkF!hkZQ^*4H6#0<|20|CwsEi(^YY&zUN=z&|s%U|U zP?g;6r_22ALF})0;84GOnV$?EdUyFjN>}@8SFIx1QAPgLLFIl&l&{D?244(O2W=$V zS6!W$SW!J=W+MB{NUWYAeF^=MPQ&585V?ieNq_9Z*~v`V5!pFhYV{HFiG{3#mwlC8 zy!BVKuaioq zJ~6?61IcXCLg&$|+(fR1JHUO&TlwDn2>507Ai>W<8{ux@IpKyZPxgrHlsrwoPJUW` zLlLRSQH)XiOW9kwQ2DVcLN!=br#h-usx#I1syC`%R$mT_2^$i&BkV&>N6j3~8=9ZA z?X*SOHQE=nU+GM`F1i7_>ADTN$91pi+v(@%4;vJQGQ&n=d*e9cM&sKigDKv$!1SEy zx_N;45%YVN_LeHkqn0Lg&5@%c7e}6q{JE{UZEo9p+dkU%leWJ`DWjsJ=0&ZH+8K2q z>V>EaQJ+L7MrTClNBg2DM&BR3DtZ@~_hd{&Ooy26F~u>%V*&aTdUXSs8Nb8f6G))?!IO^NLtTN*n$c1CP%?B>`Om);fQN_J(r2DmC+ z4ed1T+P3T1u1C9m?S{8I-0oDn_u75c?oYSEZFa}FJG;H^f$ov+>Fyf$M)zL#GwxU2 zZ^m_tD~h{2?%ufj<5tD(iffEJ5_dZ8{kU)9{)$({N5prC?;hVb{;v3{_&M=s+Q+u{ zw9jcjxc#{Hv)eCgzoGrE_D{8cwf)=eKW+bG0!h#$*b|Bqh9^u;n3GVOP@m9{a46wK z!e1SdI`rz$zr)ZDV>`_1u%yH04xc8*Cw5KDPxK{DNSv3rGV#Zb6FScASl4k=$A>!} z>iBZUcRGI2@%JQIk})YNsZ&y~q=KZfq_IgelMZzfI$1lpJ9X)l*XgcK<2%jiRM%-o zrzbl-*XdNJ_d0#u>91sEa+~DDPfhQZJ}rGt`l9r2(tqmGqs!VZd%7I%@=BL?x_r^) z_Y6hGJsEFxm3JNA^;D)QvpBOM^X<%!x^?W9)@?+$*So#l-Oznl_kG=e=;7`$yvMPg zhMpsOKG*YX&wuy4+Ow&bwpUEADZLi{1@>Fj@HznuMBpTs_Q_u16v z;~ZDc$egEg^|?cGD{_zJS@Y8J?$3KL@AbZ}zIXS%r|XXek(ug!1F zKU82Yh%6{Bs3|yH@MB?G;rzm*MarVFMUNL9D|Q#B7uOW8DBe)~Xz`Q%++Wu}x_@$iZ~xN%WBSkRzoh^6{{H?)`+wB`&jHo}Q3JXSm@r`5fWrfR zDH&Qax1?@hyMY}CrVYGn;JkrL2ksttu{6ANN$FpMCJ%b2tYg{kvfs*@1{Vz;HF(b8 zwSylUq8`#~$mk)Pha4F4_FbuWjk@bfdB^fzXzHj=CYDKlVx}tKhNnrXWEYec+7+)&+wX)GzpGVf4Z& z3!h(jYT{*<%cjwp2OoRz(1Rx) ze7)9CJEV4F?T*?%mW)|)W@-G=MN8jVmbh%rvR9UymycWSU;blVQe9o$`np|pjde%r zUaGrT_eI?wE0inRtmwF+*NT!AqgKpVv3$kO6;G`=x#HrAFIW7zQnfO2Wzx#*l|xpJ zS~+>;f|YAmKD_ea%9mHZyYlOm|5+8bDr!~os@|)HteUuL-l~vyZnb4~-0H5Y3s(dmY7tv(8zKeM9($?i+G8)NFWi!?lh5H*VPY>Bg@%sWurmP2Mzj(;xL*y{>**{i6DH z^?T|M)t|2ap#IzX>zg&3qc(TioVB@d^WB@rZ=SPx(dG@Cw{L!O^D~>D-~8t0k6=|f zR&yh$VaIu*Al7FEUd9Q$f{^6YWDiaDBzsaio1I2y2HHu!py}BvZcg)3*^%poRl-+z zdP~a{x?Fl%M-sgjUZvs$L2sZ`!)fFLd>R|aldP;nqlsjOCmT&P)9CRSF(!5K9zM;J zYO`A8uGl!5H^FoM@_pU1yqRe^bc5i!et214wzqEO`Yi?I$E~i3wE+vLnquaR%1dSg2bP{=is~@Fuo;2P^HHk&QBsAz>Cw+j^8XyG!M+#**y`8IYwTpjLkDg}*J)8E&YYGa7OXz1^Y zuo?$w=>Q|u8ns55-OQ_HB-xYYF=ZmQ9X=e(O*9g==HO8R)$TFkJ|H&PGo>bdOHB=2 z0d{z&6{|2yEgk7yG!HK|E5#}QZZ?e+&y_7N6EBo5D-o~Lm>ltYnpnD`l%|v|DWl4! zFKKeNc!94G_b(Dl=>gUj(Xs{fuvpC60&zbr1I=q%mJ1rW2|3|7l0?RN)8mcqD7zqZ zuxMpYLLy{Fm8?^;TPxT0^YQX_x(>QxUsQ+0wwAX2eD)3&AjcxJVa3VPdQF+BY_&#d zt--%0iZ!zJOGpS1$s$)+UForL@#!|3#~2rvp4KHJ-D9=c6>;&#XikxaLl^+X`8m~+)>!*Tlit~Cqt)<9!F0uJ81vrk}GD1JDDEs zy?f&-q;^S9i@WnWbqtIo7S(}K^qFo%1TPg z$_nY(ts7Tw-L!u7L!#L9?glj_{F!^E?xQRTGPi*JpR~|PdxhQ6IZ^y z_UVXPBn6!<)5 zeSDIxvn-j9h~qnSa3q@?szRSbAX$kd91BghXM#{p}~Q%kz!&RW@o*jH(HZDyT6o(dpGZsv>S1l^QsOtBWZ;jf?l#Oq^!>`rRuw zu3Ni@4J-af?6&VXJ^Ryd^v#n`i76O$2)97cA!^f+&fZ8=TvCNrtqN1=4T73#IgLiE zhW=7wk1Fex)SJA?h{sm$w#&@WoAG9MhK%RdCDPSx#G1eM`*-_)5tl~MrHOKjICIL8 z81YyIoha5<(7c!$ca26 zTxBitsT91v$j3(n(w_($! zhQ0ONC)oX}!>;3W`T(6SJ|M0aPl}&lx28M(xy4I>8WA~n7Er56JFfvH#7Y{b5mX8V zRmri_#B>?7caX`U!kjK+T83P%h^HRz>>i~x?VWO3vr;fEo?-2@e>zRXh+|+y-O!#9 zu=)0IsxT9?jtXre4eBDFK|#ZdeQaQ+K5l6Z4D3v&y`UVJ7F5JDy=b*SH&~s5yD5t< z@=xu$`hmM28B_lHwKu=p@t*i1_tP3$b7;%jK{J>47%*+$#X~E^pWYHrBU3;LYP*C; zKoC#*c-uu1vqC|5TdY>zK7qH}?6xAG-L7`KqlvaJI!~-vyZ(vSHat+-IH_#t z_lw`XDpagI6s@!!UVq`TtK+WZ6q-QQYc?;rXKq^F)V>2>W!|`;_?v>4awl%Z+_NY&Cmbx^c7JYusg}qu#=`nWpMkqiUoFtnVEnp8C12Ab|lB^ zYGVv@!U>TZ`8c;GOc&M97pBu$c#FNrXNlmI@JL{egIva7%aojt5LqR2Y#`25yA>SA z@tz>ZxnhYdWQ^soS+<#U0L`D)yWi;V|I%nCUpsZ>Kkr--|DfNm-no9=(0X6V25uU5 z$Dc5-i4Z>)U)_K0jW5I-bnt6WKfbP^aB<%FLsg6)LDNLwQ%+*M1}a1OJQO3(6~k#F zjD{gOfD}+@Lo20GTt(9r{#RAu1nY~VS_SoKg z4;2jl*SsSio;!YHW&dZUKJ@&JhWnPRoI7%JU+;E){C#7FJ(%62ZrIq_jJ6Z8I;J!1 z#7%m8V^PqGv>A#*yhSebMsPrc3vUmNh%pZn%4EdFci|uc^VZ zrVWJDGw7~w-ui+nw~8Or&PVsIeY9|4-h@Nr803=WK&2J)q@cqM5DP+VcAa^EPiMGk zM1snWi6`T{*0#imK<5stGHYII+rs~A=~8B5ILQ{)VlE|gLo7H+tCgu#7ITKNKZ5Ae0K z8Po+nL(sLA1VxHULtYXr0SiS!Zf(d&!5GS+5?jZs&iql!`qs=FP(QN!^KZWJPJHnL zV|yRE8NYU!xw))*M(MaI?v$mYk3Uf`W%T4B(?>YP_k%$#N9MHT$&bno!!yr9nsgBo0j5 z*?Fr)vSA!*4g}81v|)x-?s5<~7ww#>f{Eh3*~~1m{Al^^sv)z&lT2>9Qs4rx(Oz+41W+s1-RiWPW9}*d4Q+ff70a&5a6HM8O5# zII|F?)<;C>)Ph0>e?X}Z*M}GS^m-l9MHKpUCSou2;ko}(xvlh*WO|$qSV#C3g3%(l z5VQwuj>~8aemjFw78e!Pt)TtHKd*^gBMm>i%m3nansV^zXa6NTa^U#l$0O94;>WN2 zo6niHWZtCabHnLFN%(5Wf{Ki>EU-WzuDI z!soQ?XxaMyOwxccSvfEUf1T+=ouERkvdJvd7W!nopeyt-DutZCn~53l9&$(y!sCm} z=y6~SakjWdyobJs+Mv0IG1r%Wo<~tpD)+5eFD{ZD5toRM(P$cbV=A0ZtQqt2e_`G* z=CjDvYAO&VMLtHZD)7O4ah$Bc$MF;rPHzElr_aKGKujVv{;#GBd~)+VuA+GlS1UWR zSxl&J{;JhXDw67LgIIy`O3JIl?wE+V{y`nWm@(u`Vs*h8Xmw*~cnseB?dBlmWIZK4 zg;iLT5gezBR0?gQNMr##FPTPTEbwUrnZ3X#yG6u1S3#Y~j4&|{(NPj7p+M)-H>YuO@twzZg_>@YSTF%2qmC_&x99l`Cq=nex;govt*CUH* zY!VwAd9IQ3H+5*v#T_z_*w0klP~sp!(T-{|p;FNzBy*IDkHhCr_T#DyUD3ExUk z!`?BR$ha^y!waXBsaoUYmg@yTT~r~V1Byxb_O<5kw>CC%o6j^K=1whZeiVdmVgbH9A_9OLWMu}f1TRzfPV1RQ#<17F*cNzJ4nT<++#0S##u8pK5_T3V zRU3IZA`2ZshA+#*vXWrZkTnjN4JUQktSpQGgdQ9bMo_*)G$?gDDWT_;^rG0PQ;Hgy zVcR=R6|y5Y3I)Wr{DD0uuKyC`7M5u-kWOB!3Wk#E^-$zSQy8z%D|xC2ams(q>k3Yc zY2&yIa7)%pO_!C1oiFlHN>0Z;B%J-=aMMXl*e#N}v-rMD^FZs#PW)XoUEos*yuQH4 z-x8UdJ_o8Qp?0AB@V9j|EjuCZ6klOV4|Rw+h?Ym)sBZrG*T4S!<=19J)eno4AtP0& zOk6Hb6?cp8i|0`7*a4Asig+%d1qH@mDo`lR+eQt%1JA^4QG z-fsdH^ze1kya>8&;1^yE9l~oB+K2+5R#2FsJ`k2?y?Qe|x+y@g1;{tS^eFxwE1$nf zhy5vD$@oXid@Zib7VBvt_doG-9{AC~YtHw&wUlxil~ECn=&Cc~F7f=ghxa}4{3l#x z^KRLZH_wZoj%%L6RjyyNX5B*YEQ>@qXyA4Xd(mb%^WkQh;EvNo^EMl_uub4$QChJQ z0ntM0hb0RHmm?JNBFKoBA}Pt5!i{19rQK!|IPsgG#HN))->GWc-*e6SH=YtNeDrMk zGfynt(zSN^S5MN~lOOci8`p7Bb@9m3w1U?je*CqPjm0y@7mpm6Qi_BP1y>PaDDbC1 z*2Y9o7{c>Pq>KdU1c7G;uC-cZnucZBtWIu4qnIM(iz%|0&62%22APS#I7Z_38Vyvf zK)S|cRPurr0|mt;kTDCP*uo@5Qiq7IpciEk;@je1_;;!CwU?fIO?ITI|8?S*E* zH03?}%BiFLQNW9j0F8#MMjLM!%yJmw34zDUQCVy=MAACIod5$eb`R-I0!3OB+us3bP=upJga%(R)L zXF&*PAB=8hqX#E3dt|5fi62_isI9a3`95*p;jcT}BGak-Fg15}n$y2J%wO#Ns^!6* zO&%<3&WUZ$KE=;zTCn}))o<{%j0!MKLOtLJBQCE=kjtR*Q3(*n9ugRU z0CVF%q5dTNo2iHCS7P_$sA-=3jM$y4X`atDamSjU=lV1kv+)_$=3#s#ad`E}Q_B>* z3RZaMpq)U#9;rqpiW8BBw$4!fx&v427QjAuL(U>+?vAi5y z76nlVR8WV>1gHa^DsS_QZaFN-%Sky2r;ycT=9SF`{)MK$_~=?;%huW(6EJQA^4L=_ zt^!c%PiMqS)F~d9Ute|I$yUpfJfC13o|vBn z`tHb|nt{7xoU5VvvtarZPk6-Rv?(+*Ucf;1RH-70c*wz>GutsU^2|;Tro4oyGmgkE zt@;o1-tZoJyx@|ZgnAD5s<3~k#5-nq9VzLkA_%Q9oENkvF>98xvZ1U%Xp^WoMU#~k>85SKK z5n)pD@Y%Sq=)OKK42cMvq8Z^83ghVf1d_(hN41)J44F92J@L#qZ-vG*XuP=yoPr;wM1hz8P!G*4*<(; z#FFQO$8ZZ~@OOBt9g!d>rJAI)cU-(n!8}Tf!qderDcFGC=MH@EEn zobg6u{kF!f_4UF~@k8+!{Cjsm=_>4IELkvi?~0ed{`&N#3-7(nxS<*tUV*p!Yy`2B z9@a<2huh^^KxQB&K*qKNTBWX2I?IBw6WgDRb2*GGX@)SG8+Q$fK-KR9b|rZ-7N?4b z9@)Ko?PLqycF<5W?HFrcWs4Gry#7J=4Vl0XW)(7k9~1DC?R7@U?L?B>D(^l@dA4Uc29gf@Z*wbDP`9gHMgm%zkL74pWeGP zTdNQnmWsO?w{CA-zkS<=$M7iJh)TG^;~JeD<;^Lpk2kEKb>&$wZe^YPX5dNTXsIis1}7F zK_`#F9t^TO7LCTtVgFyoTWxBHf*J-=A^?B;0VGH|R49v0T-Ze9^GN)oFwezQ&GWpX*J$llOuG*OSb?`lT5-(bW6kw(U z$soPSWN)v;h^}r;Oix*gnVMx>huF3;?g({upSJpReR`fx*}bn%9jol1SL&6v4js6@ zz7G2KS$%!&4Yp2weYVITkA53U@skfVG$_?6&&)V;hC8+7!Q<~W zzYOV47~FNh-7mb=oX$MsJz$h^c&DF-Z|w3KS$>&PgHfx<_h~sjWt{P*6tM=Av~ZeG zg(6K6C_@?2&~UhGhxXmNweQeX$fpUJ>0P>Z&B(ymE$c*!G`0r${El9mIV?=8R7SM1 z8S;HLuS!qAeehZ&&C%wzNzAPROhfD05=V5;?bE;D){LShVyR{DT|(0hgLqsqJT!R# zr%}MEfpmetuT!hT!jy7BrWA}Oc&`S7QpqdAth_$pF(iZI*`_tz27HsyN+pj71}+ed zS`@S_v7C-NCFanN&xrHq@7=59QhJW2v&E$56`cHDah%-JbUFjSvcc#{hhT1=V3|-; za8ihbNoMpJZ!#oOAP#+`-tx1M5*Nwyx~xW{3FLRFOfJ5iyRFS?HAM*82x!`v2!mOV z$cga*7$La11tEZ_hCJ;6=eJ^rTbyC{U^~ts{bk%CcTb(QePhGa**n%XER9qqKQWQg z0m_tPvyVN;ovEog^jz}}cKp}7%_oKY`jVl?hKzaPZN@P{ZUwv+lHv^~7RIg?mCdSA z84O@ngF&tTCuY5!S8u|?ICcMS28QS8v{zqaoOrUKvT+-cs{Hd2JoYGl`X9$25>a@C1;+tTt2iOi#hPfWkk(jI^dk(}3L&i&mvlt2yLA^je~}N}3_)?U*uKSCi0?5n|eoA&=Wz(9NEcR{MOzaudeBR*8;|vmaE)8{APho%1u}-s7x{OLbzRRHkkYR zbY6pA0YWK)glco{w&Wf*oR$FZvt=6ElphgB#Z3|E95mBX)%QQp@!w*D$g@BUOO%1H)p~Cy~}xT9NjQ*$cYR1 zNfOM=VmS^ohat*PQ?&+LcX)e&P2~y2zsRy7JoR)jnGqxI7Ap^3Ezv2%X1;Mqti+(R zzQ{?Z{kYCISUinbN$$dEZDDOJs>rBlyG^G>)GjF7m|$*{Om#we2BKhA5)h1pvHgKU z0JarkGBKXYFbAgWf+>aMGv+j9`{?s8itiqnI7O)pOEH}}{7P4gQgFSnU%bH8bieS_ zh~@>zAB+}DiZY)`=Vmsq*gvyfJ@;<_1*qb&My0gISg%ompY5Tj0a78f46_PYECY!_ z6bOfdkuZy^T=b||^E`D@$G^lHy6(7mPJI11m%`b_VRUcvx6SA2aWMzubC7pA#<#Mp z2bRg(>;e)+aLcukN?7%*)SF%d3%FaY4LlPtv>6%Pp`QkrmD)jH9TF4r{_Z-p<%{GfDfL>l3qSmjnkKUSNSemry9iMJlOZ}E%|j(m0Ll4jg6ZY9^ajV4$5 zR&m2BY3la+)eN8lQ^Fp>8c{W7cNUVS%L$;fxeCf4S2$TM70?he< znN$&v_tYp|YnlSx76j`Cx zj4Kfm_%cXAJFk(~hewz+B|hGy#}7J{_~axxkr={XNq!};{Q$=v_9mVAaY((v=&(Ib zn5DQlTAIF~%b2w}(|p;ZlDjPIGH!ML1NlWmxifvbY@XCMu5F|@vwpJE;lK;`*yk5l zAa<{Srz6!eqmUU9nce{Y&`7n+1|C}n0rtDCmKjXwGFzmo3I@W*tdx09j~-c>o;+^< zjZ3oPrG33w`ChE*1oZdE(%w%mZ?sLR<&m|8`z9#)wowr>&aBqrwL7g4rVvp55UMc+ zW889zLR=yh&@y+x&FW@ZV9J6SDKO>FPS{X;_9R`ov}kooO6{cmdmegh)#{(R$X|QY zL55DLHnS``MiU+p-ruK+ zh(L*#q1a~*Co&WW-Cl5VTWL~&i*H#rsBg9libFaw4JfGsLvxKM8hdVAGjBd^5Qp|I z}9+f1N^c57yNFfx06Yy2n#c4P}8O2H5Q#!VGmd9bPBy3^<2bk z)th6?oZhTAYp7MOVU$w_zmLVW(grN2Y~T=)!|lVy2@3uL zYJou#Pz{)wWoxA{OwtfcM>PE7SKYeYmesvBMM zURhSYdzZFJa;M4}-`D4~stkR7DyW^H5+zU{w>$afP!!7~nB`a`UWP0))(Mm>-Evyu z;I)8?c02Pe{?Y|CL*{oLoA=UNpS-YeR=0bbHorzI zUT5tkanD=l#XT=iI6#y3AD|tcIv~F9KOnyMl;AqBZQq`x`z>vM{@}tNJ!W~tqtY|t zp4U%_4R4*NLtlMTy!hk+n&1yU#^gMYw{X*Bry)x*1iQm_d8C?B8}n-&&bDf`DZ+*V z0-ocwrWh>so#C%Qd?eYwX-2`eOxUH&2t0ikN)jdf8{H^%k#e1!C4AV*5mUB3I&JEFi(`t zNom%bVoV(LzL_(bP3C{(Fh+n|I*YA4pgg4D&*j345DK%4m$o|bD#ZU_HtyoRB_oFn zpGXf4?ssk9`K24FtYQ0&OaGJIxa)(wMZK4m%!?Lh(oy0re%@m7)c;~Q+HzeEe^b5z z68HCceL;TXH@qNYSpW`Lzz^fDK_*$;?)2)k(0ZulZevitXycjSwRxlUn@G@U0kLPy z*xKqWcxLh9Bc7DO@493idjj<+v1PFqjVI_(&iaV(io*X@Hyh6}*93i94&Vu{rJJ zRyFUv>MM1YWTlPD&92$<;0E7@1N10YSoPJAk;Pqda^q6Vr!1aYvbpY2%<1GZr8!;5 zzQ*cN-^!b!)$(?3({S@7GgoY;Vdh9PXErO_IAgR*WECVegcqQOhd2X}v{vSj#WdG{ zS6Fk^r8)ki`?k#3Fz@2mGiQ$KLph`r!w1oI(u zi1@@q4a?f7r+isou2wfR(D~x^=iiaS#>a-0?G|5@v)QMKO+qESbUlg39-|C_q%4d# z7*T7(>t(2f3%pJisLTw?7853yQBre;E*_^)IsM)0US%Jg{pcGmNo zP`aj8ZtJqN4>oW&a((U|YD*eX32DuSB{>00!mPF1Yho|CVf!xvAtkdPRu!`!uMBT3 zvEa{;RkX=kxry9~C+gQfzHjrEN1MgFt0oK^HeviQVancTk3IazGe`E!#b@5ES(vc| z7Ght}LO?RZRM=wV6`Wcn|2z8tB%ziBKbs{B9Qb|WzL_*eygZYZi!chI@0>=Q&=b!XcGs&j8FyFgO6%{mZ+Y_%PDX$)64d)Q%@x)c z{yyvbIr@?re1G&+9O4YDE9==9@4Wr&!f zNPAY(t+YhDXj^?-mqkeEK%%gt6%~cI`y2y&aRy^pfzRl=iT)b53#VYZU85Gsft?k(ANS~IMXem)X z%^75IBr*MOddwoVfga)i(1R8cSD;7K?LCr1v*51qw_~_NJ;+3ofgb9^Jl9SdJQR+&X*mZJ#BfN~KvDm@HpgPP*! z`At-Js|X+vVd57-SbZIweO4XDVh*IXv5$@v5(_w_#x~C6i<(W%;uSx4j6c(SoQrC{ z!sXm3qbFubWwpWLN%}VT4CA8t(5R?S1c?VT5W! zIFqV8TlJWQU;Sm2q1J!sL5o^$1bVc&y$8c;V3vu*Bw>}K&YM{60e5qVG*8C>B;wO| zK*H)2@zOj-3G|rNGV*pv7?*Gl-|9h !}#gv~NV!5|5YF|kE)J0y^zWbk4>=%|6F zy33ntw4%IFi~mIi5@F#H5DC=t8uf}S#Z!v&ic1RE28BXUsSJfa6)#wCtF~p^u#l?O z0eO(1tOyP?MELD=Km)RBA<)+2kmXB7xbwDcqlf4~djB)cr@zKqO|>VuQGqgCZaIE3 zPh2kU<-E;J^`bgJLs^!BadisA9M-epj#W!_dJhcpZBZu{FY81@5jOeF832a~R(03X2W)KY_>5w^fiM0iyS zq%u`hqg9fKkhPICljOuxNnP{%E5+Tkq7r3hd&klWarYQHQrI#Yr@Kef5#qz6X(g>3 zEAC`b-29f8QK|O_V%~l=vM$gI3^C z!Y60tXHxOrtB^`*qqJ4fEET*nk_K`bthO);LX)F!<(Xs2C;+<8w5srY( zu0@%q3gV+xX;sLVOLdx3Du!*r2e;hAbS6iRqa`(@O?lx=}0~I`prdz`0bPBzJ-?Iar*W^g&H3>}H%XNc%hQ z&qCOO`)I~fh@bt9jkl#Mb;>-SMTZT&V37&SK;U1z`MA2^}p#@GHK-TN4KYLihx- z&=`-y&Zf5NF{{N9=%EevXn7hv2H)xdTaB_JHijwG<0^W@NN@yZnJ7Ms9!%pz1R#Mv z!LKR^qfpz&-ZCrnCOYMswrx>A9AVQL%?7zDzP&0Y&lkqqj1f9Ld@vPnw@|*_%`I7$ z?M;UE{_ocr@fs~jPs8TEJtHn&hD3FIhD}Oen|LPAfn7=L_22mOQ@pUF`1j{yl$qzm zp9{VnR*}17+_mEKTOQqac!&7ZQ+u9znDdBVi*Hly=U-9z9O1new%=RZD`jRuQQbYW z*ND@_Z#FcFTOND%45O_d`Y}h6Hei&>X(>_-z)5rnuZ*@>FKGY&F!mmRQB~Rh_`9!6 z?=zW6pG-m$LI@!VA%svuZ!xrpgeD*$9T5Qm5fL#WAkvF~fDj=@mPMq=x*}MRMMQKJ z(M49#wPRTq$;`|DbMBj&B&grtpBR(Oyt(zwEic!yR+`hQ9v-nH+7mQ$5{Rw%jTou0W`yqqZpXl+JKp{;o`#6MGgfDxC6hJr~ zMf?5vWlsUlxa`9Y44%csDMRt_OJ1k6;g^0}9tpDLo{D=%Ek-cNmisDZk69G_TOqs9 z?_Pw1Y%EZ7d(C`ipB5L=V|MwHO-S%SXh_-IvZb4Tdv1dGXyHHK+dVF{u;4OL2KS@$ zogb?0{Ao@Z-pJ0~`u?1m{QW59-10u_=i=|DHTgW>S*`ua0qv}{;13WV=e}S*f)RWK zbF>!x`~jRr9>oH?iC0J!I+glUbO|1Z0}++Y(p-Ww!QwSa#$?1(dLe;)|YRv10P(7%!bcbo6Tf!QQ|Gx(fNYeC=T5r zoHeeKvfIL%kElsAXhXXj$KnZo_p;mm%TJ4TvEhB*g1#u)Lb;I5lY z|D3mw9@!N^?W#DH6Iu(G75pAPLrLEu=@rd`k4W=3Z9@b=#lR~0890MjiO9AskM>XcoaJu=E2HvNuY%&r-P)a4CO0<7zy-ICJf~* zh*4_*=AkUsc`%Az^n}<>vS1Xjy`;f6#%(WQO%N9QHF!sh6uSrtj~6n9aivA+I+smI zPL7H5#yNCy^Q`!oSYS}~s*JHa{mxt`iVHZMMmG*M{MM;Fk~pE^=FxNr4(Jn65o5zq zf~50ndViCs;*3J>X)K5-h=Kh3r_se`wUoV5y>;s!h8Pd-vvl#%ql@d(8={OsHC)H% zl+N{YP&(=7Sj{M%(!JwSh|;-Cz;1&~fO{p%U3d$e(zO=K1&7vxrO|$&1)_AVh4MPy zLPCV@v=(SLv=;gUZ@!Sm5VbRCV<4)b7KmzK5ui~-C7Uy9SIS7$+Tf>RmL@T&V`M~8 zYoFw=Pe5GM@2nr7k?^Q}O-9YBOdEBXHtMK!Ou{ieC-pPw7^$RYoYvY-a^-=Ezo(>TIes1(^`n0SUv`R z-lzpyIX_=Hsb91WwS=-@wKm|}C}ub{SfN`+FSh60Lh2d$9Gx;hpFh+JwA@eFp!FTK z{cwp!UxSumALUQ@*)rN!QYEt~!vg=5FQF5n({U3@T- zc};M7Q3jvehc9MvxR8Ps_G^%vJPhbY%3|1TMyH5tjBdna1n|wz4bO*7D`bU~w255U zH{YbJ*fa9%penz71OHamou~X*Id7%<_*Y*+UxaOdM^GmVm8JP!52AamMjU&W(JcE@ zeBOA3u({0^bFWH=g?zxd7ReiLvBY~NBZMn0v>GC2E(I0*p;B^7oHdL>G+umBh6V1y zaJ=>Y?Ksrc?4;T`5_P>Dv8?ZhzLYO7I(~f7=?V(Gem67%@;Ov6@hxr<;#Mv;2#I){ zrXpvl{z*J>KbP~kY>g)#;}ikdys+K}S`r`TJV9&YHZ`QR5#b4>1&H~aCunWlrarH= zp^vnYj3*xFTtRE2T>VXJBf=Hx|A8mkaoX0}D353Xa-@w4wJT*OgILgppko6k5?vOm zUD;wz(Pi4J4tf>*05(KA30i;sg#nG{O}am5a0on0k?3jEN7drc$;QAft>Nftxi__^ zE|MLfOs#LdkR$Hpr(zd0v#E${&k(40y>J_D2=q@m&f<7}8gevRSHsrS$XTYSb+JEj z1Fxa+2=mM)DEjjIW2@}U==!+1`szS3l^lO$#$Dj zFC)`YX8;boK>+RroF{O-aqlCyQ8lbB7hemU2yKFa3gB*(8$PKUQi!vXa2nbj*!0LefP=<1Y3VA!DeNmzth05~Y z7^13RUgBM{AQP_;CA)IBRhoyCgYGv`Vvw9Z%!*okQe^R)e8qPBxgc{RVQ zxb`W`K~X5|U&AerTLSrvS__;u5e!D_3EJ$=?^k?|_I1b~^oQHETI(-z8Z>RUp+8oJ zYYF{DWl^|ZWr}~y6b1@a7&EZvKpNQLL{0(Nu`}u-8WFPd+Lb0ctX7-Bpzt`-W+=BA9NbI-+Bb-s9kBY+irL06B0xRLN$4^mc#9E+8tW_ zc{no#J4%Md#!feFG(6sv0yo2v==>J&=%n-^MIAb=2&Xid+8mmG_Kg)hO{G?v7tL%K zH1zN923KxD{awv!&$)O$?Kvd7H~1ciQOhq$Rbx39A4Dt6ZsS^=7_}ymeDX5q;aUsj zVM$z!`rWh^NV3yfD95!2sZ2A{M8?4BPHSN>^I!~QHOS^74(XP>4NeJK8-sx%L{GHj z*8oWg7>DjlWZ8QVi8Q#hRjkhLb|(o|XOd1y3D{k**V_fN8G?dYG9rH+VRT3xms|pz zZjqzPlypsJ$KyU0SeM&fD}CH)38hAZNS>OL|6p@d3G{x9oVb%eq@s- zLsrWZZZFO88*HN2o1PmJlbCLh^9!<@o14S>jNB7Zv6)-7Qk-T-EWqKB_kqmP#x_nD zS*@BFIK$RWC578AHGCNY5Nm4MY@Dn@3N>t+$_DlF!cG^KT|s!F?wcj&I<UW8$9=ej~OO58uQn@g{WQqmKNX@{aWLG1%J{4>$j1&5VgEd z1~&mN0_KM?K+2dOmdWutWu4%4^h~b{@AG-z+GAP$=UR`g|E$Nd&Adm=u!|LSVV!|- zfR-Vh&^pJ_I{T3*j|>vLdWZJv!}O{PyE=@okS58L)qkw@7WFz&=E(>AcE;!Eb{@-l zHv$@PdxKl@7QnlaMZj-clx;OyY@*_DnrwE!7U}JF$>P$95&)+N_?4Rr!7+0i`%^U* zu3;^3A1Vdpva1^A0&A!@6p;6+lmFPK=6O$;E!6xWVNU#{hm^g#U zrb|k;dEMS#mGLICsaK`XY}PqT-F6)^WRND!@B8?3kr6aHdl&_7l60O{3*#`4t8Pe_ z;j+BwyS+oo}7TakgiX&A~>fi(wO`w3&Kg@h_jy`f5Hq@}_cs8`gG) zw!Tr$%`JLdhUXSLHt2tRH>0;TZ-MiEt%ci!)mjS?EkLs=a^A1Ca9bR2AvPj=YhxhY zRBNGJSgy4YwSZ}3Al|RFP>xN-If`l8!Uxe71_)cx0@>NLK@jiPER##4Z47|@g`Uuc zK~LP`zhr}jtKn8O6}O=kvW#mZ89Y&ICG2IQR$xm5@`g4RZUumellq4(ZM@uD`y_w; z7ydd-+xjw2;q8eBuzm#fOtWhqIZr+uk~Gc(a9z<8gx*e1XhuY|jem_jqTm9bYHdU< z47XTSSwARIXd!CT&{`m6xdZiqoUwmR zB%T1bf*gfj+>w3KS|H7dw*ZN_`yaKyH7;raGP7_+o9iuYkbJ4NQC9z*)<%@xZW#qD zd$bX?ko*K$_%b}RaK@I}5JhO!0nDstCGahHtRG@xNa*D$t_>OE$aQ6Rj~aGaeQEN7`52;b3jEWjoE1`p?xoG*lann5SE9irDuL7_lf~4t5=y#5aNwo|0AZtS zVQ!d%TcYXlZX_r2jCJx)`1D$u2Tug>zyRH&v}eaVZ~NE3b{)R`es9c#4r2$fc=hY; zs>i+DH35ax`*m1;>R@(hmy}5ltX~`~I{Ftx0pp+I(bpg*I2LyER`7ndaVm1G&I43^ zy&+A=f)T`+>Jfz`$=EtK!`4zX#v%g6=&{A7+G1mEsgfa4HV_62IkI47;A!jdtdMxy zAX(BMNCe})3#1!!RDMQ5*^n&V1knedyE__|>4uLh9Gu=(nmAGP>^~6NUcF!ROrC$& zxP=J^<8p1Sjep&gH^Fx{WpCFR7rPb|bnQ@FSgLGT+O95>tyX8qAGCRF{Jpb-ZP|hL zt6Nvasul9mlJzYdt#;<9|1Iv&p}44HM?_I``!{B9gpEBHzTaNL-K9l2uC8r6w9bl& zF*j?bYb~@*a_M{bL1cI5;vNM~vn3|0SEU7r8!0Jp+@v_{>2Tk8O);{NtHpzcH;|*x zBBk(jzLSS4hOI(Tu^;(RMF9#zWe5`G!EF&V4&5KYaWsxb1R#ENdDsW7CVQD2v-=?? zMgTkF4$WOU`q^GZ74M9{a3+G-!D<#v7(Z{``0)=+>%y0-O{wmZqs9Hm>6z61x6B4W zkB8^CNm-O#&=k=_={R=oeRqwWHFs3Ijvd?K8=OmvIO81ZF*=jN97L89hib5KbI&?I z_j|P`7+`epgw!K)@_9@QZ(~dNi8$Vdq=n>wyKpZWZ{s+g0Pld*Kk zYS0l^#jA~^6uf#2A7&O{vFwMx)`px+qh4^>&GJJwO4o=F=WF1c5fvhZDkhB(gwl{N zGr?Ewowji9(4~(dH2eBv4`sDj`mnEP$)jz4*CIme5u*E$WNzAG0YMNI#OTo+z+RYT z*1eM+9zM70ldYiJGjeP zjyN>5R~fqu&!*$q)yg$(J{F13$3WFOBEjdxH!?B{l0}N4EYRu1AuF~TC+f2L+&+G^ zX`<;_`O>l_dF|p$yFK^>`WAL6B1bha1FHr$CE&SZaiT!^jpKrMMQ{<6nGs+DZAfheNOo)|DL2uz zl|0#l`u9oAFR+cZ&KlloNO|v+yw>)+tTW}y={e~gI?h{$A0?gUEyFb5oS+EC>&m&*~pFFIPXamy7>PVm{&01TAPfl zyrQ&>HtbO3H)ZL*M?KwM=qR^o)uxq}2E~7B(hNMJCfxANFg<`)s44Xu$z$e_Shkb+A>hGTU9MVg7{!B~M zCD7XW&n@kI4*P(}d&)=RGR79to)8lo_q3F^(t(+p_GFDbgPwE+)C!x^xp6Bj;uEa@ z3R=xtlByYm7xZ(x`Zi91RtDf~@3Fi>srcRJo`z)n?2(vf6Y zKpqj)9N@JQ%ov%32!sVY2`faJQ@RmaP@^2)eDgD?OK1(g8F?DDCN__>&h4r?@}1#* zF3s`YAc<+c6NV^yhk+FAjN5czOVMI9fH)ya4nQ$`WdbeaD3=1lG@{6b1Y8)&6+}d9 zWOSNHfiZ$7rX%E0v!0|h0d-`bQO3G-`S;L{H-8~$$N$zz1?xNi4&3oW^&hM?3R|~e zt+2e9K?RO1c>#1}+1F;ot>ijxC1;qGAYa7daI`yvU@@a05whS(EP}?!my^UsMpp{V z-Uaf-!|LHXyn$Zo(ZizSuhNd-u;ph6Pg84~@H^2L4sm$($m*#hyD8SJH~LCPUxc-7 z2C71mNiT^y190fHr86Pl1ySBESx?Y_zgs%aRIp@JQwZBzcnX>7af77g!P(NGV4Bo> zgCuXPo408bdJgXsdd^4BoN5%RU!tc>BZh((f?@#O6Lf#-b6m50^V+4%xDDOvLN3EA~M*yXx1S|Rk7Oi1{pAQmZc~cIWbY!#KGwkRK^H0`n)t}p3l`SU9W}?WYy*zP}Mb6!RNZw#+|wH_ObT0#fLBa>#bPj?4ieQJYB7Z9=>|@ z5hm~4eq(vC$K_MU-hJ=LYnNztkOl~`5VI@cYmMtp`3Y;CL@_cZy%U)`EG8C3J76XT zU??`zi3lk#fwdAVAVi5Kx(GM=hn1kTR6-^|WDF3fNUp{3=`S57CM~JSIZ*%P{`2o8 z)FfRzf8a?q^p_m=^8EkpW}m5n6KAAx!L6^qgx~#p{&>r{eTuw{K)qLWhs+`%NiS>qA%77am!3ojnfxYM!&|r=E%19p8v_!Bw1|^85E*NRy|`CtGow8-MwXLOlk8G<%UFA6^X6WQ z%LTX{mxHwCo|Vlk4Mt+F2jLcphLwcwRjUdrfoW2M!rB5c8nb+6&FzjTqmu(&n-7jbuv6z{yfl9ZHLAM?xAb+_p4Z znprR-NXD#T65>{l-aEK>fHKi&E=2GkIk?9iiU#TqK^y$84M!z(a^MMyy^bU`ifcdq zO?`vSQ*V4fZAbs=(C6E?jodlpx#wU0>pdf$+J%7dcaEqZ6&PBmt1n#jXM{e}wYmE1 zirPKFWqIivwr$(}#M)&G2pQUhnb_b#b|L4~VV9XA17g@{WHx}4z^lU}N;R&7!KJl9 zr6i8`(n$o~i%t|hhf1^6&b8M^xeZEI_Sd!Ql-7l+XEe*WSMCrx`pwX z8LQ5oD7oj%PtDaIm8zAC4*}}=O7++|ebW8YhOghfb4t68@y#y3dha`@u6=~-q`}YV zf!DtgN}2|dW-*$eC?NK>GdYZ-vSj$UG{W;EG@@v9Nh6Fj5cprCzC=PvtLuYXnfPU2 zT{bw83paD0(oCO1N`lq?i3_!2oFeykJc!8ogS0VwXwrnfmAc32!Zf8m^^LC)3!x_Rh7 zunL^4yw4r!;}iUo@^`G3dk1e$9M93M_U@C+xL*$7PDj)Q?(~~MtE#|iGm z5we^GR28rGa{OS2;jd3upTBw>08R(Hec$OX>~Cx!%8WLP zGfyX92PPkg!DAe9r$8EV@WA`|cUDzAQPsBF*21o{R=xSg_J=MluYPD&cky_^!=EmC z_AfQ!PY0hEFt%eeSJL!hUDn^#Yi*mNj&Z4P9$4{irls`K?CtrMl}iRZdFQOD*l+Hg zhR01uniXalhyDHqbVWH#NhY)24UAZ`Rq^^V^9ahP`!PUk<8)?HlJGd3w{62vh%2{pYBT@2Qt%KavCe>V;kBFR1$`yz{Sr zLWS43O%~kt0q1hZCZx@1{bG&!!8*D36QK=Ptons^7YbS|>f4?A`Wxn9wri2$P7i_&YFjY&HnTOWLk++UwT=+eDk1M_oPA1kTZ{6 zzW?6P8ppTb-{0a)4Uo%0yTzpesJu!{Y_dMp7f@miF(^Hp;KYEP2|7E6-vooy&NL1- z#eKmk#Z`LZ-EJU5fnPT8Zwx^q{3I~rI@?@?EYV}e07aeiOJV*8w@*^manNN9OfePmcb;-dvFY_bBm8OzOg z-{+Kuoj4nxUfo%R*tZ*X27awRbX4cMIm!OzKkol#uX_C#^;`9Ahnm4YGO|<@ukeR1 zpZdtEY$h%M-Tee;E)%0mHc1(7H=sdN9Fo*LE5qp&5_NVj-~)SBrU@W*UYwYNJ^~^) zvi+KePf3MNPPJV%5H(G&)i@L{$_i2-Tn`=lE@1HVi($2{vr`%uEqqa-& z*~1@qH+BJjwYrtD&0FiYo&0dsLRO@nd1%FlCpR*A+Zy$^Z9(;)hsoY!Bu$MnK{QPb zo(qsO*A}&uhKP50CVz(OYQp4V?TLnL5q?LIK1g>2>5BobPe$_*G;NRcK~3AMfDsSc zpq4$O-7(4uu1|)opky;VgR2W4=|oa_d6R(hRT7 z2F%z5k7#!SI?fB&0k7AN7&jM68o4C978w_|?KQcA8^xn3k?1(kN*XsOk)a1Qvw$9q zc(n7Q+ZGKUKXJ(lbxDnSKsus!V=K;ma@ynF;C|qqB@fLEB~aZ9b=2Pvu6p?*W~t4A zR$&aE!yI84_cnzy4KM@PyyVYdhlr&ZI-TV7S`?=o7car*DWR~I2c`%pU@$|#;M1TT zHbirgPM9i_&B28$gtUW5RF^(O>iTc>=Vb9>D9gmmzwJ7+^WUh-w2RGS<=-9bwNELy z`Qrxldz4y1iLFPFczq{ZJ#^h5jG9N*AQDGMkvRDKR%_({51T}!{t?>9!M=)U=PP|0 zb}Am3=)HjRmyjU)A(B~v%p9B6r!qFy?Db;KUdaq(0kca^XoM{AXEAIjg+fRXBB12L za4($z6-BrL(L8B=n))5M<}r0`am9e;Q+kxY&|zUwZo3$;*7O4Hd1lK`vWJH=qkPEjkTus!%4N60=TGTvj`7UANtV@3B(ncim8FFzUJU)hetj@Z@*1tn*T}O< zNIf{ObA(+Qt$QNzBMG4O8~Rar;&1eX*j5NfU1-rEn86u!3Agx~Ne4xl47dZSE-h+G z13ZN4hbS(Nf>}UUQiD`Q<0gCwD*Hv>ibc&mpmwSef2aZ6>q4qjr6h)JuMK_*ZC_=) z4Qa^>4xZu?j41Rc>jhL~FnSSnU__lQbo;xya*YcPpi4T0+E#*BkX93=KY5`V!Zub& zqe5k$o&4#(;IBWt{QQB-=UL51?U%)+VCZm+L!(_8C*wIXSMe)R#95BSgHlFIX=r{+#HWTIX8m}$X4 zdr(0!Y@8$n94mcy1r57qZn;uoyo=I8Q~pF)*ihezDt ziNXHioa;_tgicfz_Uo)x$!0Pdm`!l%T@d+DvguZKE_r?u~pO}rLLpl^(% zFKDe0R`uqzQi)oHW?z~`m(>D$8;cr>v9YF%41eFs4A}&ZWBMI;ZKRiR!8lr>xd93? zYHNdl7LK8ie)j5>k1m|Mx@+0=gR?8f*HvAumq$N&DAo{n zX!W^k{kONu->~x0$5*X=WXePNeedme+iMv4S)AfQSVKE}EwMIHwCjvURB>=1OvYjb zf3drCuulMysvxZ5L_}I`Q{9v~ilA;f!YHPecJ^tTL27e+htn85dmJED7q1?cPosod z`k7Dac-9~9kDtne;ZsS`X1IwpEFwCUpv!9*kx9rY^`d&aj4J7}YzEPZdKoZbjVlpF z_K_b+zIl8f~e`quSZ}o!2YsGsOE%d{Nr-#F<1Lo6hetx(HBWY0kM%Tgpz8W!V>DqO6GlIakM344 z4e{Nh7@b+jFO5S%K|umwQkd@w2F?OC#v2x|8?h3^ffB8OfoPn!c4yr|V!T^IUqv}D z=3j&Lcq6>aUbDf8q`V-!TND++VLd&%8D@cz&qHz@DGKGC9;(7t8>br#5P)U1Df z^7$(@i&l;K>%JOsL}BL3FNi%t=jYvra^7!g6ssrP6*JXUkQvPgWs~?lB1#4nr3#}^ zY05$a&4w=$?KZ}g^z(ijP$Le-f3?~r!Y>kjPodZ_ozap~*hX;*%r>hP2{ba$=~9j8 zidR$*`w+t%xRFw#9aWM8!s~|L(wwNO*sE6TT~oWOp|hKx(>fCOr`z3!KB=M|?keCU z%kZYjI$)IZ3;-jlC_o57jW(Q_i1dNQ{KLBnvMsz;O(10ypBnm2?S*pfH-7;toGbX> z;EVhIa`sbAINBI`@|+sKe8ppMAMvWSIupiX!m0Hko;gKARVX`ZE_mqfjKkqY9s+`x zy238VR&(|Wjo_l1!hBVWKx-Xw(=5YH!)w{c z#=t`5wM%kBq7MRu&u39A7=p#EK#*6OR(@{G%vdVNi3JKSA`9r$dkazoH#rsscCmI> z@7ixKvEp6oI<@Art%Gatf}-y+g!065UYO7e%ATw^pdSB3eN3HNygnwC1(;*gH3rOO z;SBOGD2s%ADv-LVzKGkZL)f#qApbFfTbRG%}W=u-_F=L4{pAB<~A-Hz|S{QA3Z{`1v!)VJKO z&P2xZ?OI`0zz~+JGY}R*fe`r!gP=f&^B6z;^>R7()vD2ajKyL`guG5N%Racw`c{&B zC;}y&z{o5js4QB*@plj>*hq4iG~;rjlT0d(K!LbGU3`XZ*|`P_>Sk+dK0ER5Dh}ietr-4?dxO0xrsdfOs zhimS8U$Eql{OX?dt5@qSolZ}A>)-0lufJ4*r;dW4-;}MKol-5XMk>zQ{EiuG+NTD7 zeXnA)dhv4F^a!No> zbSJ`^pO|R2Sm2$s*v%-qMMW#Z^bqDKjU*(EpTT^nNl7|lFDZl^)97b@TRCgNj1`No zeyAp~t8CMfs;%lp_%Zzc1qPB(PfNttpq@D6; zX^Bu$c?^+=>a=>D%wWpYN^V7N4bUf71f=e&t6E$q9S`=zXG9@OT`Et+Z~uqvjEY(I zi0lkk4$b%fEjyFcL9%liWM_He&XBlc$fKK(>a|Th^{aLDRCOuA*@>pZ>}zn5UQ*kC zsl}^FJ|O!E<>>1uz6P_C!QHPQvz1HEAZe!w6_$_~Vx@AKW~f3as*Cs~yGd`w!2Vov zZXz`ka=W;DGkfi@+LrzJikiGx_5Yn+M{PoOO70o@PIQO93!M|QL+|tN0{R5f={ zMX+q9k{467!V_q<2Mn<~7&TJ^sc>7`Q~jy%eWj*)O3vZAxcqR*T>h)Y=E-GTsHp&p-H1PaWk`g*_9)#HEaIsWfcU0W|$iu-A=mfjR z`_oyV$-axt(}`_6a@&=S+pfanvEWfIF`ICLk*2IiQBu*QnDm0dF6(I%we-ve=>sbi z(Rd1+Qtn|jQxslRE!A`yen6E?>=Sx0w`PyQMDIg7U4uo0pD}Of2 zy13TUUcI(ly;kU1cb56HcZ{4PUaUJVEo;9y)K@(EXusfGkZGUkjds`!n{_e_J_>^; zNHJM040vd{tTU2(QOetF*P-H(wz9b+BRqk)6ODv%X-iXj*${C;b#-V9)>bWKXX}ol zK7os8!QblrqP^~owdPT1C^!S@(O?wewg;>YEi%7yqFx1pwj^;FX&Ta|y&Zm|1 z(G0BasCtDHKbXtl=!fH->4ct~17tz4B7X_5xJ&#^LF_A2ba0gDB0R3KpM-aV(w}S9 zt<~xdX)>`o>G%`qiRaiL!$&8KK+DL&gblqXJo`>q8Iuu@lIb!g+GRP$qCgT*ND{CL z30@0QL+lnuBFeph`{}$&V|%(L_ebTnhUhYnK*`w1RBR(q3b+^99bO+qcEynni@Sn! zdUf{=^;71r-(JU(>n?;;#2D zsa?yqYSgWp!RG^g#h?gACd)>ye~ECzKmmhu75#;^uLh36&sRi+z)$Ha`(p3SF4gQ> z^(yID-BE2q{Pt9<^x)E(#)33|D?0i^2?;cMl_h%O2Q~7!chN8Oxt& zEDfVU*Cd0D9DEufxX#a*Q4esT@rysPOeDaKb%7zAfs05ZitE zA|xMH`pAmK>)}J0i*Lp*N zUjYXRGGgOh0eDkmy@gvSxQT*v74rOLBFculAlQ&+=X6*xeE;7}5HGSE`*z;FF}G;< z0O0+Y)GMCiwZ3M@kFBiT(RM|AntB;7wx3mA8xV2r1sES`ECWk(ey6dJQ`G|I%gc|L zQ5uPd|486ngknc4MN37aY;yHQZUB<2#Y|$IP`xQ0s7WzHU4dHv>H9Zr>ecFM7Vrem ze~hGt@7L_yzJATloof&i@U!|JGyjh+3bpX_IwZT_MDq8gcR&0P`-w<*2?ZV@VRBk` zg0gME&lgRyH^vH*5)BA+H5edR8|>!j#X++4t-4Bqrm6s0pWh@Na&n}8`6??}RQ1-2 z>_64&H|npPZ)Ee5z50Kq5i?>KXRGO9+AoDzO4ae#S!Jhdn2KqyClaa*ui@2cE25z zPvKoUa6uFp#vSpxea%uNHU_XE9fx>vDe7^HhP4F1icsD4UbJu_6w->48H*iBmz#> zZgEnMp&qh)gx~xLBj)!fMbRNdggkEzk|gnDoT?P*z%Liis{PdQs@nX;=h}tE$^q=# zh1Ql!R1ZqWLpRkH!dN)Oi5*;u z+3f}=iS+y^h1ui(>1E^YTRvdz+#>{~fb(l)+6tG>s^#iv)l^%{ZdPAso`*IA1E^#( z2FWGDo>WIZv|nS|*clJFHqH)K`76Ft#KkR~>flAkX`2I+1#IV@h!t1hk< z`&O%~s+E)`q10 z_B;=V#!4qlS%#KSDMS%SMnyh`EF;7%qJ;~wj@P5|5Z&6u!628AHqO4Urqb3ZY}|!t zJfUg6xzG(oin!k)n(^<0HKifn9O$pJ_}WEd&TnmD4m+T=kQVVcHf;euNyIGkHlm1j zS{sya-d;OdjL_sLc0M~MzBkpHsNJFssBHp)bl5?%Hb!G zI|bhxsx}1GJgL0?BKpt^iKVbu!&nXbxK0e$kAkX(uYB6NLjEO{2lq>Z=v&QOzG691 zRGf5@b%#|>FSrgf1tpd#?T2S=QccXvwiL*sPq%o-wp-9OT{`I<#wi_O#NgooubXIS$X~Oq7d3MZ18%59XC`6F7 zL~TV!;q|3uh?zxK(z`CmnHFmUa?#CEEO9&>_9Bg6Jj6d~7vf7TGUHOPV2~_mL93)j zAx1*kBOBlXQa7 zV>UZ&h@^EHZB{+L6cjio|B!|VR@|soAs=3&F=CYTSM*yOZA@gmkwN1HfIf~!dSb~3VGJ8OMBzdo2y@vVhX1|D|q|d;!!&%F4 z;r(&e^6r^aC*3z|@|1hUZ|6Puz=FApm(c!gs{c&cFZ={gAsjf6!kn;NgBc1=nX)DI zR4L6^0*`_bw@qvqDWIn?ytK98P)w}>77&;1PfyS85YyGRqUliR$Kj&BB{U8eL>J>6~j{IJD$ib2=c$pj;Z#tPla3?@foW(ilCd z(OZq{6E%AI+rc9b9U3{9eYbP#`e#_XO?$*i!S~lm+2W4DBZpU34yU(vJ+O8QgRd^k>I*$m7C`%}!1hPjY1gB$ch`1^^ZK z5Ie89cK?;CA1^;^x5i@ zLb4Ewc`6eu>14fV;3ULFD6|gPzEl>5g6xnWdX%+M|51J5faDCV7rTc}u;q)P>zEeH z*&9P&ZNy06d69dgK2*AJPid*u=yawg$D8djqCGw_1+_af9f?Va<(1YXOG+RGm16_; zfIrYV&_5uP29p%<2|iC*rSJE3WNDC59Y)h+!eb3H6AU*}FFgh$Ihz8Hu(0N_=g&^1D5ovT6}zQ_2K|8GTZv+H2i*^s?18l z7DSU$MJ=xoKnB$4(xTMF#H0+L!-JCUqRZ$rC+V_VCZzVObhyhar3ACXW^ooS0Pui%fNe3<6gTPNg4ef06=CRr%gJ#?0g~^XS&dv|$@%M|1)n2y^ zk~V(!bqMuHE{48ey=yf`eCQnZmSzYuOFJj|klz)LdJ+2gW=`1@@6%;AHzPWyywVVh zStXTMipln5e{yaz6wuh@*kpHVs!&#$s(0H^3^+W`D2@H;_C>fHOQ9rWeGCEKMWdDl z3Hz2=ScLym1SM!lN>ESsXKLsdQDo=UF6n1$wr*bY+;{4gR@IwCantTh*6h18dwNwP zgLB&A;?kVOhhFQtp$h}f|Kb)c2P}rmy4jfJLvXTJ*581a{3LeP4j*B*(4(|jdO}JI zhslEscvA~8LDw=TEm`N%$9k=qu~vK$U!rpp=GnM`@fD>*ng_^`vt`buIoyE)gCqG> z(y@{B0%nkw8l&YkDt^v?*`j^xme)MHZe@)cbMU}{gQ2&o51)8$;?Tgr0iS+6b{IUY z#7*ipJ$>ZZw(UocZ~gxJZ!Z6J=iV36?)HEGO<;UFWG47JrLDM=5^*0P5<4wE-fm3t zN?xNyPR~fQTjNZM#VuMyi_Y%`)1_LZ+9VpVLiruUVZ#vTOk`K6L!5X~q~3w32l2Tv z5d^z86Bq7x-D%kT#D*QCN0;Bbp=x&3+kY9fe^IwiOqlV0^}!eS{ha2V8I!?&di?2~ zj~`Rt>8oCwxIoT+b;wk;-!iZW9RZ{|g^($x=kDaNLz#{dJV*2&U7AfJ>1bC12(@aAr`Z^8 zr15Pj6$WDDH(m;r85|p56>AK(O=588+U2|GTTR84*uVeq5rc+^Kmt`iof^d9scZk= z$E9AuBhMUtX~#1!zO?P$IkRWYy62uyN>vs1C0)FxEX6$akQDltqK=^*ai30)2R=I; zla#o4pBLFqPJ}g5;1H%>%iz)0n8A#T#v z@HE}b*2o*8MoWy9033_*m^o+dvLwLOj67CYzN(l%dJih6tl)?Ho^ zF+=Z%NlWnPrK}d_)LxY~*=&xLV_|uZMTAP@G$0xelnv46fn=Tk-meC>Q}J z7Js-{J~S3uXr8ek7e1?g`+V(7kNs!km^In5`bDQFTjxI2_uUUeyY8&M-y8SPfbo0A zkC&>|n`+@#XI|OI3U-d{H;k=s8F<>4u6|qh`jbrBFlOo_Hy@hwFlLd70}Q+mNNyIP zd8yl|m}Et^A)1*f2!uxwLC~)zT7YCV*Gpb&ijji=fg>J(myw;XW*6#?i-C^K)u4Dm zRl84A%5NT+AS10isEWV6MKa+T)u9B?kLKA!;1mkm!P8FhzDRhy)w9RAT_oU?=LUl{ z@=(>Gx8C?!Uwva3S}Ic=@+WAC;?3gqsJkN=M3WAO7!jKqECvQn2|&NIN|R=&(lGkIFgqTtzBJ|{FX&G7wYAXrns{JqWMwd#&5|Mg!DLz+$t9$ic@EF+nZA&EZ9C+3g`Td zxgr4DC9Swe|oSEK*bYXR`{PBW+(>4Tf%IQ%Xcw!b&^{}3%o2uNtT8E zTjq5-u;-b+B^}!z)_EMuyg%Q(df+8@mG@`G&n6Qu8_TNTEA)ex<&sp|+@2uWrM%Xe z$;q(;Dx>mCa*NUy%?4B^v?#Sh#l;&szb;oto8m%!*a4`Bi(=|2E-2r*BTr`w@v)9` z+>POgJstnATV7~H_q1?4l@|G;TG||rEK&-kKY5)EXuGI*>bh?C483i5PT@ms$8YX7 zV`!h@dBqPEPTtVtzCk_i%qv=4Fm6kaIsGec7lqQ|4bv0T194r8H%?1RPmW_7x)-jW zmXewj-?eDN^b|ld(Mg&pRLfbY3how=hodlu*=#h~5P!!Ez?gyydqAbhVAlc3T!-*g zaX_UDa4xw8r@23q#O~J{D+gT2f$fRH-`qZuut{u_G7*IS4XaqB=7{d9h0~Z%ty#=I z2z|9=Av?K@IhHYh@fXX~>&w(@Mc~O=_3BHo>mkhqoErp->ea>F&&B($6ejED@O5BRzs^@k60&6Qq<6cv5FKfR7Mz6^A&mjQ5Q z6@VoNUxm#iKcpuTz6E;P`9|3rVx0jc|uUkO^tUk$q=Lk8b6Ckdqr%<+=S1IaudVPoOo_zdk3< z#t9?jum8LLwL8E-SO|mbl0G= z_;y~WIR^V{!}>ZcPRLAdzhu+uh&SHfNU|syN^l!$c9H{wMvWRWWYnlZa2TB4zKxY^ z-!2P#tM@!tvwP1zwdmVV*lYhmPaf1wKct+12iil~5grBJUI|QGRKSgxq8RNSzen_V zB%9tZrQn9+Qcoj;4OlAvBe4uHK0y7&AA!O)MK(#V7Y{95txji~mM>I)g65r^Y~Cw* z-g;|1u90)69_?qz%*k>73K}XAi^OG04Lm~Gr7;dE5h=m(lI%}*!_uA*n{350hJ$A! zY>{`Ux!%E6C@xj=HG{ikx^XP^ZCUTt2WqPOF3)PWqV1j2r%fm>^OpqJ59$(6Cwbzk z1uLHN`NI4r9TUH>5YNoQy6?ie`-C*AjG5pHz?O;F$@FH)2qr?hk_b5D z*qDGpqDtA?TA<1yHY2RXf;3TkJl{twI~+EtMU!PHkrCor$+~>GZ(f_hD>s-7Ni%O> zxUPET=I2@Wfp-lZa{E1#rBh6)x8Lj9T%BFA?!hN_zkAonyZR3wR#N!@ows7_7ujNT zxHVwIC4YzBAWF#s-<$A2FbXo1$FN+^%luP6)rDU;sAmfsN}9?0J06(|vC5TfD8XV#u(HkpmNZ_pI&Sulv9i z<;oj#CO%x&cl*p`58c<}zE-V9cAxNIXhMfReL8gRpJ+<0U_W#y&g~UwJEph;b}J1t z*$N4lYMp_0s=2Iu9CWXNYqyRXZV&HEnPbU-~i@Xp)ssF-y(oO3_b+u=y1SxY;mAxPSZr!6exjj7XF=n7KDEnPVQa zhbA&dpVeEpu3q!hmbI_Fc6v;=!FgSAb9OHrSjonwLMHlbOLlr+^`>cpVF+8J-h1a= zBt2KCC-pVB8zq5ojarq)F|#in9(WW?%Wl~`*<(vhw%L+XB@uUduD03OQ@)3Jt&NgG zN1f-c6QA?ZX`zLM-W3x)`*=rErP^RcaESCx%Px2Kd1+7oI3#$7w688Vzf0br2ZvT|Y1iW5fcCkC{n~cFr*Db+UFY6?I+gZ8Eg+H) z#5>5Z9j@F{rtX6j0?&06Ej{c7gl7>_2zZ1Emc1)L%*jF4@PyLh1ijDPCcTy4pDpHy z>1Mr4SJcj9>s2WPS_OJlX1B7p^0z|G7f&lsE2Vk!yq=ZKnUd6iA@X~x9$ty?evOjB z5(%+^5;lr>{1e?t+WP3hP73gPW=1p3C?>cIV$w4Zu7EdWd5EljioDFZ4tukdxVHAd z;5&zov^&0HbLA`QnH`7szQcqTtJF6Vk1QBDhPkEkR$bJmalH;LUNGO6n`Sr8$s9Q{ zZOJ3;&x`kTZYfSWvE<2T)N|?wix*#H!kztAqRtIggi!uYf%i8r^&sKV@Z6n&ZZXWM%UNYo?@%~yh?YMXjCcvVp zt?gC1b~}UL-X8i)%$2HW4_vSo%!O3v;kaX&NT&+~k~6I)YqF#R?wA|sJcbxEz#AzD zsab*m8-N3BGXhOO@;E3D#;(YyH0HvsEro3$kP~!^b_Hdo>0pEib8S@c3bXG_G3)pn zRqAI?C?DLM{pPVxx*NKy=R0?uI(y{QT~kKRo;Jht<@M`K4}h0o-SsaIAC}&JL{;zJ zzjxKb6DQ`c+4sEq16fqgKo*#(pAG4~HLhav+iyknJ5XP=njvBlbZ3b^$+E)%35ksp&4^9RJ^e9x%}Epj-9+GT)7v2b zpP++cJh)lefu4zf%bJ^4uKwq{dH!_&$f9m?)r<2z<+a6gp6S>-tI*?i#3uqf1#1GG zLw6B6N2bt6#L7l>k1}OiL?_Xm`h)lT)B6}LvL$unxQ91D@_|=pcRCYccrxqc)HDxD z)ENCpk4KRjfUHImj412`&Y{Mq8gt>vMO0Bf#n(wJEPz1|q3j&BhnGhcl@mxxejSKm zJJ}f4jrDjTzkR}CThfw=qw8h^WA)en{>1CaQ+iRjHq8f?ZWAVXpL#wMh?eR<)whvy zlFc%aHFJSRj;JstPQD(IY<$SIabY!LEP7zL#8@PgDFtW5^z zX&8EA(=RWOyY}-3P#yQuvV!*UhwT1&6M6;zw*C3PYA{_wdoU&`K=d z*UTT1_6K_&Ieqd3qS`Sc;Cv_>KqhViD|nsU0(8mI@aVeZU)cXJ9uLG3+A40zmnHmHt#@+@SKkE*kDs~|<dXVS{Os&3-8d84 zE>U-=V*NsrQD4*v0w5zOd?0L$<6;y=I;UoYN=jNZZ{NOoi;|y;+qNw(Dk`G03f>4@ z6hdBU&N*MV`VSe8o3chCjm|sK2>v*nbw~5&Ze5(*GTog{ z*^fwW4kI67)p8prz|qEI5yMwEg;ZkVe8VY-*u~vhSXhz&&NB>PeFiH~c6S(+)8oMn zpEIUjtDjms*f3z&^V0Qn2HU2ErtNIoBiU-Ts8MUYkbx&F&<+HhVhwCVMJqdR>E^n(%0j^8} zBzhOp-@QP_!)Todgk8Yh$bumr24@3OjYPo?G!mfS@Ph{p0?y#3 z&UnrJ1APF2dfX8Y$w@=Ah{9O-Sm#={OC5Da%v1jdJd26yN%qbAue^Btqr>t|6#e*O z9R#Xz?|dXr2xc#P^6~k^S!tYG6-2in;ug85um-yAW-n|NW-Fp@C94g%NHSt?fh6D% zY<4pOqa!(nU=K(>Z4@sM86uAuhy=cqzny~Lwb1*$Y^b^yc|b2B9U$<{H`SC`ShZE| zy+VCWJ%?m~6DzI+&uL+tu>6C51Mp_1AkGvOk=!0#Y?4KZg(?zAO+cn@f~<4-khd%O zd>)9|uEqd75ZN?@;>K_U8WG=u!y{321D4b!q?1=RLs|8i8uW{Q4|PN#vHxv(b<@Ap zlj!`Hzo(=2?dr8~VbyZ+FMJ zW2bwV=?0INFZkwH3VPmMv+~4?-t@I(d&574{5*uQ*`_oB_7#g{MPQhl0crs}#DJQ( z2FWaOPb?2cBM((HhyLL*q&pmxcz zrD9EJ2z`^MTk3rN$#G+M6OF=(AyZZejR08Siq2%wSyA~C0W>H$02DN2z?zU$Ci1MZ zKO6#T%kWX)*h|QO0P7O>vJ186XKtKzu9jU0Fne~pRAVA#f3UAqAAKWxAZP01lSj}9 zz|Hl*VTa{B9=7vzo5^GrB^PMUpf~Fi5|QRcwC9Pn*lcEpMRMyUGx?<{0Tgryi&$7@ z=dxg!nMPJ6On%zxh*%w+vUJs!wd!ZbS*m&`i0&%WZ5Jn;2u)y}<|JC&X#^`2`6ikZ zr(?Bxv%(>{-6mqJxD|9Btd<)m8kwO0?zSm97N?6vrh`5{!5~`*IW9KFo$KuE6rG6R zvm;?uC)&U!X~cALU=#YIAvdfdxDY=yZXa%aeL(KX-mZCP=BDWvYA*mKwwjH4ZKA=H zQi;+kw4zAbi+p2M3)s0?sdrwYbw!-EvLEZ}hs6ppODW9m2qY&bIYg${HA_oo0lz;0 zVab&Q=9nrbCB^zBhar|PEkEFVkWD1i@Z!cWKy$j&Bw(2Gb*B7mDa{R>TUMw97ywy^ z&Dk<8f9d{ZY2C+HCe*|azpG11)v?EN?^-`c9WT8cGBKdPFIAno-phBR6zrK9qccKX z#g{YhoPkjD*Pec&kDmRobhBDavw*2op%qVo6|20o1&GO!>W}p&(=_zy&HOAiB?U;* zPMa$k*&1mgJWeTg%!4m@!#psVMxu7ZM5I5MhosFzUas!HV@996r)rm`wy!8NZ8rBC z)Go8CW=U-8KGW|||0<<~4xt=O?@8(oed_^}AZ`!1qgP_+SJ4z-I!fKo26UX%Ki|Mc zPgeaUU|`8-R!Muy41c>jh!$or|mo4mpx#L z^y=bL>~zbG+3D!m*Dw-)Xhj96gC`!`fGZat@#a_hpC~A{4cvc)4tF>}P)5F7L2+0rPoDNgs)n z6n$CtpJOIVm)qm{=4X>GTD*AJ{lmv@8FJ~Rm;Pqgi7(!G+HQ3GIn8-)?u6}oYpKyPLFO+RDbJjIzG* z6@GtiypiPVA8f2IiyuB>NdJMF8|Jj+f!zmI4n(sK>|cyEY5{C$N!7vXAe;>sR96=i z8@c`a_k+2ozdtuWrRVTTDbd-Vq~M$nBt4X)mHqFaRk1A#w&>KXIQr=9vq%%+-oCU` zl4JY{h2(F=1+lhLWL7#9~<@E$uY4{#|vi%(BW^y{=t*?7P2zJoSp+qb5zb z_Sefw(#D5=bHkK79^AWAHEnwE?nUqcFmm0*y6b*EW!BPBYbW01Zc3hSp4~s^mdkMU zfB3<>w;Os!kDgWKZg4xs!UF-OnAG_4FxtC~KYY+PXV%Ywm@6 z2d3NxBc6QG)!-VZrDGMJtTK`_6ERID`rRrShFL^UiG42*YqkK^Y$?%iiRc|KOdFh$v2b8?K_O!&U1Si-$y)UYOOiAKcXQFL;I8_}X2MY4lItth%!MZ5;k zWyIlF$UPoTGvCM3cn_>>J<%0IPo4bm#2-$+|NB3D?3(w)znW5g@#lW_gk3)L`I|?N z3=NugbwL9JcZ)rbf;$s#>gVIX5DJ?1wlY;|zdf++)*~}}p3+yI%6(?DwJKrOq)lj# zg?6fMDdd=*WFfp$To|dCN0*&m?eTkhLApzE6SzmJS)Ay#^7D-x9O%gLW|;1>9)N~glo`VPXbf3Eb|3(YEZ7=LO zZ(f zZS0YmkQ`T@U6f`Z0GE-Q9hZPj;?kn>3MBh;yJg40W{*=t)DHezEx95^G#csD z;u07p;a^zhy7Y|nfcR+Oya%(DzsPw5&H#>l^hR7`zuJblL!W>2mal(pzs9(OpR|r$ zwkDyz&#cUwuCrSc8>;)%C#+ef7kz1eSk$*ydA~wc{P~wEx3FK2^4eni{g0n~yL*rP zk=@_^wYso>kKEjz-C<=V%X*jl>M-br!kg@QjTM7K-OI~W@vu>2N7N^T%=0Fs={N=M zPZ-xYBAnkCZaiyJY1oyMUIT|z6*V2KM^fWV|L?lI|IXo{tiwABI6UGrOkNs}M~D>- zf%1gD!DA@tbP=ih$huKEkghb`GC_9yHm&2AYz>X&ovR{K+>KHIotSoyU2yB~R5 zzy5y~cQ5QdrQcxhYfB2t3u~(VIkV;#_ALBv_n-l_BUF>>C8nnG?!OpE~=-wK`8-Gwv7N%Mnf;VrTF4%-%|yeZcCHbJmau|9jxW0egxAv?gszV|9u*r?j+Z ze&f)@k%Rhr&9lb_!*ILZcl02$u{$i-xPcD;@4BnV^mj>f$^B;W0?z?LzM#DYiq!}2 zzk^+6#;2r>7UntJ@`n^THn@l#02hFR(zNuJmd{)NY-J3K{QmO>t6p;#4xdz8x~TtiZ~prn|M+!_FDbul*~0nZ1=p-> zvcLIyQMbZwXvx%p1Hnc~xT#Z`n{{jT?|x@b8{4B;ZT;Qvs&CE81>yV|GvyyVk1Q_i zQ8?4;K4V@{dC|#-`j05>mugvA+2Si+7f)W^<+%Nps5RnbcunuZ+P?iWGE|^%Swf+A z;Gm>lCB4p?)GZXsD{;rgB{s$-k4VJAyD_!IRac!?eb%Hdc^zc3%Ll>W;d0rDheUQX zP(*ZrG}wm=BLD9bwRA!vDTQL%{(%@mPwi;xymf4DaCcQ+)$^5kV~xS}Q+o}&?!M1X z+n?BNSM3-b*R*54BX^%~__<^Fe0%S}8>(Ao-ue7Hk9b|#J7(dZ9ocqy%m#X^eR1#J zRh4Rsx>Cd}W&?$o6&E{3(2?LSF@mD4@QlS>zs(aP*!ER&Kj*=GIO-ssr2?e{) zu$#KKMJw4_bb-A=45;%SD>z5p{9^`GXa$&E;dA?ta4tNKCdZj+Ce9jVrNHo)f}?k0 zur|f{jkE0NFooumJAxsxI-%2Q0>B@zCX@p6o*@w=GBrfCNk*)KxOBt7dHw8&2LhNz zp|?aALG2g6WjIPXVkS9f>s1P+Uv1m1I5~0lw%%2@&wlc;#~$l5wzfGH?)L&JRh8#w z+*W<~ zf9Lw#c+Y(t`Qs$C7m*d5(ycylCnV|C}IDPn`>$rZ{(}xjp5mhDu;d7IrXk(WsGBu&hG8v_% z%6bVaCH3Lpep5hYi@tX6>Nj+Bc9uVo+P8FMBl7wfc^!%7h11EVj=U1|PI-0WQvFDj z72UfYY8+YGH#OkT${sxwhW|30I(f-`Csqe?7XY5NaRc%KtcI>{JnMqeA(Qj_Cv@?q zj_Z5H=-#vZbLVN^@Q4uu&mKCY|L6%9Up!^b%nK%8(XD6CqUy^0Qlqaw!+ZAVIagHo z&A{=KE9Q(o+v|%?-@O#RQ_B{AvJnNw7HukwMp176 zuv?Y&?4A?s6PM^8&{$XQt>~MT*43&kNiM8Tf*D=T`o{*XTei~+`i2bbSIQlIg&7nd#1Qh=a1q~5*XuPnI%DUZvMLmS48F)+HaE0QnVTBjB=xd)Hw*TVRFZH1>*AENstC2Yg{)%yZ zcN(m``Pc!eOf(a`I3kgPcypXtz-t(@~6e+=Om}8w5))* zGmO-N-tf;nFv=QWJ6#+bMvIUA65JB(P<%Dogr~zNR_s`Izpw4_!|E$JG47pw)vOt& zoERU`Hs|J>jpo+j;?+yvvUzsvWY>s0*KM0Qe)5GlMh<4e`da+w%O2mD#xiFwGEIta zVUN#;(;l(?NXRnI^l~c_t|+2SFW2g*g0?SJQCzk?&J^JsB0RM?n~~5IsB0EfZfsE# z?3Nexk#HLIH+$YjHRPmPy6eDkSL^QG8)P5y?cd8jq{_PSdXW|J*fJXXr4mC1I{_{& zHPxSx0apVFN!TxSVXw?cN|u9Zh!y05CmcA%fzMOuFf#pfzx2mT= zL6z7iRO5%oKRRjWi6Q-~6-DmtVei`O61icO@)8 zQ2W667qjK+?(w$2o41X7V#HIpzALgyABNCb%CL&7>KYGMo4%4jAT2$$C?mhHz-RU- zFUrr#O-4u_xK?weVpW~&hfB3=4aaDr>I^o5WM%P#LQB89A)ijDu4*S>9~5QQ!@#6L zO($9l{qf75tWQX2UY+G@eDsPx{LixsXRI84#r6&Q#+J&mC399>vLW^Cad+q24W60} zlgHxZ&p+(P@7y%@@l4~>-G_?)^jgB^u`RRya~$haMLG7N2NLDKF#ejT}f~! z8IMT7aES)zUAP#Qh~OSk+0E<}r`8#6&MkIP53w`t^0i&2w%Ze1Hf}^PYg^yYwn$&I zL6=+X@b_SdZzg^Z-Ynzc0s!MaDcK!o#tomOo2EA*0nTj`;8Xj*eUF#sBcIDN1|ba8 zWV^X}^Je`Q#`E^}<#x9Ee7X8eYIwlbT<@WV*&1S1#o;PwR#K7|MbfIq^__ z(P7bW7aeNZSqpYHy5(@949 zIs8(tOK1aI+}GA>;v~j?Y|KBBmUC~Fvi~U-P4R_f8sDQ;SVmt~YEn{ivL48Cbgvl z?Syf4%CEei*=GIv0SAwN_?Bg3XX|$R*#ubfPsnmoN~dGa`3^0ZCQRqCEF+MZkN|HB zno9E`6kb{&#m@j2$toEllN?CQk43p~iU?lAKUix=G(&1i7^v8vMVWzMYDkU(oDuLs z{bA?UX+IkBV!L>UkA=NJDP8tzPj|Fons6P$NT(&m`QWNPDUf2Jlxc{&rUwG?hL)0? zWZ@*JoVkdj$44<5V$~*gL;2^7GX9`^om>mge`)Kq&d!BLIL?Lb$(%WQwH?#t|9$9S z7&gC=_8^JQ0bgxTVtMH`maB=h&JVE%iRWQF$FSscAO0=UyV6~bwikcZv7;YvUzqxy1|Bq>ZI>L;e;06p=_y} zwn_LM15;0^RLy_Q9->aXW-nW|ZIgTQ?%m7VzBoUWIkLA}W%p{kRd>y?XS&`)IsMpc zS&4Q_#JQGi%qQ?G=RuSTOff!P^Tr1ZtgdlF42>oHF8c-10y$#^$1vK~1;U30&5f|9zHhU|S(ZA?v@K=6FhKcb!z9*~z6$Kd%X)F|0NW?8IFoPCn_$?=_ zfjjBPnZXG&B3elFe^GkiEpHs!!o8O6Ter5f+AS@H?nE{!#M?NWpW|L30_nod7Pi%?Ou(vT_zY)zB%*zH zo-;`qay&x*FAb3AnP)$-qfJ8tXsXrS_4`jdGywU*?f5&z-lKxAM%@Ruf;hqjr}fE7 z+{s4kkE82p^vN9Qc?et7Lu;qXJ5?9G!YPDQTzA_KwY%wFi@i{%+S2=)uPbWZm8T2c zm?%_6VqyT^*1C1~V^hqZW8w@X`o!bGsR9qeVv#ASb)x2w`t~)4w6_ych@XzBH4&|b zdk2Uu)HbBW57Y&PbN8uTyaIZFLTJ@nyQX?B^hs})Yo?UE!| z%>RTfhWDV|FFU=%{V{eOOSKy8MfJ?KDhtZ6Y%|hx3oMxMi+hfoln^W~MpQy9>{79B zi{{1ErP!HsKW?eBRmG_-RwW%e7hQ|JD6E<#LZR#?(B_>-XEnLb*MMnvv0 z_I2;N<*GrGn;QC^|J2A&=?m@sAkub+PDiCI&p&6;}d z%!PXM)ApeW-O}&Nno)>_%>=br-BNI8PTOWI3*R(nshlm}!u#;QZ2QSK4m`2eK5sC# zY-JDbHPCTpIMSVQCZolX52QHgdGk8!{iTeArhx+u~Johil+AbbbdaJz+4rY6& z-;#3lPj9{*XWaequU^{oR5Uab+3icy>1oV3ujIo z-D@RvFTcG~B3WTCI@p-)iHGhL7q8&hLLwf<2jcRf4ym&y$+XMOIdV(;t}`zaI%K9k zw5wbr?W(O?ceuOWci*XHPGlp@8}@1gVaM?WoC59e1t)LpSvkg!$dcUoN=&vOSslLt zXN1OVdo$<~Cw|wq9uxgjYK?zz9}DL|w0hP`!%9}iHxsq8Mw}E#Q1C^V?1QgCaRaQU z!A~e+MQ~P(s>1k?=nOpC9ZEr9jq%O)xE)`eo8rqG_T>(H92Q?+xJI|#|G`DKJgr}H zYNw3*$X78Nha0=OeDE%=d*b4gVVUyAC&bG+ZMf@+Q_0X?@jcg zQOg@@hIMauKcG&BNCmiVRzW=7XM<-^{U_~XV zR<7!;SZ^${=kHX1wCkQ%m#Mi=+jWlmzOrqZ-m33z+k>m`qw)0;L<$I@pOZDjIyU3t zaMmPIQxZ-u8FP}B=t6jAxD!uEGxJ>v^Ak>~$_#;XQPCY2^t{TUa!(K#N%7rm-aN#<|Uee)F0!=vz_&CY|Mv2HW6)rQ_fzjU6K$c z%m@E4J_8#EI9L>kZs|z)8FC(5z+hs=1zaFB6uV{Xsh#!&SEXH~e-jD0#-W99mmF8_ zd*NFc)oMh%7MvRJ;Y*0z4*i73@3Dl^<8@~Z=!8dU|8#7CMf8HGPQuR{OAwl8So5al z*2VS<##n@&c-M$H|2KB8m0Bb4rW^6`V6(1k?2akT(35eECIQ=Q0oY@42{Jv=IAg&k z;@@%3h^^RuECSp^4|R$G=XCy=f#6V%P3Zr9=>K#nhf0g{BtiO<(%|ynzy=!zy*E8M z2|los(h{PYS?6*%LogQA!BNYcT_`IO*#TtJIkp27G!cOI_zo>#ABldKj{641ZaqFN z&6l2NS$==Ij*_Hek_DIg(tU{Zh)qB%kOcJ{qUh|coZ*d-W&?IgZX|v=1}yiB5pe>l z05$>pw5;B^?52lz?AX3ynXah?5*u&PHEN38l31@FK}@TO11+xcHlbW{!zDw?rP4h( zfN9~>J-n}`qo)vL8}=3iB{p0xKtfywyl#`HBG;5fS~|!Hnu_JJQZqUh3A<^S_4=T- zUSG6eRde(8*DOlkf=~$d{M{aq*U8LDPBe`3yL|WOmi3H>A*)}BI0;`kjTtye9)RQq za3~*37Civ(lYxM&To3^hd?_O1Y!AxEVY8RZ3Xur5uo+qf2U?W&3Zn&HwtIaGw6twg zUU;%?w_dgQn*3lJ?sYnAU9rdUds;x^`v!ceDM?t^$0sHE;2K2&Lh$_m8Q;sZc*+qZ ziB5p}g)bW$PfXl|CGG{guY7o~y6vT^kv1ZU*hxeCZ@*NgtF+AO=7myKi0GPnc0zV4uA`(R;IMi^$MA9DkdBlcYk#)Bv_K6u zCUE_^I>gv)mJ=CT?rVtFW#D3HK71PciyN}Km+|RgSo9!|he}x}mrt_}A{`n@YODTlVN{^aA^z z|50(LM3<_@E%1}B$yoaq%k3o7hk;(0mev)c-Ca_e4j0QfqnhANfVW!R{jaRsQs=-V^Zm0& z{??Y@+3~AO9-Kb$fh{-PlcYDSO;z1mT_=YIE9+(z9Q?@s_a~R`-QU~6eEnM4;#t_;5C=l z1>p{HI3%VC$2tnD>{wq##;{bYP`aeOUT5|hsaZrJm~!s8!Opkxp~FtvpjSf0_NuB!%HVSt|-!R za^=A3xR_4XvEw?|)agAqA-<5`#$#w zb|Eyr@eoJc_kqUOllm=eFrMeV7s9p(%NFi;_f>x9PI(}DD-uR%_lJz?^_KI7wham# z?vw|j9@??ybZ3E=aMdDDg3$`8M&J)f`9W%NYn*{MV)hZDv5gAt^PExJI7R?z8 zPN)^|QW&vBhMeV)V@3}K5T;O{wiY*Z^fiauR&`Nl!;ci~(BrNfcI~~-y>9a- z;@+ZvI1J@(O~No4Q9a=&%Y)*ujlfWdu=b&BuQuCH=S;izns82f&Vn`h`igb3E-`l5 z_u4aFG?#nS3H2{2g~%785W{*e(a5p?k%C}68p3~Jg8_42Ab?0MMlwQ|U{5Ni-Hg^r zZIW5A$T?ibJ(-w22L>(skM^l?*N$1bTCI&3wl>%=+uKvRZKzWJ)(f1gEIQ+@L4Kw~ ze$rsED3M4Ua2=Wg2d^lJ1mTDUOi5rUj!yeAqCeppK}S`NYC&{IroBKgRp`fVoH}pj zvTNEl;Rec#?MG}gyuM-o5w*t&vV+KMxMOI4%C=eQK906&xAsNE=Ksywhpi22DN*6! z5Tvzl*PX9!{_placYxY7tc_ytgR4jrK4s0Qz3;yn`q~>K`h6t|d}L={j5oCMQB=gv z$FL(#G%Xsuuq3BWO)WA*qyy@-kp_FG24;>b)e1_rk*}iBjlnn^((NC2s*d3-13IF_ zc8aUKb!*4S$_)Dc@(-dbi%u=E(bAx`cHXgt6{qO%SJtk*6B&sKTIydHG-^NXWNk#E+ zi!*?ze#vlhC3fLt$1u#39MV=|n2sJibi|cW6dl3?WB(wMqDW4sXo_XM7){ZUp)(>X z_L}=6^CPA@9QB(9`%fW?j`>lmrPlz2IV{%7``{Ohe=GB&cwvV(irGyj@mSvufT6bqVET?eshwIGVxmKS%T{D7#P#)HG_kQ}x!nbdN zH-UL}vwf&-hpW=E|FiGy|M**1zv1pPdUJ8Ey}-WT-fAz<|1u1RN0Ux9sli7SI56!key!8+LTla68r$2JRq^%oQZA@s}cbjX9{SI#Ve`g<1 z2_Ikj#&daPca`S1W^mB5-NR?bd;F2t@v9Ul)Nkcq7BP%7{=kAi7l`f&YH5^?+ zi8BmO0?yz>G<>mGoUsUoP$0A>{3qmg(2{VDRE#zV)|{aVVJ-Tzefr@GKbZ5{!H+*& ztG;e)GFBS{;*P!a<`-vgt_a?D$4$5^_`!X*qNrLnP6;DMX@_#TTqsvuq+IBJ+-QQi zHUnW_5xpyNCgR7-C60k046>;qKG@`zo>QzH>;Jgi{{3J7e9N=1KlJMF4lYrzwyiPx zsUzMi58nKN{q?Yo6ZUS|)^eq?Z(l0?PyZsGo#++%7g1w0+{Y3om+8{`77L+-tjixzZx zUOUQM482z@7vX~GUJ z$G#%J5&1$`DHC48d&jKSXfO8aW5GuZWh{LO1zuiZsi z4cJ%9xiUOQyTMiQimOGUeR%r-TBum7bKW+b(>5h|UIT6^*3Rei75YB>TfyV0=GuVw zEzCXn$-1TdiHHgn=ZS}QWzxTlHxU72H9a9Y;BG%}0r!;cb{lD5$83&f7R!Bs%3H3g z?L}g)zx-KyzN)u(t35A?8UGpeg1y@quTO7#4wlNz_u_iJnDL*NvXr1Ki2VDLWx*mg zT9z~{W20w3{@1cxtpfJWh!OuOm1%#XWVlaLA71r^cgV4SQe%)`8F<>eNt$mU=5 zO8EK7-QQwgjB{q+8s_c~UVi4#3AOE=H}(17k9=3XcirvlZj7)}h;avpqmNJ)Xhn-S zUlqV_NMSc46Wja+2y0nj7==Zi?6W3i;`XFpf|})Oxg#f~iBT%(nD=?8wZrx-^i5fy z;pim{4=kX>Fs64f*{>||q)1_L;j3>Sz3G!LVFk>;v*nL7mb4t%bw)8b&|CZk7;XOcTWXO;4WM`1ZD~LKUuJSnAF-ShL)vr<$dLiS|9=eZg=Nzc`Di~L1!Yf*%wf+Huvmsq>vCT2ob zFQ)c$&D_~%0qx7;Rn?Wk6X@;r#l5Y^54`l^yBn{c_2jJaQ~!0t@BaDJCNYY4%=n>UpxBxhC5M{v6xj~ zh3;7-H3@Vx3*r5&uv>0Yrl+_hFBwOrvHHicGhcQ#>`2*uAB-ZtGwruOtVvOjn-wrY z%bkyo?g5-i!Knb$EZ3lu&Ck7J-{g1ScK6zOD(~;3R*$JY@8Q|Ij=gyCQg_@UbO1W! z;663x;)%HHUzoqTwDA6$;1nSB+BwIh7cdtbMK2U!Kch6OOSgi&+}!jo1unm*u&9e0 z`BdohnAZyedHE?&HL72Qbc8fm02PjJ5E?p<}_ytF;;&5$%&(f zKi;khSP)va{<5FT{p$fj3*x%SyCU)FE#w(aQd_gGk- z{II`vlQMe)S>1B7v(vf-j6_dvcf><+VWx4p5C#c~f48)pd|F>3D*t~gv$(sUXRLe_ znB|owhWlNt{R{MW?L!-`R<)}Z-M69Pp+hgcd+6u$A81~$dcAhrj&Wm$tsc2?^)t2c zMQdhm;{G{WRy+MAJZ3$EmJK&{O)coswJS~$Bb-sT7w*SknKCk98y-0+7bo(fTgj2p z8WU(}#x&JMjbnZL24EkHIs9YTh2lQ01bamH^3mtsFk@(Aa6naK&we9A`d{ZQoWEfE z;pbm@-3{yA@|0or?kc6#k`Plh zDc$Ja&ErYU$-yz3oMa;_6=(F~Q-8oM9ZM^|L?Tiv`&W6L?RrOMFM7B6xxLRHvS00J z+FPJju33roT%E}2D~I%kAK3VC_f$MSWod&O3o^?nK<3t!>y;7i3$TU5nCKtT@==u$&tfc@$g=3WF}{%`QaW* zs5xrgfnT{F82vD*IA*TSE!ihx?;6`YN1E`(-G|$rz#0c$We&A9tXUNubyTM{-1LPP5#}_Fe!h4h~H|byWEJoPm@`XCiKt$>o{;6mJs56rX)e=5hQf+w~#imYj<^{TNB|X!j%Spfqv!p;glTsPr=NgptM9c z|EaljXgG-~B9i<6rlCaYND{z}HnE1-tJ!50jFd2=iBBq&av1pu?83vte%GM2W{W@p3nWz-xrFu zuioYJ72-o2zt`+7ojf1Ua(&6?({MJbqvzvUt|iXt?hy-$XBA z{XFU&X>p@Jvy8U5FC|v8rLM0cHO%PP;%KRtVkKMZ+88OB<0f0IDEPFwCd$gCGJSwAksBx!1bMkP8RWuLx$w(d^HSR6uP}m^{*F3L`OqK$p?j^RT zuAGf;kpU^k6pkpC1MfVJa>z)?i?!!e+TGjpS?t>PgM7q_8t9PEVi&9#XXJw#xoSBw zo$@R}L7fusknrbI9oNY-n}MI_4+@pe0Idp?VQB%g~|8kswsd=~#yK9nq{ zJWJe5f3!T)DOpZFOMWsR;e02bYu!sC`Sk5nuj!O5C!cFwj+M^P+nJ1gLdiltA}`V> zlq?y6;PR?iTSKy@Q?ihoyy-fOHz8R`l&oNf7Wd4cf3XWBC&Wc?W)HnQmJ>APEXhf~ zP;$_&!L238urt9r{oW~u!P;t;MKAcN90qgV(PMmqUPlg)9Gzuomz?6xIe^tzh7OYB zY}&+10akPJKnb=urRZD_VKt{7YTQ3r56Ac~IoMky;((I_<(DJpSLunJ8=Prl4;c4HU#W9TcMf%-{OOBRQ>Csxk^S!H<;{(6s z_z*1&Z^Ufv^w!Vby2$A*?Q18G7^Bd8K6?wJSb7Un4ss}t_V<}N4Av$)ImF^%oSDPm z=a@rm{%~@T-eMV0j|-g~ay!(+y+P`sOBtlM-gD~VxT8axI(bNMF%SHH`H$6uy~TQ9 zmSQQo#p;3HLfir;2ev-g3pu0pC3=AKZT8kvd=71ir}c|@S|7b7ni<~b&IEgFN~9Mz zpKil*{Nq~6-l~t(p~Wd-%qKp7$=<>*S<5+2ExSa^=;VP~$~Q4e$DMxJ$s=|?%-I)_ znO5?^OnXb`wq9tz>N+O1)Q%xDuQo^nXKVVY&k=86rxT%0gMS+rF3ljqM6&1lc-(KS z?gCd^a?}7;S*&*o#1jYnOJulXDSPLIHBT1p&bheC-gIHV$BUjr%5|d0!2xLvj}OV} z`8xlN@3byJ6obb-%WCW7FneeC0*c`pmC+V$eNf&+5D5+{G8VPK-MLl7U(EOUF!We);_Q zX>%`>+HFMbjz_-QqcMP+nUXOr>2lpp(Sw5A=tTU5YmXV}N5U3BG~OC#TH`}%^# z<9F1Ia-A4>$%Vr*_~9MX=BHhLQKYs@J>Q|W5j1d&Ziz18U1Fx@3j+b!-Z?bXM1MR>tKP7iD?I zdQh_2Xpuj8{W#lJ1WN$o>cz#SrIloN%kP$D#lc#UuO%dC`9|7{SqO9ZM&vBD{}tI8 zh;)q8LXJB-$2$(3**P9ZQaY8|?o~8=@PM4s9!cjXUNWlatik=WOM4_tj=y+X$9DAe z=~mRODmZ5W{0>!B&0c74Yj01K7i%N?HP1_s*i@~sG1&`CMF4?28oiczeUeY4=49|4 z#A9ri(ukC#i zxOnYPe$UmYe)4+}=`cEd@94Be6CfOYI)Crv)GHw$_UC7Q51#T6%LDPZ(tKE8BpRtO z1?D22hbuEPJN0@T{Khz}wrVR8LXGtldkkdc2U5|g40hFW&p5MoP;Jkm!u0+xuJ2S7 z&ypEk%O=O=78P~zH2K<&btsV|AqkL>LaldWT9C1VC}DYE`{6YT!+V(Mp_C1s~qJbo0!M2L^Nd7FB;eYxUwA z&!6SL-0Tgy)UxcW)dFoJZh0YosfkU-1j#Ito9vO{*rMf+98bV)fd!xSt1oMqw$c93 zZp~bqGDCI9W!?X4F6(gQ!pWsb=8+l@*I-ywAn~Uc3rBMWl;K*4d^5nEsp4BU{KCsXwt3LK2`)_Z3@#i<+`07h(n_ehF$TbZ&5R1|M3YVs|ctjwA z1Bp1l!r`%qADZZ1BCo2}ggjnv2||R09`X(DzhSakeyd*f*R_Lt&%aU?AkQ+a*N&q` zSz6D=Ot~nZf%E-cvi;_$N&ezYcy$^*NwSU^{b(me&WJ3EFhRV88QnR67ovh zb>{;MdfvKd;-)E+U;O+2Kisg}{;jU>U8O1)%|3VF&t^4@ykh(I4GW*U{!iFKRj&<5qQ(Be{^wOMoqxgc3)ND4+8w`m?De~TeqqZM z<0t>+hIhX*ylbE8=1brCi=!VG^xRxoh5bEq-90y5c5ThD`NPk_MmQpv*xOw**((8U zP-7k(9qKxQwrYmkNJ+(YV)q!FFo2H|Y=IbFzfs73!i^M+*Y=HYSm}k>MY?&R+lkwX zkaYz(sojlO!X zKdCqjw13|)?5#_l*k`Yqwq-&{Ki>9i5zcsg{@SOuefE}K)y)s6VAqho<39VW3>if@ z2j;58O;QhJ%<1n(UF9gHN9*3`k48*2^wENaMQ2{$p~_G{Fn)MDK` zW)g0*M#rhh&<|tU;}VA)fC|I{km53KdO$_(>@tLlT}5rPuNpFT<~RS0PY6A8<;$O) zerx@Qi|y2Po9?*l{QD-3yG#AGwK;WN7YI%Dxj*~jt>$)@X`;(%s^I3H#vH+T_NHp1pfl^e8SaHMJbeZKZ3a6`npd zqXOj@ ztQf1B5BNNbp5J$9=W>tln6YE}6?vDJ&d4jx>)!MH(GxB$xwxpJv}<8bVQ{kjm5!4W zXizxh89AU0Zg{W8e`L|K2g^Ts=;$Om^hs`(eEwte;0u+2Rx9{mMs z&05GB&wy1}*7V>;tjHY$RP^s+eT@9Q$vLeWTe0)^V)5bMy|@fA0j+}^V)mvpzMzK} z@$Z#f*?>J@@lgvg+Zmem3@-g*t4FS-pk1I$i1-}9$*1o}ip09{=Iyd#H8vpS)dt(w zIcp$ybhY>!bWDARH?BF|qw`AZH0(S2rR{I1QTB6ZtfTN1y`P+dihN~`{TAMkQ(am7 z3~WNDAHzF$d9fOE-a!PchtK#9ENA*CISUtgV~oAudBYni>*+t?jdQ)B*c(lDWJTwS z)@A~9oUI~}l85F|=Tu26UzMi6o!?3}5W( zF|`srZ;=*6^rkOP-=le-QqVdF^pV^ny`g*Lw@#b?Z>{nFC2M9WhpdQ= zJDpnkqOG$Fw#MbL*1;;=ScX=@%bNB~P*Z1luGh4rzJ-vQ!qW?YA?O@#t(F)j)?-EC z)`pyZ960RsD&TP92;#`o`|xBe@f_kfK0lY~@l2n`^aSEW;tl-PO5%;gRm7W!tBDWt zyIYyV!~FU-;v>Xn;xCEYiI4Kl7UE;X9mHP|cM_i_K0|z#xQn=(_#DgjJaG?kFY#rT zXCJ@v3e&GLy`SmVm_EQ94iOI%j}VU%j}hM`9w(k4zDGPs{E*-JnD{C2bK>`c%0u)K z6N$<4D`gQ=h-t(O{xyr(m6%5?l-^Xu#Bx6AMXV%N5vz%Ph<*8HKj{S(CJvVRDoTPH zCbd?S0Yw>56ZqE)h|`Ie5|{AJYfm4?`%8&G=aUuu$_;$7l6WI=HE|7bE#JJIZ?0qd z4&q(J`-t0E>lS|Nai-bJ>L7D?lh4@~>RqOP&v)4J>I0_#O#C0>*ZkJs`R4a*fmWg| zs3ROI@MrRlK2hG$CrKIf3+1=^bUvTM^p*VULL#iK`0H{$UqxI^TtmE#_!N;+s=vwf z5&rfB@efiL{XM4NXZj@5A29t9-~WW^&xqgf$=`|J3L0_pzF{&Q&vXLQlpiC&C+U3B zg_upu;q$J>Z2(=|-@WvTiR!^C=GBXJOM2yrBFG_i?DUNXo?#sof@NSsWZLYziqZyM}PV}|sp zF_So(IEQ#SaV~M5NQJS0xRAIG(qfWPO){!UMm05IR1>zzRG^F_lZqnes9s;LR1nwl`GsR^T+S_@Ga)zpMhO-&fp)I?TIO~#t338R{t zFsi8uqnfZc3ksu}nlP%V38R{tFsi8uqnes9s;LR1nwl`GsR^T+nlP$~_>Pi;Fsi8u zqnetGVp9`FH8o*WQxirtHDOd!6Gk;P8P}#JjB0AasHP^2YHGr$rY4MPYQm@{85O!7 z)555x5=J%2sHPG|HI*=`sf1BYC5&n+VN_EIqnb(>)g+^uN*L8t!lUql`yKQgi%c;jA|-jR8t9~no1beRKlpH5=J$ZFsiA9QB5U`YARt=QwgJ* zioHxmHI*=`sn{1}R8t9~nu;w?Mm5!+`9v7iRKlpH5=J$ZFsiA9QB5U`YLZb+GO9^N zHOZ(Z8Pz1Cn))2cM;AslbzxLf7e+P7sHQHAYU;wMrY?+X>cXg|E{tmGlu|OPsSBf; zx-hD#3!|E3R8tp5HFaTBQx`@xbzxLf7e+O8VN_EWMm2R|R8#*}kc?`QQB6Y_)ii`r zO+y&fB%_*!Fsf+?qnd^=s%Z$Lnuai{X$Yg5WK`1-Ml}s#RMQYfH4R}@(-1~A4PjK% z5Joi(VN}x)Ml}s#RMQYfH4R}@(-1~A4PjK%5Joi(VN}x)Ml}s#RMQYfH4R}@(-1~A z4PjK%5Joi(VN}x)Ml}s#RMQYfH4R}@(-1~A4PjK%ATNHU&6W0?r5bq)0OWa7jpE+zIK0w?|e31FP z&UX$H-ypt8{DAlo@e|@_f+~sVCkBYA#6l^pDkk=j{8dk41+h0VNUR}BPbDkqsbs}^ zso~6LCi*d1T|r#H+^*z13;EZpnO;m>#e5#%I}h@&%}noN`Z?nBe6p9hy>xmCau$A0 zR`2t#A2T1PUf(m_O0)%ajVLozvVMWQuU{lz)GufHI>}A{In&qkog0WZ^2tran~Ap& z*AgFe66GC(y=llyk!-L}jWl`F$dK z_p9fLuMmX^{Yn_muRkhJ(DIUgn(1el-ox}>Nu$8%qAAcrp2*oX)-n~O~$5$ zk}Lqq*t9q{Esjl#W7Fc;v@{u;mL_A<(qwE}nv6|Lld)-OGBzzu#-^po*t9emo0cYH z)6!&YTAGYaOOvr_X)-n~O~$6B$=I|s8Jm_SW7E<^hAoawT#aH{#-^oYY+7hBl$K-D zQZhCzj!jF+*tC?4O-sqxw3LiZOUc-@I5sVgO^ajGQZhCzj!o=^Fi#nqmXfh)DH)rV zlCfzi8Jm`pv1ut8o0gKXX(<_-mXfh)p{L}Dj7>|4JX;)_7RRQgWNcdKJ9$&arln+T zT1uqX;@Grw8JiZzrp2*oaco+;j7^JU)6!*ZTDpu)OP8@}=`uDgUB;%R%hn{?9GjLQW79HZY+8nl zP0Nt6X&Ev$EknkpWysjH3>ll2A!E}rWNcc7j7`gsv1xH^S{$1e$EIb-*t858o0cJC z(=udiT84~G%aE~Y88S94jFbhirMrnHu^4X_V$=x20tpo9D#X|kl(AEYQS&%3Oq3a| z5Ti!^dN*-BaRc!l;=RO;L>V207#;HdLE;<4H;JP26k>D;iq2Dr(E-Hh5cCrR#8je; z4#bQj_LcHb@(U^Xg^+yt)%SefO0)$jfrYwPex-}PR0ui5o9Ge2QN%ICvx(;r&n2Em z{26f)@qFS`qLYubb0OQgknLQ^b}rJA@%19jA{OHPBDCi|Aa3dc!^Ap1uV=b}C|Yz8 z)>DEv5@m!IVLc@%8g&skM{;46p6wqGeJsAF{Py#<5!-Dv=n3f3W~H8WBdw=v=n3f z3W~H8WBdwAJ|&cj5=uo0*6H#@q@sjUQ9`LG(L^drFhhL>l>REgDqEh2RFqIEO0de7 zv`9q>rJ{sVQ9`LG!P-`yi&T_QDoQ97C6tO1N<|5!qJ&aWqWBd`MG4l1@+*;w5{xE6 zk%|)VIgnCOLa8XBRFvo<6(y945=uo0Rul3>q@o1t2tkpG6098rMJh_LUJw+iD8U** zP^6*+tc9;oDoQY#BrQ@=3JrWIG;z^?%Fud(;$N+dZCJ+kDP#MTv3<(eK4om5GPX|{ zTc(UHQ^uAlV@=CY7vzSz2ufYbSeG)^rHpkcV_nKvmonC+jCCnvUCLOOGS;Pxbtz+A zDk#Ynl;jFZas_#{f|6W8Nv@zIS5T5GD9II+B_v$ZVPZY{w36*m$#$q@J5;hAD%lQ| zY==s=LnX8?$zc=m0pe!jgUm<9dnH?`lC4z9R;pwxRkD>T*-DjcrAoF^C0nVItyIZY zs>Db^J{T#2JtTi?>S$sVa>k5sZpDxDsIZXmf`OuU3Ri+CyV zGU64)c~TyXGQow!btq4e>;$(jVEZ6PR*>uzBs&GkPC>F$kn9vBI|VuVf*gH8j=msA zUy!3O$k7)hI|VrggB*iFj=><=DM)q-lAVHNry$uWNOlU6oq}YiAjfQw>=YzB1<6i9 zvQv=k6eK$Z$xcCz=paXQkRv+C5gp`+4st{XIiiCc(Ls*rAV+kNBRa?t9ps1(lAVHN zry$uWNOr2$lI?$CKi(o1LQkt^D^;_7s?k33WF=8F+iJ9rpy;>NXdl6siLVg%3$pIj zta~-`u%h77&YwCB!mfIk6Y9l2}Eo2G+3mYuNiW?EM<{ zehquShP_|IdeyM^YgoG)_I?d}zlObE!``o9@7J*RYuNiW?EM<{ehquShP_|I-mhWr z*Rc0%*!wkXff}|z4O^gwy?f?pk?h(?a5T~+iVyh3Krvz^#img6`o)Q#WeTbYKA}5E)$suxb zh@2cECx^(%A=vZf{fAlpZNx{2&BR|4w-aT(7J@xr@G;^J;;)E1iL!PJ!JaSpEO8fc zH&NE1A=vW;_Yh?@7t&r}?Zm1df>mEy@)f3EWqLo;uQ4riLy zc792VmKcJyU(!d3$B43j7lO54P^`EiSo;M}5=E;F!R9YdM7IpV@-Jyw(S%_Cm-J^$ zf6nyxQgY=X`iO}{S@ncevb@8&DWoi>MI#NV6sAQl4XHGyGx)14Vpov?><$RZ?m&pU z10n1V$hTy?hm?%>kdpBpQZn8{*c}j*IXa~3MM6}6Vk1%Z2twE+K&xVpKu~745OxaW zxmaaG>J*=}3F^B1N;iluqG(njYE~gw+VL%nNBkC+cI3txFa&$MJee+k#W+P8)@l3| zqgB$mOpA3o1naas7wdEgBUiAPPsBPMGD?{)W4Z^^Vx0~dJ((8kbO_dI$)S?z-b`09 z9b{Up(;--=<(V_kE{_wMibMrQV4N24;dWA zoYO-FM=@vi5bW6UD_J{)V9k~^$Feb*X^v%M3e&Qh2*JKB?}!!=f|Xm+P8-f(OU@+D zCe9&>Ei?oxx8QvKN-W#`z+K0I7O@bzK|k=hAbi9CZzQfF-b7qYe3|$Palas#83^u0 zZs>8riSh(}D%hQvM=T%~5le`;>5X^FiMXGObS1HhSPiU2IX40=qOfZ%*!6K>G5;#s zS}oXBP;|3e@al2kFrvt9tu}&)TZTx(PYLiG;y6A(m+A3LpU3nBqST@mZ6e=VNxYG` zig*)oHE|8!yqmb5xPf>N@m}Ia;#Pj;Vd6I8BgAInFNxcUj}lvmj}dnee?{C$e3~dW z(poU5;4b2B;&c4s^Ta*Gy~LMU=6!reY_PT136g7NTIj1fuaGM&eCKGOwE z7ZF95sD;KNZyFimlzb$gjAD8;(_@%!V)|^RIljPnk`Koh7*En1Utl~*vz5Sj zlAgq0iS|;9)s1{bw3k|}aU?yBX|^F4Po6t%ID>zkNyPbIJfB0noH!R4CVPa*9%1Tc zVX{Y<>=A};ChrJ)gvlOZvPYQg5r$TF9M7ef!{X@?DC`j?dxW8t$#bb)7+RU6rFLOx zWrD&UVX{Y<>=6c|K8`2C9%1NRg2EnQ=w0%rutykrm!Pmm7{M;PZQB$65r)Pk&xJk0(6}Tm z>=A~>B`E9>#`y|CVUI90E{M;L1y{0jOK$_#x;(!w5L=u7fM*dt8#2xHYFX=7n=gvlOZvPYQg5r)1be--u!lRd&@k1*LIjNN>BF6=7n=gvlOZvPT&DlH?%l5hi{M;Q8& zJQwx|lRd(Qut(Ss_6XxtfS|BP7^eaRg+1!P632nkN_AifLE+3gu9fPzR;uG#sg7%< zIbT;l<65JR7OFa~8tS-SsN+hZjutA!m6fkR8U<5{!bNq| zoa<;cs-wCmMwF8P_25Q9nGx#2jr)LdeykqcD9`2mSUtE=(sF*R z9^CjiP|lClYf_SWFr<8OCGke0oUW+{Lkh|nn|ii(JzKk;tzFO7u4il4v$gBl+Vx;a z`PRe4ZNx{2&BR|4w-X;F$}WFB7*cQt@mIv1#HWd}t5^?)6qLQudN8D*oHVQFNwaz| zq@?AfSv?q1%Dj*7yu$RWOz&ss zXQBKhx|HcMrh715&U8GvzBa zO!p=BBZi6f#75#EBJ0kPUJuTc97ajYfHNgMhUq4z&u01@BF7yWpx)rPBM;PrGv!yZ z#;gZtN?P>NdT^$sg&FF>nUdzH1ZPTG)|mC+Oi4R!C}&ga!I^?`lByn@DJUnY>cN@& zv<9%pS3uFM8o(ZcHAK;K8mQ+qP|sJJUn92%%IG*DY;;OyVP zdB1@(ego(F2F~UUoW~m=pZE$SQ&6<@2F{)hoP8QN?=*16Y2aMbz`3S@vrGf$mj=!( z4V+UNIGZ$Z9%?(tY$TrI^EN@|KU8P_T)z*)?T0dL7*3S}buTddZ~lX`868Hc?+~qQ2TheYJ`DY7_O< zChDtA)K{CRuQpL%ZKA%~L~XMPmOaT?G|VRImQBK90|E9}2xW zj=leXNP7SHIIp|Tcb<8;EEh^vh;oCN-WR)&PM)^LbqfeLy}Z0H#1ggzdK-5V8l_E~ z+w0qO*UidlShJK;^s_3V?WXz_#nNP{B)hW5FDEOzMjlD7JRJ=}Q50dX;@^e3wrK?m zQXOVS&y4Qp^X@;N*Y|bw%yZ89e9!ru?>W!WIS=9ehw%PGc>f{1{}A4P2=70H_aDOh z58?fX@cu)1{~_N0&=22__xF;^UUJz>E_=ykFS+a`m%Ze&mt6Le%U*KXOD=oKWiPqx zC6~SAvX@-;l1oNy?4d+PZOrKCF+(fLB;1NJw4w|%vJ7o0LtDzwmNLwbGR%)M%#Sk6 zk21`UGR%)Mw6_fHEkk?D(B3k%w+!tqLwn26-ZHee4DBsLd&@8b$}soIFzdJXK48uT7HI>pP}VvX!#jheukF+2>SL2 z`t}I=_K0fqj>Jc46(6Nl=oEFu03TKCYV@k$N2&Wq6%{B220p6T;6&n4e)TB7dX!&1 z%C8>fSC8_mNBPyG{OVDD)k=G7rM~nO53ND{ZEgHq%O*X{F7y(q>v|Gp)3ZR@z1@ zZKIX8(Mo%0#rv)Jt`*<4;=5LS*NX32@m(vvYsGi1_^uV-wc@*0eAkNaTJc>gzH7yI zt@y4L-#rG~z7tuB1KZj$Coen(+mFHaW3c@gY(ECuA7@l;m$tMe+NCW<&q3N1MHsz5 ztv&HxY`4btg!iYlC%iwcJ>mUn?FsKsYiFj=&P<`5nL;}=g?45N?aUO~nJKjEyQH6Y z9Ny0Ctex3eJF~NPW@qih&+W|4+L@iTE7H*O#KY}@BjI*M8b*KbYuDFIqxYw^2i`T^ zuCJL!t5&T4(7YbVlcSFGZ6$9V0ERg4+X z5nVg6Tsu)*JMmjPkz0HCwBH}Lf!+t$uCJDDI*;BwcffN8Ja@oz2RwJcb4S8FcffN8 zJa@oz2RwJca|b+kz;g#YcffN8Ja@oz2RwJca|b+kz;g#YcffN8Ja@oz2RwJca|b+k zz;g#Y>(G0b9G*MixdWa%;JE{yJK(tko;%>V1D-qJxdWa%;JE{yJK(tko;%>V1D-qJ zxdWa%h@3m%xdWa%;JE{yJK(tko;yPG+yT#>@Z1T{o$%ZV&z>W2WZ{sg6A%H?tdr;cfoTPJa@r!7d&^ta~C{!!E+ZpcfoTPJa@r!7d&^ta~C{!!E+ZpcfoTPJa@r! z7d&^ta~C{!!E+ZpcfoTPJa@r!7d&^ta~C{!!E+ZpcfoTPJa@r!7d&^ta~C{!!E+Zp zcfoTPJa@r!7d&^ta~C{!!E+Zpcf)fxJa^NcyWzPTp1a|>8=kx2xtsRf4bR>1+zrp& z@Z1g0-SFHE&)x9c4bR>1+zrp&@Z1g0-SFHE&)x9c4bR>1+zrp&@Z1g0-SFHE&)x9c z4bR>1+zrp&@Z1g0-SFHE&)x9c4bR>1+zrp&@Z1g0-SFHE&)x9c4bR>1+zrp&@Z1g0 z-SFHE&)x9c4bR>1+zrn?@Z1B>J@DKE&pq(m1J6D1+yl=&@Z1B>J@DKE&pq(m1J6D1 z+yl=&@Z1B>J@DKE&pq(m1J6D1+yl=&@Z1B>J@DKE&pq(m1J6D1+yl=&@Z1B>J@DKE z&pq(m1J6D1+yl=&@Z1B>J@DKE&pq(m1J6D1+yl=&@Z1B>J@DKE&pq(m1J6D1+yl=& z@Z1B>J@DKE&tG6?X)g@-!f-F#_QGv19QMLtFC6y5VJ{r^!eK8Q_QGB-?DfK4FYNWg zUN7wR!d@@z^}=2+?DfK4FYNWgPcL=vrS84dy_dT8Quki!-b>wkse3PV@1^d&)V-Iw z_fq#SQpZ07p9B9Kd_Lj$`T2xnv*)$yyC(E*9sVDkL^VY{s zxjuHv^}$;oy!F9bAH4O!TOYjj!CN1^^=a)?Z(yffAH4O!Tc7%x-Vbkm@YV-!eel)? zZ+-CA$4xZ{~cxZ{~cxZ{~cxZ{~cxZ{~cxZ{~cxZ`icpHGX0eBmLw*hz?fVTm78-TX~cpHGX0eBmL zw*hz?fVTm78-TX~cpHGX0eBmLw*hz?fVTm78-TX~cpHGX0eBmLw*hz?fVTm78-TX~ zcpHGX0eBmLw*hz?fVTm78-TX~cpHGX0eBmLw*hz?fVTm78-TX~cpHGX0eBmLw?TLt zgttL>8-%w(cpHSbL3kU4w?TLtgttL>8-%w(cpHSbL3kU4w?TLtgttL>8-%w(cpHSb zL3kU4w?TLtgttL>8-%w(cpHSbL3kU4w?TLtgttL>8-%w(cpHSbL3kU4w?TLtgttL> z8-%w(cpHSbL3kU4w?TLtgttL>8-%wZcpHMZA$S{tw;^~Ng0~@f8-lkXcpHMZA$S{t zw;^~Ng0~@f8-lkXcpHMZA$S{tw;^~Ng0~@f8-lkXcpHMZA$S{tw;^~Ng0~@f8-lkX zcpHMZA$S{tw;^~Ng0~@f8-lkXcpHMZA$S{tw;^~Ng0~@f8-lkXcpHMZA$S{tH~l}Z zMk4)}9_aB@yX~ZV+6^Q<9EP`Hc+t4a3_oybZ(KFuV=J+c3Nh!`m>t z4a3_oybZ(KFuV=J+c3Nh!`m>t4a3_oybZ(KFuV=J+c3Nh!`m>t4a3_oybZ(KFuV=J z+c3Nh!`m>t4a3_oybZ(KFuV=J+c3Nh!`m>t4a3`u;%zPQqIfgjCr(}zC&mu26YK)J z!5(lPEPzF$YA00r^&XYq=p8sOs{F>E2fgF#MU~(9cJO}i9pJk_?*w~MbA)n^P|gv`IYK!{DCY>}9HE>elyih~j!@1K$~j6o zM=9qhPw1q@g9k+m@#^f zL{`igy+)S@}k;t+~BFi3$EPEuf?2*W_M^%}$ zdDFJ{NMz+x+ukFQWmc8d3b}3Xk;rPD+_v{fWVKpu+j}IkS~IupJrY^1nH#-FBC9oX zqxVQ;wPtSg9*JzidnB^#k;pPT%j%npQ~nP84tNvv9*Hcc_hbX_k;t+~A{%&*M3#A6 zHt-&aEVH?6;5`yq=5*P>dnB^V?6QIPNMr-=k;n$#BascfMK(SdM zy+T$NcMEb zmOT>L&@1X$_DEzye?iNJ-XoC>y+BFij0%N~g=dnB@<_ef+z?~%x| zMR*yF0dQy0q4O2STr)? zzr=|D5+nXgL5tJ*ud$c-ud$cpeWl3DM*r8?OY*Go7s0oK_k-^M-v#~>_-^n$;4cgR zLhDrPLVt1oi{!roy-VS1q<@X{uaW+>q|?VpA0vH?^fA)MNgpSDob++hCrF*OZF2~8`IJq1rm*eDeoLr8R%W-l!PAoa-3X_lgn{(IZiIe$t6cF zIdaL7OO9M}vJDE~m-mG`XB6m(%2Onp{qk%V}~sO)jU& z2#|fH|np(pAb%y`!u;vllwHePm}vJxlfb(G`UZc`!u;vllwHe zPm}vJxlfb(G`UZc`y5}2=lD`Qrzq=0Vop(((NWeMUyA26ekp}7#d8|PP9)AzwsVy2 z9A!I4+0Ie6bCm5IWjjaN&QZ2=lF%wr^6lZ&J2zQnqhW zHlMxyj>I=9+czoOH!0gUDciit)|Qx8*^G`4=ZO#JS+}1jN}MN3oY&mY&-gpkyyk{R ze}|eUikoN6d7d@rdDfigS#zFe&3T?R=XuQv{k*?l&l4TZ6Bo@B5zQ0f%oE$p6V=SK z@;pz(GEb~BPn0rGd@`@Oq{^eYq|x86=L3Jgp4VK`_@HyqoYCq2em$=_qfm23{Z;Jg zS7OiTh+>`*d7iO&o>6$7@pqo_cb<`Vo-ucx(RQA3cAgP-p0RbFQFT7__v`u4->>I2 zXEgfzwNA&>XreRQjQH+6zAM0g0saf{Ux5Dt{1@QA0RIK}FTj5R{tNJ5fd2yg7vR4D z{{{Fjz<&Y$3-Din{{s9M;J*O>1^6$(e*yjr@Lz!c0{j=?zX1OQ_%FbJ0saf{Ux5Dt z{1@QA0RIK}FTj5R{tNJ5fd2yg7vR4D{{{Fjz<&Y$3-Din{{s9M;J*O>1^6$(e*yjr z@Lz!cZ^8e!;Qw3j|1J10!haF|i|}8B|04Vs;lBv~Mffkme-ZwR@Lz=gBK#NOzX<(U+FT#Hj{)_Nmg#RM^7vaAM|3&yO!haF|i|}8B|04Vs z;lBv~Mffkme-ZwR@Lz=gBK#NOzX<(U+FT#Hj{)_Nm zg#QKjUx5Dw_+Nnk5}cRdyad}N*e=0p306z6T7uOQtd?N41gjQV50;ZCD-6FMHq;`wcZjst8QoBWJw@B?4sof&ATcmc2)NYa5EmFHh zYPU%37OCALwOgcii_~tB+AUJMMQXQ5?G~xsBDGtjc8k<*k=iX%yCrJ3MD3QS-4eB1 zqIOHvZi(70QM)B-w?yrhsNE8^TcUPL)NYB|Em6BAYPUq~mZ;qlwOgWgOVnXXrgqEJZkgIGQ@dqqw@mF;h!9qY5LPssTT84Yy!N}2@Y?T+^v&pR zf-6!v+g|%!(Jap?{wBDhRUMzoo8do@n&9)D_JW zjlT%`Tk1;aZ-OhD?;HJ1a7A-`qrauDXkKshH^CL@nBFfPGx}TV3TwZw6J@-ciwb;Va>!heVT@AcmTuO~hT{vP-t@Cp8U8~g9I^Za$~>Sj88s_+k}btm2DRe6flzR`JCuzF5Tx)F!7a5^0GD2M>y8fT!rPJlr5_HZn=#`c=@>(OWHS$^` zuQl>oBd;~`S|hJD@>(OWHS$^`uQl>oBd<5e>k@fgBCku->k@fgBCkv2b&0$#k=G^i zxE|J$I^14i3SIFxMd0io|E97;BysnVf74o`5URTKL3VB^2 zuPfwrg}kni*A?=*LS9$M>neF&Bd=@Zb&b5Pk=Hfyx<+2t$m<$;T_dk+Sa{DjH;JW^)jkn zM%BxxdKpzOqv~Z;y^N}tQS~yaUPjf+sCpSyFQe*ZRK1L=CgZ{sj3Om3n>;SK@1H8fx@JjfA{~G##?kem6udoBWqSaKV z`2SWa>;SKXzlTk&!;fJ5|5hsO0I!7pf7?pv|I@Fq1H8fx@G87j;jId9Rd&u-;jId9 zRd}nyTNU1_@K%MlD!f(UtqN~dc&ox&72c}wR)x1Jyj9_?3U5_-tHN6q-m36cg|}+L zyj9_?3U5_-s|Mz+3U5_-tHN6q-m36cg|{laRpG4)Z&i4!!dn&Is-bzS!dsP{^Hq4O z!dn&Is_<5Yw=MOu#}ZrWWyZ9AyG761qGxTtM&mpEeoocf3U*@qRJ|>oX>9a=2ySWg^pieSZ%d=6 z(Yqd=|`m3}^TuF>tW(;7al;nNyEt>M!e zKCR)?8a}Pz(;7al;nNyEt>M!eKCR)?8a}Pz(;7al;nNyEt>M!eKCLNkIj@p__T&kYxuN=Piy$JhEHqww1!V>__P+-r!{<9!>2WTTEnL` zd|Jb&HGEpbr!_@BDjPnn;nNyEt>M!eKCR)?8a}Pz(;7al;nNyEt>M!eKCR)?8a}Pz z(;7al;nNyEt>M#}PEl5wb&9glKCOlJX-$!mc*CbPd|Feaw3g6qXKHWT_;eeeZsXH! ze5yM_dB**88=r3D(`|gZjZe4n={7#y#;4o(bQ_;;uHa^|Pr`z~+8=r3D(`|gZjZe4n z={7#y#;4o(bQ_;;uHa^|Pr`z~+8=r3D(`|gZjZe4n={7#ywoi32nf~8UsQ+3LY9=E5 z1yC~)*_w$6H4_nPCL+{KM5vjFP%{zX-`n;~M5zD2(`Bq`Cqn7DP#P%Ie=`Z+3#y&S zRyz?&&xO)+q4ZoRJr_#Ph5Dv1)Hi*hzUd1GL4DJgJq*6c8xDigbEQkqh3fl4^?jkf zp$ql(T&VBnLVX7p>XZPXzI_XC8r@EWI)g&k2)-4Ro-2jAxShz}0ZPwhtM3b?=R)bZ zP^`GyuKLmal+zV#F zM?lRc^o+jP3iYj4$lKgbWdA>)^jx<3zEFK%sJ<^$-xsRy3#I2m>ABGDB*dp7J`M3{ zh)+X&8oKZ68T&NEry)KK@o9)pLwp+I(-5DA_%y_)q5HmmYoCVh`$GFPbl(@+ry)KK z@o9)pLwp+I(-5DA_%y_)AwCW9X^2lld>Xp%2ci4E&^`_EX^2ll_kE?Z1@5TAzlG{mQ&`+gAO)6jiiwtX79?+fkI(0yNM zpN9A}#HS%X4e@E{zOTR9ry)KK@o9)pLwp+I(-5DA`1Hr*({)|5sCj7cV=AptU#o+A z68a`3)Hf-iS-MA_JulR%j!-KtLapiuwW=f3s*X^rIzp}L2s=To>d5W}dqC~9|&Nf2sPN2paDp;mQ-T1gPz4{B9MwpMk7TGbK08`P?fY^~}DwW=f3s*X^rI>Ilj zI) z0B;TO)&Oq}@YVot4PJo>8sMz~-WuSo!7DIIH*XE_)&Oq}@aB6=&IgU~)(CHn@YV=# zjquh8Z;kNQ2ycz>)(CHn@YV=#jquh8Z;kNQ2ycz>)(CHn@YV=#jquh8Z;kNQ2ycz> z)(CHn@YV=#jquh8Z;kNQ2ycz>)(CHn@YV=#jquh8Z;kNQ2ycz>)(CHn@YV=#jquh8 zZ;kNQ2ycz>)(CHn@YV=#Z}mz@a4#eHy^P@Z`osXG{1)gD=U&f4g&&ZA@AYg{_!00g zz^{R0;5aw|9s!SnUk4|_W8iTx2Tp;fz|-J2z%$@9cpm%~xB&hY_}Ad8;A`OP;NO53 z!8Py_sJXw&uQ{yn1~vLy@H^mljlsY6UxS|le;WK55N3R0fc^?6L@f6bvE1tu1A==! z^9}Cxi2=fY1O5V-1|!gs%)Q|ba3`o!!j$6J=3edKGJ5pC*K=p#1EAI%WNY`D@Harp z6Mg{ucR;N<=&$%F#7CYxE5+J%Z}=#vH3!)r2VL4Gyx)ZPoA7=U-fv3S`%QSi3GX-I z{U*HM)!uLNc@aW;zscuC2<`nQpBEvt_nW+4A+-0Kyj~%+_nW+4A+-0Kyj~%+ z_nW+4A+-0Kd|rgm-f!}G5kh;v$txH_d%wvm7(#o$$txH_d%wvm7(#o$$txH_d%p?q zH~G8>+4g>u&x;6}@O~5CZwl=Froi5B@_7+Ld%p?qH{tyzyx)ZPoA7=U-fzPDO+GIo zXbSE9rqJGR((XQ^z2D^XB82vS6W(va`%QSi3GX-I{U)!R=ox#z3GX*~kM|`93{~i?6P$RyRd-$E$kw;&R|!1i6?aiyX-~mzs6p|)*0+d zU&ek7TW7EXHXP3jP@Qli)pmMtw)mGfTQpJ;-(=={kd5_FJ)a2D|Kg`Bf9BUDHa@9%-S@U>EAn zYoT_}3blJysNJ(d?Vc5C_pI<&!C&K@I)hy)I)h!PGuVYXgI!4bRG$@x%(L!O&vm-a zU>9!j+nO<{GuVY8_#>e9ek(?Q{>AxyYldZn5zbaa@ ztuxq#I)h!PGuVYXgI)M`P-n2qz8_m>u*=pN>_VNvE_@fZ&S00VGuVYXgI)M;Y@NX_ zTW7Efbq2doXRr%(2D?yaunTntyHIDa3v~v&P-n0Ubq2feH^Kklx=TZx@QOk2rlrxeG@6!1)6!^KS|ebao^hK=qiJb0Esdt7H5xkInwHj>Xxo~WPFT~@ zXj&RgOQUING%by$rO~uBnwCb>(r8**vk$+=nwHk=!)Q(8_Aa3{joZ6~)--PK5?a&J z8j=0HH7$*%rO~vsMr5a0)6!^K8cj>1X=#nf{*^T?ji#m1v^1KQM$^)0T3RErpRuN; z(X=$0miE08O0lM;(X_PYN`A(gmPXUk8oO;<)6yEjZClgQ8poYtO-pMuw{1;JYfQIo zO-pNJw{1;JqiJb0Esdt7HL^S1nwCb>(r8*5P21X=&x7mWigN z(X=$0mPXUkXj&RgOZzLcp0uW=(X=$0mPXUkXj&Rg1X=yYqji#m1v^1KQM$^)YbL3ex zEv;zBwlyt{rlrxev?3p;Thr2LS{hADD++SDH7$*%rO~uBnwCb>(r8*5O-rL`X*4a3 zrlrxeG%I6iG>u#5^fqf+8cj9;|4k*y%rA8n@I5t!ZgAEsdt7(X@1EO-qN?w6y-8#b`}Sht{-oXiZCp*0i*5Ob+fx)9y#p z?nl$^N7EuSEke^GG%Z5YA~Y=`PK(gA2u+L7vR(;_r2LenBNEke^GG%Z5YA~Y>R(;_r2LenBN zEke^GG%Z5YA~Y>R(;_r2LenBNEke^GG%Z5YA~Y>R(;_r2LenBNEke^GG%Z5YA~Y>R z(;_r2LenBNEke^GG%Z5YA~Y>R(;_r2B2J6YvCP zYr#9ETE_dd#_~?7gs}tEe}BvF0`=eDvU@=N_qS~Q_qS00{T;khtwku0>pk+g@%Nn~ zpBjH2{I}pQf^P@!2le0IdgfiA{`*_D{!3k`|56v~ztn>rlye8=+(9{aP|h8cbBEN- z&$ygBq-I8!bBC0{=yL9$oI5Dz4$8TMa_*pP8C}jDYGX#1a|h+z zp%!J^<=jCzcTmoqlyfKL+(|iiQqG-}b0_88NjY~?&YhHVC*|BpId@Xdos@GY<=ja* zcT&!slyfKL+(|iiQqG-}b0_88NjY~?&YhHVC*|BpId@XdU6gYd<=jO%cTvt=lyev5 z+(kKeQO;eIa~I{@MLBm-&Rvvq7vPDZ2s?mHQUl+(8;t_8kD z(dhQ+TNI6MpT0%WXutawMWg-hTNI6MpT0%WXutawMWfrN?-^VZx*z$TL8rK!zC+OH za{3NIqs!?#1dT4IZx1xOoW2cENI8AqpWa3}eczwbDW~uIv+Z*FzCWYO>HGeSE~oGN zGrF9<@6YIRHmjUEQ$yu6dNrw8r9B}`^H+cSZdR0H^q1~t#V2b*udFsFyyo1T_-)W% z9GVrM7(WbpWxF}C7yBdFx-~{A4})gAS)4ep4zLr{tuac`tuaE~8YArG$v#lG#wcX~ z)U7eHhrnUbtK7}3b2hWi*~~g;GwYnqtaCQA&e_a5XEW=Z&8%}av(DMfI%hNMoXxCr zHnYyz%sOW?>zvK3b2cjiaqf9=2Al*39cJ^Wj*iZ?6v zu!j@6?-_{>*URfJ^U+wD`{5jVfSx8!EU9=5&G-mKWew%6O66?@oj0^Ks3 z6?+)n_L>!M7~S@o1Gl|q#T&+71zXGvYqrg-*)}V#@Ly?HiYsKR{i}Vd{Tm-4MYqPt zcAVd=$idHeg}hmjgKYH<{gu_-X7v%<|Hgk+PqFQF{$}+T+qyMI=(W>k^%~m|wr-7) z?UjdS^&s0juyt#U?48)}#`YJ1X7wqjd)>8JJ7R+5_)IrweIv^A@(rOUgx*EK z-Jrp*vFiS7@|{vxd-pwwCj#Hcr_(?6q|utQTbg6rUf9jdXty-SwmIA_&C!WJ(j4Q1 z;BSNGYPU4!yig~N2zBCtP$!KDb>e|gCyfYo8;el4u?W4cZB2&P8t#F zq!FP`8WDOuXE$@7-OPPZB3b$H5$^lSY(s3e-s>vcCbI0jELT#-j8*sM}a%>oyjlP8t!O=NX+eB3mbo2zAnk zZ~?nSjdaq8QoNG0Tgqd53Hw!SujK5O@;Lo<@NdA2;2NltM)X&mG$PbVBSNoE@0Riy zzYXf75!qgy-mO`W(W}$DHS00zHkM$wl*g#sScE!hM0k(?s#%ZT$*gC$l*e`>=|7GA zR_vd_zL#I=q!B&iUcXz)W7KUdLfyt9d^f0*Mr7-x5#g_b?uolK$1%D;`i4hwB`tD} zv^VBByQM`=(QPb&?|;-YYRSe&{2qZB3b z`$65tB3mbo2z48aP`9xJ??a2;hZgxJ%@azo7QGLJc^_KzKD6k4XpwI)JP|yA7CnF# zJ;0N`HBYA!qeZ?oZ%wwf$hYPh&5v)*Gg^xtNVskI);#~!TI5^vjON6*=GitUzBSLb zwaB;T*>!7WwWxqqWF)=NYX^4)nxYmx8HGg^y$cb?H&W9O;1mvMGv4wzD-Zhphdn-&$j!KZ`0G0XpwKzvu!Q% zZF;t?MZQhXwzbH&={dz(^Z;7q+w^Q(i+r1&ZEKNl)3a?Y@@;yytwp{~&$hM5x9Qoo z7WpzD>_)E%I%8#{b}2qeZ?=&$hM5x9Qoo7Wp`8GYHwaB;W8LdUW zO>bTJPSCTb_e(vDp3C?)J)`F`zD>{Qxr}eqGkPxL+w_c{9r!jqqh|!ZP0#4q-nZ!) z9nbqVJ)>jw_p5yx9iP9SSlYMg$tJ?|ZF;sHRr)qPqvJ{6re|~v>D%;-jvIZOp3$+Q zZ_`^3xc5rv+Hvod(6#$@YRA1-vRymwy%M^1+})l z-5zSU2jA_Xc6;#M9(=b4-|eAxd+^;JYPSd9?V)yi@ZBD2w+G+tp>})l-5zS!qCLQE zK}$j>w+J0?x2UE@-8>@nNY|qJ8g+7uP$#ztb#jYPC$|Va616ZAwGb7zFcP&e616ZA zwJ;L3Xg8*xx6Zeq@GWS23##6NO1GfTEhuvfn%siwwxG8yVne?b8%FPPX$jJxPHvH{ zlUsy3xkYGgY|&m#r|aYvp-yfIT9P`sMfk7$tK?6B?$Ir%N(*|@f|9hLAuVV~3+mB= zZnTI`KX0vQK_yzyhZdBfC4AcN58FVU+#>tS%7uH=gg>s9^P9@u_!Gi^&mPVPiBBFR zK6y~_##->8*gh}x&fy2ew(d&l*IiC+iXN$CJP!7i{H>;bbpIgecci$<}h_lrHF zcU(Ux_Kf7k4%i3T0sCOEhx8VH^%8a!^v>Z2#i~%O8a=ankT~i=jXTOkDR}>3y#H|WBT8w7|5o^K4Ib9>t$|xbYw#rKnQv?G6!w3{Zd2~9 zdcV^@L;ADWhrllwVWSl`T9wOs;9G&Zgr4U8{0ND*1WgANaSy zA8Pb@Ecmag#bd!Ak^WimkHOFJ*FVMf8row)Cw4d31NMT?@#L4lFN0qJpXaY%#qP%* z0EfUANFT<2(MY7>JB(D?q}O&n7PP6%AA^&RiD#uy>yOJvYr)6mBcYf#{)F&xeD^rM zdmP_APOTr;d)k7>@!jM2?(x9BdmP_Aj_)4FcaP({C-B`9`0fdO_XNIs0^dD>*Pg&f zPvDU!@W?)Vv5#-E`|!v<{r0h7pMGn667-n9Pj7I_0qkeQ!#;V$>3^tl?vqEH@<-rj zRnC3EA7g)xzkXgd-51y|`+|1TJ3+5!?hAUbd%-XAYG2YjqxSK|Z699Shu8MWYbsUJanY0b;z@k*B))hOUp$E~ zp2QbV;)^Ho#gq8rNqq4nzIYN}d_uon4?dya8r^#LRkCqEhdH{ny% z?kQ^b6i+_IlTT5*r>Nai)b1&2_Y}2zirPIz?Vh4`2dK*d>T-a(9H1@-sLKKBa)7!V zpe_ff%K_?gfVv!@E(fT~0qSyqx*VV`2dK-_J|Q!B+9zZNPb-&U;p5jkeuJ+inZo zw%Y=??Y6*eyDf0rZVTMD+XA=kw!m$>EpXdz3*5HbXxnYH?KawW8*RIdw%tbCZli4< zgpGsna8NvS1qa20(W-lp_Ha-<*tY5(r2QO3bq}Jt2T|RFsO~}Wa9+qSgJQsF)jdev5326At-1$QcmLI@dr-BuZPh)fS{tpp2UTm^R^5Zt z@gQ|Pi0VG0+6@QKsCGiyw=x5xs zp3(dD9=+fA5v6|yem(;;pMjar(6c^6&w3VapM~3JmHUa{S>oriemA^dd+e;vYKhbYe>{B?*@9imi+@Yf;ybqIeQ z!e58**CG6M2!9>IUx)D5A^dd+e;vYKhw#@S{B;O_9l~FS@Yf;ybqIeQ!e58**CG6M z2!9>IUx)D5A?kaG`X0hxe;9m0>)U@MMOqg+8vG;ajM35HXO(_J_~S-+{wzFyR?jF! z&zuN8#~VH`mQDnp7fV8X_j%YD2Ozp00QL2nc4SL?#hfmWd}pfF$18=UUieL?TB z{T0x)`-0x)loyODgWjVubOm38$uGj>7h&>?F!@E8e2!W_N3EYj@tz~E=V0JD82A#; ze2Hhi#4}&wnJ@9omw4tY%4I$HigFR^{l>QlzshgF%5T5QZ@BxL{H%YQ{5-amb|g6nz6c%xzwS3DCwapuo#G zkA&9hk+1>#UgsYEte*6Z09``=ABXP+kR4>59*pVv(ZK(|FdCe|cD+Ue*JU&~3+AOK zqrt3y8!Yixuau4k%e=??Z%2a_o_rl#<*$DOx^|<%MV|bh*j_;$4c_2am#{B`-lIDz zuQ``%;B``N@Xl}Z%-@242Yv^<$&=s3z6IXq`8(KuFCIpN@9~~>QvLz^A1TiUxJmk5 z@J-(KFW42MTD8hU3@}Oz;M)+yo?5l>Q+`|WKl0>%a=uBA@1w~!QV#N0&(KGc&ywGGbqsdcl z3CYv^>I^sy=6Qw|l03&7=D`B!b@O-~KPs|A{C68G8eJ6Z;3))`Zby znYwsAXEf>coY7?6ZwM2hN2}5BNBv~zF=#aW-~HRr>sq6s*Lg<6w}AKXq{qk6&{5N9 z*ywtNZ^icRh0*Z;;K`qLF5%B%r}*pJ^kkO4nWYbA>4RDIzBQ#=$FfPcv@9(rOFPNZ zLb9}tY|^bFn{<1~Chf;;(jLspFGg!lHu)`Z0kraDlV&NKG(Xv-naQf|Le3rN;uR-&kOk9z&(a)ZhJ#Yd3~U zj|KL~7%Dx6N{^w^V@a#@7%DxMv`UYm(ql=h^jOj=J(jdekD=0INvqkITCCsp4Qwmh zSkfvzmb6NbC9Tq9Ni#f_v`UY`)mV~p!q^xpJ*L*^XROj=YAr^q^jOj=J(jdekE!Jt ztuqp24u|7#I1Y#7a5xT!<8U|*hvRTK4u|7#I1Y#7a5&CLHx7s6 za5xT!<8U|*hvRTK4u|7#I1Y#7a5xT!<8U|*hvRTK4u|7#I1Y#7a5xT!<8U|*hvRTK z4u|7#I1Y!t*Wg6pdkuteI01(fa5w>n6L2^IhZAr(0f!TCI01(fa5w>n6L9GJ5%f+t zoPfg#IGljP2{@d9!wEQ?fWrwmoPfg#IGljP2{@d9!wEQ?fWrwmoPfg#IGljP2{@d9 z!wEQ?fWrwmoPfg#IGljP2{@d9!wEQ?fWrwmoPfg#IGljP2{@d9!z1X=5%lK>`f~*R zIU>f^f+O&A1Qj|W9+ZL>9YKqZphZW}q9bV05wz$CT66?0I-=V7S5~AWs-4lgbVRx| zEc6(0L^XAad)yJ!=?Lm{1a&&1dO6)1bp(w%f<_%dk&d89N6@GvVUuFuqr^W)iF}T# zc1j`gIZEVnl*s33V68Z+TKliwYj;$&J}>+$>}7fXXz-eHJgRuc_8Zt&!0VtD?5N@m z}$=y_D5r)`g(M>Trd_K0~@ zBc>RT2UQo1l}`UT(4*wh@NN35ZzO3GdiwX*kdQ$z`zxDVsseauh{7Z0#XD9=G zd6L#XNnf6X?MYhuB&~gtemzNRpG;E1b!p7(qt7kECBlRo%8j!|>c2iu;HIqh0ie`$)WQ(<|8@OKF53{hvw&)kK~e`kK~w-@sxR}AT=E3zo{!`hJ90_SM{uh2 z19NC#j`>I~>G?=5>G?=5>G?>G`AClWNRF{Am-Kuj$B33odOnh4T+1arAIT*h{pOgD zW`so$MIc}}1?C+V{%>6<6%n!} z;)Ij5!;|RDN#cZ)w55}@qLZ|rleC~?JBdb} zL^)5w?MYZY37;p46HcO^Cy5hI5+|Ib7AJpL3m7;_obWQ5_A;9GGMe@>n)Wi9_A;9G zGMe_XbbdW}8BKc`O`C#^DcG2TjVaief{iKIn1YQd*qDNiDcG2TjVaief{iKIn1YQd z*qDNiDcG2TjVaief{iKIn1YQd*qDNiDcG2TjVaief{iKIn1YQd*qDNiDcG2TjWe)u z1~$%Ugk2BLNT1h)6WE^Fosm`>Pk<*uM;d3O+fMgBy)(qyX97okXJF%uMr1#;0D2$J z8ELX{!wBx^P- zzlV~*;hE$j>C512{MC`?8TD?Xqq{Te-Nx^Nw|V9+=$YUdV(&9V-DhCG8BIprD9-}k3sX&N4;sr9r}PH&US`ALs`)2grW8tD2?QQXjq=nePXv-D0?8AB*22qaGgk|zSm6M^K3K=MQ&c_NTJ5lEg0 zBu@mAN3runAbE5UXxiBAQq4Q)$)vjGo`+i9qs1Ao(BmM&8T-6J%683@38Ip`;2;rf93i63~hdfHb2AseMYTa&(OkW)WY?oTC!9A#BWgR zwcUm7`TLAouhTt$pHb_z?fLtR+O5&^_ZjBzGfB_iXVe0n?)m$STA*#u-)GRq8MJW* zZJbfNQms+Q8RqXZw51v5?=xuT3@vAdmNP@knPL7uqqgBU{}XTa{C!4k!?}3=KBKl_ zyKcnSGtA#-@bwJy_Zj>ph&Y~T@aHh39ybTLbGF&p^50A?8zXBAgCeF1b_F-u%AOI$HaTro>rF-u%A zOI$IlxI(`oqL?M3m}RV-P5yV%zYaR0m{mk!{7cXg#jGL_qOXpD0IrMW5<(xzD=Fqx1;-xuS+8j~S z9PMom9h*bJ=7>D!XkBwC%pBS>hpNmG7tPUf<`|df7?4Iw-XB0mb!%gMqCISqZU~8EvTK?_NsnC?Zkieicmpg ztI>VGpwZLl`B#Be-vXPyPpYDe!y+6O;jjpY zMK~j4PVG$0Ca9D)HA{-Xsun31mI4r_p5e|!RScJnO92ViQ2!};DEW%+C4vTPD zgu@~n7U8f6hebGCK+_h`v;}dv9xR|~3u4l?TjK(nwt%KBplJ)zH2>9_wt%KB!1Dr{ zwm>gl5ZivnGo}TNWk%1K7ErbYlx+cJTR_lVW1qXM~DjjBf!O{iGrmr~DlFHl-|6_hst7 zOx>5M`)j1XM*3@{zef5BapnpU<_Zz!3K8ZC3b{grxk7BYLiD&ol(<5CxI$#OLQJ?q z9JoT%w?e$Pg0iikX)DR1*j`DNK#vY9L~$#`Z!1J@E5vLo=-3L;+6r;n3Q^e#QQ7Nw z@B(GNK$$O4<_nbh0%g8HnJ-Z03zYc+Wxha}FHq(Sl=%W>zCf8TQ05Di`2uCWK$$O4 z<_oCt19%5#u2BS1Lr}n48Nh$I^CDO23*H`J+SLxSR z>DO23*H`J+SJkfcTeT~r`}I||E2I1MRr>W+>7n23etngGeU*NFm41DdetngGeN~#K zC+XK$>DO1KY3GA$j3Cz-L9VG@Yr!?u$mm(mHFW+OI)6=NbBgDW*Yq~y+l1Hg>2-X1 z9iLvur`Pf6b$ogqpI*nO*YW9fe0m+9UdN}`@#%GZdL5r$$EVlv>2-X19iLvur`Pf6 zb$ogqpI*nO*YW9fe0m+9UdN}`@#%GZdV`*RgPwkao_<4KTMKT`({IqzZ_v|k(9>_w z({IqzZ_v|k(9>_w({IqzZ_v|k(9>_w({IqzZ_v|k(9>_w({IqzZ_v|k(9>_w({Iqz zZ_v|k(9>_w)4vVF--h9D!`rvv?K`A@hxG4|{vFb9D!nVXsdOP8xhanf%f2R$-^3#~ zRnrr)Z<79|)Aa^DuQwPEh>e>`uRh&m_30*SN;mP;O?gUhlc$Vl`0X_4o_JGUbNV^I zUpyGC(l_DZCLX*gHk@uHxvBLTW0^Pjzrt_IkH)&6!H+lb<4yTdZa@t zTh#OxHN8bmZ&A}*)btiLy`{EyKDb3qZ&A}*)btiLy+uuLQPW%0^cFR}MNMx}(_4zS z{RY?c7B#&^O>a@tTh#OxHN8bmZ&A}*)btiLy+uuLsm1y|uIVjmdW)LgqNcZ~=`Ct{ zi<)vvX230(!EI`KTQyymZMDBmO>e8FwypNJ>1Euf8E~Jb(BB+y)5~tt%WhMP+w`*A zs)c?fDL;Ji#neR~M zJCykjWxhk1?@;DDl=%)V`3^1l4rRVWneR~MJCykjWxhk1?@;DDl=%*2zC)SsQ06<7 z`3_~iLz(YT<~x-64rRVWneR~M?@{LOQReSalJ8NH@00$0(!Wpo_kWnKH>?HU*BjP? zbw-MHMv8StigiYcbw-MHMhcCG;(48sVmv3+HQl79o78lZnr>3lO=`MHO*g6OCNL1Xme?Y7L0j>HjW9417+qK{>W9417TiaeQ zy31I3m$C9LW941O%Daq}cNr`1GFIMYth~!ud6%*BuIi{asE$UD5qGKMUDeLE_fy?v zth~!ud6%*BuIi<9#>%^lm3J8{?=n`tNj&o=@ywgVGj9^lyh%LsCh^Rh#4~Ra&%8-I z^Ct1ko5V9^y`d{8^Ifd0_sC{-vCMjVS+nUjrTDv8Iq>RMnN`O!tBz&9ia^UY`Wxk7*1FvzFRa!skojK*e-#E%*-oLtp?VUMgdBG{( znNwDqG1EtQ>e}PFZc$PkLugneSrdz$>w3zKfLu@60L7n|_bK zi`BdSXpfAS7O`vDZh>HVr5oh z%k+^l-^I#&H7Ls?e)3trlkZ|>zKfOlE>>pEwyf6W_c$^s)3eISPHg|DK$*4NvRa+( zFOcs46euUZi2Y}vcZQeM8lCQ)Ic2_!mH94KriYgKE>=!@XHJ>#VrBJN)tB#LL#khqC&(ZSTw}tNk0jGpEdYa#?-B zZ}85XvU-GV&t=Md7b|Ne#OeMnR_41{neSp{^%|$sX85{M*4l`F>;Duet2Y@Pah3Tl zR+eta<9rt@^IfdWs&!dC&QJa`PkLugnHB7^dY^5t440)gF28r?l%+OC@60LlU98M^ zu`J5A=DXZt&c0^Z3k;;5GDXS-{UVIlTvmRbn@Ai}4nNwCDx9y!d zW%bsspu(72Va%;C=2jSUD~!1n#@vc}(0Wi|%&n-W*!JwKq84uS?5x6=TVc$tFy>Ym zb1RIw6~^2OV{U~px5AiPVa%;C=2q0A^ft!a3S(}CF}K2)TVc$tFy>Ymb1RIw6~^2O zV{U~px5AiPVa%;kyDIgna#B`RCs&*Zs+^ZnO}tY%Ruk_9e+B$ad51f)g%4u?HuwSl z`hSBT1|K4QFZM^UGuRJ!t|odw&rGX{KCmAg00+S#a2WKr z<|-$JRuf~`ef+7&&eN>8bBQfO5tljv8R6k6ph9d0~V%9H*rCxuoyDYP2;q|mBP z#8R0#DYP2?0=7>It#VRmHB6IoKPeHmPYSJaQfM`N7xoU)eNt$ZlR~RH5zF>2(%*yq zUTmKfS`B{%yBXXKJ^=n-;J*WZ1Ef!J77+Ka>$e}I7Qe$^e;51rus?)N{|f0}A^j_) ze}(ifP71AtkMQL0^Q(_yKZ@Oo{TTMgus@FdIQA3RKjiQer0fSj34RLnSNJL?h3d}t z#6yAZdQPK@TnXikjg#Ar^8=EP`D%<052niB`soH+2_^%%{GgP+2- z=EQ+DCq{GP;AgO{IWd|O2iBaJ(}`nFCyqItI1a2iabV4fbuORLniB`soEXiC(VRH2 z=EMQ*3eAbpoEXiC(VQ5~iP4-G&53mipGt-1#Ar^8=EP`DjON5>PK@Tnp*1H)b7C|n z4y`$HXw8X3Yfg;j#Ar?&T65yiniHcrF`5&jIdN#si9>5n99nZ?G$#(NIdN#si9>5n ztW)@m)|^Nayh33R)PK@TnXikjg#Ar^; z>BMnp&51*6PRw~_acIqnLu*bPT65yiniF$6am?w&u}TOQqK1;x(3~2YQ$urV^5BV}j^@S#_K&8ed~bu_1r=G4)gI+{~QbLwbL9nGnuIdwFrj^@S#_K&8ZXT z)X|(eaZVl0siQe{G^dW{)X|(eno~z}>S#_K&8ed~bu_1r=G4)gI+{~QbLwbL9nGnu zIdwFrj^@S#_K&8ed~bu_1r z=G4)gI+{~QbLwbL9nGnuIdwFrj^@+ zi4a1_<8d_a^L+Zxv%YK3ne#p8+0Xv&@7`yhvxzzL#GH9z&O9+^o;+usm@`kznJ4DV z6LaQ?IrGGvd1B5yF=w8bGf&K!C+5r(bLNRT^TeEaV$M7-HW$P=%LVbl;xSu2c8T=CXW$Q}8b73wR*!cmUV z8Z+5?r&Xx05DPV@A^a{^`#tP)*!l{w%Fko#{Uh0W7Ae%qe4*Yy5^D9hP_rCD&2k7e zCnnU2eW6zD3pFz-)U$8luRzUG%DxEdjY8R%z{{YX!UQoz9;3e2BGgxig__kDYDI@o zbNfQA=nyW!F2P=keG9g}Labl)6=I>jLM+r*h=uwJu~1(j7S@7wU_JOrP`$r?T@5M+ zkgcx}3(=cmk^O2cFGO#OMLM(etYf5P#Ih-H5WTVElTt*;OZZ>L0GA(s6S>?&-1g;*u}3bF8`*!l{w?2lpBVt*XF z4*L_>_1Je}-vzD!SAwg+HQ-v1d-wN3b>{VyG+=MQZp8iz>?Z7Hkank7X{u%h^ z;Cj_#0r9+mcwV3!(#JTS7bu6c?RZ|G9Mb4`UZ5P(z8(elfSQq3NjIn&Y1vQW_p6*? z0Pjb@qo6r2P?R=41L`{-vQL0t1HTSF3w{IC`%pS&1l0T2vR?pS1RbRdlph)$r3;AC z1&Y$Xo>9EKiv1e4W}a34I`;QC!yDlDLCrbq*M9|n4C-lxO2)to;5hh8@Za$`0ZxLK zK}X#JqHY0Ew}7Zypm?jZDbgBCz*|5^*8-wzfugHzeOFVc-H?UaIaKIKTR@~OAkr2n z$8(7zZGpe{F1(8)SGX4R1$v|QK^CF}MOrbh7;EonAg({i=80gw%4} zePw~>w_Q$MXnx!Fzi|xAYku3u{|5Xm_&a=QCST?6z`(oUyixt3c%TOJ{`N7Rsr z8WK^%m?LT!b3_e^s38$GB%+2fx28~|@=>8PZ1UYDh#4iKrnF zHB@eFzmBLO5j9k9Y}*kv)QH<&98p7!xQ&jep+?+BN7Rsr8fwJtBTs;isG;&+qa$jl z5x3E8EhM6b%6n})qJ|oA8y!(YB5FuP4T-2B5j7;DhA~IfPpTQ9| z)cD%yRvZ#hL*=)&9Z^FfYN-6yw%c{6{MP7*8fr9cbVLm`f;Kv$hD6kmh#C@6Ln3NO zL=B0kp+?F&PuvkTB%+2y)R2f85>Z1UYDh#4iKrnFH6)^jMAVRo8WK@M?JT5PAfkpu z)R2f85>Z1UYDh#4iKrnFHHZ1v zG4zp+s38$Gj60%+dM0jPj;J9KHPo!CT7l-VghbSkh#C@6Ln3NOL=B0kArUnU98tr- z5j6}PQ9~kX7&xMaMAVRo8WK@MJzI1+DkY+ZMAVRo8WK@MB5FuP4T-2B5j7;DhD6km zh#C@6Ln3NOL=B0kArUnsqJ~7&kcb)*QA0hW)HUcCrO^>JB%+2IU+6A~s38$GB%+3z z>u|XvYN)vm+m5KA#uqMeL=82*u6UFP~!{Rj;NvLI&3?lhD6j* za~-xFQA5pj_^KRHL(O#<9Z^FfYN)vm+m5KAMixd#)KD`UM&c3?H6)^jMAVRo8WK@M zjShUIBWg%Q4T-2B5j7;DhD6kmh#C@6Ln3NOL=6*;sG;|M4GLo(XBEagsw#|mtW>Dk z2BUU@5NeiK_($?p81uap#(Xb@niKFb{|tT!)Jg`GJPsZN`@nwAa0omMeg%Az^L&?M z&VlDatuD}c-UNRIUIZ^0H7+)41*UKbxD<51P^hflc!$p)*W9@9W1ybF$@W}IVcc^m zh1v~4cM*3T6?!iTp=VSI47Q%1kHwhh?3pKLvuM?c-Kkw@u?03O=V-N$~w-#zNt>c5w*`wC3*nY@o z3%am(b4&`{LrFK-1NMRkz~lC=QH;;)=l~#yv=()^hl4)8GvFdw%8a^v;Wp@#+hqv+hE#!4P^jqfjF$U5`dm zw(kZTz(%kMYzAAvR`AoH=N}3+zi0d`2zv?GOZ*RWnE1cI{~P?D;Qs>u7HsEw9sqZO zU(oeL>R z$UP!*kBHnOBKL^MJtA_Ch}>R$UP#>x%nEL zdqm_O5xGZ1?h%oDMC2Y3xkp6q5s`aD>R$UP!*kBHnOBKL^MJtA_Ch}>R$UP!*kBHnOBKL^MJtA_Ch}>R$UP!*kBHnOBKL^MJtA_Ch}>R$UP!* zkBHnOBKL^MJtA_Ch}>R$UP!*kBHnOBKL^M zJtA_Ch}>R$UP!*kBHnOBKL^MJtA_Ch}>R$UP!*kBHnOBKL^MJtA_Ch}>R$UP!*kBHnOBKL^MJtA_Ch}=ml6xe{J(A=eNpg=Qxkr-RBT4R&B=<;?dnCy{lH?vqJqhg#l6n$qbncPV zlTf2`k7UfbM>6KzBN=n=1Lq#e zz_~{h#=N?JTpy~?AJ(A=eNv&3OxpR*sxkr-RBT4R&B=<;aX4S_y_eg5B zs=YY(NRoRb1Lq#ez_~{k6J(A=eNv$3A8Jv401MZI8BT4R&B=<;?dnCy{ zlH?vqa*rgrM^aBAb%um65uBbjjSk<<*o(YZ%5;oKuh?vW(-NNNt>CC)vP z65uBbjjSkxV%ENG6(wP1g|2v)Y z9`#3k!UvVL-sAl>gb#ragU&hcp>MiJeUp#Tekj6jQ2U|C)_y2L*ZV!{n~YxozX<-n z{Q7^ezl5#*P;|^e@CnNMu=|a=FI}hZ%cymOL7UzhctEJtyh1-MZBq;}YCk)n^ZYhN z5~D{kZHgg7!j+)MFKs;2Y*P&JF@C1m=Kbu1ex})`7-IA@%{F318&3?|6f0cfr-W@h zA8g}!UmH*Q+IYs-rdXk06)TK>a@VFelRk}p4%NmJs5a@-wx2q+NuNeP zX=;-`jaFS7s%t}aZK&=uemf)hjCdBxyHW3(2OFiXA)%iuZIrskgg(zkWi>{v(h*wQ z8{?nHen9oO5%q42cTnC*xs|*z-eXiP>ujoJqqV&ycDJ5SZHavv{7mdV*&D&X1~-AP z7~>T_CSD1Cijo}odt-2?%Y#pXp9MD?6QB35iGRZWqVQgMyifRP&>ru_xud*#vg7lm74cq&Je^)^mf<>TK45~zH1%+C-Bh<=3 z;rl7MRW^Hm39aY9RX#i>{3&?d2q)~`C3`0&KQ!uW##@EkRgXi$$f){KiE7H|Cz#vS z{~BMVyRKR2cY=hTmuQdwQfF@WyF5a@r7Luv(C)X) zf_7cAj@LCC-FLM6T^ONfN85wPz^6dZGqlsQw+Aoq-xtBN{OX>)-EWx*wL(?+9m>5n zquuYD2=$h(@Cx>Cz_&SrXPeuDcR@$U_C$eyO%#HjRcNPAZ>Jysyx*S+KCkS^Xf=Lb zd699#sI11=1?~a6!5**|JODlqo(8`Oej9uZd>yoMKCcYKI1SE#^G1y_jEg|`5uev} z8gCKqP>nnwbicMkD(Vv+13izlgKOR)ExG(v&|2ETUF=XD$yV*?NY##UJ0%bKNablm zLig7@0{3w{f_`ui^lF?P%FSHvd~63w+d)3IgM4g`*>t z+iPrgNP$MPvBTff7EXe{r`&ApNF=}_d-NNB!uMdClO1ZOIs;nW2{SukW~augW5G_1 zQjO!Fb-NSY?$n6Y<$gl36W#9A=+z~^1+C$ou(T7Fc4{=LUs3W-#-Tek4t0rDy%SaM z)R@%vK5##1o$u7h)M%aW)cDl)H$cy%?Ud$S@*-%p?-XP9{%z1|-|6=ag+Ha_SJ>A; zN1mM;nHsJ6oq;vK6V2~b9xGd8RsE__s&TQ}<4$SG_+Cmpd$vOfZ==&A!O@za=&F-g+KH|@ z(N(8->(jrit4?&)NfhlwSDompQ?nmFvvt*}84sg%)rqb;(N!n9>O@za=&BQ4b)u_I zbk&KjI*F*A=<4sp@YUe&#O>AKAF%%c`$4jo2kB2Ar1yM~jN(D50_!NHbTqon1UcAN>%0^h277(!badsxDE z!FeP7-NW>E537z`qW7?b%Y|L=-v$3&YVRr`d+buHxBZOH+(q`-C01>p1f4y0iD8#G zd+Z{6?DAK+WPb~E_SogGatWP1cBvMO&K|p{>n`fLi|nzB?6HgNu}cv{=RpHqXrL=_ zzuXl#d+buIFuH!b&_);9=puXUQk3woTnX7@7ujPM*<%;kV;9+DmulJPbidH0IY6Vc z$1bwRuE5!2SK#ci%U|UZ=0InUU1X14WRG2FvI|Xikv(>iJ$8{jc9A`HNg?_I0t(rM zLUy5$T_|K13fV;-wF`ypLLs{pEA%fEvI~XmLLs|Q$SxGJE3iU#p^#lDWS3gE|7C^j zLLs|Q$SxGJ3x(`LA-mLybtDSeg+g|rkX+U`kJe3x2)aLfNl54yNR5;iI%%{*Di7YyW3xL6}lJRtvO_$ zOT9ln_qEiONI6FL$h(!5=@_X<*CQ3_NM&d)*~PDWu-z~3){K+O-8=8rypwIm z(%nHX_5sj6^=^O7Rj9AI3a$3tMAzM#iL&j!dpEt$Zu*_w>UUhCuel0e$Nnz1=LvU9 zb-pTRIJ=pJ-YwPnYJUkj>h4w^=rcR^?p8Kv+wp3*W~FR94)3PV+Rgm)Zes6l=AU;H zfp<%L@+Ixbm$F3ti#WWS2)tW5^sl$-*GFjekI?ELAwoVvgnWbu`3P#KuR6 zijNTS9wFAHP(=z=q)OANqona_Or=t0ILeQm7&&ze6gqDpIH-g(_00 zB84has3L_bQm7(@DpIH-g(_00B84has3L_bQm7(@DpIH-g(_00A{AH_DSFiusz{-V z6sky}iWI6yX-?8dS`{f&kwO(IRFOgzDO8a{6)9AaLKP`gkwO(IRFP6|JF4?o6)9Aa zLKP`gkwO(IRFR@DPN9kvsz{-V6sky}iWI6yp^6l$NTG@psz{-V6sky}iWI6yp^6l$ zNTG@ps(2JtJc=qFMHP>tibqk!qp0FhRPiXPcobDUiYgvO6?-_t9?r0bGwk6EdpN@$ z&aj6w?BNW1IKv*!u!l2v_t>GpyT=MS!(Ps?mow!wHRrbp|hN9(3X>!wHR4&0-4)1!6Mqjl4x zbbnP)H97=|LeqD5M94^q`O)6w-r2dQeCY3h6;1Jt(9H zh4i419u(4pLV8e04+`l)Aw4Lh2Zi*YkRBA$gF<>xNDm6>K_NXTqz8rcppYIE(t|>J zP)H97=|LeqD5M94^q`O)6w-r2dQeCY3h5!|=|LeqD5M94^q`O)6w-r2dQeCY3h6;1 zJt(9Hh4i419u(4pLV8e04+`l)Aw4K$KML88LiVGO{U~HV3fYfB_M?#fC}ckh*^ff@ zqmcb5WIqbok3#mNko_oRKML88LiVGO{U~HV3fYfB_M?#fC}ckh*^ff@qmcb5WIqbo zk3!f3I$#gzpcjSoqL5w`(u+cRQAjTe=|v&ED5MvK^rDbn6w-@AdQnI(3h6~5y(pv? zh4i8jcA5^@X;$$p%jF|rzt>!UW&11y;$B6ll5%V7-<{x0z?f|oP z2jXY+-vi8493X!eG#$wL3sRet>@b0R8v@ zdhi2Mmw%lCJ!^MBeX-H=2?v<9JHV{n0qM#me*oSh{F1+j9(>7PL=V2iuV3QVFVjZ8 zOdI(!%KtLT_fFhHfp_8-N{3^@W1#1XAD5zxuTt_0&@+3F>kKN_8H}DQeq5Rv6?(4t zap}azc&6oXsl~r~uK00j#=m;5_;IPlB`<@XD}G#>F?z1}an-d@_1h=(T=Cv&zW@o#;ez_V%xnf*A( zT*pD;z(HNP{-tX+dan4O<~NKU2OZQkyWDfd2UT}Q&z>Dr-evTd=%8xQdWXEvnRX<( zPtXRRpbb93ti=<|T0EgPsQ;?f=t#9b+qcT@LwkK_uaElbBR=;LpZln%2azv^izEG{qd)M|*nagy;!v^I$8=Ki_x$>g z*nZaEPjv0q*ve;cjP2Lh%C;kIzs6R!9dG+JwzBQ0+fUT(*VxJ>ezM=M$e~)$SI%sI z1@xR)fACe%vwZ#f%9-&Qjyw*2of6Oc^#>>|K7)IxevJ)XzRb*MglPNypku`$ zwYyQF=RXfAni)NQKctvu+p{`{;+{`CB%K=_T@Nv4KO}wX81?4HB)HYTN>?uNT+JcI z0uA6hxLCm;7gRdhdr#U%xCx}w)@$`WF3d;Z4XOPKE{3SVRDSa zWLAe&n>sW3)nV1C?PZ{Q;jeIyU*R6V!qt9-tNjWZ_zD_e=lbADauW8hm+joi``3>O zeb?T_en{xMW-oi;|Bn5M@L|Pp_O%zfy|b^q&~2Q3?S;;%o`eT>x0mgf_#|vRsouf1 zdus1=Z+y*u>93zuyR+?H`$;k2U)?&`^4E$44rt!B%#XaLLP+u~ay${s);$;65cnbUm=y~|3=+U0iwb}j^cn$Pyz*ADA z(etZMNt4DT=$!B=_njH9PGTx`jc%LTQf0}InX|npK$?Bg*15Z=? zU-gav!2o^V0JS+lA2&d44p5r|)aC%SIY4a=kQEP5n*-G505N=k+8iKm4^W!}#OeWR zbAZ|$AWt5kHV3H90cvxA+8m%Z2dK>fYIA_v9H2G_sLcUtbATu}Ky40Cn*-G50Q?M4 zn*-G55o+@YwRwcvJfaA5H8?_Ma)jDELTw(QHjhx7M-)$V47GVg@x-=k^N8Y!(Y1Mm z{NxC=d4$?LLTw&VZ1JzI%_G$25o+@YwRwcvJi^r;;cAain@6b4qtwMwYT+ogaFp@L zQO1Bri6lqi|0rX+qcDFI=8wYsQJ6mp^G9L+D4ZXK^P`O8juJ7BGMYQ8>mLh_it|39 zpQ;~aGde~dVPj5vRcD?diGKSs1aMw~xJoF9b$LHHkp|3Ua4g#SUVc@X{w;eQbR2jPDZ z{s-ZI5dH_@e-Qo$;eQbR2f6Y=_#fo@2jPDZ{s-ZIkh>U!|3Ua4g#SVKALK3u;eQbR z2jPDZ{s-ZI5dPWAK42Gnp?lb8;Qtx!g^yY9e#DxeTFM%r+C@dDDm@%XW;)CuACj=1NMR!dMyDvzX!+R|2X^~hyUa7 ze;odgbIr%$|2X^~hyUa7e;odg!~b#kKMw!L;r}@NABX?rT={YMKMw!L;r}@NABX?r z+{JPDKMw!L;r}@NALlNP!~b#kKMw!L;r}@NABX=F=>G)zKLP(I;Qs{oasvIIfd3Qd z{{;M>fd3Qle**oVfd3Qle**s5Yd&C?d7=3~f&STFUbgd`6Yzfm{hxq;c9{=Op#Kx- z{{;M>K>uH(7x)_U3}54pzQ!GWow4568S8zW5!}}q!Fh-GzQ8-Yj|n}VdY17N`@GBc zcVhj*jL zQ_sddp7P%A{;$VV-r?OP9#46PciSFMd53q~9#46nciSFMJsbCU$~(O4Y>cP8!@F&d zr@X_v(c>xa@a`i$p7P%AwmqKm-tIoe<05F^a(9WxQ_nJ<@_z2NJ)UAeccI5q-p}17&U>F_JoRkg@sxLUcgYaw z@f5qd3q77w2DJob_DXD;1y9IP1@a z-%>q3r*W1`ej#R_BceVRzhql6O8-@iGCt%Zl@C84^cQTN(>P22Qby_{hkZ8XqPEkN zXTX=hmnnaRGkBc!oO%tP%~{iP(&wnqvG+OY)3$rS=hTDv7-vw=slTx8eCavm-twi| zmoH`Dw*LUzs}P@4zB&|~)V)6-^!m(`y01Q=S2eaY5+sa*GE{9Bg?p6xuzZ0AX4 zJ5TDqe5B_&PX>;$Ct1gJGVl!NN&3E%T>nX~{3O?WlB+$*b)M7}>ioJkqh~CiS1pVQ zkAWWNKF{p&^Ncc{XO!_g^TW@JPyNb><9S9L&od|dJmZe%8FxI-tnVrMlvDI6r zrTf)>9?Tz}ihHK(lsRJOPSJi(i3gW>)zc~Qa5XqhesY?g>oh&rY4VfP z)X`~T^=TsTX>yX&wqCMP*fPI8(WIZch6CgPnY)}5wCPLqM0CIdN5 z26CD@I!*3zn%v_w@#Hk|Vzn;|`rWYPoFYIG}40=WGu;P!8{2BHbsQn#O;+f}R z^}M?Gi`MVItnJ`e@tKzUDk_d(LxMG2CbKOv|t$xoyvR z4ig)P6-ms=i=bQCuv(c*JPSH3^%@4)ln1SpANV^jzq$dLP@K z`59IpWZQG0!-@dDe!mGdtO#IqZ$9k(9fSc`;3J6!!)kH*ulg^eBk-_#G2>#6^z)rz z_2$MUzAx|ZAoR@Au=+S3=?Fipp3b&cRSm1Z+Z&9~n~%_&kIsy%}40XN9fH*=*>sSDo5zeN9fH*=*>sy%}40XN9fH*=*>sy%}40X zN9fH*=*>sy%}40XN9fH*=*>sy%}40XN9fH*=*>sy%}40XN9fJd#G*7&C`}YfGcHIo zB1khLNGl2r1!>}HnkbZJERc?$qugVGG-H9ZnCX-4d@rrY<8tSF>A3U%w77D)^ZzvY ze_Fh`#QA@k{68%YUGgUA%s;I-WAD!V(`5c>MHt)8{L|$8X~mW?*}vgm&ivD4{%P^= zv;B@UIP*`F`KQVJ(`5c>GXFH0e_A!NH%Jpt(y9?1PoAG9o}|h1)8zSS^87S;ewsW# zO`e}tp06vRmr1K0eFo2?rd6A^9X-;jQ`?RnY1OQ4M~^hUPg=F?66g78^87S;ewsW# zO>Uniw@;JXr^)KmiWolLS$&#_k(N$;9!HF{)MDGSvS~#FqjUJQ;(+b%g3j2}WbA1& z_B0uLnv6ZIw(lc7YD<%`r}f6YOPsf-1Lt^YviEf0v0GZ2v`1$MX}x#v674P_bRUr> zpHGv|r|Cn}Qm>D9Oh`+^wjC4FQnKxN|BFmMO(vgKdv{6XU)A1iC$XKqr|E6eWbbLR z_cYmin)aSnEAYQO1C~}>uP6bri?pd1X;UxKre35?ouM6_VFv6Bt>z4^ z<_xXoj55`+;0&rhqbyW5>N>-7kTX07IfH)Apqw*k<_u~%gHFz%lQYV}{9k8WXQ<^f z%CBs{3_5!h%ZvnHW+eCu$G^hyuW;jBvG|Fy(#|XB4iqYbzx;U7~a93_7RL&vUhkA3Ftl#ndP@t}NAOrmoe$sYg)s z1-)Wwl-eKF?6l8dK1VgrVB4&YYCgfXxgBNPI?A|plyU2*W*GddxgFIgTQ&@gYOHPB zvrMCmxJOaKtGf5T;8oqbkh^9mzn}G*co6E!jqeeDhg$m%we}rq z?K{-k>zwCx&ht9wd7bmT&Us$vJg;+}*E!F3InQ@F&v!Y`cR9~FTKYNK_&M76IkoYz z;2cjG&Z(AV)4I>`l;Irh`W)^09PRoX?fM+;`W)^094-1BE&3c!8P2I5eV%WDo-aDb z$mkqnqH{cDIHx*wxyLN$Xv^nl%jZ<5E}1tn(m%&Y{~R@YjygR@>pn+3d_%2!EOV(}eJ^jQbsPPZ=MA-Pqo4A;q1J8O2l{=MH`Ka~e#-WSTDQ@6@rHD0bS!#< zDD(zb{)Sq*ORj-_%JYU=y3tquhFZEY3Hm9|8*1HS!FgKWd0O9jwcPuH^VIBlYT-Ps z@4S>bs&Zfdc_~viZS6d5?Yzd_S5@K`cV2qXF~K90q_7{wehfUpf33Ik(y-6t)fDHY zWS_xnD$YyKw*BAoTnw8=ibjV-*sN~ zrE@atbzZe*d%5uY+}HQ<@_o+#ea`TG{`&)>*$;?jKcL2cK#l(pJ^v6r{}4U@5Iz5h zL2uV~+nZ$N!Auf5!1YX|*|u&k(C#kK?k=dlT<&&v zfp>c^@NVw~)t$?&+Y7wgdqFiQkMMIrHE7$h^nzlkjwG`E9L9bQV?T$npTpQVjE%$C zIE;Rq!6Tvy~2cXA*6Z9Gr%H;j4G5LN1|@ODN1hNpb0F za0!K6LLrw>$R!kV358rH54=nsc$qx#GLiW*wS1Xqe3?A(GPQP@Jn(X`M{Hjv54=ns zc$qx#GI`)-^1#dFftRVN%S6}9)YoOA>t&+rWuoh4>g%%Z#piS$c$qx#GI`)-YUDC8 z_A+_kW%9tw#MsM3*URLAm&pUKkOy8N54=JicqRU(&UuAeN zOTR`-zlNV*!_O36rtmUF9GD^wOc4jBhyzo^fhpp^6mejRI50&Vm?92L5eKG-15+qu zia0Pu9GD^wOc4jBhyzpH(G+(yMI4wS4ondTrcl%rcRIzLP7w#Dhyzo^fhpp^6bwwk zz!Y&{ia0QZx~9<86mejRI50&Vm_k=m#DOW|z!Y&{ia0Pu9GD^wOc4jBhyzo^fhkls zMI4wS4ot!P6wFT%2d0PvQ^bKO;=mMf;2Je@jT*T|9JodtxJDefMjW_C9JodtxJDef zM%`Vb?yeCBt`P^W5eKdj2d)tZt`P^W5eKdj2d)tZt`P^W5eKdj2d)tZt`P^W5eKdj z2d)tZt`P^W5eKGG$TSL>Mj_KEWEzD`qmXG7GL1r}QOGn3nMNVgC}bLiOrwx#6f%uM zrcuZ=3YkVB(Mj_KE zWEzD`qmXG7GL1r}QOGn3nMNVgC}bLiOrwx#6f%uMrcuZ=3YkVB(Cls3YkG6Gbm&Rh0LIk85A;u zLS|6N3<{Y+Au}js28GO^kQo#*gFCls3YkG6Gbm&Rh0LIk85A;uLS|6N3<{Y+Au}js28GO^kQ*rE z1`4@>LT;dt8z|%k3b}zoZlI7GDC7nTxq(7%ppY9VLT;dt z8z|%k3b}zoZlI7GDC7nTxq(7%ppY9VGK)fHQOGO`nMEP9 zC}b9e%%YH46f%oKW>Ls23YkSAvnXU1h0LOmSrjshLS|9OEDD)LA+soC7KO~BkXaNm zi$Z2m$Sew(MIo~&WEO?YqL5h>GK)fHQOGO`nMEP9C}b9e%%YH46f%oKW>Ls23YkSA zvnXU1h0LOmSrjshLS|9OEDD)LA+soC7KO~BkXaOR6NTJFAvaOTO%!qyh1^6TH&Mt< z6mk=V+(aQaQOHdcaubEzL?Jg($W0V-6NTJFAvaOTO%!qyh1^6TH&Mt<6mk=V+(aQa zQOHdcaubEzL?Lrh$lhR13K1&vyejnCj5(>|0pSq#FzC6dxwyZ4GN+7mRQNq?uXUUw z$D5M|Y+jE9<%6?t$nZr5dz_y(?&M6bN?Ju9qkwebuS(ttKdpL8- zja}~9#W`ijwmru@7Z1kGXIc3PUz2-74NIjPR* z*~mF%(LS^1B=PKu_3PWT`nPHIZ>w#N1#hcfjQ038ZS!r~=G)@aC7!2!TW2=jD$JsaEUL(& ziY%(gqKYi4$SOYc1zC+#t_rP+EUL(&imdz&sl;c_qKYi4$fAlYs>q^>EUL)zJ)A76 z$fAlYs>q^>EUL(&iY%(gqKYi4$fAlYs>q^>EUL&dg2q^>EUL(&iY%(gqKYi4$fAlYs>q^>EUL(&iY%(gqKYi4$fAlYs>q^>EUL(&iY%(g zqKYi4$fAlYs>q^>EUL(&iY%(gqKYi4$fAlYs>q^>EUL(&iY%&l2UWa-D&9dA@1Tlz zP{li_;vH1+4yt$uRlI{L-a!>PRFOj!IaHBD6**LqLlrqxkwXocTvT=sKWa`?+x;->h$i7rk(V~cbfn){&r2ag!t;tJc~*7ibtOKJS9Rv;N%Qf4<#?~^%*VYd zFCX`ud0toRBfY9KANLBqycFesc~xg#>p+Z-#(DL{_Tp8Yc`3~$o*~S~y<#UX)fv62 zGta8dy!vP#=~bQixL0-N<8N`iS9Rv&Ue%eGN_`%$^vg@7w!Nw|FZPUH)tT4I5TjRh z=CwY=wpVrLS=E_mRcD@6o!%*1|3c4s=~-uERcD^ro;<5M^Q`L3qwu_H#K(7Xw!a6x zsxzCm}t(5QcJc9iw=$WFtT7k>EvAwD@&#X~it-y9KExNS%B!vU3|`flS6j2~+1fm-I`g! zys9&=RVc=vf@p@8n5QM?X^DBYM4!hqy?Iu3=2_L5XH{pORh@Ze#`0>XK608Py{a?M zELmRd)V7~o=arlJUc9O^uiVV&Rh@aQLNR((XP!JQPo9>iUFX%Vbq3mXUhUfUVvh8x z&OB{Aua>C$VpV6JIk&u8x{vg#&b->YZRZAgwbs1}@4en9)H5TYGKxe@ZEaMjnS9|- zvHuNQ?`WvxO;9T_WNRgcQ156YVqVoL)H@o&1)$#1kge5d!mU11`t*@{6IrM=8$zww z5NgeaP-`}XTC*Y4nhl}e(GY5#hEVTl2(N>BMk z1b3Ipx{{{ijf|NT@fzgumgxTK_3qZwv|b=9lny*jiO6dj?x?e#xH2 z)|+3l_2yS1L2V|e%>=cXP%P5FsLh0GQ)lz)HQ_e<_3Aa@4s)nl_K}^G=*=(Ldh<)D zH@}36LPEXyB~;`Q>dh~qB9BmSehIZARH!$u#T=pD{1R$Ks8CWt2l7>*x zMyO~b)T&XTMgc;N0)!d`2sH{2D%uFqhN6wnrj@`#z4;|X4~{mn(SV|jdD99~q2Bxw z>dh~qqK)uBK5-QFJHDVHKrKnJEehC$4go-K&H3R?4YukhcE_YNB z>Ps5J$j2+H*w%VZ;bMMuOh_oIxMT^x>di0Nw^06G%Jn4;mHZ*L){e^7n_r0qYImc; zVk7Znfpa|BjwcJ8;|Vn$6ly#u)JRaMwI4#qlLgY7F$rqiC)?3ufipLu#&^PfpvH8v zwI)QUQJYZXHKC)&0%uS{jkAOr?+7)vN-S`WB-BVs=;*P)8Ie$HKZK4R3yBg7y$(UP zqrpO=!9wD|Lgf!G(W-3WCEK)xgI=pa-naUy(6PNhbzyXDFVGzs9pMX9BSNBg0dc#4xa~crUGBJDAm)vZ+Xck!0<{#| zdQK|T6H=jLxOa{=I);1aXrrEgCA@RA(UH7>t1aMa3y9|h#Pg842&sjTS_oAOV~NnS zPeRQnBtrNPJ)0!kaVCWM5avUe4`Dup`4G-SI1fF8q~kTl7jjNrzwOtg=g_%?@F$dL z>@3@Chp-*OcIcTRmCPH}vW$yBx2BLg3gJKWQ?NuK{1?K1A^aD@zjwp*ujaoH{tMy1 z5dI6{zYzWl;lB|63*o;I{tMy15dI6{zYzWl;lB|63*o;I{tMy15dOUr3r1?YJ?n4)8{?Pb)(5hIZSwxi(ffs2m(YE98BF`ua&HN(ID+kiJ9n-JylY|ZLEann3;N8TG zzH9FwW^^BvRK9A|`bputpzkQjy(GB{_7PKwa#5kLxrl2n;+l)lOc9zXLNi5ZrU=ax zp_w8yQ-o%U)UI^~%_uvluoO!^2`2Sj@dI=B^iW zzl*uA#b{yO9v10fshM!`XDTbM1 zm??&nVmK*AW5sB!7>yO9v0^k4 zOJHdU{49ZuCGfBW29|K|OStPL-0u?ZYY7@#g2tAhu_fHm67FRQcd-PGEkR>TxaJbB zxrA#jK{F+2rUcEDpqUahQ-Wqn&`b%MDM2$OXr_ewE#ZDkxYH8uw1hh?;T}u4#}YJC zf@Vt4ObMDPK{F+2rUV{J&`b$zl%SasI4MChC1|Du&6L1W37RQ^s}eL*0%Ij;rUc$f z&`b&Jm7tjtI4nUkC1|Du&6J>-61XivGbL!I1kIG7nGzT-K{F-rT!LmwV7mm(l%Sas zG*g0RO3+LR{4a(7rSQKL4wu5=QZ%y^CYQqGQkYzdX0%VcV#QMUTnbl9VQDG+EQO7w z@URpHmU8b)x$C9e?^5n-DVkY|W|pFvrQFd{?qw-=u@ucLMKepe=36wP8A{xu5sgp^ zxhg!VUgj1l#OUnt7SE0fJ%+kPHLhb+%f=M=B*zScdZ$3;dZ$3>8HQU_N5%`3I2*r3 zHDbK%ahnyMIEE{ zii!7%0b?QPY~;Pv-7RpCzmr1cYvub}Vu^h!NN3qLM>~a*l9K|k2 zvCC2HaumB9#V$v&%Terd6uTV7E=RG;QS5RQyBx(XN3qLM>~a*l9K|k2vCC2HaumB9 z#V$v&%Terd6uTV7E=RHN<9go5ncv5m-^V%M$A8~XKl^_A+4s|0-%nlNsyn@!xK(#5 z)b$(P&)%l;2ZWk|6y7dQZj0RkYNt`zpTNEo)J~%+(N3enmEbDPY24g;Sz8us9lLwayxjJ zug5!$3Ri-E#xa_SRf%R|g&sBE=AA}`dLuxnr>?@k@sZwXRM-GEf=ysE*aEhKp9Vhz z{x$en@ITMf?(-)e05xwf`wQ~&0r>v_{C@!cKLG!w@Lvl5rSM-0|E1pPHBk!xrQYdP zw)roG|5ErbjhX*a_%DV3(wO-#^-ixs^Ir=8rQYdPw)roG|5Erbh5yo+`7e!`|I(QG zFO8Z1(wO-#h5u6cFNOb7@ARs2^Ir=8rQYdPw)roG|I)bmFO8f3Qur^0|5Erbh5u6c zFNOb7_%DV3(uDah^-ixs^Iw`U|D_4@Uz#xgr3v$2>YZMN=D##y{!0_)zZCvUz0<2~ z^Z!Bk{~-K-5dJ?1|7GxB2LEO7Uk3kW@LvZ1W$<4H|7GxB2LEO7Uk3kW@LvZ1W$<4H z|7GxB2LEO7Uk3kW@LvZ1W$<4H|7GxB2LEO7Uk3kW@LvZ1W$<4H|7GxB2LEO7Uk3kW z@LvZ1W$<4H|7GxB2LEO7Uk3kW@LvZ1W$<4H|7GxB2LEO7Uk3kW@LvZ1W$<4H|7GxB z2LEO7Uk3jlg8vV}|A*lJL-1b?|K;#s4*%uwUk?A}@Lvx9Uj_eF@LvW0 zRq$U0|5fl`1^-p>Uj_eF@LvW0Rq$U0|5fl`1^-p>Uj_eF@LvW0Rq$U0|5fl`1^-p> zUj_eF@LvW0Rq$U0|5fl`1^-p>Uj_eF@LvW0Rq$U0|5fl`1^-p>Uj_eF@LvW0Rq$U0 z|5fl`1^-p>Uj_eF@LvW0Rq$U0|5fl`1^-p>e+T^E0snWv{~hpO4gb~fUk(4&@Lvu8 z)$m^p|JCqc4gb~fUk(4&@Lvu8)$m^p|JCqc4gb~fUk(4&@Lvu8)$m^p|JCqc4gb~f zUk(4&@Lvu8)$m^p|JCqc4gb~fUk(4&@Lvu8)$m^p|JCqc4gb~fUk(4&@Lvu8)$m^p z|JCqc4gb~fUk(4&@Lvu8)$m^p|JCqc4gb~fUk(4&@c&Wx|0w)_6#hR7|26Pm1OGMf zUjzR&@LvP}HSk{p|26Pm1OGMfUjzR&@LvP}HSk{p|26Pm1OGMfUjzR&@LvP}HSk{p z|26Pm1OGMfUjzR&@LvP}HSk{p|26Pm1OGMfUjzR&@LvP}HSk{p|26Pm1OGMfUjzR& z@LvP}HSk{p|26Pm1OGMfUjzR&@LvP}HSk{p|26Pm1OGMfUjzRiga41g|Ht6}WAI-K z|F!U63;(t7Ukm@W@Lvo6weVjH|F!U63;(t7Ukm@W@Lvo6weVjH|F!U63;(t7Ukm@W z@Lvo6weVjH|F!U63;(t7Ukm@W@Lvo6weVjH|F!U63;(t7Ukm@W@Lvo6weVjH|F!U6 z3;(t7Ukm@W@Lvo6weVjH|F!U63;(t7Ukm@W@Lvo6weVjH|F!U63;(t7|8e;LIQ)Mc z{yz@?b?{#Y|8?+R2mf{OUkCqn@Lvc2b?{#Y|8?+R2mf{OUkCqn@Lvc2b?{#Y|8?+R z2mf{OUkCqn@Lvc2b?{#Y|8?+R2mf{OUkCqn@Lvc2b?{#Y|8?+R2mf{OUkCqn@Lvc2 zb?{#Y|8?+R2mf{OUkCqn@Lvc2b?{#Y|8?+R2mf{OUkCqn@Lvc2b?{#Y|8?+R2mhad z|4+dGC*c1R@Lv!A_3&R0|Ml=+5C8S>Ul0HF@Lv!A_3&R0|Ml=+5C8S>Ul0HF@Lv!A z_3&R0|Ml=+5C8S>Ul0HF@Lv!A_3&R0|Ml=+5C8S>Ul0HF@Lv!A_3&R0|Ml=+5C8S> zUl0HF@Lv!A_3&R0|Ml=+5C8S>Ul0HF@Lv!A_3&R0|Ml=+5C8S>Ul0HF@Lv!A_3&R0 z|Ml>HC;Z#8-oBz#QeCf4d7Wcj4u(#OGD=DSWNK*9v^Cz}E_Vt%%vz3Vf}I+1Cnut-#lc zxP7g_*NV7(t%%##inx8Pz}E_Vt-#kG;cF$nR^n?VzE_*#pvwfI_#ueJDEi?6l#T8po>_*#pvwfI_#ueJDEi?2V$*E)Qy!`C`| zt;5$ke67RRI()6e*E)Qy!`C`|t;5$ke67RRI()6e*E)RN9rN>ryJLR7aChv(((2uc zW23@9l7{bA95engv)BGz`bBMxDV7@Jo@$9*sp?KL3Fp`lFqNV zWW3AAC@vZC75`&wyu|+t_Mh@EKTWt>@yh6@26ro72^Fu5egbkgPeASt+I)QCHn0>d z1Ixh*uoA2StHBzu7OVs7!FHct@ye+04GO=YD_>9TtfzL?Q#eu zSx@b(r*_s;JL{>P_0-OKYG*yQv!2>nPwg~NI}OxM1GUpY?KDt34b)BpwbP)!=4zsW z+G&Wnb{eRi25P4v=Gtk9xpo?2uAK(;H9p?8(-3p*G{jsx4b)BpwbMZDG*CMY)J_An z(-3#pQP)XoNKX9Kmff!f(X?QEcSHc&eosGSYe&IW2{1GUpg?KDz5jnqyfwbMxLG*UZ_ z)J`L{(@5*P9wF`NbNLIJB`#%Bel~=?KDz5jnqyfwbMxLG*UZ_)J`L{(@5*P9wF`NbNLIJB`#%Bel~=?KDz5jnqyfwbMxLG*UZ_)J`L{(@5*P9wF` zNbNLIJB`#%Bel~=?KDz5jnqyfwbKM|P4LzPZ%y#l1aD37)&y@&@YV!xP4LzPZ%y#l z1aD37)&y@&@YV!xP4LzPZ%y#l1aD37)&y@&@YV!xP4LzPZ%y#l1aD37)&y@&@YV!x zP4LzPZ%y#l1aD37)&y@&@YV!xP4LzPZ%y#l1aD37)&y@&@YV!xP4LzPZ%y#l3~$Zw z)(mgW@YW1(&G6O?Z_V)53~$Zw)(mgW@YW1(&G6O?Z_V)53~$Zw)(mgW@YW1(&G6O? zZ_V)53~$Zw)(mgW@YW1(&G6O?Z_V)53~$Zw)(mgW@YW1(&G6O?Z_V)53~$Zw)(mgW z@YW1(&G6O?Z_V)53~$Zw)(mgW@YVuvE%4R?Z!PfF0&gww)&g%W@YVuvE%4R?Z!PfF z0&gww)&g%W@YVuvE%4R?Z!PfF0&gww)&g%W@YVuvE%4R?Z!PfF0&gww)&g%W@YVuv zE%4R?Z!PfF0&gww)&g%W@YVuvE%4R?Z!PfF0&gww)&g%W@YVuvE%4R?Z!PfF3U96O z)(UT}@YV`%t?{jw3U96O)(UT}@YV`%t?{jw3U96O)(UT}@YV`%t?{jw3U96O)(UT}@YV`%t?{jw3U96O)(UT}@YV`%t?{jw3U96O)(UT} z@YV`%t?{jw3U96O)(UT}@YWW)JNB1}w%Dh^&&2MNy%GFta1;27F<#+g;+5d1 zD9M4pHwJgQJoqH|S#Yy4@p=E6_$TZy3OC|$BOW)#>~SL=H^%I7W6T~m#_Vw;9yj7~ zW85A$#_e%q+#WaLaU&i#2KKlyu*Z#f+=$1G347dx$4z+LgvU*I+=RzXc-(}?O?cdd z$4z+LgvU*I+=RzXc-(}?O?cdd$4z+LgvZTz+>FP~c-)M~&3N35$IW=$jK|G*+>FP~ zc-)M~&3N35$IW=$jK|G*+>FP~c-(@=EqL65$1Ql=g2yd*+=9m~c-(@=EqL65$1Ql= zg2yd*+=9m~c-(@=EqL65$Iq$7jU_&(7H9mha+}YoH5v8IMxov@7y1pR&Ty&nE^ zYDdOb!S5K=E`(CP&Lia;+gu{$8%x15upF!aE5RzT8ms|p!8)*Bc%PWLPxxujdb-tL2$`(WliF{2VOWBe?**$6ZDi5c5p6yA@=`|)@`b#Xr) z@5kf)c)TBv_v7(?Jl>DT`|)@`9`DEF{dl||kN2xCbbdVEkH`D*xD}6E@wgR_Tk*IR zk6ZD$6^~o-xD}6E@wgR_Tk*IRk6ZD$6^~o-xD}6E@wgR_+wiyzkK6FL4UgOKxDAin z@VE_++wiyzkK6FL4UgOKxDAin@VE_++wiyzkK6FL9go}bxE+t%@wgq2+wr&^kK6IM z9go}bxE+t%@wgq2+wr&^kK6IM9go}bxE+t}Quy9PyA*ExP)yHbq;uQ1OQr41t+g|& z*3PV2du*Ln-?hj78~A77pM&c;{=aK1)*fpH|B~_+?0c|VvHwbA!}eGkwpU`bt4-PC zqu?HJFW3$41HEdfomsnfX6@RUwQFbAuAN!Cc4qC`V_(JB0H`-l^{=C#z5*(H5PSyI z7dusQ0{j}N_fl2zEcgv@7#so9;0xf3pjU>s$GqmPJ?0f??J=*SZ&w8H9gT9#tJr>j zq+PwL%U{R#x~BHn_prUXsXg`vw%0hd$F%c^&?{})V}5I_J*Ib5g?dL-=(on&V|qtb zs5hF0+9yKzOVBHG+GGC?dVNlN%x?s=GfUYXo5a2ZUIyRsHOC7;zi-tZF9N-isy*&E zL))3pY>)fR&~|1u+v6qJUfa_izXjVX<=W%#18;LJ$IHNKN@~Dbunw#TKMAhlJgdPq z;GdeSIC_htH|9v&s%x;sY*G z)V2LV>@w^RVV7f9fVWdpiTx4mD(pM3tFb?dU4#8G>{{%PW7lDS0=pjjPVBqD72ry6 z6}Sdm3v%zw^tLC~Q{wez?THQ8UiH+T_zP^WeQIa!w>?3-V+OcALAzrfxIOV#9O>0i z?f-vuXCB^Eu|EDYOVTB6DU`A=0a4bLleTG7K_qQcC>Dy8T|v?|Z3Ai2lSzPr3lwEj z3@ErSAc%m7xL)P5C@v^ocX8v2;&Sz?UKd1h_xH|wCTUUc{odz3&-afXJe_%G&dj{; zY@ahT=Okg%QI;pSAvP0bd72tx7ov=_lFddL+mK-!GP4cquqEr!ZA5o2x&d^9;5KU( zSd%nssp!fRt!7-cHX~u0X_Ab`bzn2Kp)B8(HIPLHvdF-c2C~RN78%GQ16gDsiwtCu zfh;mK$s$9OW5duSiwsS&$Uqhunrst8lPoec*(Qc2S!8IEMFz6Sfb$2LOR~s778!7V zm$GD$0rz+5N){RT1i?TS8OS07S!5uK3}lgkEHaQqh9+5LXp%(+vdGXRiwtCup-C1Q znq-lIEHX67B14lbGLS`vCRt=?l0}9lS!8IEMTRC>WN4B_h9+5LAd3uSk%25SkVOWv z$bdD8v|qBwKo%LuA_Jds7|0?6pL7_=A_Jdy7|0?6S!5uK3}lgkEHaQq2C~RN78%GQ z16gEfl0^ox$iQbM2C~RN78%GQ1D~51nq-loNfsH%B7;a48OS07pQ;$hA_G}uAd3uS zk%25S@HvZtEHa2>k%25Sh-8t0EHa2>kwGMj3?f-%5XmBgNER7HvdDmQC$I$0oun&S zWWf3j+6`G`Ad3uSk%25SkVOWv$Uqhu$RYz-WFU(SWRZa^GN_zK@FuA&6IlfBMWQTO zWWWwc#!D6%un&^5WRbxniwxKeNm;VUfIX3vC5sH$8A(~P$bkKklqHJ{*d<9>vdDnF zl9VNj4A?PAS+dArl0^oSEHap6k-;R33?^A*Fv%i=NfsH%A_G}u;Ik(KS!Cc7C<9q! z;BzPgS!5uK3}lgkEHaQq2C~Rtl0^ox$Y7F12C~Rtl0^ox$Y3}tkwpeRu`-ZF2C~Rt zl0^oSEHap6k-;R33?^A*Fv+4YvM7u!3IkzwL5w_I4Q3P4E268QiJzJ`DA&qox;KqcG3ovV-AB;f zgYI9kc6-r<-)?|3`_Vms)*i$(PoS%ZmZcWQ^S9#eil~mb<(d z&`ip5mlp$?N%>`TUq$x_x^JKh-yaB9;Tx;Kh3^jpSFWsLKr<=JU0w`mCgt~0{s3jU z%ZmZcWc-iPa-f-XlhI8_SMKs+Kr={#G>ZYvq%1!>69bw_S?=;;Kr<=Ab(qT?e}P=sMAr?}WsFZ!kiDZ_*u&ZYgTP@d6~)X1wqKahcb za24n$Wjo6KQ0|ZN87QBL?pYW!5amHA4@P+i%0p2ehH?(dxhM}uSx4D{avsY0C>Nky zh_Vaav(X)i?r3yN&@Dr^Le?GVC#{vc!Whs`%5qm21Nuo>?h0c_zZlR@#>mgb#DIQM zmYvZhaQ0+DH&wd8H0j#3!J7QngN)J$N}5&-z9|ze1wy7wwIr=X$xQ15 zr)Fk6ZQLdmfA)D|l_S?jDluVkCnOFORQG%Z*AMak(}E*Yxi3~dOR zp}|*O@f5HtOqMB`Xr0KnN~Rioa$d+#CvfBmPh@x2o9}v{!qBVv?^R8t{hQqShCz^M&m>_QWN7 zNz@;xvpaNssxK@cm)();(B);Bu`QWj*uC~h*jwjo@`mTxL-lcm-e8@*$=hPD@!7+^ z2ET~-!eFUCXs`8!BVO?5M#Fwl=dYC}iQI$@?F?;H!? z{NG)Rv^4wbe8S%l1k-aHBTa!yKh#iw{wUTn(&)3ho4vK*sVl?m@oMJf>g~(MRJoyW z!|;Gvh8SL1QRf)8v}UbE3uCHAh_!3m z;V)0qH3$5`E7T}Cv|$iC22zKhv;dT2*GfSSLvHEH^86qLVW?I?oDU?sRt@n%80wQC z+@M7vpBK`)A*L2n)PWm@bUE<%$6R)pR8c53fHq5ObZsi;5K5OFY|KSFMN&z+9+-Y+C{4_@UPERuW+MAKT&2TU7Q+1lsg$Z8-d2fd6wr!|AOkds6mBF7{~? zr2KF5MWC*-2W9)nmTrKW$XZF8WtmOTBb8Vi*~sn40%9rwzonW-n*gKFgX340sZo>QztuxG|H(hL zgHXZix*$T)HysU+jc1X4vNlJm(VQcWh4DP$^{My8V)WG1X1sU>y9N9sufX(WC!m&_vp(nNwJM4E{~!bFe=iIVwb0a-{|$Re_sTud$@ zmy*lK60(%El4ay_as^pVR*;os6dko*|ZDoO1shSv)wH&!7Y7ne;3=kPf1Q=@2@U z4x>3Vmky^obqQ&%VI)aX*=g?8~TsoS%X$dW*Wz<8<=@>eeR?uxtI*m@JGw4iu0flGcbT+++&Y@mfLu+Xr_0f9TKpUx_ z&ZYBcfHu(}4bf(5&@dG=LZfs(T|gJo7P^QorWeyo=%w^Bx`ZyJt#lc^oL)hf(-m|j zT}4;ZE9q5q4ZWJi=vumtUPG^?>*)r19lf63KyRcs(VOWl^j3Nsy`65Po9G>MGu=Y( zq+97-bQ|4HchI}(PI?dBMen7%>3#Hm`T%_pekcB6_`T>y=%aKG{3h#Ox{vOs2k2w; zae5Gbhx1AJMa!q@A^Hq`7Jk9;Irv4v=jjXdMfwtbnZ80_rLWN=^mX`Uy*J_4=H7;1 zZ2LQXhaRKv!ta_Lhu^#UfPM(S0Q3*~G5v)85B-#WMn9+jq+if4=~wh?dV+pKPttGc zckm77-_sxHkMt+{GyR4B3g0=ZF#=yJ$>1CIEX)euik8e$SSozSRT_iuGJ9?+y0advC+h{DkM9GY(YCXGtUo)04Pa-ov)Dj3hz({#*ibf%<*-~f zoaxNL@>o7AU`|%ZikOQPv$NR_Rq+&1M&|Iq=lJhSjn<=7T5V4e-3$&*rju zEWnyr5T2tn!|7v~2^L{dHlHnE3t07$>^62g+sHPtJJ@Enh26=v zvb)$eww>)@ce9=B9=40!%XYK-*!}DQ_8@zRJW*x%Um>;?8Bdx^cwUSY4Y*VqyEI(vh?$=+gbv!m?q>>YND zz02NX$JzVr1NI^Ni2Z|o%syfN!#-u7vCr8**%$0f_7(e@onYUvlk8je9XrLoXFsqX z*-z|e_6z%!{l+y;IOU9UZsAs*#FKdnPvthA#?yHQ@4z#8N8X8N@yOx-U%{926?`RM#aHty`Bi)kznaJRTE327!>{G* z`38O+zn15op0ou_#J#R-@@S z>MSDQ6^(q6FC1c_ppQisge;N9un*cV6bfqT|Km`Z07U^*xUttO(AT7)Ig}gU+WFPXiAC({krZh zOKsb-rG)0gu#k1P*7=|hU`RlxLpf1lgKia3?D23qc5ggn@zzEoKH3zOc&^k6 zOe2R|Y6Yf~Vuy;hv@)Dt5l=5e%oAy}PC)h6DpN(3siLYao3+ZcuPUB1xhWcm_?rVQ z)+!vO)+uJzDQ4CwZCO*M#Pe8Z;6=;i#!xtz+TaT}!L+Uk2&?Rh`97=H%co7yaHjCGnTpMo|=zW>lXJ+=bWln*vG>4njZ>I5^Y1I6Y?VjR~r(r&5hM?ID zAv1Z%Ode`0(i$@D3B_|+>-_Wmbv|pzY=o$pF=}Rvwq;C-CUUgkMc@uJLP|?KI?3JS ztqq5QNnX>px?#r2HbF1R9cqB#H806)`qok`#9C`ADs59_t8J5cXPv`89%Y?RS?4he z_MvAR(`J#ap-r}qF-vYhkB^bIHh_~h2FYz|No!~qu#IiYZEI|k`B-2KZP zHn&YqJFlJ5Y4c7CNK^#_Fz)@e)=IMz1L&nywoeym7qC{E%^5(CSIUM8fMcyR2VKDQ zCYYrK&C({cDF98;zug+J|VBhlYICNv0)mV*%QxO=_n+E!-|(on%@PHoa;ymq5=}-PW8o zxaGR>0^Nt!eB%Cl=d}GkG2mbO;HmfYWlWmZ8fkhXeZBTC%3f8DKp|& zu+B7FWf6L*GZRBHbx}gJ&NOSb2t5m|R2qb}J`e&cQ}Hfh=0$R%nB+F^AxT~ZO%vgG z&1RAe<+SQ{?Ux2OTUb!3$=_zH#Z+!Kmj#xEM1sChk}6(cQ}pVvTgOM|SWrOp?Kc#~9Fup)*k z%8PIW9r1Emm}MST4_4_=J=4&VQW}iXh5n?Fs$;XCg&RXwShhEL9TxOh1gfe`V9ij? zTKEHtEFswkX|m+FWgUKJX__k5>_Bx91F4u9#T0M7-w((CdHHe4=}1U<390RBLAuJ} zbjp@ZgbHOSk-jJ)xe`)wTq@KPQbJc@T$iK38NcdCl;TK~;z*Q|mnbDKQA%FC6g{sX zUP@k~yu89hT%zQ>M9F!HlJgTK=O;?ePn4XWXp8)Wj{Jm<{DhADgpT}#j{Jm$WfTcQIxQ%C}B%c!j__h zEk%ivixMRlB}y(zlw6c3*_9~Sm8h>Pp~IEX;Y#RmC3LtFI$Q}Iu7nO(LPv2zM{z<& zaY9FNLPv2zM{z<&aY9FNLPt?sDRCVzQ`8u8=<%x#J+8x{$8|XLxDJON*Wu9PIvjdj zheMCo!=Wd1I1)PAY<9-u^kSEFnz<}qV0zQ==3-rdUdpsM4pJ7xCF=|`VT#GSyyp^0}e2RB(o_YVavGj|#4o@mIpX&Q z>iqTfmNL9wG>1cV(b`Cgh{8QYT5Q1`cM?2km0R^>f3O~Q@{tx0B643Au)$3v99oD+ zCCTz`F3(I-ad8n}htJK#g-5$Z ziLIU7v7H>2w?4z(CHZEFdcIjA`1!ms6q+Zyti~4zEx=R-Dpi4Q>ML-X_7^x+xKM=)&3Y6Rn)N6s zL@V@yLTpFyu^qw3`hkz_2tKwW_}Gr%V>^P6?FhcvP6dT=eb_D#kL{ut6e;~hN`H~k zU!?RGDg8xCf05E(r1Tdl{Y6TDk(qE+XyOe&H((h9GT}r=8>31pp zE~Ve4^tzN@m(uG}dRzp^tn|%-Kw5$rQfaeyOn;o((hLK-Acb(>31vrZl&L?^t+XQx6=p-kCOrfeuvHk2tF%9IUdsvXKyKX{aWk7@&t zY6Fkb?@{_aO20?7fk)~0DE%I#-=p+IARcRI}WcRI}aI~`{IoetFR@R;)y ze7p`mUI#yZ9qofK+6O+`2R_;dKH3L9+6O+`2R_;dKH3L9wh#DdANXjW!(+}<@RfdZ zoTk|b2&?*+7Rk8=VOM;vfn2QO-0k9&9p+qxG|G-r)efb~4s)J5Jmx$FU)f>KQwS?N z%y|l7WrsOWA*}kroTm_0{b0^h2&;ZD=P87hesi8WJmx$FU-g4IPa&-O!JMZMR{dbk zQwXbmFy|?RRX>>X6vC?h<~)V4s=ql;A*||e&QpiSoTuQc`kM0+!m7UJyo9i-uQ@OC zbah|I*UPioj<0YN0*l3(c5%4vka3;b(#dtq?~>tpmW<25g=wNBGngnO9k0gon->#V zGvjMpd0lQ2I>sYv;OQg8O)33-Ol4^@EaY>W;gM;QT+`-;gjGg>2M@l$OUBhb2uX64 zi#{xH<#kxw%ImnSl>)A4WdgaF1)tW}%iB?&BTrAB96xA{D8bSohir#-C-^d)Y98N9 zFkoO+m7RD#kdrC zVulAoTuN!uiEkg(hF5pSH?q1DM}}Tt&Sdc8Gh2<2Qnvxb z5C4#F5auhv94Tmx4bo?59pMe(u38U_PX!CC@P=_3SkXc2q-AT}w4UmU1>Q)O_EWGV z3+(O=HuMho8@$?XbRR}{ZvY04b`afX(0w5gststbq5F17UVRVUPtg5J4m9n1bbpmD z;X-z4D!QG}?IDEjApOxDf^HtTdE{(#N26N~Za%3*cM`hOBeJyF=+>hf#P*TzHOn`x z+uS6S+q=maBVBln3)D9+R$o8&LM$f9kjOb6cOwID(~^E`@iXE5g+TPKD zutggO|26Gh_)p+X^5YQq0sLp$NARCRC>O@kFzsqBrmfZ1X`gDJYhP$zX(zOk@Md8H zyd$`Y+yQT4y$Nq5je*nz-uu~(wd30TA{k1{x4HXPtC9Q(*tB`&reBy~}71RlC z6)ga_Qfh}Q@}HE<@t|eThHz($)v~ARt=W^TDMOZzU4AN^B+-qn*`*M5E+xca(^IUL zp&5+!uxPs1nmW`9ub;LSQNlM?>*wpk+Qsy`qtB9F+DQCg1#ck>c>h(tgDu}b9wq z?_Ifk&fqTNE*O5^x_K+sedC-w-TCRug|lnMPddNAIJmgJ_o`>!8S>=Z)bEPkx*@Xe zyK8pserW!6UvD2*>lu?f&vwm(^M+pa#q@DkzLxZ1k73`p?wJ18^CjQpJQh8+=I%pR z_r57mnY^LTv7=u$91kC?IC$Hfk;mWP-(_>{LVxGQ_vBCpgJ|>8C-tR|>jlFducv(JQhWheh`Vf84 z#Er-iO|_{JQe!*X!0jFtx|%t)E@9-&MRjS{OO|hN=&X_T0GY@P?A!yB|HY zam}>%emqjgOPmwP%lUV7eP;ZQfrm~UUtURF zf1ve>C*~Y~_ntv-9=h|qy0;JYykOtX;^ZT){+sfz9KQOd&-NzuJGac8lJt{o(o;v9#-=;A{I1FLrB}9_2{YY}Y&}ahadKALG&slgg@g7| zZ?n(QS??sHld^1O(Qu77IA6Xu74MJKEbHV(?}CWW(Od5+li9L5n-TU>IH~s6!%?j~ zyLI%{dz<~&MO~H?Sj6YAnzs2cQ{l)iK5b<%KR#{$Pgv1P`nPWtIbB;x2TgA!sZ@@r z?T7E*^0(*h_oiO5YUhgRR}W73`rXGn9BA4S_ppO5Z!>7(h#&OP+tyDRoxv}mp)m)*EDYugz63l5P!E$8`#1^F8~-Pq~T zV~xXi{NsaztFIdJ#FhP4)bCq1eOf4bVC0UoR?Iq_nLYCM%Rim`cxv#;U!NNH&Z9{k zukU~H(NP0m?z8ao+a1q-{g3|Lk3RXpn9`eiT(q&z+7D-c`^CjyUvhU1iG4fXcI>78 zQ@3q+e%H$RyS~_y{>_Ku-`e<72 zXHVC_Q|FG;TlvrM=Tr08H|eb7_vdyyKBL3nD|Yt(_`=^=tY6e_8vnbyXp!!O27wux zTMDnH3VXhNVzdSxb=W6{;h{~q<@6bAcSq%GWAK0l@2JJPGY=l{#iynW!gF!+j=J>W z|Ih*j0b5p=wp(gADkAm?KG;r%=Q&2`#iogQli`g$AwNqO6+XK+VwZOop*{)M{+2X6 z-0ZavsvWEsgLSzwGs_y7C_P@$(oh|&7T_)>7Yp#Tq&O!}E*1W_>A%0B_k(kGz#9`& zyIx%X?Cj;~N50;9m$B^XD_4CFFED3Y_vBpOZ^MT#-!ifCr&s##d;7%w&JlfLPo(_x zb5`!m1FJ4RXT+I(zWZkS;#*FVhn`M-WXTKr2S&UN1IN$(=<}uC=`EYz>zdgqd*JTl z;|neuI>ui1=&||%^{bz++SB(b*E5sX9uI%ly*@hk(Tc_wT`lQ5^le9n%^7>!8#_9a z?aSV9t<#IMu489kJbLoO_q;c}=d!o{o?ec+9uzw~?ft_wGJux;O(IWeOkcl=#1 zJUjc$*RI<8P4MEud&#Vy9V=!Yx$26B=_|W$JmCE5)1jODeZ2O&Wgl((=bVMJ7tdMt z%QV|8cY5vQIj@)Y`_i2Lt>h@Q)Ejsk`2AFFmQ&2m{d$A$v)bk?A4`^h?;%NDnLbq? z6u-Mu(xunG?7!M(p$|!5>AY zy1_TR!Cw!n*S>m^S`72fv5#Kuv3%#6tLHuO;*z*S=)D|0^llIVW4|K~`TWuZ;GCw(8St@!&ey**Z`)bT&ult(ec$AqC!IHM z+0^I6?`R_VcO`r5o%L_J@9_F}XK!10NPl|m$V*F34S4v&Wuhy*%b$76ruTnbI{dT8 z4wro#esAK#Q!?$#g4bR1;Z5hyeXz*!_d9bwyGlFMyXxcdd3&z-e!~7A8>aZan!A6| z;W}53%*=(J`HpXvFJc|$9DHEbt>0Z)Kfkr-jN{8b+E;O>YwAbG+zT?MchFlcS+I`z zN%61#gRdG|4rh01nphoL*}ccI-&w5xe~Ta3sQ|Q!@`~HI3hx@|t^`+KI-RR>&_O3B zXQht^e#2*XfsK)fh_A(xvaHiWHSoCy2aE`rFtu~`czEeeeiqmc2VD&kez>0+rH_=? zZCU0AsJ#JuMVUR$${hQ6`Bs?-)ko~r;4FZTKiH>w1Ah33HLT?9^Ya|ta23yOojXjH zWy43I&5u=!xMub*H2>S}(fYED8~hhfNq^~Rmo<6L)s^{o&$e%>d}GK8*Bdw7Ir^*a z6}J9;s;dr`ZasYE_NiY6$6B{pvWxrFju_Bs?V~rmcsSX4N%(^?(|&1rZuPj2M>pp< zYcJci5GI^;lKSzh#)yATY&gJ>>eUGTkhpmacz2y91 z>XufQ#xLRw#!~ENDW{_oI1oq5zeT6S;h!vom>!L1hs~Wt^MAIvJ2#$7r+-=_uitw* z7Eh~@FRb^K?Q#Z((Xr&uQPa_yV%{Q3z%bb6@k|&}~(C z!?h_d_3l2ktm_>szxip+t-DU8JCBV_+gY}Lj%Uctzup|G9C2SkLv!Zx-)0tHIP-%* z>)pnm$JZ>H_t1i}eQEccoOR}~51wDGk2;Ut(sFp~gk83Se;bfwdwhNC zcbQ-BS^MzKH@$h`$gHnFrPgi($B$eU%3uBJ@?-xqJwJNRXV?1QFAGi30xur9;_azh zZ`yk9bCvxX*PfWO=lCbqS;hUb^8V>)WetGET1tq%^tu0Uu}3ri0Q9zVs*TNhX1fuQ z=8)$M-4mxqDa?`9?lK3?wGAJeBLfa7+QQlT8EqN41MYugKlt=$*V@?A_hnBTX#b1v zWcTU~-P(^d*#GgROFSd?zP9Jfw|gF_8F8%B=i{uGdkpup^w->s4d1M~Z_-KkXH9v- z#vT~FZtwlWXVncT$lY_@gAb1r*T47O?e0^j8Xx|4iFKiSfA!kOE?qe3f?hi^`jz~B zf66WSua-|-JHm2f=Fl1b&#!p1_T`)>tk)I%v-9R#PJBIi^pP=LH`=tmSJi)cY*f!p z5|eI6pL_ACTOPk`@wIa%^n7yYv<>T@>vH_2hWwX@4$gY! z^Zk2g+{d;IzVY+kD{maIVnK(S4|o3Qwbv>tBN@+}lN+)>%bx$_qYf|iD}G>V_ai^; j+_!VPYv1l8X`A1wy=V7^2OFn9@%|fwe_OZZkf!}Vb520^ 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 zcmcG%349dA);C;L-IE0ZWF>?pWU{h@2_b?5f~+FSq9C9mOGHEnh>D`@O$6(5HKPYB^PPwmNmH zMo1w)!AnFd0m-#npsb5&5Uq?fW;%i^BKq#^6Qtl*k77j5yeSvFr*U1U@*6~~xH6!ps zh!4*`&i60>5qVGPaD7|k{P0eA5h)bE<~-q@^lhSR3zvv+Epz3d$Og{c_*#rsvB+B~L&Xoh`lO_Y&LX8mx&Ep9%bf5| z@&mL!Uu07%ITzO@T)zlQT@?A@_lbP7zQ}hi!o5V~%UL2{-RxXOGm&p>)j6aA-sY#y zT}{UL_&_6XA?60REaQc(_k;-Qp!ZT=RC9dYU>fowJb%rjc6QUJdgn#IgpMfW4VO)rw&^Oc; z*OAiWL>oj)Jf1(GeHe2ZN9K!O=*!!1-2|F@9qHb|bpZLtqpUwf4bb;=6Ewi%jy@0N zL%+Z1>LK#OCZP@==Z#;?{1;Gxh);hcUMr>gQ&9*<3YF*O@0sDUc~bPl=n~E zyE$!OJ_^_Tni{sLWvzGprpULan?`?B=lGtl_oh|h@DnO3PB z>T@bTbSIidJ>}(1fIn;mdLj$mAJf_GQ&UKqNUx3_d`=$Yt-_^IlhWDoZR-%E9< zPpjU8eKtLK7iE11`s1zyRWbJOGe-AYI1K!2rx)<+H z;-2J;w`qf}7l9A@fd-bMexj94;K^MW|IdIYUHA^XB3v7SpGhas`%iI!Mhs|S;;FE4 zc;5$nHx}==i|JvbKG*dKB0DrTal2!zoRuzqk*0Q_bVTCusyGytrGx+mB zVMQLmd+6K9pK-qp_b>2$iFnu;Bpyb;KWq*{*$bh+r;1n2^Pu%~;By@B&*K^^hW_d5 zfc&_^T%ri(gc7i0@E0!(e)=4?%tm~U#yi=hEXslzxNjYkcdJM%JDOS8rTDis!{*r2U)tNgNkT#0%nQaYFnePKtkvrQ$_# zN?770@v?YDEEB(qSH)@ZoA@2Idc}XlHL*^t7k=@zcuagMwu>ENr#LTm0i!+Qg19Iy ziM`^oxFW6!(|}zhCc|!WiFRU!Y#`gn>ttuyOZJyf$|b6S+M_;G|1vU-8OD5Lf$@T| z)L3P_ZMtpkxZ72Wr}pmRGB8zrAvm%nwUME7e9z2Qc4B7>Md)@+TsndTHYZC z%0co@Sw}`oLz;5193qFxyTs?>3pq^QD`RA=94<%5k#dyGm-orh@_rd71r^E~L-}03F6@2>+B*%y1E%CP4 zAZCmA#WUdNf1nQ#>z9iAS3eR#L<0pYX5-wxj!ekP)BM0Ui;h#3(}BGyJ6 zh&UEmBQi6xSLC?JC6Q|)zluCvBcevb8lD<=*O*dcag7Z%w%0gOQ`M|p(^GR|&1p5~ z)m&P$u;$vDn`-W?`Blv$HBUt~jA|0qHmY+}pQyo6`B4+2rbW$*S{hXtwKi%~)Xu1{ zqK-tJin>&*cC8k*?x?k-)`42bYw6l;YLBVCy7rf~zpwp!o%lL^>Wr&n)!A6*cpV+x zJ9=jHn&{2ZpGOzR)Q{;9GXVdF#f*)a9J4y+WXz>l6xaqq=#j@un~Ans_~>9{NLD!z7n{rJrI?D$Uc{o)Jar^UY< zzb5{J_^t5=;{yrp5^hSkEn!^3(uCI&wj_L+aJp`M-EMVf)ZJP4Slw%hW@2<=+r%-6 zvlEvk?oT|OsOzQI>s4=Zy+!qQ*89HRl_WDMJ*ivLxg=dbwth zjG~OMGR|biXLimUnK?FddFIZ{gPGT|L{{glaanV+7H4hD+Mjj0iE5JGq+OGtO-44E z++<0UolTB6DQ;S?X`7~fnvQF_xaoUM4>l9cQk%7E)~;EnW`mlIY&Nmk;%4ic?QHgY z^BT=NH}BK@j^=kaAJ_bm=F^(bX}-4khUQzEf7Sfk=Es^Bw@@wOTQqEOeT&X5dbOC+ zVrGjqEk0N97-fB^+ZLN;C zj%c0TdQj_0trxZ4+WKf4vrTrJPHlR(8PsNEn}Rm4w>flO*mW(g8-3l%>rQ9a&mNX- zWgpKmbL!`G$Qhk8C#NXqP|oSLDQ)|-UEKCqZg%dB+%I!ax2xT*Gc* zA}7Wjli`kWXPY9BVr&a^c0neknA?!fg8u01vYd1>CM_l|AuU(-_4#}*tK^88UXtd+ zB&A^E=%7kKctJ(mX?G|PTLrz8}2w6=gxEUm4i>X!rgqO z#kmb5ZK#|&G;no@o{}t=4AB#kny$2JhW|ljr2l~wLpJf z(scJHt`_tx+sSws-y*;CimREc5dBtD#EAwXO$c|I%n?*>T53Xgv>Ro+Q>uQJ*X=X@ z*jKV;>EgvpXG2}Z>NEPZky7a+I`h#N7B5!P)B$Y={N>Ly4yCqPg0|HcsY1j>yR(Ch z%W>!CB<3WfB~Zm}^DReo`u6TcBRu*B{PRF5?ZQ78DqLoTJh3s+Mj8Rx=zq>*^i_LMPi+*C6P}kCo*14L zo|TuCmneHJPyV{iiPxTZ=%Hz=PPX}{%Q|)63(bq}-uLB@cbi%FGc8!g0AmhDNyr%R zL4q4J?#`8qE!jdJwDdtWIQSr2SV*5#8V0+|NA`J!krpS%SU$_ggbliq+tpw-n7)$< z?p!rkN2$RUILM(n*(jKgIH(ag$VcUY7C&mfVTSaq+x%C;7$uIdJRSC~3%H?><*8BFW)LzDql&xuLP&4?+s zWMA{=A^F9_`FqS1%xHWcjqh^>NHR4%w_Og=y*t5UG|+30?AUQc)v|Nd7nVwsU1jZp z!hC(VUZkT)G!UH|SCPLVsEzW)ht~y(r4k2$&eGhuZV)^Q&ELCM8C$m4_FnwS-T}Qy zb}!W%K?wOC{rK-g2AjBhIHsLna8CN$CN{)16j1m*lj9+|qw7PM- zy-l_DEnO<_u#B~VJ7hqceQ4T)ywgjsm^sLs0K71$2Dd4M7q#+LW4PU^-lMZrL;I_( zgwuGv;wK0-OZTX&N9(qPOgm{dVV=5TE^&P-qC{QdDVb;ni%V(8gOVB^mXNQO4A<7n zPx+Lxf3nZ7gON8v7af}2P-UtXa>A4A_1C$&lTNW|24I+(aw#Lzw3oquqxJSLC5 z|DAo!zGk%6U+bS_3)x%0qkS-1-~Msr11DsGUUK4rkw5C&j811xojPL=mUROGeVXbc z8L}VkeZ^@ntlO;gxUe)9S7F@V?7Vil<`TPLxEzZH+gdeNb=K*Z^lNeu8f-jZAJl() za=mPQqx@1Hv-C!NkQyA+CGbbE&XM4PGF@WU_xS>^ktT8K50f8ON=Kabp%0t}cLt?& zGzrrmJf5fEJElI&l?jnDA>Wu|C#iqS?G~6=|3iNQIz^jg3uAyf6RH~=4h}U2*s zlTC^OR{{?Kv1l%aLqLn*yS!ZWkStp9sQ%^kqN3O3!Tf!8GrP9(29_Dijg@-f`4@cp zS#{g$^INw)Ej!At@#EixK-cT-MT1pCYI{Ii#>>W>z%=`|OT*;pqN35?Q@=tkx!wY8 z)_`1qT#{)9RJ8nVo4R+O8oAG>vvQyfFT1SbvFJQCkNczu{7QPY2I!P*3R0&g@XdlG zaHr*_L-V;~iquH?vc4i4>Mk{<(C_q<%TDMqPzN7gdLUPy(?cw2+Eeq+?=1<*7xOs! zCI-Fi5TT>dP;7RddE9rHM)0uDx5NI2x_O5$+oOI}pMrPoZ)|T5^eu35O<^9Zg%Z$% zO=V0tp%(2{A3&~M)bIOLgxYO)u+-hEc8O)VEct0}F*)XO@7}=GvetFJ zd!q09n<_M~o;+Drr|SU+&m7WWxIlz4MLy$JFw2K%(0nzyc&wUlPi7p+Q!oqZNlziA zoCUm!$2vG++@;1NtU`%C$^`{VtsBS|E-MhG^DP->6cf!-zuwDb)No31M`GTbE9EGk z`IbFREzza6PxW&Ow(qfPsr3^TRUhmlvMC|nB=@KsrG5|G1%ndqy7GPun~M+dW}!`y zl9~hw8B_F|s-=vd-qa940pz&Te5ZJ<`C`d~bU9_arXwHvANfe7QzoDB;5uL6MWml; z&P4k8C6m#HDWzA!B3*x_UvE$~6&wZj? zR;0SgjrKd4a+B5?Ezz^|y>~C~BI}(gF{p06Fj#kNRo(823zsRfa`n2wsm1#9Dkv0< z(-+3c2SR=762K$63=i~HC6;?g{&q>X4{_T&`q#PkF!j{bF2%cn5SKxEW)1oSYs7iE zb-^RxT4IzS$HlwJE^wz7aZK76=XKQ1FS$Hco1;@P*Hct2B{QnhMD)=z&PI92Dbv%U-q5Ub#a>NoZ4|?~-QbAxaBe!aJZ2 z&{kYd9E4jOXYyP{I0$j(Bt&fKaeNgJVFCo?_C8+Pq6)&2SsqV7hq`FGSV&#IY89@y&WuTs;Z_T$P*+3+V z(x6nXu0DI#eCsSyIy&|{*a7jP5qheMUQEk^I*>sfn3*q&o_#i?1IKh;0i`F4NasDv zN^jKPN$G92TZ|dws5s2g*d8%EqwWaI&_o6qtYjD(IWZw)QTDxSwj8E+EH3c*9-AjG z*q4ug{EtTRdD*|68lVSc>j?X3bD)a$kv*^$xK^vDjJ2~Z`zzJPnmxNvzaYmK&Q4BN zZuv*Dm8@6jN0Xhl!VVAOA~PMn%S#MnO_iM(lVjXDak1VZJ1(B+`$V78&Ez0fd+DuBtR^Z+Nj;e6vY;olEz|Wm%|eJ3SsbJ`B0`L@!Y_s|$C(ZhD+PZa=uBD#D>B61a zVRU#_yWC*fS6`h@sRQlw_QD6AIb(e8MigRTmY>4Ouuzq?+J_3d6d%eQm+6K4H6a~3bw5802Z7k`^)N2n!d0J%Qy zPo^8fy;6DBboZ)Yhnn^0&aK>^`9hj~kgxiAY9o0AY~Njamrq`T2#M0QE%}6eST8im z{IV}mTiFISZ)94j$ctGaPJ|ZkJASV0sXtoqfbZ)cpy#NE6wx^vRj)^)+*6k!8R6f+bOLFpt?7cz_>3)g&KDchV#w#%%m# z$|s*{%XjLv#YE(D=gMc)3-;L4PpcBn3t)i%NshC*CDZo80n~i29tf!x_{_*FImzkL zp!<#?T~*zg_R(e;^Oj71d#670j{c`U?sc*`S&f*$S!74MpgXbdR==w5l&|Z@4r2kP z(P2GB&O5As);}MHp;t>kC8vW(F3RcpDJQ?4W-8=|)#>O?1+L6X`b;*JIXiWqM^5!z z-w!o^X|yfbqmTD|>Q)kos5c~^F_!QL1eNF%qpiJA-5dB)Jz>9M*0=141q;+QCp~oN zL*PAVN*NXt9bPvkIx#IXCORz_)3H4D(Ch;TX8Q=Zto8bUF1+OyU8oPNUoTt9;TG0? zTCI2Lg)R>IPaPia3m(39h7>UCSaqXQM;yurd7+}Tb|@beW&KvQ3ah+^TW)cxK)d8J z%xhcCat@@O!pL`Th05_mA^?qNnd%7W%GRu>7`MZ`Jo*v4TnXRDHh- zYxC8;Uj!dvb?)B!kee8UIDU#_9p81I&@x`a$_3ZdO#& zvVM)cQGQo$n^?)WR_s@_!wlzk_X@WAmJnW*-gm`1W)R;>?{^^*p}O~ru+~ZMXF~49 zarx&_z7h-JSj78MOgiPl3h%o@KvH_hM}@Tn^v8LamrCq<$4QUes$qrnixxWRS;z7F z{&-=aRy&9fbQr%M!0#8zf@yMp*veZPqM*^x2E&yX>gt2lFQa-?ED08ZC)d=O64V1LYEU!w))#~*a4 z@w{4qJgm=StE^a@th5$k$_lFwOo!;yjmQfRQ2E*l@j2K#9Bwkurs}Y6+=vk6jTpC1 zH!}}z-xgLkXbf9*!?x{cDbLC;xV+M%<~^=L0WOBuv8^J(N)9e*BhiAC-5%C|Bffn5|0| z547gyKYO3qJZ5Ck9Su{6)u|ug+un$}(?m<25r;Ip<9`jUtdMpOdcD;RBrTg`R${ID zxMW9xe);joogELru>)`w^J>bwFg z4mZtPv6$N~wTd;?(mXDX1#env{$c#7ZvZg10`6O=6XF3G0~y*B1_G>EI7&W(E%}ku zR(>Ipd?~ldEkpl^4LkD()DH3yt=#E)L8LhLd`e7$nGoMtlH)!tmm1kxLeginCHujW zU&;6MSNGiG(~~!D+BJCOn=<8!K4*L)59((I-t)J+($jivw>%MxJx}@sOd?4FC-!f@fZ|%Mt&h>}%^Gd#}2kH@M64eJ^&M24T%W(_g zIObDgvZxMRWm64W>SJ;&RTI<#d!9Z00rk83$!=`Nn~~Gs)Wc=ro71Piq(73~Uz*-e zJ*ghEpEcD!JI79wLvzrng*hWT=#O+^2dWo#tGeu3&%6SQKiL1dXl(=bSYcHxM!k6O zPOKsoT)Qy#wzJ(Yx~!h|8a1@1eXm+&`_*;0H@1JG3*|vSR+taxgr~`fvuEL6BI614 zX#QSdjTOw4hD$w_?hcOtK4f4dx(%!;Bw%ILxgw>}qJz%e4ux$_3(Py9 zp0c+emoL~y>`VFzR;t)N;J7o*L-uUc$!ia;%dSG$g|%qy!Lg`8D>PZo%7fK{HI?u* zGFV{l=H-~TJoL7GdHm$bA1EP8(6_0Jaa=iiJ-NvrJz6A-6~QsvJDm>P-2{oc(rioekRC zr17X5vJa7;{&5+Qd{~d#hwz(;hjm}sUeAMYnCElWh9#zwum&HtyIB(~{i(bWH=soP zf;k1*)iLQyt^4V=C~CPr!NxVo)A zXD2x2rH7pP`QP;Iu&CdlLH$m*%ItRcZkaV;>e%7en=Mz>$R1R`PrbMG^7QoLK|`BC zQaj~3ejfByxtyj2gS6C7SFBvQ;-2E-;%mmit(!M18K#RhbQFy#=8n73o(PO-YqTlk zM9Co6fDxJ~m90V0M6jX{LDhB~E8T-$gWG@niM%ak{+A}>r(O)Y7v6dCxjk6u;8lhA zc{1Lvy|mmP0~HYRHc&q^Ugi+sRgu<6E}{Cipf!jmht>>-)(oTjXua#Yhi@D#Z^)ed zfR0)^CVkffk4bsyje=&ojeD~6LhG*ajpP$E?|Aj8bM~cHt>-@_g{pP^_0)HIj&T)r z@%jyEs^AhAP1<=iEjv%WP3t$dEzjTX(^vH_*?a2&V}#FFGB6ts&bhLl9zY8?Ja@&K zYH(ePyp{&av%r?1n{)(8{EHX1z}srR@g35^2@wZ^%ys7*k6N}HUYChv-oWQJ)A+@; zEa)vst%JqvG($Oymf3l6X?Zz$vEVY}m&Og=ZC>v{@`2Si>+LD2^lA0hvomRzTmHe12Rosl0qhB(Csj*6 zrk};YKIYt!KO6ZMhVti8UKz(Q@VQi411t?NFEQx+EJ_I6#Wbs^IW9 ze+~SxBUu@?oxH=STM}VsTdF;TwLeVlvzF=&mVWhlNC&3b@D3Q$aLkC)ofRh1IMQJy zuoIL|B59)vPB?@VutUVi33AZ*srm@qUGR@Id}1=f6w7^cdPmS%qMw#Wz(0MyR#B?f zo;?*fhvtCW%|7LE2WFo@z4EvNxjn3N`FCNRi_?SOVLTDD1AT;6z`{TTM;xMd;?zZo zXuv<%g%x6U{`<6`W5k7o)|Y7Ic2-$wLWzrlsUvxC<7)QWsY2ZeL zijWnF&=E2y5k5jQXoQf!3`&Imgv9l?kBpx_Ztk@EW)@8D&~0YH%yHAFJ@&}>N7}z} z8Gq{1l!;Tjb(=bI%I!;^yJyP8Cp?}fCQiA3*0WDvxpIlyj5et@%sT=r4&b@`s*HwY z)HlMC+DYedSQ&2xS&HSv9JcAn!&SB_>DcwUuNUmvE+=HW~no5=@Z>7mcy{O ztD=259e=780P6YcSQq#RO2gFmL0;xa7^a=?gS5jDF~LRpaI&Mr54#F6Dxp}Y<|606 zi-$_DGW)1DKFYPP(wxNprqV~y@n3{XO{zF|acIT$7Sjqi8QAU$$`u$^=5T)R_!4%> ztZL=ZLV1PXS53c2MpgU1tBmLO2&PikaruZ6N4*P02Y%li?;AVsCF4`-_#~k1Rfh`c z7nQ!t=^@?ZyA|GdE#1KHtNJz;szKGh-$n8g{ZKW1SIhzEeN|t`LKRu<`(5(IYTtLI z{sdj+n@f0oir0+d(qKQzIBT7ipHDI;P*_NOkZ*p;X<&0zmB0zavg7X?E2(p9Xu&_c##vHm)55;b^TWFm$2EHNW|STOtEyq+ME3Pt-nIDVl9M>4@Q;RuGbTvA@aPeo4r zf_-hToP{W+7i3>2uE9uAlPQ!z&4;LrqUZ*adsySW33W%3r%1Min~8W zU=z(d|Eb&BAE->Jhc4{<*kj#NFrtrDCxaKtLZ*+ZGJBzfEXEjNq|C*@5p?dDV==U< z&e0>5Prf5xw)bR)*0H}tSkrW@s~7JMkp1S82Ybjg`V&V$X0_{g#b*ep*9p$UK9PFw$m0^N|Rh=k}O*WasD0y2FO))A{(DF=+Mc zgJI<~( z{jH99e)l$1$0LxlkLYfp&+=D5KQ;(txXbu>8!5<-0KJ_{$cQ*QFxSm;^ND zH)_nZL95@ma~c{`R%QI3TE#Y-tAOi_rTGuFDGp|6E+UVK-Vk3X|HsOwP($-x){3Vd-pEsTs;oOW39Pxo(zx?`da32^Z1`o!Fc1(yaBktheI=mj06{J^zd9zdRP51 z#l=`^ui9^KKC|JBU2LiNf(=9`H2}^cAM7K_mzNL@84{jb=(8Z0uK^AkdCpNjy{CCN*%;`XJQx<#JqZZSMl@xb ztn;pvgY-Mn`>yrwySfw`Vf5|qau6K=8D_A~sGfXr(zU>73to0&7fHgPb0KL`c>$j$ z!jQu$m`Y>CA|YRP-n(GIUfEf1qr2W_KK1JCDN|;@8c22Sn3iM}73uHvcSS`q>u>x= zeDC1f3N@l8M&tgE` z99#4@0;|xTNSSZW2=qp{>Iq|G$!wKq{|cpMw+WoKETgXa3i+T{Tt|?Pta(rarkF9V zBkKaGyyO%%?TLUO#xsg0fN!Gt(!ah_Y`f{lnD*r%Xhkz1VDkFcq10 ziyVJJp4wo){iZ&35(|dkhxNYpk?|bT6D<`R8;unBd!UbG*=id3YiNBf?oV%wjT6R? zA3Ju;{i7$2qx+cqs(c3FW#f;499H&7b@5ylV`k9GYYuSBh?Gg{-u-HXzJlm@s4_?q zvvbKdq$S^0O{8_vinKFv&xurWyN@(CcmwggREHzK zSy1CM^$no$sq1Lax5WkkxkwS+0YZRHA~!$x>WfQCg_`6u76m3D#^Y~TKm4_O$w^~T zFuy5+`JH_1Ya=#~Ni%vD4A%Q;vg?z-fB1#Zl^b`FqC=>ZUKD3!LjE5J8|>N%f8_u% z3_JX=YLFF^15uL}o|R_cAtpS*Al(}Jmykg(#vv|Nh(FaMXDljp)vMhiE? zFp&_C&{@PxV=Ma#`WcB&OAFZV@PiQZr%Fl4#^l6KVn$iko5lTx^>SR zkTE1~*ogRH<=@^LH{#y7p&9-1x`)1vlW)Pjwn$FGmccMNNiRy21N3`m&+7N&fU~mC z=vu0wo+wM3H`h`wwolX=ZJZpE(J!}a*W7+6efaRWVHrc)4(Qr_K--}i!{~FBZ?gvH z_V3Gt%AK(qW|Ffu#-kkYNx$t&S|f_{oEOOJC7@*xEuu@$C#5Wps-AiZJ{wE z`+G9RpVq>2XnLCiZp(jW_Uvci=0Y$QWOu+x_pQ9np&OciWA5d$wr)l7#3SZR)g&wp zvIbUKneQ>UO0ji57KVqOICkuW`8gJX)qw+FJ9*wRCeP#}6Z;~n>fnWPUA5^KO42Wwf9pXm+8Y8n%`w=O`l4bycCc4otr(VF z)k8(E*FBI8NbZqnawFbSrx-Met zD8Rfd)-Hqrx1IZ+?GIRapn!$aSEcPeg6|=7(YK)AO6&9sRZ~t6c||c_m{au+rk_|= z{+bGNu+Vxx*##BnV4*oiksgFS6&BG0f^|Uv!K-4!jTLq+Dzcd)r&4`+#_ym`UC z<(NB@ca@R%FSz7X!Sh#vlw~7w{hiSlz{qtZvUa%T9NyZ1})#fm~uAO>P zOx_xY=AS5Q@9_%#c{MnvqV_uWoYS9I#hJ4HoWkj|xZkeAF*^<8fb^~%=m&~{gzhbi zn5qzY2y-v4+UP_1A#BY*g&+pqKF%0c@|#qc7gvf2xQac_)s6YpU~ER!F~1sI^ClV* z+@{=Mn;d_{-!LFgGmQ+ydnK-7`IgEj{W*ctW2%U@UlkYG7f3qLk3OiyQ8bmJt;j1{ zA>zttj~17QU71ffjYZjxZ=^lw@_H`&lJv^Dc+a?VyvE?*d+Zm%`>H?!xFRHC0fIA5T; z^cQ5kP#Y?xzaT!VHa*%_ZTgGy$tr!+jK^}9{Lo2HF^5cVy@T(exhnOklm3ESU2Xac zI7_3t^krjErTmK$JwxU5JfRRY=am1M{F&?L7)TzA2IXtE&~J$}>7tE!<&n2FC3yR< zqi;_VgI61Y3wsC7FI4A@lj{NID|jrySG(j|ZYOLHvvGKH;CGAjzVtPmzU1s3arUdg zc7Rs`_6b>=IgJzo!`IW66(6>)nCnkEdsbZ5NvpWnu~j+Vm*%7im_$~HcE!XrLH3;+ z3{l1Mz*puYUseeFby*9*iNF;YR`RLt4*FCvVwK{EcE97at!nx`f02GqFg<)PsulM| z3rvm-aiMe*^+l=1d+-PP!iiJ5ungs+O=+-oUc*?SC&>3uQT^=oZF8(0ngf(;8zo%G zLeY!+A_ti7X8P^x zyf5|37b!h(fd3XaIO#u=^BFf6{JKNffH$yXdN7?a&Z3u=RA2F z+-ZLl(q9MM4Dp$Am-Q=R9Pr+;t3KmX9#!dB;QkcKsY5e-P$)TX%J`0?M{#*%crhu* zO3~pVM6oYUPvU)9pqdPtknq+lq6+iVz{~4sf7Yw7jxo)-C6j}jv^G;@{X@W!{2G%u z{(`8T{6&=A!Gp=l7>zK0pMwSn%Zc+3;_Hg@8Wd{@;eRX{a@gG7oCCN{)-)8 zX;q?h<=KsI{NV?l$ z7heBRd049vnOQZ`{->zhD#f;fuh+OppSBD3?+e`T6f1(*TD%_=eBXfIV~-T?X-gH3 zJ^5K^o`>pu?$cY=1H@K_bE+3QjsWx(R!$%#PS!wVn6G8FeMxdb+M< z&r~x(4p1d1h{{aB92eA2PCGiyA-E|ZH!at(QcInk0hXGoZYi?#Wot8S57>($NG8zU zI+k;ejk-IyPKR%Ub1KJ14aLM(O~2@gJSNg1XD6jslHLRP`%v8PrK#g4%Efm1|)x zm;>E`QFYT~xNO%%WvyzAelxg(!WW#RRoq2UQNg0k80&CnjkW`Dhh9X`2lYi7a6iU8 zJk)tFSM%6Fk5-CP*o7_ol)ma3*)E*x#5ki++LKk2q%wKiz#ORw*pIb**2ClH9S`lr zDtQ-WkdCOhejQqm<~ap$Q5^s8>|K5x{TqV{h&Hp~z(qhPoCBC5n=b^umM@*rN4D%j z=;v5_B__fpulymSEd7ASZmM8CBv+KkU>wW!9&jXTFEZY=<0&7$244t02fjZGUcgvz zJ1UHZ%Ep-_ZYXXt3FQTKNjD3e+azBzdLiyA2|FAE1MSu-7CRkFgnfo$9765mdY$!o zv@0SVY;a!3H#!2ln{Z8SQ=M%94@Lqa)3g zJqKCF~kpX&1`NBKw5;xBA{STU6Vb z)peXB+g!a-9%z~No6}st4VsoKjkP{|xBZT#=BvrDdW2319COB-_J)Jb+5jP@TkZ?y z1yEX$e6Z`gH6{~Z!ymp>jl%#fwZ}29v7UAnB0spaLVj3Vl$&ZVGFNdJK!{& zfw7vbFZHl`Of{bgG&jDXerDec^G7Z4M1wGw@=%7#QF$2;O-!|S*?Zj+WrQ&|UEimN86yKzQso-?8skX(4;!0hh!Y9O z!GOg-scd_HrJc-`w=r{{!4@IkWQ9H_rY-WRlZehDdzLzmSd`l0>|s8H^mXt7>4H)g zf(v`o4*7Qes%!b=?Z2!eW>Sw&l0QkW?x(jrttL3*6ZTH!x@e4xeDXB?4^`$8OzdQ9 z&It$khvrn2mM#ZBCr>$wWoWXF4I?@v`Bz2yA&R6_zD&|@xBO8Lvsc=iQLRxX{-EQS z$HK^8&bD&Z5+v%!Nq`m0F!vMg<%OW_)PC+S@T>Wr(}q8l6f9+zJVuyQE`s|Sc3+9B zkhn7sv;8=j8lb@7xjt|KO!w_j$xQ-tjVIjp_q3^s&H*{>JJ16=2IT1;g&zAxJJCbq zhBhH~Yc|TN&0c8g$yk_$(e4xjM~3l3OmxvE`C_VSqPp0h*!z?8IO9h-L(kTaf$`?6 znRFHrSZ{Lh^aT53l( zY?)@T6{46UIesX3$^xG%;%o#_JC|SVC)>@`(|qbS*>>k4{iaoDO-*~R05N!&g#PhH z-`o%N9_j~_XJEr3xFx6~Ew$M$#a_hV9%|@F*Uk98l8(%-pd)vy7`@1Tb<-tv0>Z8d zqWkQxNkwAy8fUt&iVXG@`KQrWz0g+%&D+CXGu>r65`jRu*|Dr6Re0S7l67QUY+j~f z9T^K9Sx34)dtvGP!WE<;M^B&p<{G=6&u*~h&B@b8lXhHDIDhF2SFS!G|FK3Nxh?_g zQ`by)$&Ym5fX(oP>ty;Gee)AnuTZ;5H;%x0x$u`%JvWNNEkUvzb%}GMEcx2}`Fe!4 zcdvEwWjZ$M)sxm<0qv@yvnTPL<@4fxial-iF3G5B=`wxaxYx81bjhpvHetsDB7H-dS*Cxx)M4 zNxx;6>$m?HDLy?w55!bym=wma&3sqb7lhIo{2@2kohR z&O+6_-S_Dgytf;boUCSVcaYz)8yPh0j5Q6|3Y3ew$zDZUbBz^xkxwsT{xRlYaH&7p zhDN#?v_42t>;KiBVd!7jr?i(QsDEj{Y6c`A^sXzWg8o(CL(EOyq$b<*H|aiVoZJwe zD$mJFsq#_1ps|k7QH}Kigl!kQ_1k)t`p!0!aUd*4nsFog18y{C6?E{q!`Kl$?67Pn z+a1=!a4?AeoVP;?QA%^^f2cBJPH>+%{B&V+ zow^7sN?VSflcyZTGBh1tIe~mJXdvle4qF3ZLM=cCx0lU!Z~S13yk9Ry@CSSzfhXU2 z*3#eVJ@E820{>`5~Ti)N)UaJPC>lbMAt?FR!wq|cgmU)(R)1e^Y_K&m# zOuU1AZ8tHG)`bNaRA4UZ&2l|#PUX!#XYE#-L(U3?{ByN zZT}_@f%{qi8b1TaD*88<^=~u1Y(7G;o;@usy;}}Y4UJio7j$_Fn+m@f@lP2OlAUO0 zrFE4>IK`QD4bDi!`EB4+G=lin+0%y43(+RVf39nOQs(BqI5sTccQBh=_odyQ;MJj4xRMKwH>UmImJ1R3Z<0% zqAH*G=->_iILeC(wwonhuyVP!!ZAZ<&sI8U$jRFtF<1t9La5K=UqoUtMk&>YV-Z?7 z!>#uJ6qAMZkl`34FYDbC7%xNqo#Hgg#~QSf&Y#H+{;z!s$WQ5q^E?c`0DR_{3;x_O zR34p`hVq+Jy_L=YL;t5&>3a#cMU|tt=p-=tsCvV`r}BAVMjrV<_JS6%HiPovMRoAu zbqpnF9fSFf&(#Zqyr)Psj`pG>^=$0FBJ1BgRMO1JS3buLmP3Af74+K^@AV4O7kDU- z+$*?fJ5#=KBG8a7k1;N=w6G9SFgmXgW&B^ydmY(kUXOZFC)HIJn`j&iXqfDy4Hal1 zU(^r6%VVFRU70u$H5PSOnjhmcc$&_@LVG+s4rtH+ySc7YUvM05;BlCO`clyjj5%?( z<4%NH4?d~$o8&g1{mdr&8K3HC3<^(wywAB@fwx`M?^j>ZV`T)r$ZqM(JIq$^@rXgDMYRvDC z2h&gF_cKv1pOqky4$GGt8sdiXt($ls<+`AuJC^J9zbW}maK;4smR!F_2& z)0Vc(5$H=)A4gL|toFf1a@LyRL(Jd_5+-AoJR_Ht$WD6Xys-~H`?FpsJ6*xqDVF)Q zYOUAn;u|ycDm{zB3uRk5x!tMFI=>_v<)@+jHGy{oNhPx1FidGXaMDWK9eOyK9`74{ zOHR_>reHf^*Y*KE+)k4@8cPYFRuLDHsb(MT(s9ao^LHag<9Ci~`7rsTT@GDpsD@HM z@hH6SyY!u=9EVW5$BFJ~Y@GQDVq`F1<*8CAqK6`YDclvCGuvB52QKf}9XNtXNs)f= z`>*7Sg*al^GiRl>!SWPl%NBd{Zg@}DC)X2|t0(dverR{d8W9tHgGAW73#+BDe9)89 zEn7pW-246C5k>xKk8cP4U5{6z=)g=1JL3oG^FQvNI=}nmTjVPFsa)xl$@GH$0$sxP zsv5iCFjjp=Ugn7h30*(Ld-QI+5U=kr^ID}IE+xQNlz`=T)LxF z5<-_w)ZZ-w@;vs0m~cH|(rm%BX!c;);lu2g`->PvXCD3kYrPhI2FY%=cC93PUS?ur zaGZ1Q-2S0!dR}-$ZrG1G{b!$@hk8wsT)ozG(CdWUoU?vF&I_GCIdsR#$UR4^v6?2^`?p=Bx`+$0b0G?0zp?8p+2M99g)Gg zm-xRwGwT`f#bD+ONU`Agbty3zFlIh5iR?UnnY;^x{GCr8muKyBOD6k{b;hd9P`!p? zr0wrLx|i`fnn`mVV;#zZpOIt0uhKmF`^o|(LER*8r1=HP42MUif@bA?w0=#{Xdlq)ERXvQKuFo%fN3*{8SZZTqm7>kIq1 zO6G{}WSita$=f-u4aiTUUY+jRyID^4+50!!`+bXz`GLuqGM`Q|)n<@ zmqmIo4rO816Gtt@;Q=`WqO)@Na0i35LUgfj_Tis=KOM%AS9;=a1N;4k?Osk($qqux z;(kKI5tDzT{*+paqG98mM`vO$6Z8=4CsB3=PbK|CdvzT>SGKN>UpjI0VnH?fjP&Kh z{GM^=@-H~))m_{s7}jCE5R>jkXMqdYGk|+&l?<`%EUKM2_pn|*-O;B#J~?B^z`nzG z;yC(X$U998DdwHy-tXkI4ZrD|6O4c7aX>xOgY{4)RV%=&@{o8Vu2LNo4qp}=U$q9r z#&f9rg21F;J+7x+2RW9jx_W5o4~-%hNR?WaKX&hs8OJ#QKN!7FCp3Q3y`ytdV|S{6 z=xGw~0l?a_tWZ900&pTMB6Lq*s9V$|1X%=2bM^v+B6t{AJ&F5110O2%GS+iA0*H#Q zPzBI7U`PeG7)(RKmBzxXAL{N<6_DkX$AkEl#``?RA%aG{{2b5nzUPrCJJr(^Wv6iNFJ_^F5y0Bl` z*oC@io!}PQ=GP`+DWxZXZ?Q_?-xZtmazA=)f|0 zRHxD}MM&|gK5A0?DXs<*wDRvn&<|JaQvrLG`_WPIlKs^N%i4+^*1LA>fT^Ji>eA`f z^g9u?opby#zcy#M?t$l}E=r@{iNM)p#Qqh2Ct?cyPDIhm6JC|q?91A<4nHDxtKP5) zzY`H5i{)KUuK%XF?xmYypQ21{(_|j^TNCu#=fIKdR)o2xNp}t7sQL;l=#L-8&u}TbuWkI%4CizPw z9VwNNR+j^pDaHr*hhmtCU{bLs2sSwO?%-2Of@=Bnh$SmF-ywC^UK4K_f?s6ouf>Ib z9=a&IzNlZkIAyv|O8m+NR@bt#t-f>hg5(=J_Pnh9LyHPty?4{J`-glWAF;R4*=mM^ z2j&2TNACYICOB4{0$u-GgtmlYVgDDr)UUw+*~<7`|9_01Q5N>`-=bI}v_0&9?L74> zrltX+M;^;yACm0+KO0SQ>HfFa$>CU=_+LBE*}L|CjTeG(|7*Oy;gHz>6|-P0y<^Lm zbT<8eAIBUF89;y2yr1%tU%fWZ{bT5?3XX=BnDgWV8P%aIAeu7r5f2oFowe!7T|qTk&fr4VkE;+44-FM z$Z!?IjSM$2vx3O5N@r}ZE&TkR@NCU^ww5tevLtL8m9Ln%6hIcc(hapi{9=9b=JiyOm89vBx9K-Pp3m8sd zIFaE)3@0&snBi20k28FN;WUQR8O~t%B*U2uXECHc%!Aj1;7bgtKl8Xh^TcX?re4kC zUdrK`9t2h9<)>h7k;FFpOeYn_)D=ScdToiFfj_|BWDxS02vEAxJ!) zhvUl$rZ7xpn9h*6EKfFJNEDtYTQKy{n99!l%p)jo<>$T(c^oB=pyaWWJZh51OY%rb z9wT`#rys$Ps4h?5$B=j=Px7cq9xurwC25S>GhMX@MJ>m34`9+>^kmqJVQ+^0_}l&r z2k@KQ`S}ih9>~vw`1u}wCTeNV)Y2Z*LM4x7_#ne^497DpU^s#EPGtBH!$}MuW;lh@ zOy%dt89u>q8pG)fi8k7UHmI(b_zlrUd!~){pbcsl(MEfwjrO1oN*Q2Cw9y{4fj3ey zG%39dV;I4(2E!oaV~Foj_%!*qt344W`)#;^s$ z&Rk}1hPN{8%kTR$yqzKUIVgc}9>Q<#Vt5b3QT+ZshW9h%QNZXg$9fb|qlaaPhh>Nd zBTjEfhIj-~phwV%dmuvyk__=chR`#~5RahRJz@|)59a5)7}Dr_AouzMj$%ku=fUU` zB---`k`*376zIV(01_lR^azp_9zn9gBS=XVn|fsVXE*zCewS87#@}w9;OYC zB#GexZ4e}h;gK~MlEm;xq79EE+VIF&hD0GA$aa**62k)up=Xj99+ns$mKYwE7#>Ly z!y|c&BuNYpOAL=}#?K@%JdhPsCQ*n7vVtJV3XddN;bB?ffvlkSL?IrQ6&{uq9+njz z$O?Ktf+10h2eN`7QHuw%f*?`LNRfv!N3u;a5}LO^p2;Q|2~7&fHpxh~Nk+=ylv0vS zGKzDJ;#{LR*C@_4igS(PT%$PGD9$yCa}{!~Le5plxe7T~A?GUOT!oygkaHDsu2r0C z73W&TxmIzmRh(-T=UTR`UgiQXbAeZq-t;mTc$o{l%mrTN0xxrcm$|^pdeh5X;AJlGG8cH6 z3%tw)I4gupBQEeV7kHTqyvzk&<^nHsftR_!D~Sud%mrTN0xxrcm$_gg)7VC)v5ib) z8=1y7GL3Cy8r#S;wvlOUBh%O>&b5hiZQ@*;IM*i5wTW}#NIc-ViF0k@Tz;lZKU1ck zDbvrC>1WFHGiCajGW|@Mex^)6Q>LFO)6bOYXUg<5W%`*i{Y;sDrc6Imrk^R(&y?wB z%Jeg3`k6BQOqqVBOg~empDEMNl<8;6^fP7pnKJ!MnSQ2BKU1ckDbvrC>1WFHGiCaj zGW|@Mex^)6Q>LFO)6bOYXUg<5W%`*i{Y;sDrc6Imrk^R(&y?wB%Jeg3`k6BQOqqVB zOg~empDEMNl<8;6^fP7pnKJ!MnSQ2BKU1ckDbvrC>1WFHGiCajGW|@Mex^)6Q>LFO z)6bOYXUg<5W%`*i{Y;sDrc6J}XFpS>pDEMNl<8;6^fP7pnKJ!MnSQ2BKU1ckDbvrC z`GX)G@dMA8e&89?4?JV~foDuVi1wJ9`~VN)F~EFIN!H*GJY)KSXG}lvjOhnZW@Egk z8Pg9uWBP$-Oh15D@t$W%Kk$6#2cGZz09tK~eQ|lPH*BVGnisfUr*hVYLEc zh6uQt;YNm=7#1@OFoe~LG_X$)bt4!mh9*PUCwLG01Q7NKAS5#&W;B49(E!FW#Eb^d zuwVfpnE?|S!al)seTIHNe*yzQGV&hBw<7e#)?vAbBJJlNdH&2ww!=WHD^YusOrq81`dG z9MOd_>B5+FVNAL(CS6Dl;9K}i012xu`HaO=Xjbs-6WXGj42 zHZc4ofP`BY@{<4(Ze19+F61Y{GvU@n5^h~2;nqbmZX`GG3_l4VP5I zto)gC;@zYA`}Xu-RbBP-&24eLefWo_$}>zOQHB*R${I+4uGA`+D|$J^Q|%eP7SMujc@$ z=;Z@n`oNbp01|KpNO0*TpSn9*^>?xAuUz$4uKJp+`aD;Co~u63+S|R_+r8S`z1rKo z+Kuvg?d@Le?OyHeUhVB(?d@Le?OyHeUhVB(?d@Le?OyHeUhVB(?d@KTao^?X>|Tx0 z-=)s()!y#a-tJ*nI)BDJN42+mwYPhd$qTFwYPhd$qTFwYPh zd$qTFwYPhdo{*=SBkTHwYPhd$qTFwYPhU-B({$+z$&-?o>0+g|eRdC9lKCEo&<{9QE2?ep=Cs8gta zW})~iSOTQ(NpIXN6sa4R8#fC@`Z|A%^%0J-K0=E15mK-ONWl^yb(XyGIBfj*+jtx{ z9*2#`VdHVwcpNq!hmFT!<8j!yStxRN#^-a}r(fdJH~aKUeTwxFuEF{UDb`0wu|7hI z^%2s)=C5(1aN}m7NWl^y{WgCFECG(e5+DUjfE3&jQm_O_9U2>t#>UM;aqQ5D{egYz zM&ZVzvGHhZ+$S(u@n~#3 z8XJ$s#-p)uvry=QB|r+60I3^)8;`@r6hYOp3dL;{D+Xf-KXzF z`qunuT>my)=~8#)+x(T!`ZLesuf6HD$ogX{foLHhpu13vwBm%@+p zBJ4K?UylFpA$Wtsaqi*?kLjeir-uxxL$6K6C2)QJlZLIc)ZalkslT zepUOs+T~JFv`>!qnyc-zyUk>{o&LNr+CJDB?!9ibx9_el9yLX_nGG{MV@N02INQZ> z8}Tvi?7Q%<#61=Gznz`TM%f|w_dr@0^VF5rza z$kW9=`Tw4OgNysQ_rDe*8qlIG+%-06#a+)MKI$l9W{;sw7tv-9qVHaec64dG?uzyZtQeH1#a^FH3r9pH_ z18uN{eQREay;5GEJ&`?`ePQ;7?2E7$?8WR7THrFcva4u=YiN_}XoaV;8)%uEXv^K~ zR`$idZ6;`~r?WR=58-Ff<6n}!8E<{OCHu1Mt=X4nZ_D1EJ)6BFduR3)*>l;uvaihE zoxKO|A-y;Is_d(?zl^r~+Uy&%Z_2&}d+dBG_8IxM?Ay_I-;Eu5{x;a4zl)u5z9;+M z?EA96pM8J!!R#MoKal;y>>p)6nEfzz(E1U4+wsS3~-?04`rzu(J#AKz~Lui1yQ z|Cap$-aGvt*ahx?Wq+9cM)n`G-@;c0-EH<*h%eF`J1*|$hmLJ2HCl(Rw`e6Q| z?D;&yI^a*`59JSIX8&pVORziMpU(eG{%7--A`th}^UuiJ2sS@~@RFD1e=g6lVe@C^ zufS(jA3@0XXXmfNd$Auu$o=Q!OL>u(2(hu)D|_>fj^Z0aQ=_;AHfIrehe>C{5WDs|7rdc z*m?1v=RcYMRQ}WX&*VRwe+U~s{9OL?`M=D60sBe)B0_L}DgQUv0Q8she}_-}{7U|- z`LE@_jtvlg1G`iGr~Ehb-^%}U{@eNQ z%>Q@(NBKt(J@iq;alj zg4haT;>GNRy>YWWd*IUf71SMB&JTl}Te-Y9dU`ZB^x|0m%6RX}!Od$sqcUd+$rQVoXig-%aLR`2w9H2SQy0X7e?{$*lNoB*mgQzSdEt~Y{$dntG>-c z1&(j4AIBa`y2q}kN)J4Y|_2XDGytTVO+1tH!eRO2dY#$k+tJmdTcjaE!!@cf$vABNy zpxGYo9o*a*9!wT@^{=^&P|v+k&ka@3@jdn9*k)>iWBcj&_@=t(_`d$JrGHG+kC`pk zV-we77ebF6gdV#fcX1$haUtBrLAZ+xy55Ti`q%sg>CJ;6k9|R^;juTW<0sVdGwFDC zXSdnjKRUcN9v4eXrI{WT-FVcCN7eMGT#83UJSyXnjYpk$v>cCO&SlKGj5(W_vxzyI zn6ruXGqDU4%P_GF6U#8M3=_++u?!o_u(1pq%doKw8_Te<3>(X^u?!o_SdJRYQDZr3 zEJuyysL_qJ>c+ZsV_mwjF5Q@OH|E@pId@~u-I#MP=G=?-+lyuNVi~j4GDVE#?oJ@sjBdW+%JN?*8J{@n~Dh z7FKp{T_5_xqr+x*GTIr9hsOuE_Q!y;KmEX9B7a|lQTL~guiqTIQ6c=epe|lmzd70t z7rl6l%kL;_)|WMNax@vvt`0FO&PzEnPvX=Olry_^9Y-^+pxMWVw{8t#0&iZvI&7Ui zXq`J~y?zWMzUkALU)$H!eh(;7S|7fgRI z4C9R-AE`Td02K($;p*>?9zFtDL*TBbJ zcGK!Scvtm~OP-;3-v3N3LBP)K_A%dKnIA+EQs-GI39 z!0plA?xVZ=*XA)N@pAG;|NH3VItD6t=7DRw2YcaQ{B*cxfBYtQ;^;o63XMM+jkm8) z{6)<;WHh_|=x}H9pc>5G?}cq|r`_SFqyatr#an-OID5mN2;*kBbhLL9L+0h3{YS41 z@d7VaXLwh)_s<1abZ+2{ity(pVavvB;L#hTc?itzIMU*ed$Dd?NocIz4gTT zLHp#&=Ab<|cPd7rGSs3 zOo|+?iU5`(p~Z4&DFR%Igcr-JoV@W92E&jmIG1|kW?fnSq@4?z*3RGWH~UE0Ze5AljXov1~8QgOdSqPr5Kw8 zrVa-B;+h}$gu%A z7<^(sa>%g(IW{4u%OS@G+6pq?s!AIOKE! zaxl_FMGiTgfEzkkwZ== zAO|B&ROFD;3CO`n6BRk+EC=LZq=||ga+U*fFw#sFD-Jo!0XZ0Hq9TW!<$xTFG*OX5 z&T>EwMw+O|A!j)t2O~{Xes6BRk+EC=LZq=||ga+U*fmJ@O+ z4msU`9E>!vL=HLKfE9trI_i`aMq%ja?^^OE=gZTF{P&! zKV5<(;_588QWSLwo`};GTqTyeU4rr9bOl$6l`cUuak_#lMNF3KvpzTt zX8m;U^l6e=7rwesgmno%h^mQD)`jA%OV+I*taX7=ETWY4We9OyDCW9ky%NG*7mBgrAwL;VYdrKZ=Ki+rx31z3s!FG%M}Asjg5v|K$% zo$O$cS~4g5?sa%j|T)8q0Q*^n-@`TeBq$$R{ARS7DaORMy&Y&Q; za%CE(d2_ylWge!u^MZ7|;<~V|Q1p2LR)DIs5a_N`r!%JlYjjRm=J$$3FG)rT1EJJ8 z4UUGLvkH@5C@S5+_H%U>U@11eSCZ6QA%r?)Y%D0VEiI#?V%0G$lh3~p>xE+0p-eu+ zLarBzT}QP^t0e@xvyfAOK$(0bgk*P*-&DC|V`hYAFBH#Sl5rY^5bcn$T*FTJglaD| z*G`596hgK`#&UZl8M1>pX?P?Q;ohTX^+LJ3;dt8800{XY3+rAa+Wn64wd=yGN*BaL zJz~Pd7mA7pV#ukDknwIBrS5}##DtG86d{l1Cm%7Pbe{X1)Xy$LR{(6gOXz9ib|$milwIqjY>vI#naPcMkTmXOnpgun1J12P83&9KZTXxO0o5L z{yAJ#f-A+>)8j=YxKfOLm%d-YmE!EXEMr&+t`cjn4d9An!IsKCX#nvQ`IdK2Q?w*_ zx|ydEoW1C#5wk}=9k4i}n=F_i85UR#(N!ZR8;2=8zI&SD{gUBruo_Zs8Zk@KZwsp- zx@kJbT6D%hUsE!B52g?Kk56$DkAibV*d+_aa;=oyXU-6(-v?O8%|fy zsMvoujp1|!jf(xpctz?88WsDGagx*(>?!u&jd5I^1$&A8#|tCessc-w&_{~vH>4LC zlS$D{R?cA3M%6h+s4FW+5_VuCrQBrYdOdQ|1HM_56R>(+(yxT6xF{z(hmy$$a~iO& z=zb`Z&%-omUGe?BE<2=51J@Pd-|Nx{5p*fWzt<(F5g<-NgDJ|tA_!_zRp%bP5K;KE~oND3!mUO9l_XjViTHAncL>0C0thZp2`l#;^Db zoLh5xzg;o_0B%$%H%;!kWZ(fPCecms>XIBEo+{BzQ@NfY`5#a{q8#UPZNttV#692` zpJ`(m(wPJwY$#W`2Mp<$DaAbinaXA7OA6R_UJpdWYHKd2Ll&E@0rAtl#B(T0z-T_0#8K6G`Hk5b3uw$Wk2TJ7~ zC|OKOgng;K1MD16yaTRZQvZ_kVet->$~#b!-r!O~?IBaSq-(Gg=K!SACGji)_oea; zlABk>EA$}eEZn441k0+6X(GH#|6 zzW`*?WnbYGzd)({0)~ByQ~Uy@@(UQ2ArZGgsoVmFd;r~m`|Fd&K;r~m`|FcZ8@c*Ue|5*-A`2SM#|74g;Df~ZVYG*Qp zq7?ogQt6U*qmqfc;{QvQe-r+{O#FY_;e^4Y5w;&P)tL;hF~askDqU_KYlQ8GRJz=_ zZ-niKRJxpW%(ea-0xqQNNM-t{%78|;-)yuIsdPFHZHd3%!JFv8nI zCQOnsOz;ha=U2t(yS}FCEWEw*5lo+b*Vmk`;7Y~l8`76#gtmuN<&wA(*50TXeb?7q zods8lw0C{Y=?bnCXKzU2+z4e4neLYiGcyvS52t_=FwM!6{D~1x z9x}G4A^8&{oIGUGCEapHIC)5=OWIQ5cn~O1x%I zj+Vm88^y{)nS6wWmN$x)hcdb56kgsaULMNifGNbhQN%oy$){MDd83$lD6_3C@KV$~ zl*zS)aP!VjtGbGu6bU(R6giKQNedzY`pz@0N+zcXLeD$bbW&#L2@;_1V!f0yi7*M! zH;SOgHV`DjBtqXPh91f!!i1tXilT=yiLjn<6N;mUGKnxD>5U@kp-du7SbC#adMJ|! z6Pn&AnjXp|!X!@LD4rh5B*KKKH;SmomK~%G6Q9!i1_fimHb)i7?^njpFK| zOd?FkdPHHV2ZQun8DZ-owK9n?q3eyJ>rrhIVZzrN#n(fbM3@lvMiKTfscD85hgpsTgBi*nM9cE4sR8O4`mWzMVRMX z#o35{>>jCB7=6fON!V>ttx)=qTA4(caQaq7+@sng!X)C}DpDWH zBuIqSw~E#8vFH?5-zrwWB0a@cSbfOYTovglwzBUIq|#+uIxrPhvHBI;(9>P!6{}y7 zo??Xhhapa}`W4$p)4k>ut6z~`W;@+(Ua|TW=_$5x$N4nSpACh_S)&b z^NQ84NN=y5ZauG9{fhMV+Uf4|iq)@3Z?BzhK(AQ+iuCqcVf7&so=K0b6%HR#>5`UK zqUfz+>?_h^YlX3gOy!auTPut`q|zk^a$)SPV(csO4L&Q3J)|m^G_u0jTNOoLk^662 zVeBDQxuks-#@;H%z9K!;Rv3FoRW3P%3uA8;V_%W4?pR^$Ayv8L04|KZRZ;X6>D{)% z*h8jrN$<85#vW4XlGqT&-l{12iu7(??9FBP)D8WGa{B`mNCQkV==d8^YFG#nx9O({F{Whg9W~*buJXDz3gFd44NV^pL7t z5*xzQTgB8@B+GAwsE1VLl6FIQdaHQ)isbmM(Dab1T+(g`OK%lRUy%$ywoVLlGey!@ zWF&wUjvg}AndJAaQ1p;Wm&BDY^j0zS70K>fA?P7hxg@THpSOyiuSj~{3Ox_0$|Y@% zu=7^2^A$8Z z|8|5;hvf1X0=+}7kvqbfLz4N2ajHYEg*(EGLz4N2h?fqz=Isdo4N2xN{Y!4+*b$Z+ zlFVQFmyB5M2$v1X%wPJKT!(gqNrvR|7xK76Mq+n_FNP%Zm;Sxansl?jv37o|eQxFKpnc-Za58QX zeYvvQKH)yleqzyolKafcxz)`lHszvIqie&1orzp_^%@StWv2%#TNgG4a@qRM)&0pc zJEQjL@%F*qXkV^(UvEFL*gmtq{`iIS?GyK0wdlSEE;;$a@62^`f^XCh_pY|j;9Kw$ zm9P6YyvkRuo2ctPZqCo_jQ1zwEA5q?$!M<`PGX(ix8_ye_`MqloL95np1gKPM=_%5V$za$*7$A!&~FYaHsuiciy4vC4q&nZ-7xi zi*)TFUC=(ivECnSZeH}?eV_g~yRz~4W_#t#nf9r*jX{5FZT(#P%+|)@+PRDU^>bT; z*KheErpGIr7dJ1Q+}v8*y5KHd#E-WAz`R>{-|>6-#NrpMZ9R6!NqqVv+z_-sehy5I zZn6@Zg2}Nuv`#qd8um|Ar^9k|6Cysx?jdz@QyxBtyW8pT96y1U2WfO~-??ehpSVtk z=ZJ|EpCj7z9z40J6`#Z1?R0pKc%W%CpiK{{6CPwbhr8=^c#fY4#!>pcby~vHIIWY& z^eCSioWA&iBf}@fcwmNhNTo6FjFrCI++dD&n1;H|do%!*dm9FG&lfHOP&h>6J`WOR zYKLju=fOePz#$s$?xx*!&wU&UTg*XUSOcwc?|mRt;)OL1H6iZqUa(e&0@vN$RO7y| zlfivDHvNAcs19%O`(X`4%V7<8Kd^x#IZWk#Xal`*n96y?#$Y`)o>C!`Yra)uAIMkdVS;U%2vB*FSYMHV{p#4 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 336/352] 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 337/352] 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 338/352] 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 339/352] 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 340/352] 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 341/352] 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 342/352] 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 343/352] 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 344/352] 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 345/352] 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 346/352] 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 347/352] 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 348/352] 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 349/352] 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 350/352] 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 351/352] 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 352/352] 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;