From c987cd8d511a4b2bdffa6900ab1f6d50b49a4462 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 28 May 2013 09:44:24 +0200 Subject: [PATCH 01/15] Keyboarding: Getting available keyman keyboards This patch integrates getting available keyman keyboards on Windows into the Keyboarding library. It also adds functionality for (de-)activating system and keyman keyboards on Windows. Change-Id: I8820c172095de1b63d5caa39a193aeef4908be37 --- Src/Common/Keyboarding/KeyboardController.cs | 2 +- Src/Common/Keyboarding/Keyboarding.csproj | 14 ++- .../Windows/KeymanKeyboardAdapter.cs | 105 ++++++++++++++++++ .../Keyboarding/Windows/WinKeyboardAdaptor.cs | 50 ++++++--- .../FwCoreDlgControls/KeyboardControl.cs | 75 +++---------- 5 files changed, 166 insertions(+), 80 deletions(-) create mode 100644 Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs diff --git a/Src/Common/Keyboarding/KeyboardController.cs b/Src/Common/Keyboarding/KeyboardController.cs index 58ee641832..d2733b4b3b 100644 --- a/Src/Common/Keyboarding/KeyboardController.cs +++ b/Src/Common/Keyboarding/KeyboardController.cs @@ -71,7 +71,7 @@ public static void Reset() #if __MonoCS__ new XkbKeyboardAdaptor(), new IbusKeyboardAdaptor() #else - new WinKeyboardAdaptor() + new WinKeyboardAdaptor(), new KeymanKeyboardAdapter() #endif }); } diff --git a/Src/Common/Keyboarding/Keyboarding.csproj b/Src/Common/Keyboarding/Keyboarding.csproj index 65f4af9fbc..369dbab19c 100644 --- a/Src/Common/Keyboarding/Keyboarding.csproj +++ b/Src/Common/Keyboarding/Keyboarding.csproj @@ -30,11 +30,14 @@ false false true - - + + + + - + + true @@ -77,9 +80,11 @@ ..\..\..\Output\Debug\SilUtils.dll + + @@ -104,6 +109,7 @@ + @@ -130,4 +136,4 @@ - + \ No newline at end of file diff --git a/Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs b/Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs new file mode 100644 index 0000000000..baea334692 --- /dev/null +++ b/Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs @@ -0,0 +1,105 @@ +// --------------------------------------------------------------------------------------------- +#region // Copyright (c) 2013, SIL International. All Rights Reserved. +// +// Copyright (c) 2013, SIL International. All Rights Reserved. +// +// Distributable under the terms of either the Common Public License or the +// GNU Lesser General Public License, as specified in the LICENSING.txt file. +// +#endregion +// --------------------------------------------------------------------------------------------- +#if !__MonoCS__ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using SIL.FieldWorks.Common.COMInterfaces; + +namespace SIL.FieldWorks.Common.Keyboarding.Windows +{ + /// ---------------------------------------------------------------------------------------- + /// + /// Class for handling Keyman keyboards + /// + /// ---------------------------------------------------------------------------------------- + internal class KeymanKeyboardAdapter: IKeyboardAdaptor + { + private List m_BadLocales; + private ILgTextServices m_lts; + private ILgKeymanHandler m_keymanHandler; + + public KeymanKeyboardAdapter() + { + m_keymanHandler = LgKeymanHandlerClass.Create(); + m_lts = LgTextServicesClass.Create(); + } + + #region IKeyboardAdaptor Members + + public void Initialize() + { + m_BadLocales = new List(); + try + { + // Update handler with any new/removed keyman keyboards + m_keymanHandler.Init(true); + } + catch (Exception e) + { + m_BadLocales.Add(new KeyboardErrorDescription(KeyboardType.OtherIm, e)); + return; + } + + for (int i = 0; i < m_keymanHandler.NLayout; i++) + { + var name = m_keymanHandler.get_Name(i); + var id = name.GetHashCode(); + + // JohnT: haven't been able to reproduce FWR-1935, but apparently there's some bizarre + // circumstance where one of the names comes back null. If so, leave it out. + if (!string.IsNullOrEmpty(name)) + { + KeyboardController.Manager.RegisterKeyboard(id, + new KeyboardDescription(id, name, this, KeyboardType.OtherIm)); + } + } + } + + public void Close() + { + if (m_keymanHandler != null) + { + m_keymanHandler.Close(); + if (Marshal.IsComObject(m_keymanHandler)) + Marshal.ReleaseComObject(m_keymanHandler); + } + m_keymanHandler = null; + + if (m_lts != null && Marshal.IsComObject(m_lts)) + Marshal.ReleaseComObject(m_lts); + m_lts = null; + } + + public List ErrorKeyboards + { + get { return m_BadLocales; } + } + + public void ActivateKeyboard(IKeyboardDescription keyboard, IKeyboardDescription systemKeyboard) + { + var fSelectLangPending = false; + var activeLangId = 0; + var keymanKeyboardName = string.Empty; + + m_lts.SetKeyboard(systemKeyboard.Id, keyboard.Name, ref activeLangId, ref keymanKeyboardName, + ref fSelectLangPending); + } + + public void DeactivateKeyboard(IKeyboardDescription keyboard) + { + m_keymanHandler.ActiveKeyboardName = null; + } + + #endregion + } +} +#endif diff --git a/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs b/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs index 9686bf91be..a5735f1c98 100644 --- a/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs +++ b/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs @@ -15,26 +15,17 @@ namespace SIL.FieldWorks.Common.Keyboarding.Windows { + /// + /// Class for handling Windows system keyboards + /// internal class WinKeyboardAdaptor: IKeyboardAdaptor { private List m_BadLocales; + private ILgTextServices m_lts; public WinKeyboardAdaptor() { - } - - public void Initialize() - { - GetLocales(); - } - - public void Close() - { - } - - public List ErrorKeyboards - { - get { return m_BadLocales; } + m_lts = LgTextServicesClass.Create(); } private void GetLocales() @@ -47,7 +38,7 @@ private void GetLocales() try { lenum.Init(); - for (; ;) + for (; ; ) { string name; try @@ -81,15 +72,38 @@ private void GetLocales() } } - public void ActivateKeyboard(IKeyboardDescription keyboard, IKeyboardDescription systemKeyboard) + #region IKeyboardAdaptor Members + public void Initialize() { - // TODO - throw new NotImplementedException(); + GetLocales(); + } + + public void Close() + { + if (m_lts != null && Marshal.IsComObject(m_lts)) + Marshal.ReleaseComObject(m_lts); + m_lts = null; + } + + public List ErrorKeyboards + { + get { return m_BadLocales; } + } + + public void ActivateKeyboard(IKeyboardDescription keyboard, IKeyboardDescription ignored) + { + var fSelectLangPending = false; + var activeLangId = 0; + var notUsed = string.Empty; + + m_lts.SetKeyboard(keyboard.Id, null, ref activeLangId, ref notUsed, + ref fSelectLangPending); } public void DeactivateKeyboard(IKeyboardDescription keyboard) { } + #endregion } } #endif diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs b/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs index fc3c6973c4..2ee1f8ef6e 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs @@ -185,70 +185,31 @@ private void InitKeymanCombo() CheckDisposed(); m_keyboardComboBox.Items.Clear(); // Clear out any old items from combobox list - string strKbdName = m_ws.Keyboard ?? FwCoreDlgControls.kstid_None; + var strKbdName = string.IsNullOrEmpty(m_ws.Keyboard) ? FwCoreDlgControls.kstid_None : + m_ws.Keyboard; m_keyboardComboBox.Items.Add(FwCoreDlgControls.kstid_None); - var keyboards = GetAvailableKeyboards(exception => { - if (!m_fKeymanInitErrorReported) - { - m_fKeymanInitErrorReported = true; - string caption = FwCoreDlgControls.kstidKeymanInitFailed; - string message = exception.Message; - if (string.IsNullOrEmpty(message)) - message = caption; - MessageBoxUtils.Show(ParentForm, message, caption, - MessageBoxButtons.OK, MessageBoxIcon.Information); - } - }); - - foreach (var keyboard in keyboards) - m_keyboardComboBox.Items.Add(keyboard); - - m_keyboardComboBox.SelectedItem = strKbdName; - } - - /// - /// Get available Keyman (Windows) keyboards. - /// - /// - /// Delegate to run if KeymanHandler.Init throws an exception. Takes the exception - /// as an argument. - /// - private static IEnumerable GetAvailableKeyboards(Action doIfError) - { - ILgKeymanHandler keymanHandler = LgKeymanHandlerClass.Create(); - try - { - var keyboards = new List(); - - try - { - // Update handler with any new/removed keyman keyboards - keymanHandler.Init(true); - } - catch (Exception e) + var badLocales = KeyboardController.ErrorKeyboards.Where( + keyboard => keyboard.Type == KeyboardType.OtherIm).ToList(); + if (badLocales.Count > 0 && !m_fKeymanInitErrorReported) { - if (doIfError != null) - doIfError(e); - return keyboards; + m_fKeymanInitErrorReported = true; + string caption = FwCoreDlgControls.kstidKeymanInitFailed; + var exception = badLocales[0].Details as Exception; + string message = exception != null ? exception.Message : null; + if (string.IsNullOrEmpty(message)) + message = caption; + MessageBoxUtils.Show(ParentForm, message, caption, + MessageBoxButtons.OK, MessageBoxIcon.Information); } - int clayout = keymanHandler.NLayout; - for (int i = 0; i < clayout; ++i) - { - var item = keymanHandler.get_Name(i); - // JohnT: haven't been able to reproduce FWR-1935, but apparently there's some bizarre - // circumstance where one of the names comes back null. If so, leave it out. - if (item != null) - keyboards.Add(item); - } - return keyboards; - } - finally + foreach (var item in KeyboardController.InstalledKeyboards.Where( + keyboard => keyboard.Type == KeyboardType.OtherIm)) { - keymanHandler.Close(); - Marshal.ReleaseComObject(keymanHandler); + m_keyboardComboBox.Items.Add(item.Name); } + + m_keyboardComboBox.SelectedItem = strKbdName; } // Since InitLanguageCombo gets called from an OnGetFocus, and the message box causes a From 06adf2dbfb9cc7052db4c8c9a5bc075728a8cad7 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Fri, 7 Jun 2013 10:17:52 +0200 Subject: [PATCH 02/15] Keyboarding: use same interface on Windows + Linux Use IViewInputMgr on both Windows and Linux to allow C++ code to access input methods/keyboards. On Linux we use a managed implementation, on Windows we modified VwTextStore slightly to implement this interface. Also some cleanup and refactorings. Change-Id: I2b71e384b8b33c5457ead1e43c034784fb3ee8e5 --- Lib/linux/Common/FwKernelTlb.h | 2 +- Lib/linux/Common/FwKernelTlb.tlb | Bin 98864 -> 98864 bytes Lib/linux/Common/LanguageTlb.h | 2 +- Lib/linux/Common/LanguageTlb.tlb | Bin 98872 -> 98872 bytes Lib/linux/Common/ViewsTlb.h | 2 +- Lib/linux/Common/ViewsTlb.idl | 9 - Lib/linux/Common/ViewsTlb.tlb | Bin 84700 -> 84700 bytes Lib/linux/Common/idhfiles.MD5 | 2 +- Src/Common/Keyboarding/KeyboardController.cs | 2 +- Src/Common/Keyboarding/Keyboarding.csproj | 2 +- .../Keyboarding/Linux/LinuxKeyboardHelper.cs | 8 +- .../{Interfaces => Types}/MouseEvent.cs | 0 Src/Common/SimpleRootSite/ViewInputManager.cs | 14 +- Src/views/Views.idh | 4 - Src/views/ViewsTlb.idl | 5 - Src/views/VwRootBox.cpp | 90 +-- Src/views/VwRootBox.h | 16 +- Src/views/VwSelection.cpp | 23 +- Src/views/VwTextBoxes.cpp | 27 - Src/views/VwTextStore.cpp | 617 ++++++++++-------- Src/views/VwTextStore.h | 46 +- 21 files changed, 391 insertions(+), 480 deletions(-) rename Src/Common/Keyboarding/{Interfaces => Types}/MouseEvent.cs (100%) diff --git a/Lib/linux/Common/FwKernelTlb.h b/Lib/linux/Common/FwKernelTlb.h index f2b1c4a0e6..5fa565705d 100644 --- a/Lib/linux/Common/FwKernelTlb.h +++ b/Lib/linux/Common/FwKernelTlb.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Fri Apr 19 17:38:16 2013 +/* at Tue May 28 09:54:39 2013 */ /* Compiler settings for d:\fwrepo\fw\Output\Common\FwKernelTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 diff --git a/Lib/linux/Common/FwKernelTlb.tlb b/Lib/linux/Common/FwKernelTlb.tlb index 4b026b316009b9974e95f2b19d83a9bb0d613a3d..e3e267dd2a58fd306c53fb2f32c4472d98dc427f 100644 GIT binary patch delta 45 zcmdnc!nOg3($C3-l%^{9CRQpKStuA-TA7+y8CxnC85kOK2{Y_ZTC%zI-0IB$T)_`@ delta 45 zcmdnc!nOg3($C4c6=feL<1tSXu14}DY6Dwm21tSAPV=iHaeMw6;_nuq58316g B50d}@ delta 45 zcmdnd!nUJ@ZA1P!Ik%!r1;>IS1w%^(Lvt%*3oAoY1tSAPV=iHa=P8Aod(W-j3;R+S8gmIV97tNS`QfVH^8tE{ B5Rw1@ delta 45 zcmcaJmG#b4)(wYO$+;C}DmWGtDHvKR7@AudTUZ&ID;OCV8gmIVyi6(F{BYIp`2cvg B5Pkpv diff --git a/Lib/linux/Common/idhfiles.MD5 b/Lib/linux/Common/idhfiles.MD5 index 12b740cb88..2f8f3c9d44 100644 --- a/Lib/linux/Common/idhfiles.MD5 +++ b/Lib/linux/Common/idhfiles.MD5 @@ -1 +1 @@ -dd378cac93e17582a769267f7dd080e5 \ No newline at end of file +cf15076a09553aa7fb566683246f112a \ No newline at end of file diff --git a/Src/Common/Keyboarding/KeyboardController.cs b/Src/Common/Keyboarding/KeyboardController.cs index d2733b4b3b..b1ae91d9e1 100644 --- a/Src/Common/Keyboarding/KeyboardController.cs +++ b/Src/Common/Keyboarding/KeyboardController.cs @@ -230,7 +230,7 @@ public List ErrorKeyboards #region Static methods and properties /// /// Create an instance of IKeyboardController. This gets called if SingletonsContainer - /// doesn't contain already one. + /// doesn't already contain one. /// private static IKeyboardController Create() { diff --git a/Src/Common/Keyboarding/Keyboarding.csproj b/Src/Common/Keyboarding/Keyboarding.csproj index 369dbab19c..778490c70b 100644 --- a/Src/Common/Keyboarding/Keyboarding.csproj +++ b/Src/Common/Keyboarding/Keyboarding.csproj @@ -111,7 +111,7 @@ - + diff --git a/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs b/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs index 8ff8e117c0..fec6d8764d 100644 --- a/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs +++ b/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs @@ -35,10 +35,7 @@ public bool OnMouseEvent(IKeyboardCallback callback, int xd, int yd, Rectangle r Rectangle rcDst, MouseEvent mouseEvent) { if (mouseEvent == MouseEvent.kmeDown) - { SetFocus(callback); - return true; - } return false; } @@ -64,7 +61,7 @@ public void OnSelectionChange(IKeyboardCallback callback, SelChangeType how) public void OnTextChange(IKeyboardCallback callback) { } - #endregion + #endregion // IKeyboardEventHandler #region IKeyboardMethods implementation /// @@ -77,6 +74,7 @@ public void TerminateAllCompositions(IKeyboardCallback callback) /// /// Activate the input method /// + /// Corresponding C++ method is VwTextStore::SetFocus. public void SetFocus(IKeyboardCallback callback) { var keyboard = callback.Keyboard; @@ -101,7 +99,6 @@ public void KillFocus(IKeyboardCallback callback) /// Enables the input method. This gets called as part of VwRootBox::HandleActivate when /// enabling a selection. /// - /// Corresponding C++ method is VwTextStore::SetFocus. public void EnableInput(IKeyboardCallback callback) { } @@ -110,7 +107,6 @@ public void EnableInput(IKeyboardCallback callback) /// Disables the input method. This gets called as part of VwRootBox::HandleActivate when /// disabling a selection. /// - /// Corresponding C++ method is VwTextStore::OnLoseFocus. public void DisableInput(IKeyboardCallback callback) { } diff --git a/Src/Common/Keyboarding/Interfaces/MouseEvent.cs b/Src/Common/Keyboarding/Types/MouseEvent.cs similarity index 100% rename from Src/Common/Keyboarding/Interfaces/MouseEvent.cs rename to Src/Common/Keyboarding/Types/MouseEvent.cs diff --git a/Src/Common/SimpleRootSite/ViewInputManager.cs b/Src/Common/SimpleRootSite/ViewInputManager.cs index 1428ca97e0..2b33730f0a 100644 --- a/Src/Common/SimpleRootSite/ViewInputManager.cs +++ b/Src/Common/SimpleRootSite/ViewInputManager.cs @@ -23,13 +23,6 @@ public class ViewInputManager: ILgTextServices, IKeyboardCallback, IViewInputMgr { private IVwRootBox m_rootb; - /// - /// Initializes a new instance of the ViewInputManager class. - /// - public ViewInputManager() - { - } - #region IViewInputMgr methods /// /// Inititialize the input manager @@ -42,7 +35,6 @@ public void Init(IVwRootBox rootb) /// public void Close() { - } /// @@ -100,12 +92,10 @@ public bool OnUpdateProp() /// /// Called when a mouse event happened. /// - /// Always false - if at all we can handle only part of what's necessary. - /// public bool OnMouseEvent(int xd, int yd, Rect rcSrc, Rect rcDst, VwMouseEvent me) { - KeyboardController.EventHandler.OnMouseEvent(this, xd, yd, rcSrc, rcDst, (MouseEvent)me); - return false; + return KeyboardController.EventHandler.OnMouseEvent(this, xd, yd, rcSrc, rcDst, + (MouseEvent)me); } /// diff --git a/Src/views/Views.idh b/Src/views/Views.idh index 9ca6e6ac46..b6fb878efd 100644 --- a/Src/views/Views.idh +++ b/Src/views/Views.idh @@ -5986,8 +5986,4 @@ DeclareInterface(ViewInputMgr, Unknown, e41668f7-d506-4c8a-a5d7-feae5630797e) // Called when the text of a document changes. HRESULT OnTextChange(); - - // VwRootBox will need to do these - // HRESULT AddToKeepList(li) - // HRESULT ClearPointersTo(VwParagraphBox) } diff --git a/Src/views/ViewsTlb.idl b/Src/views/ViewsTlb.idl index 5dbedb0a1e..c202ccb6fa 100644 --- a/Src/views/ViewsTlb.idl +++ b/Src/views/ViewsTlb.idl @@ -27,9 +27,4 @@ DeclareLibrary(Views, 1.0, "Views 1.0 Type Library", #include "Views.idh" -// // Include WorldPad WPX load+save interfaces for Linux builds -// #if !WIN32 -// #include "WorldPad.idh" -// #endif // !WIN32 - }; diff --git a/Src/views/VwRootBox.cpp b/Src/views/VwRootBox.cpp index 6492ba5522..60bf5e62cd 100644 --- a/Src/views/VwRootBox.cpp +++ b/Src/views/VwRootBox.cpp @@ -24,13 +24,8 @@ DEFINE_THIS_FILE -#ifdef WIN32 #undef ENABLE_TSF #define ENABLE_TSF -#else /* ! WIN32 */ -#undef MANAGED_KEYBOARDING -#define MANAGED_KEYBOARDING -#endif /* ! WIN32 */ #undef Tracing_KeybdSelection //#define Tracing_KeybdSelection @@ -54,27 +49,16 @@ const CLSID CLSID_ViewInputManager = {0x830BAF1F, 0x6F84, 0x46EF, {0xB6, 0x3E, 0 VwRootBox::VwRootBox(VwPropertyStore * pzvps) :VwDivBox(pzvps) { - m_cref = 1; - ModuleEntry::ModuleAddRef(); - m_fDirty = false; - m_fNewSelection = false; - m_fInDrag = false; - m_hrSegmentError = S_OK; - m_cMaxParasToScan = 4; - // Usually set in Layout method, but some tests don't do this... - // play safe also for any code called before Layout. - m_ptDpiSrc.x = 96; - m_ptDpiSrc.y = 96; - -#ifdef ENABLE_TSF - m_qtxs.Attach(NewObj VwTextStore(this)); -#elif defined(MANAGED_KEYBOARDING) - m_qvim.CreateInstance(CLSID_ViewInputManager); -#endif /*ENABLE_TSF*/ + Init(); } // Protected default constructor used for CreateCom VwRootBox::VwRootBox() +{ + Init(); +} + +void VwRootBox::Init() { m_cref = 1; ModuleEntry::ModuleAddRef(); @@ -83,13 +67,19 @@ VwRootBox::VwRootBox() m_fInDrag = false; m_hrSegmentError = S_OK; m_cMaxParasToScan = 4; + // Usually set in Layout method, but some tests don't do this... + // play safe also for any code called before Layout. m_ptDpiSrc.x = 96; m_ptDpiSrc.y = 96; #ifdef ENABLE_TSF - m_qtxs.Attach(NewObj VwTextStore(this)); -#elif defined(MANAGED_KEYBOARDING) +#ifdef WIN32 + VwTextStorePtr qtxs; + qtxs.Attach(NewObj VwTextStore(this)); + CheckHr(qtxs->QueryInterface(IID_IViewInputMgr, (void**)&m_qvim)); +#else m_qvim.CreateInstance(CLSID_ViewInputManager); +#endif #endif /*ENABLE_TSF*/ } @@ -97,8 +87,6 @@ VwRootBox::VwRootBox() VwRootBox::~VwRootBox() { #ifdef ENABLE_TSF - Assert(!m_qtxs); // Make sure the Close method was called before it gets destroyed. -#elif defined(MANAGED_KEYBOARDING) Assert(!m_qvim); // Make sure the Close method was called before it gets destroyed. #endif /*ENABLE_TSF*/ Assert(!m_qsda); // Make sure the Close method was called before it gets destroyed. @@ -277,10 +265,6 @@ STDMETHODIMP VwRootBox::SetSite(IVwRootSite * pvrs) m_qvrs = pvrs; #ifdef ENABLE_TSF - // Initialize for interaction with Text Services. - if (m_qtxs) - m_qtxs->Init(); -#elif defined(MANAGED_KEYBOARDING) if (m_qvim) CheckHr(m_qvim->Init(this)); #endif /*ENABLE_TSF*/ @@ -686,11 +670,6 @@ STDMETHODIMP VwRootBox::DestroySelection() if (!m_qvwsel) return S_OK; // nothing to destroy #ifdef ENABLE_TSF - // If we don't do this the text service keeps trying to do things - // and we get errors because our VwTextStore doesn't work right when there's no selection. - if (m_qtxs) - m_qtxs->TerminateAllCompositions(); -#elif defined(MANAGED_KEYBOARDING) // If we don't do this the text service keeps trying to do things // and we get errors because our VwTextStore doesn't work right when there's no selection. if (m_qvim) @@ -2531,9 +2510,6 @@ void VwRootBox::HandleActivate(VwSelectionState vss, bool fSetFocus) // This is critical to be called whenever Activate() is called, so that TSF has the // right focus. Missing this call to SetFocus() caused LT-5345 and LT-7488! #ifdef ENABLE_TSF - if (vss == vssEnabled && fSetFocus && m_qtxs) - m_qtxs->SetFocus(); -#elif defined(MANAGED_KEYBOARDING) if (vss == vssEnabled && fSetFocus && m_qvim) CheckHr(m_qvim->SetFocus()); #endif /*ENABLE_TSF*/ @@ -2541,9 +2517,6 @@ void VwRootBox::HandleActivate(VwSelectionState vss, bool fSetFocus) if (m_vss == vss) return; #ifdef ENABLE_TSF - if (vss != vssEnabled && m_qtxs) - m_qtxs->OnLoseFocus(); -#elif defined(MANAGED_KEYBOARDING) if (vss != vssEnabled && m_qvim) CheckHr(m_qvim->KillFocus()); #endif /*ENABLE_TSF*/ @@ -2590,8 +2563,6 @@ STDMETHODIMP VwRootBox::get_IsCompositionInProgress(ComBool * pfInProgress) ChkComArgPtr(pfInProgress); #ifdef ENABLE_TSF - *pfInProgress = m_qtxs->IsCompositionActive(); -#elif defined(MANAGED_KEYBOARDING) CheckHr(m_qvim->get_IsCompositionActive(pfInProgress)); #else *pfInProgress = FALSE; @@ -3028,9 +2999,6 @@ STDMETHODIMP VwRootBox::Layout(IVwGraphics * pvg, int dxAvailWidth) Construct(pvg, dxAvailWidth); VwDivBox::DoLayout(pvg, dxAvailWidth, -1, true); #ifdef ENABLE_TSF - if (m_qtxs) - m_qtxs->OnLayoutChange(); -#elif defined(MANAGED_KEYBOARDING) if (m_qvim) CheckHr(m_qvim->OnLayoutChange()); #endif /*ENABLE_TSF*/ @@ -3713,20 +3681,11 @@ STDMETHODIMP VwRootBox::Close() m_qsync.Clear(); #ifdef ENABLE_TSF - if (m_qtxs) // In case this method is called twice (which can happen). - { - // m_qtxs gets created in the c'tor, so one could think of destroying it in the d'tor. - // However, because VwTextStore holds a smart pointer to us (VwRootBox) this would - // result in the RootBox not being deleted because the reference count is one off. - m_qtxs->Close(); // Clear out any internal smart pointers. - m_qtxs.Clear(); - } -#elif defined(MANAGED_KEYBOARDING) + // m_qvim gets created in the c'tor, so one could think of destroying it in the + // d'tor. However, because the view manager holds a smart pointer to us (VwRootBox) this + // would result in the RootBox not being deleted because the reference count is one off. if (m_qvim) // In case this method is called twice (which can happen). { - // m_qvim gets created in the c'tor, so one could think of destroying it in the d'tor. - // However, because the view manager holds a smart pointer to us (VwRootBox) this would - // result in the RootBox not being deleted because the reference count is one off. CheckHr(m_qvim->Close()); // Clear out any internal smart pointers. m_qvim.Clear(); } @@ -4018,9 +3977,6 @@ void VwRootBox::NotifySelChange(VwSelChangeType nHow, bool fUpdateRootSite) CheckHr(m_qvrs->SelectionChanged(this, m_qvwsel)); #ifdef ENABLE_TSF - if (m_qtxs) - m_qtxs->OnSelChange(nHow); -#elif defined(MANAGED_KEYBOARDING) if (m_qvim) { // I'm not sure if it is really necessary to store m_pvpboxLastSelectedAnchor or if we @@ -4065,9 +4021,6 @@ void VwRootBox::LayoutFull() if (dyOld != FieldHeight() || dxOld != Width() || dyOld2 != Height()) CheckHr(m_qvrs->RootBoxSizeChanged(this)); #ifdef ENABLE_TSF - if (m_qtxs) - m_qtxs->OnLayoutChange(); -#elif defined(MANAGED_KEYBOARDING) if (m_qvim) CheckHr(m_qvim->OnLayoutChange()); #endif /*ENABLE_TSF*/ @@ -4289,9 +4242,6 @@ bool VwRootBox::RelayoutCore(IVwGraphics * pvg, int dxpAvailWidth, VwRootBox * p bool result = SuperClass::Relayout(pvg, dxpAvailWidth, prootb, pfixmap, dxpAvailOnLine, pmmbi); #ifdef ENABLE_TSF - if (m_qtxs) - m_qtxs->OnLayoutChange(); -#elif defined(MANAGED_KEYBOARDING) if (m_qvim) CheckHr(m_qvim->OnLayoutChange()); #endif /*ENABLE_TSF*/ @@ -4875,9 +4825,6 @@ void VwRootBox::MaximizeLaziness(VwBox * pboxMinKeep, VwBox * pboxLimKeep) for (int i = 0; i < m_vselInUse.Size(); i++) m_vselInUse[i]->AddToKeepList(&li); #ifdef ENABLE_TSF - if (m_qtxs) - m_qtxs->AddToKeepList(&li); -#elif defined(MANAGED_KEYBOARDING) if (m_pvpboxLastSelectedAnchor) li.KeepSequence(m_pvpboxLastSelectedAnchor, m_pvpboxLastSelectedAnchor->NextOrLazy()); #endif /*ENABLE_TSF*/ @@ -5434,9 +5381,6 @@ STDMETHODIMP VwRootBox::get_Synchronizer(IVwSynchronizer ** ppsync) inline bool VwRootBox::OnMouseEvent(int xd, int yd, RECT rcSrc, RECT rcDst, VwMouseEvent me) { #ifdef ENABLE_TSF - if (m_qtxs) - return m_qtxs->MouseEvent(xd, yd, rcSrc, rcDst, me); -#elif defined(MANAGED_KEYBOARDING) if (m_qvim) { ComBool fHandled; diff --git a/Src/views/VwRootBox.h b/Src/views/VwRootBox.h index 28fd84faa7..11ab0782bb 100644 --- a/Src/views/VwRootBox.h +++ b/Src/views/VwRootBox.h @@ -20,13 +20,8 @@ Last reviewed: Not yet. class VwTextStore; DEFINE_COM_PTR(VwTextStore); -#ifdef WIN32 #undef ENABLE_TSF #define ENABLE_TSF -#else /* ! WIN32 */ -#undef MANAGED_KEYBOARDING -#define MANAGED_KEYBOARDING -#endif /*---------------------------------------------------------------------------------------------- These are values that may be passed to VwRootBox::OnExtendedChar. @@ -331,10 +326,14 @@ class VwRootBox : public IVwRootBox, public IServiceProvider, public VwDivBox void HandleActivate(VwSelectionState vss, bool fSetFocus = false); #ifdef ENABLE_TSF - VwTextStore * TextStore() {return m_qtxs;} -#elif defined(MANAGED_KEYBOARDING) IViewInputMgr * InputManager() { return m_qvim; } + VwParagraphBox * GetLastSelectedAnchorBox() { return m_pvpboxLastSelectedAnchor; } + + // The specified box is being deleted. If somehow m_pvpboxLastSelectedAnchor still + // points at it (this can happen, for one example, during a replace all where + // NoteDependencies cause large-scale regeneration), clear the pointers to a safe, + // neutral state. void ClearSelectedAnchorPointerTo(VwParagraphBox * pvpbox) { if (m_pvpboxLastSelectedAnchor == pvpbox) @@ -420,8 +419,6 @@ class VwRootBox : public IVwRootBox, public IServiceProvider, public VwDivBox VwSynchronizerPtr m_qsync; // If not null use this to synchronize object display heights. #ifdef ENABLE_TSF - VwTextStorePtr m_qtxs; -#elif defined(MANAGED_KEYBOARDING) // last selected paragraph box. See comment in VwRootBox::NotifySelChange. VwParagraphBox * m_pvpboxLastSelectedAnchor; @@ -461,6 +458,7 @@ class VwRootBox : public IVwRootBox, public IServiceProvider, public VwDivBox // Protected default constructor does nothing. // After creating with CreateCom, must set everything up from Init VwRootBox(); + void Init(); HRESULT MakeSimpleSelAt(VwBox * pboxStart, int itssStart, ComBool fInitial, ComBool fEdit, ComBool fRange, ComBool fInstall, IVwSelection ** ppsel, bool fContinueToParents = true); diff --git a/Src/views/VwSelection.cpp b/Src/views/VwSelection.cpp index a823b7dedb..68948f0e00 100644 --- a/Src/views/VwSelection.cpp +++ b/Src/views/VwSelection.cpp @@ -5238,13 +5238,6 @@ void VwTextSelection::CommitAndContinue(bool * pfOk, VwChangeInfo * pci) if (!m_qtsbProp) { #ifdef ENABLE_TSF - if (m_pvpbox->Root()->TextStore()->IsDoingRecommit()) - { - // We need to do a real update!! - StartEditing(); - } - else -#elif defined(MANAGED_KEYBOARDING) ComBool fDoingRecommit; CheckHr(m_pvpbox->Root()->InputManager()->get_IsEndingComposition(&fDoingRecommit)); if (fDoingRecommit) @@ -7286,8 +7279,6 @@ void VwTextSelection::DoUpdateProp(VwRootBox * prootb, HVO hvo, PropTag tag, VwN *pfOk = false; // only set true if we make it all the way (though failures throw exceptions) #ifdef ENABLE_TSF - VwTextStore * ptxs = prootb->TextStore(); -#elif defined(MANAGED_KEYBOARDING) IViewInputMgr * pvim = prootb->InputManager(); #endif @@ -7310,12 +7301,6 @@ void VwTextSelection::DoUpdateProp(VwRootBox * prootb, HVO hvo, PropTag tag, VwN int ichOffset = m_ichAnchor - m_ichMinEditProp; int * poffset = &ichOffset; #ifdef ENABLE_TSF - if (ptxs->IsCompositionActive()) - { - ptxs->NoteCommitDuringComposition(); - } - else -#elif defined(MANAGED_KEYBOARDING) ComBool fProcessed; CheckHr(pvim->OnUpdateProp(&fProcessed)); if (!fProcessed) @@ -7406,15 +7391,13 @@ void VwTextSelection::DoUpdateProp(VwRootBox * prootb, HVO hvo, PropTag tag, VwN CheckHr(qsda->get_StringProp(hvo, tag, &qtssOld)); int ichMinDiff, ichLimDiff; // in qtssNewSub CompareStrings(qtssOld, qtssNewSub, &ichMinDiff, &ichLimDiff); -#ifdef MANAGED_KEYBOARDING +#ifdef ENABLE_TSF ComBool fDoingRecommit; CheckHr(pvim->get_IsEndingComposition(&fDoingRecommit)); #endif if (ichMinDiff >= 0 #ifdef ENABLE_TSF - || ptxs->IsDoingRecommit() // there's some difference -#elif defined(MANAGED_KEYBOARDING) || fDoingRecommit // there's some difference #endif ) @@ -7495,15 +7478,13 @@ void VwTextSelection::DoUpdateProp(VwRootBox * prootb, HVO hvo, PropTag tag, VwN CheckHr(qsda->get_MultiStringAlt(hvo, tag, fragEdit, &qtssOld)); ComBool fEqual; CheckHr(qtssOld->Equals(qtssNewSub, &fEqual)); -#ifdef MANAGED_KEYBOARDING +#ifdef ENABLE_TSF ComBool fDoingRecommit; CheckHr(pvim->get_IsEndingComposition(&fDoingRecommit)); #endif if (!fEqual #ifdef ENABLE_TSF - || ptxs->IsDoingRecommit() -#elif defined(MANAGED_KEYBOARDING) || fDoingRecommit #endif ) diff --git a/Src/views/VwTextBoxes.cpp b/Src/views/VwTextBoxes.cpp index 2f64e72178..7ec12e54e5 100644 --- a/Src/views/VwTextBoxes.cpp +++ b/Src/views/VwTextBoxes.cpp @@ -4048,10 +4048,6 @@ VwParagraphBox::~VwParagraphBox() if (prootb) { #ifdef ENABLE_TSF - VwTextStore * ptxs = prootb->TextStore(); - if (ptxs) - ptxs->ClearPointersTo(this); -#elif defined(MANAGED_KEYBOARDING) prootb->ClearSelectedAnchorPointerTo(this); #endif /*ENABLE_TSF*/ Assert(prootb->m_pvpboxNextSpellCheck != this); @@ -4760,8 +4756,6 @@ void VwParagraphBox::ReplaceStrings(IVwGraphics * pvg, int itssMin, int itssLim, int ctssOld = Source()->CStrings(); int ctssNew = pvpboxRep->Source()->CStrings(); #ifdef ENABLE_TSF - VwTextStore * ptxs = Root()->TextStore(); -#elif defined(MANAGED_KEYBOARDING) IViewInputMgr * pvim = Root()->InputManager(); #endif /*ENABLE_TSF*/ VwBox * pboxFirstSubRep = pvpboxRep->FirstBox(); @@ -4793,12 +4787,6 @@ void VwParagraphBox::ReplaceStrings(IVwGraphics * pvg, int itssMin, int itssLim, // dictionary. It requires a paint. Source()->ReplaceContents(itssMin, itssLim, pvpboxRep->Source()); Assert(cchNew == cchOld); -#ifdef ENABLE_TSF - // Must NOT notify if it didn't change...this produces spurious messages - // that interfere with IMEs. - //if (ptxs) - // ptxs->OnDocChange(); -#endif /*ENABLE_TSF*/ return; // no change needed } @@ -4819,9 +4807,6 @@ void VwParagraphBox::ReplaceStrings(IVwGraphics * pvg, int itssMin, int itssLim, // string collection. Source()->ReplaceContents(itssMin, itssLim, pvpboxRep->Source()); #ifdef ENABLE_TSF - if (ptxs) - ptxs->OnDocChange(); -#elif defined(MANAGED_KEYBOARDING) if (pvim) CheckHr(pvim->OnTextChange()); #endif /*ENABLE_TSF*/ @@ -4939,9 +4924,6 @@ void VwParagraphBox::ReplaceStrings(IVwGraphics * pvg, int itssMin, int itssLim, prootb->RelayoutRoot(pvg, &fixmap); #ifdef ENABLE_TSF - if (ptxs) - ptxs->OnDocChange(); -#elif defined(MANAGED_KEYBOARDING) if (pvim) CheckHr(pvim->OnTextChange()); #endif /*ENABLE_TSF*/ @@ -4976,9 +4958,6 @@ void VwParagraphBox::ReplaceStrings(IVwGraphics * pvg, int itssMin, int itssLim, prootb->InvalidateRect(&vwrectNew); } #ifdef ENABLE_TSF - if (ptxs) - ptxs->OnDocChange(); -#elif defined(MANAGED_KEYBOARDING) if (pvim) CheckHr(pvim->OnTextChange()); #endif /*ENABLE_TSF*/ @@ -5008,9 +4987,6 @@ void VwParagraphBox::ReplaceStrings(IVwGraphics * pvg, int itssMin, int itssLim, Root()->InvalidateRect(&vwrectNew); #ifdef ENABLE_TSF - if (ptxs) - ptxs->OnDocChange(); -#elif defined(MANAGED_KEYBOARDING) if (pvim) CheckHr(pvim->OnTextChange()); #endif /*ENABLE_TSF*/ @@ -5835,9 +5811,6 @@ void VwParagraphBox::DoLayoutAux(IVwGraphics * pvg, void * pv) Assert(false); #endif #ifdef ENABLE_TSF - if (Root()->TextStore()) - Root()->TextStore()->OnLayoutChange(); -#elif defined(MANAGED_KEYBOARDING) if (Root()->InputManager()) CheckHr(Root()->InputManager()->OnLayoutChange()); #endif /*ENABLE_TSF*/ diff --git a/Src/views/VwTextStore.cpp b/Src/views/VwTextStore.cpp index 65a188b8d3..ad55983e35 100644 --- a/Src/views/VwTextStore.cpp +++ b/Src/views/VwTextStore.cpp @@ -212,6 +212,8 @@ STDMETHODIMP VwTextStore::QueryInterface(REFIID riid, void ** ppv) *ppv = static_cast(this); else if (riid == IID_ITfContextOwnerCompositionSink) *ppv = static_cast(this); + else if (riid == IID_IViewInputMgr) + *ppv = static_cast(this); // else if (&riid == &CLSID_VwTextStore) // *ppv = static_cast(this); else if (riid == IID_ISupportErrorInfo) @@ -1562,94 +1564,70 @@ STDMETHODIMP VwTextStore::InsertEmbeddedAtSelection(DWORD dwFlags, IDataObject * } //:>******************************************************************************************** -//:> Other Methods. +//:> IViewInputMgr methods //:>******************************************************************************************** /*---------------------------------------------------------------------------------------------- - Retrieve the start and end boxes of the selection. Return true if there is a text selection. - Returns a value for both boxes, even if they are the same. + Create and initialize the document manager. + This can be called more than once. If a document manager already exists we do nothing. ----------------------------------------------------------------------------------------------*/ -VwTextSelection * VwTextStore::GetStartAndEndBoxes(VwParagraphBox ** ppvpboxStart, - VwParagraphBox ** ppvpboxEnd, bool * pfEndBeforeAnchor) +STDMETHODIMP VwTextStore::Init(IVwRootBox* prootb) { - VwTextSelection * psel = dynamic_cast(m_qrootb->Selection()); - VwParagraphBox * pvpboxStart = NULL; - VwParagraphBox * pvpboxEnd = NULL; - if (psel) - { - ComBool fEndBeforeAnchor; - CheckHr(psel->get_EndBeforeAnchor(&fEndBeforeAnchor)); - if (pfEndBeforeAnchor) - *pfEndBeforeAnchor = static_cast(fEndBeforeAnchor); + BEGIN_COM_METHOD; + if (!s_qttmThreadMgr) + return S_OK; + // If we already have a DocMgr, we don't want to create a new one, especially without + // properly closing off the old one with a pop to clear the reference count on this. + // Otherwise we end up with leaking memory on this. + if (m_qtdmDocMgr) + return S_OK; + // Create the Text Services Framework document manager for this "document" (root box). + CheckHr(s_qttmThreadMgr->CreateDocumentMgr(&m_qtdmDocMgr)); - if (fEndBeforeAnchor) - { - pvpboxStart = psel->EndBox(); - pvpboxEnd = psel->AnchorBox(); - if (!pvpboxStart) // Single-paragraph selection. - pvpboxStart = pvpboxEnd; - } - else - { - pvpboxStart = psel->AnchorBox(); - pvpboxEnd = psel->EndBox(); - if (!pvpboxEnd) // Single-paragraph selection. - pvpboxEnd = pvpboxStart; - } - if (pvpboxStart) - { - m_cchLastPara = pvpboxStart->Source()->Cch(); - if (pvpboxStart != pvpboxEnd) - m_cchLastPara += s_cchParaBreak + pvpboxEnd->Source()->Cch(); - } - else - { - // probably in the middle of setting up the selection. Not much we can do... - psel = NULL; - } - } - // If no selection, let the caller worry about it. - *ppvpboxStart = pvpboxStart; - *ppvpboxEnd = pvpboxEnd; - return psel; + // Create and install the Text Services Framework "context". + CheckHr(m_qtdmDocMgr->CreateContext(s_tfClientID, 0, dynamic_cast(this), + &m_qtcContext, &m_tfEditCookie)); + CheckHr(m_qtdmDocMgr->Push(m_qtcContext)); + + m_prootb = dynamic_cast(prootb); + AssertPtr(m_prootb); + + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); } /*---------------------------------------------------------------------------------------------- - Compute the length of the current text (in decomposed characters NFD). + Release the interfaces installed by the constructor or by Init. ----------------------------------------------------------------------------------------------*/ -int VwTextStore::TextLength() +STDMETHODIMP VwTextStore::Close() { - VwParagraphBox * pvpboxFirst; - VwParagraphBox * pvpboxLast; - VwTextSelection * psel = GetStartAndEndBoxes(&pvpboxFirst, &pvpboxLast); - if (psel) - { - if (pvpboxFirst != pvpboxLast) - return pvpboxFirst->Source()->Cch() + s_cchParaBreak + pvpboxLast->Source()->Cch(); - else - return pvpboxFirst->Source()->Cch(); - } - else - { - // Handle no selection by pretending we have an empty document. - return 0; - } + BEGIN_COM_METHOD; + if (!m_qtdmDocMgr) + return S_OK; + AssertPtr(s_qttmThreadMgr.Ptr()); + CheckHr(m_qtdmDocMgr->Pop(TF_POPF_ALL)); + m_qtdmDocMgr.Clear(); + m_qtcContext.Clear(); + m_qrootb.Clear(); + m_qws.Clear(); + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); } /*---------------------------------------------------------------------------------------------- The document changed. (Ideally we'd like to know where, but at least let the service know.) ----------------------------------------------------------------------------------------------*/ -void VwTextStore::OnDocChange() +STDMETHODIMP VwTextStore::OnTextChange() { + BEGIN_COM_METHOD; if (m_fNotify) { if (m_AdviseSinkInfo.m_dwMask & TS_AS_TEXT_CHANGE && m_AdviseSinkInfo.m_qTextStoreACPSink) { // issue a document changed notification. The OldEnd may not be exactly right. + VwParagraphBox* pvpboxCurrent = m_prootb->GetLastSelectedAnchorBox(); TS_TEXTCHANGE ttc; ttc.acpStart = 0; - ttc.acpOldEnd = m_pvpboxCurrent ? LogToAcp(m_pvpboxCurrent->Source()->Cch()) : 0; + ttc.acpOldEnd = pvpboxCurrent ? LogToAcp(pvpboxCurrent->Source()->Cch()) : 0; ttc.acpNewEnd = ttc.acpOldEnd; #ifdef TRACING_TSF StrAnsi sta; @@ -1660,6 +1638,8 @@ void VwTextStore::OnDocChange() } } DoDisplayAttrs(); + + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); } /*---------------------------------------------------------------------------------------------- @@ -1667,8 +1647,9 @@ void VwTextStore::OnDocChange() @param nHow Flag how the selection changed: ksctSamePara, ksctDiffPara, etc. ----------------------------------------------------------------------------------------------*/ -void VwTextStore::OnSelChange(VwSelChangeType nHow) +STDMETHODIMP VwTextStore::OnSelectionChange(int nHow) { + BEGIN_COM_METHOD; #ifdef TRACING_TSF StrAnsi sta; sta.Format("VwTextStore::OnSelChange(%d), m_fNotify = %s%n", @@ -1694,7 +1675,7 @@ void VwTextStore::OnSelChange(VwSelChangeType nHow) // scripts are installed. For example, we've had crashes here when selecting an // icon in interlinear text using Chinese data. if (!psel) - return; + return S_OK; VwParagraphBox * pvpboxNew = psel ? psel->AnchorBox() : NULL; if (m_AdviseSinkInfo.m_dwMask & TS_AS_TEXT_CHANGE && m_AdviseSinkInfo.m_qTextStoreACPSink) @@ -1705,7 +1686,8 @@ void VwTextStore::OnSelChange(VwSelChangeType nHow) // REVIEW (DamienD): I don't think this will give an accurate acpOldEnd, since // the LogToAcp() method calculates the acp offset based off of the current // paragraphs in the selection - ttc.acpOldEnd = LogToAcp(m_pvpboxCurrent ? m_pvpboxCurrent->Source()->Cch() + VwParagraphBox* pvpboxCurrent = m_prootb->GetLastSelectedAnchorBox(); + ttc.acpOldEnd = LogToAcp(pvpboxCurrent ? pvpboxCurrent->Source()->Cch() : m_cchLastPara); ttc.acpNewEnd = pvpboxNew ? LogToAcp(pvpboxNew->Source()->Cch()) : 0; #ifdef TRACING_TSF @@ -1725,7 +1707,6 @@ void VwTextStore::OnSelChange(VwSelChangeType nHow) m_AdviseSinkInfo.m_qTextStoreACPSink->OnTextChange(0, &ttc); } } - m_pvpboxCurrent = pvpboxNew; } if (m_AdviseSinkInfo.m_dwMask & TS_AS_SEL_CHANGE && m_AdviseSinkInfo.m_qTextStoreACPSink && nHow != ksctDeleted) @@ -1761,10 +1742,12 @@ void VwTextStore::OnSelChange(VwSelChangeType nHow) pIErrorInfo->Release(); } + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); } -void VwTextStore::OnLayoutChange() +STDMETHODIMP VwTextStore::OnLayoutChange() { + BEGIN_COM_METHOD; m_fLayoutChanged = false; if (m_fNotify) { @@ -1784,18 +1767,21 @@ void VwTextStore::OnLayoutChange() } } DoDisplayAttrs(); + + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); } /*---------------------------------------------------------------------------------------------- Set the Text Service focus to our root box. ----------------------------------------------------------------------------------------------*/ -void VwTextStore::SetFocus() +STDMETHODIMP VwTextStore::SetFocus() { + BEGIN_COM_METHOD; #ifdef TRACING_TSF TraceTSF("VwTextStore::SetFocus()\r\n"); #endif if (!s_qttmThreadMgr) - return; + return S_OK; // retrieve the current writing system, so that we can use it to determine whether to // return NFD or NFC to TSF @@ -1813,51 +1799,293 @@ void VwTextStore::SetFocus() { Assert(false); //, "Microsoft's thread manager threw an exception from SetFocus!"); } + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); +} + +/*---------------------------------------------------------------------------------------------- + Send appropriate mouse event notifications, if they have been requested. A "Mouse Down" + event terminates all open compositions if it is not handled by the sink (unless, of course, + the sink does not exist). +----------------------------------------------------------------------------------------------*/ +STDMETHODIMP VwTextStore::OnMouseEvent(int xd, int yd, RECT rcSrc1, RECT rcDst1, VwMouseEvent me, + ComBool * pfProcessed) +{ + BEGIN_COM_METHOD; + ChkComOutPtr(pfProcessed); + if (!m_qMouseSink) + { + *pfProcessed = FALSE; + return S_OK; + } + // Determine whether it intersects the range that the mouse sink is interested in. + HoldGraphicsAtDst hg(m_qrootb, Point(xd, yd)); + // Find the most local box where the user clicked, and where he clicked relative to it. + Rect rcSrcBox; + Rect rcDstBox; + VwBox * pboxClick = m_qrootb->FindBoxClicked(hg.m_qvg, xd, yd, hg.m_rcSrcRoot, hg.m_rcDstRoot, + &rcSrcBox, &rcDstBox); + if (!pboxClick) + { + // The mouse event is nowhere of interest to text services. + *pfProcessed = EndAllCompositions(me == kmeDown); + return S_OK; + } + + VwSelectionPtr qvwsel; + pboxClick->GetSelection(hg.m_qvg, m_qrootb, xd, yd, hg.m_rcSrcRoot, hg.m_rcDstRoot, rcSrcBox, + rcDstBox, &qvwsel); + + VwTextSelection * psel = dynamic_cast(qvwsel.Ptr()); + if (!psel) + { + // It must be a text selection to be relevant for text services. + *pfProcessed = EndAllCompositions(me == kmeDown); + return S_OK; + } + + VwParagraphBox * pvpboxClick = psel->AnchorBox(); + if (pvpboxClick != m_pvpboxMouseSink) + { + // The mouse event is not near the box of interest. + *pfProcessed = EndAllCompositions(me == kmeDown); + return S_OK; + } + + int ichClick = psel->AnchorOffset(); + if (ichClick < m_ichMinMouseSink || ichClick > m_ichLimMouseSink) + { + // The mouse event is not (even close to) the range of interest. + *pfProcessed = EndAllCompositions(me == kmeDown); + return S_OK; + } + RECT rdPrimary, rdSecondary; + ComBool fSplit, fEndBeforeAnchor; + Point pt(xd,yd); + bool fFoundChar = false; + Rect rdChar; + if (ichClick > 0 && ichClick > m_ichMinMouseSink) + { + // See if the click is in the character before the position. Selection was made from a single + // click, so it is an IP. Extend it to cover the previous character. + psel->m_ichEnd--; + psel->m_fEndBeforeAnchor = true; + psel->Location(hg.m_qvg, hg.m_rcSrcRoot, hg.m_rcDstRoot, &rdPrimary, + &rdSecondary, &fSplit, &fEndBeforeAnchor); + rdChar = rdPrimary; + if (rdChar.Contains(pt)) + { + fFoundChar = true; + } + else + { + psel->m_ichEnd++; + } + } + if (ichClick < pvpboxClick->Source()->Cch() && ichClick < m_ichLimMouseSink && !fFoundChar) + { + // See if the click is in the character after the position. Selection was made from a single + // click, so it is an IP. Extend it to cover the following character. + psel->m_ichEnd++; + psel->m_fEndBeforeAnchor = false; + psel->Location(hg.m_qvg, hg.m_rcSrcRoot, hg.m_rcDstRoot, &rdPrimary, + &rdSecondary, &fSplit, &fEndBeforeAnchor); + rdChar = rdPrimary; + if (rdChar.Contains(pt)) + { + fFoundChar = true; + } + } + if (!fFoundChar) + { + // The mouse event wasn't inside a character in the range, maybe just before or + // after (or empty string). + *pfProcessed = EndAllCompositions(me == kmeDown); + return S_OK; + } + + ULONG edge = LogToAcp(ichClick) - LogToAcp(m_ichMinMouseSink); + int section = ((rdChar.right - rdChar.left) > 0) ? + min((xd - rdChar.left) * 4 / (rdChar.right - rdChar.left), 3) : 1; + ULONG quadrant = (section + 2) % 4; // want 2, 3, 0, 1 for the respective sections. + DWORD dwBtnStatus = 0; + + // Figure a set of flags that indicates approximately the state of the mouse. + switch(me) + { + case kmeDown: // no shift, main button + case kmeDblClick: // assume no shift, main button + case kmeMoveDrag: // mouse move, main button down, assume no modifiers + // All of these cases assume the main button is down, nothing else. + dwBtnStatus = MK_LBUTTON; + break; + case kmeExtend: // main click, shift down + dwBtnStatus = MK_LBUTTON | MK_SHIFT; + break; + case kmeUp: // main button up. + // Assume nothing is down + break; + } + + // Send the notification. + BOOL fEaten; + m_qMouseSink->OnMouseEvent(edge, quadrant, dwBtnStatus, &fEaten); +#ifdef TRACING_TSF + if (me == kmeDown) + { + StrAnsi sta; + sta.Format( +"VwTextStore::MouseEvent, xd = %d (%d), width = %d, edge = %d, quadrant = %d - fEaten = %s%n", + xd, xd - rdChar.left, rdChar.Width(), (int) edge, (int) quadrant, + fEaten ? "true" : "false"); + TraceTSF(sta.Chars()); + } +#endif + if (!fEaten) + { + // End all current compositions on mouse down. + *pfProcessed = EndAllCompositions(me == kmeDown); + return S_OK; + } + return S_OK; + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); +} + +STDMETHODIMP VwTextStore::KillFocus() +{ + BEGIN_COM_METHOD; + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); +} + +STDMETHODIMP VwTextStore::OnUpdateProp(ComBool * pSuppressNormalization) +{ + BEGIN_COM_METHOD; + ChkComOutPtr(pSuppressNormalization); + CheckHr(get_IsCompositionActive(pSuppressNormalization)); + if (*pSuppressNormalization) + NoteCommitDuringComposition(); + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); +} + +STDMETHODIMP VwTextStore::get_IsCompositionActive(ComBool * pfCompositionActive) +{ + BEGIN_COM_METHOD; + ChkComOutPtr(pfCompositionActive); + *pfCompositionActive = m_compositions.Size() > 0; + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); +} + +STDMETHODIMP VwTextStore::get_IsEndingComposition(ComBool * pfDoingRecommit) +{ + BEGIN_COM_METHOD; + ChkComOutPtr(pfDoingRecommit); + *pfDoingRecommit = m_fDoingRecommit; + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); +} + +/*---------------------------------------------------------------------------------------------- + Terminate all compositions, and refresh the display attributes. +----------------------------------------------------------------------------------------------*/ +STDMETHODIMP VwTextStore::TerminateAllCompositions() +{ + BEGIN_COM_METHOD; + +#ifdef TRACING_TSF + TraceTSF("VwTextStore::TerminateAllCompositions\n"); +#endif + // Can't have (or terminate!) compositions without a real context. + if (!m_qtcContext) + return S_OK; + HRESULT hr; + ITfContextOwnerCompositionServices * pCompServices; + //get the ITfContextOwnerCompositionServices interface pointer + hr = m_qtcContext->QueryInterface(IID_ITfContextOwnerCompositionServices, + (void **)&pCompServices); + if (SUCCEEDED(hr)) + { + // passing NULL terminates all compositions. We should get OnEndComposition notifications. + hr = pCompServices->TerminateComposition(NULL); + pCompServices->Release(); +#ifdef TRACING_TSF + TraceTSF(" all compositions terminated!\n"); +#endif + } + + END_COM_METHOD(g_factDummy, IID_IViewInputMgr); } +//:>******************************************************************************************** +//:> Other Methods. +//:>******************************************************************************************** + /*---------------------------------------------------------------------------------------------- - Create and initialize the document manager. - This can be called more than once. It releases the old document manager if one - already exists. + Retrieve the start and end boxes of the selection. Return true if there is a text selection. + Returns a value for both boxes, even if they are the same. ----------------------------------------------------------------------------------------------*/ -void VwTextStore::Init() +VwTextSelection * VwTextStore::GetStartAndEndBoxes(VwParagraphBox ** ppvpboxStart, + VwParagraphBox ** ppvpboxEnd, bool * pfEndBeforeAnchor) { - if (!s_qttmThreadMgr) - return; - // If we already have a DocMgr, we don't want to create a new one, especially without - // properly closing off the old one with a pop to clear the reference count on this. - // Otherwise we end up with leaking memory on this. - if (m_qtdmDocMgr) - return; - // Create the Text Services Framework document manager for this "document" (root box). - CheckHr(s_qttmThreadMgr->CreateDocumentMgr(&m_qtdmDocMgr)); - - // Create and install the Text Services Framework "context". - CheckHr(m_qtdmDocMgr->CreateContext(s_tfClientID, 0, dynamic_cast(this), - &m_qtcContext, &m_tfEditCookie)); - CheckHr(m_qtdmDocMgr->Push(m_qtcContext)); - -// HRESULT hr; -// hr = s_qttmThreadMgr->AssociateFocus( -// HWND hwnd, -// ITfDocumentMgr* pdimNew, -// ITfDocumentMgr** ppdimPrev); + VwTextSelection * psel = dynamic_cast(m_qrootb->Selection()); + VwParagraphBox * pvpboxStart = NULL; + VwParagraphBox * pvpboxEnd = NULL; + if (psel) + { + ComBool fEndBeforeAnchor; + CheckHr(psel->get_EndBeforeAnchor(&fEndBeforeAnchor)); + if (pfEndBeforeAnchor) + *pfEndBeforeAnchor = static_cast(fEndBeforeAnchor); + if (fEndBeforeAnchor) + { + pvpboxStart = psel->EndBox(); + pvpboxEnd = psel->AnchorBox(); + if (!pvpboxStart) // Single-paragraph selection. + pvpboxStart = pvpboxEnd; + } + else + { + pvpboxStart = psel->AnchorBox(); + pvpboxEnd = psel->EndBox(); + if (!pvpboxEnd) // Single-paragraph selection. + pvpboxEnd = pvpboxStart; + } + if (pvpboxStart) + { + m_cchLastPara = pvpboxStart->Source()->Cch(); + if (pvpboxStart != pvpboxEnd) + m_cchLastPara += s_cchParaBreak + pvpboxEnd->Source()->Cch(); + } + else + { + // probably in the middle of setting up the selection. Not much we can do... + psel = NULL; + } + } + // If no selection, let the caller worry about it. + *ppvpboxStart = pvpboxStart; + *ppvpboxEnd = pvpboxEnd; + return psel; } /*---------------------------------------------------------------------------------------------- - Release the interfaces installed by the constructor or by Init. + Compute the length of the current text (in decomposed characters NFD). ----------------------------------------------------------------------------------------------*/ -void VwTextStore::Close() +int VwTextStore::TextLength() { - if (!m_qtdmDocMgr) - return; - AssertPtr(s_qttmThreadMgr.Ptr()); - CheckHr(m_qtdmDocMgr->Pop(TF_POPF_ALL)); - m_qtdmDocMgr.Clear(); - m_qtcContext.Clear(); - m_qrootb.Clear(); - m_qws.Clear(); + VwParagraphBox * pvpboxFirst; + VwParagraphBox * pvpboxLast; + VwTextSelection * psel = GetStartAndEndBoxes(&pvpboxFirst, &pvpboxLast); + if (psel) + { + if (pvpboxFirst != pvpboxLast) + return pvpboxFirst->Source()->Cch() + s_cchParaBreak + pvpboxLast->Source()->Cch(); + else + return pvpboxFirst->Source()->Cch(); + } + else + { + // Handle no selection by pretending we have an empty document. + return 0; + } } /*---------------------------------------------------------------------------------------------- @@ -1989,21 +2217,6 @@ void VwTextStore::CreateNewSelection(int ichFirst, int ichLast, bool fEndBeforeA *pptsel = qtsel.Detach(); } -void VwTextStore::AddToKeepList(LazinessIncreaser *pli) -{ - if (m_pvpboxCurrent) - pli->KeepSequence(m_pvpboxCurrent, m_pvpboxCurrent->NextOrLazy()); -} - -// The specified box is being deleted. If somehow we are stil pointing at it -// (this can happen, for one example, during a replace all where NoteDependencies -// cause large-scale regeneration), clear the pointers to a safe, neutral state. -void VwTextStore::ClearPointersTo(VwParagraphBox * pvpbox) -{ - if (m_pvpboxCurrent == pvpbox) - m_pvpboxCurrent = NULL; -} - COLORREF InterpretTfDaColor(TF_DA_COLOR tdc, COLORREF current) { if (tdc.type == TF_CT_SYSCOLOR) @@ -2260,33 +2473,6 @@ STDMETHODIMP VwTextStore::OnUpdateComposition(ITfCompositionView * pComposition, } -/*---------------------------------------------------------------------------------------------- - Terminate all compositions, and refresh the display attributes. -----------------------------------------------------------------------------------------------*/ -void VwTextStore::TerminateAllCompositions(void) -{ -#ifdef TRACING_TSF - TraceTSF("VwTextStore::TerminateAllCompositions\n"); -#endif - // Can't have (or terminate!) compositions without a real context. - if (!m_qtcContext) - return; - HRESULT hr; - ITfContextOwnerCompositionServices * pCompServices; - //get the ITfContextOwnerCompositionServices interface pointer - hr = m_qtcContext->QueryInterface(IID_ITfContextOwnerCompositionServices, - (void **)&pCompServices); - if (SUCCEEDED(hr)) - { - // passing NULL terminates all compositions. We should get OnEndComposition notifications. - hr = pCompServices->TerminateComposition(NULL); - pCompServices->Release(); -#ifdef TRACING_TSF - TraceTSF(" all compositions terminated!\n"); -#endif - } -} - /*---------------------------------------------------------------------------------------------- Called when a composition is terminated. See MSDN for details (ITfContextOwnerCompositionSink::OnEndComposition). @@ -2383,145 +2569,6 @@ STDMETHODIMP VwTextStore::UnadviseMouseSink(DWORD dwCookie) END_COM_METHOD(g_factDummy, IID_ITfMouseTrackerACP); } -/*---------------------------------------------------------------------------------------------- - Send appropriate mouse event notifications, if they have been requested. A "Mouse Down" - event terminates all open compositions if it is not handled by the sink (unless, of course, - the sink does not exist). -----------------------------------------------------------------------------------------------*/ -bool VwTextStore::MouseEvent(int xd, int yd, RECT rcSrc1, RECT rcDst1, VwMouseEvent me) -{ - if (!m_qMouseSink) - return false; - // Determine whether it intersects the range that the mouse sink is interested in. - HoldGraphicsAtDst hg(m_qrootb, Point(xd, yd)); - // Find the most local box where the user clicked, and where he clicked relative to it. - Rect rcSrcBox; - Rect rcDstBox; - VwBox * pboxClick = m_qrootb->FindBoxClicked(hg.m_qvg, xd, yd, hg.m_rcSrcRoot, hg.m_rcDstRoot, - &rcSrcBox, &rcDstBox); - if (!pboxClick) - { - // The mouse event is nowhere of interest to text services. - return EndAllCompositions(me == kmeDown); - } - - VwSelectionPtr qvwsel; - pboxClick->GetSelection(hg.m_qvg, m_qrootb, xd, yd, hg.m_rcSrcRoot, hg.m_rcDstRoot, rcSrcBox, - rcDstBox, &qvwsel); - - VwTextSelection * psel = dynamic_cast(qvwsel.Ptr()); - if (!psel) - { - // It must be a text selection to be relevant for text services. - return EndAllCompositions(me == kmeDown); - } - - VwParagraphBox * pvpboxClick = psel->AnchorBox(); - if (pvpboxClick != m_pvpboxMouseSink) - { - // The mouse event is not near the box of interest. - return EndAllCompositions(me == kmeDown); - } - - int ichClick = psel->AnchorOffset(); - if (ichClick < m_ichMinMouseSink || ichClick > m_ichLimMouseSink) - { - // The mouse event is not (even close to) the range of interest. - return EndAllCompositions(me == kmeDown); - } - RECT rdPrimary, rdSecondary; - ComBool fSplit, fEndBeforeAnchor; - Point pt(xd,yd); - bool fFoundChar = false; - Rect rdChar; - if (ichClick > 0 && ichClick > m_ichMinMouseSink) - { - // See if the click is in the character before the position. Selection was made from a single - // click, so it is an IP. Extend it to cover the previous character. - psel->m_ichEnd--; - psel->m_fEndBeforeAnchor = true; - psel->Location(hg.m_qvg, hg.m_rcSrcRoot, hg.m_rcDstRoot, &rdPrimary, - &rdSecondary, &fSplit, &fEndBeforeAnchor); - rdChar = rdPrimary; - if (rdChar.Contains(pt)) - { - fFoundChar = true; - } - else - { - psel->m_ichEnd++; - } - } - if (ichClick < pvpboxClick->Source()->Cch() && ichClick < m_ichLimMouseSink && !fFoundChar) - { - // See if the click is in the character after the position. Selection was made from a single - // click, so it is an IP. Extend it to cover the following character. - psel->m_ichEnd++; - psel->m_fEndBeforeAnchor = false; - psel->Location(hg.m_qvg, hg.m_rcSrcRoot, hg.m_rcDstRoot, &rdPrimary, - &rdSecondary, &fSplit, &fEndBeforeAnchor); - rdChar = rdPrimary; - if (rdChar.Contains(pt)) - { - fFoundChar = true; - } - } - if (!fFoundChar) - { - // The mouse event wasn't inside a character in the range, maybe just before or - // after (or empty string). - return EndAllCompositions(me == kmeDown); - } - - ULONG edge = LogToAcp(ichClick) - LogToAcp(m_ichMinMouseSink); - int section = ((rdChar.right - rdChar.left) > 0) ? - min((xd - rdChar.left) * 4 / (rdChar.right - rdChar.left), 3) : 1; - ULONG quadrant = (section + 2) % 4; // want 2, 3, 0, 1 for the respective sections. - DWORD dwBtnStatus = 0; - - // Figure a set of flags that indicates approximately the state of the mouse. - switch(me) - { - case kmeDown: // no shift, main button - case kmeDblClick: // assume no shift, main button - case kmeMoveDrag: // mouse move, main button down, assume no modifiers - // All of these cases assume the main button is down, nothing else. - dwBtnStatus = MK_LBUTTON; - break; - case kmeExtend: // main click, shift down - dwBtnStatus = MK_LBUTTON | MK_SHIFT; - break; - case kmeUp: // main button up. - // Assume nothing is down - break; - } - - // Send the notification. - BOOL fEaten; - m_qMouseSink->OnMouseEvent(edge, quadrant, dwBtnStatus, &fEaten); -#ifdef TRACING_TSF - if (me == kmeDown) - { - StrAnsi sta; - sta.Format( -"VwTextStore::MouseEvent, xd = %d (%d), width = %d, edge = %d, quadrant = %d - fEaten = %s%n", - xd, xd - rdChar.left, rdChar.Width(), (int) edge, (int) quadrant, - fEaten ? "true" : "false"); - TraceTSF(sta.Chars()); - } -#endif - if (!fEaten) - { - // End all current compositions on mouse down. - return EndAllCompositions(me == kmeDown); - } - return fEaten; -} - -void VwTextStore::OnLoseFocus() -{ -} - /*---------------------------------------------------------------------------------------------- Convert the ACP character index (used by TSF manager) to the decomposed NFD character index used internally by views code. diff --git a/Src/views/VwTextStore.h b/Src/views/VwTextStore.h index 7e6a89e5e8..8855830680 100644 --- a/Src/views/VwTextStore.h +++ b/Src/views/VwTextStore.h @@ -16,6 +16,11 @@ Last reviewed: Not yet. #ifndef VwTextStore_INCLUDED #define VwTextStore_INCLUDED +namespace TestViews +{ + class TestVwTextStore; +}; + DEFINE_COM_PTR(ITextStoreACP); DEFINE_COM_PTR(ITextStoreACPSink); DEFINE_COM_PTR(ITextStoreACPServices); @@ -38,8 +43,10 @@ DEFINE_COM_PTR(ITfMouseSink); Hungarian: txs ----------------------------------------------------------------------------------------------*/ class VwTextStore : public ITextStoreACP, public ITfContextOwnerCompositionSink, - public ITfMouseTrackerACP + public ITfMouseTrackerACP, public IViewInputMgr { + friend class TestViews::TestVwTextStore; + public: VwTextStore(VwRootBox * prootb); ~VwTextStore(); @@ -116,16 +123,20 @@ class VwTextStore : public ITextStoreACP, public ITfContextOwnerCompositionSink, DWORD* pdwCookie); STDMETHOD(UnadviseMouseSink)(DWORD dwCookie); - // Other Public Methods. + // IViewInputMgr + STDMETHOD(Init)(IVwRootBox * prootb); + STDMETHOD(Close)(); + STDMETHOD(OnTextChange)(); + STDMETHOD(OnSelectionChange)(int nHow); + STDMETHOD(OnLayoutChange)(); + STDMETHOD(SetFocus)(); + STDMETHOD(OnMouseEvent)(int xd, int yd, RECT rcSrc1, RECT rcDst1, VwMouseEvent me, ComBool * pfProcessed); + STDMETHOD(KillFocus)(); + STDMETHOD(OnUpdateProp)(ComBool * pSuppressNormalization); + STDMETHOD(get_IsCompositionActive)(ComBool * pfCompositionActive); + STDMETHOD(get_IsEndingComposition)(ComBool * pfDoingRecommit); + STDMETHOD(TerminateAllCompositions)(); - void OnDocChange(); - void OnSelChange(VwSelChangeType nHow); - void OnLayoutChange(); - void SetFocus(); - void Init(); - void Close(); - void AddToKeepList(LazinessIncreaser *pli); - bool MouseEvent(int xd, int yd, RECT rcSrc1, RECT rcDst1, VwMouseEvent me); protected: // Member variables @@ -174,7 +185,7 @@ class VwTextStore : public ITextStoreACP, public ITfContextOwnerCompositionSink, bool IsNfdIMEActive(); void GetCurrentWritingSystem(); - VwParagraphBox * m_pvpboxCurrent; + VwRootBox * m_prootb; public: static ITfThreadMgrPtr s_qttmThreadMgr; @@ -185,8 +196,8 @@ class VwTextStore : public ITextStoreACP, public ITfContextOwnerCompositionSink, ITfContextPtr m_qtcContext; TfEditCookie m_tfEditCookie; +private: // Internal methods. - bool _LockDocument(DWORD dwLockFlags) { if (m_fLocked) @@ -228,7 +239,6 @@ class VwTextStore : public ITextStoreACP, public ITfContextOwnerCompositionSink, VwTextSelection ** pptsel); void ClearPointersTo(VwParagraphBox * pvpbox); void DoDisplayAttrs(); - void TerminateAllCompositions(void); // Conditionally terminate all compositions and return false. Used mostly in MouseEvent(). bool EndAllCompositions(bool fStop) { @@ -236,23 +246,13 @@ class VwTextStore : public ITextStoreACP, public ITfContextOwnerCompositionSink, TerminateAllCompositions(); return false; } - void OnLoseFocus(); DWORD SuspendAdvise(IUnknown ** ppunk); - bool IsCompositionActive() - { - return m_compositions.Size() > 0; - } void NoteCommitDuringComposition() { m_fCommitDuringComposition = true; } - bool IsDoingRecommit() - { - return m_fDoingRecommit; - } - private: int RetrieveText(int ichFirst, int ichLast, int cchPlainReqNfd, wchar* pchPlainNfd); void NormalizeText(StrUni & stuText, WCHAR* pchPlain, UCOMINT32 cchPlainReq, From 5385be0fc5451f6fe96b51227fe9e774107c38f4 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 29 May 2013 15:29:38 +0200 Subject: [PATCH 03/15] Keyboarding: Implement getting active keyboard on Windows Change-Id: Ifb2dcca36a3acdf456776e83adecf414fd923bb6 --- .../Interfaces/IKeyboardCallback.cs | 5 - .../Interfaces/IKeyboardMethods.cs | 5 + Src/Common/Keyboarding/KeyboardController.cs | 31 ++++- .../Keyboarding/KeyboardDescriptionNull.cs | 4 - Src/Common/Keyboarding/Keyboarding.csproj | 1 + .../FakeKeyboardController.cs | 6 + .../Keyboarding/Linux/LinuxKeyboardHelper.cs | 20 ++- .../Windows/KeymanKeyboardAdapter.cs | 20 ++- .../Windows/WindowsKeyboardHelper.cs | 120 ++++++++++++++++++ Src/Common/SimpleRootSite/ViewInputManager.cs | 8 +- 10 files changed, 192 insertions(+), 28 deletions(-) create mode 100644 Src/Common/Keyboarding/Windows/WindowsKeyboardHelper.cs diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs index 14e424fae3..f85dbecb72 100644 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs +++ b/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs @@ -21,10 +21,5 @@ public interface IKeyboardCallback /// Gets the keyboard associated with the current selection. /// IKeyboardDescription Keyboard { get; } - - /// - /// Gets or sets the active keyboard. - /// - IKeyboardDescription ActiveKeyboard { get; set; } } } diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs index 9e9cab267e..e92beaac96 100644 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs +++ b/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs @@ -55,5 +55,10 @@ public interface IKeyboardMethods /// /// Corresponding C++ method is VwTextStore::OnLoseFocus. void DisableInput(IKeyboardCallback callback); + + /// + /// Gets the active keyboard. + /// + IKeyboardDescription ActiveKeyboard { get; } } } diff --git a/Src/Common/Keyboarding/KeyboardController.cs b/Src/Common/Keyboarding/KeyboardController.cs index b1ae91d9e1..5d90e45e0c 100644 --- a/Src/Common/Keyboarding/KeyboardController.cs +++ b/Src/Common/Keyboarding/KeyboardController.cs @@ -240,11 +240,11 @@ private static IKeyboardController Create() #if __MonoCS__ var keyboardHelper = new LinuxKeyboardHelper(); - controller.InternalEventHandler = keyboardHelper; - controller.InternalMethods = keyboardHelper; #else - // TODO: No keyboard event handler class implemented on Windows + var keyboardHelper = new WindowsKeyboardHelper(); #endif + controller.InternalEventHandler = keyboardHelper; + controller.InternalMethods = keyboardHelper; return controller; } @@ -335,6 +335,21 @@ public static IKeyboardDescription GetKeyboard(string otherImKeyboard) return Instance.GetKeyboard(otherImKeyboard); } + /// + /// Sets the keyboard. + /// + /// Keyboard identifier of system keyboard + /// Identifier for other input method keyboard (Keyman/ibus) + /// + public static void SetKeyboard(int lcid, string otherImKeyboard) + { + int nActiveLangId = 0; + string activeOtherImKeyboard = string.Empty; + bool fSelectLangPending = false; + Instance.SetKeyboard(lcid, otherImKeyboard, ref nActiveLangId, + ref activeOtherImKeyboard, ref fSelectLangPending); + } + /// /// Sets the keyboard. /// @@ -354,7 +369,15 @@ public static void SetKeyboard(int lcid, string otherImKeyboard, ref int nActive /// /// Gets or sets the available keyboard adaptors. /// - private static IKeyboardAdaptor[] Adaptors { get; set; } + internal static IKeyboardAdaptor[] Adaptors { get; private set; } + + /// + /// Gets the active keyboard + /// + public static IKeyboardDescription ActiveKeyboard + { + get { return Instance.InternalMethods.ActiveKeyboard; } + } #endregion } diff --git a/Src/Common/Keyboarding/KeyboardDescriptionNull.cs b/Src/Common/Keyboarding/KeyboardDescriptionNull.cs index d8a2ad58cd..4b95ab4c8c 100644 --- a/Src/Common/Keyboarding/KeyboardDescriptionNull.cs +++ b/Src/Common/Keyboarding/KeyboardDescriptionNull.cs @@ -15,10 +15,6 @@ namespace SIL.FieldWorks.Common.Keyboarding /// internal class KeyboardDescriptionNull: IKeyboardDescription { - public KeyboardDescriptionNull() - { - } - #region IKeyboardDescription implementation public void Activate() { diff --git a/Src/Common/Keyboarding/Keyboarding.csproj b/Src/Common/Keyboarding/Keyboarding.csproj index 778490c70b..038d1d3bd1 100644 --- a/Src/Common/Keyboarding/Keyboarding.csproj +++ b/Src/Common/Keyboarding/Keyboarding.csproj @@ -110,6 +110,7 @@ + diff --git a/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs b/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs index 3a82554814..fa2028eef5 100644 --- a/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs +++ b/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs @@ -149,6 +149,12 @@ public void EnableInput(IKeyboardCallback callback) public void DisableInput(IKeyboardCallback callback) { } + + public IKeyboardDescription ActiveKeyboard + { + get { return new KeyboardDescriptionNull(); } + } + #endregion } } diff --git a/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs b/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs index fec6d8764d..9c07c91fee 100644 --- a/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs +++ b/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs @@ -17,6 +17,8 @@ namespace SIL.FieldWorks.Common.Keyboarding.Linux /// public class LinuxKeyboardHelper: IKeyboardEventHandler, IKeyboardMethods { + private IKeyboardDescription m_ActiveKeyboard = new KeyboardDescriptionNull(); + #region IKeyboardEventHandler implementation /// /// Called before a property gets updated. @@ -74,24 +76,22 @@ public void TerminateAllCompositions(IKeyboardCallback callback) /// /// Activate the input method /// - /// Corresponding C++ method is VwTextStore::SetFocus. public void SetFocus(IKeyboardCallback callback) { var keyboard = callback.Keyboard; keyboard.Activate(); - callback.ActiveKeyboard = keyboard; + m_ActiveKeyboard = keyboard; } /// /// Deactivate the input method /// - /// Corresponding C++ method is VwTextStore::OnLoseFocus. public void KillFocus(IKeyboardCallback callback) { - if (callback.ActiveKeyboard != null) + if (m_ActiveKeyboard != null) { - callback.ActiveKeyboard.Deactivate(); - callback.ActiveKeyboard = null; + m_ActiveKeyboard.Deactivate(); + m_ActiveKeyboard = new KeyboardDescriptionNull(); } } @@ -128,6 +128,14 @@ public bool IsEndingComposition(IKeyboardCallback callback) { return false; } + + /// + /// Gets the active keyboard. + /// + public IKeyboardDescription ActiveKeyboard + { + get { return m_ActiveKeyboard; } + } #endregion } } diff --git a/Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs b/Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs index baea334692..053ad26625 100644 --- a/Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs +++ b/Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs @@ -52,14 +52,13 @@ public void Initialize() for (int i = 0; i < m_keymanHandler.NLayout; i++) { var name = m_keymanHandler.get_Name(i); - var id = name.GetHashCode(); // JohnT: haven't been able to reproduce FWR-1935, but apparently there's some bizarre // circumstance where one of the names comes back null. If so, leave it out. if (!string.IsNullOrEmpty(name)) { - KeyboardController.Manager.RegisterKeyboard(id, - new KeyboardDescription(id, name, this, KeyboardType.OtherIm)); + var desc = GetKeyboardDescription(name); + KeyboardController.Manager.RegisterKeyboard(desc.Id, desc); } } } @@ -100,6 +99,21 @@ public void DeactivateKeyboard(IKeyboardDescription keyboard) } #endregion + + private IKeyboardDescription GetKeyboardDescription(string name) + { + if (string.IsNullOrEmpty(name)) + return null; + + var id = name.GetHashCode(); + + return new KeyboardDescription(id, name, this, KeyboardType.OtherIm); + } + + public IKeyboardDescription ActiveKeyboard + { + get { return GetKeyboardDescription(m_keymanHandler.ActiveKeyboardName); } + } } } #endif diff --git a/Src/Common/Keyboarding/Windows/WindowsKeyboardHelper.cs b/Src/Common/Keyboarding/Windows/WindowsKeyboardHelper.cs new file mode 100644 index 0000000000..3da4b3dfba --- /dev/null +++ b/Src/Common/Keyboarding/Windows/WindowsKeyboardHelper.cs @@ -0,0 +1,120 @@ +// --------------------------------------------------------------------------------------------- +#region // Copyright (c) 2013, SIL International. All Rights Reserved. +// +// Copyright (c) 2013, SIL International. All Rights Reserved. +// +// Distributable under the terms of either the Common Public License or the +// GNU Lesser General Public License, as specified in the LICENSING.txt file. +// +#endregion +// --------------------------------------------------------------------------------------------- +#if !__MonoCS__ +using System; +using System.Drawing; + +namespace SIL.FieldWorks.Common.Keyboarding.Windows +{ + /// ---------------------------------------------------------------------------------------- + /// + /// Common keyboard event handling class for Windows (system and keyman) keyboards. + /// + /// Most functionality is implemented in C++ in VwTextStore and doesn't make use + /// of the IKeyboardEventHandler and IKeyboardMethods interfaces. + /// ---------------------------------------------------------------------------------------- + public class WindowsKeyboardHelper: IKeyboardEventHandler, IKeyboardMethods + { + private IKeyboardDescription m_ActiveKeyboard = new KeyboardDescriptionNull(); + + #region IKeyboardEventHandler Members + + public bool OnUpdateProp(IKeyboardCallback callback) + { + throw new NotImplementedException(); + } + + public bool OnMouseEvent(IKeyboardCallback callback, int xd, int yd, Rectangle rcSrc, + Rectangle rcDst, MouseEvent mouseEvent) + { + throw new NotImplementedException(); + } + + public void OnLayoutChange(IKeyboardCallback callback) + { + throw new NotImplementedException(); + } + + public void OnSelectionChange(IKeyboardCallback callback, SelChangeType how) + { + throw new NotImplementedException(); + } + + public void OnTextChange(IKeyboardCallback callback) + { + throw new NotImplementedException(); + } + + #endregion + + #region IKeyboardMethods Members + + public void TerminateAllCompositions(IKeyboardCallback callback) + { + throw new NotImplementedException(); + } + + public void SetFocus(IKeyboardCallback callback) + { + var keyboard = callback.Keyboard; + keyboard.Activate(); + m_ActiveKeyboard = keyboard; + } + + public void KillFocus(IKeyboardCallback callback) + { + if (m_ActiveKeyboard != null) + { + m_ActiveKeyboard.Deactivate(); + m_ActiveKeyboard = new KeyboardDescriptionNull(); + } + } + + public bool IsCompositionActive(IKeyboardCallback callback) + { + throw new NotImplementedException(); + } + + public bool IsEndingComposition(IKeyboardCallback callback) + { + throw new NotImplementedException(); + } + + public void EnableInput(IKeyboardCallback callback) + { + throw new NotImplementedException(); + } + + public void DisableInput(IKeyboardCallback callback) + { + throw new NotImplementedException(); + } + + /// + /// Gets the active keyboard. + /// + public IKeyboardDescription ActiveKeyboard + { + get + { + foreach (var adaptor in KeyboardController.Adaptors) + { + var keymanAdaptor = adaptor as KeymanKeyboardAdapter; + if (keymanAdaptor != null) + return keymanAdaptor.ActiveKeyboard; + } + return m_ActiveKeyboard; + } + } + #endregion + } +} +#endif diff --git a/Src/Common/SimpleRootSite/ViewInputManager.cs b/Src/Common/SimpleRootSite/ViewInputManager.cs index 2b33730f0a..b4946e77fc 100644 --- a/Src/Common/SimpleRootSite/ViewInputManager.cs +++ b/Src/Common/SimpleRootSite/ViewInputManager.cs @@ -16,7 +16,8 @@ namespace SIL.FieldWorks.Common.RootSites { /// - /// Connects a view (rootbox) with keyboards. This class gets created by the VwRootBox. + /// Connects a view (rootbox) with keyboards. This class gets created on Linux by the + /// VwRootBox. On Windows we use VwTextStore instead. /// [Guid("830BAF1F-6F84-46EF-B63E-3C1BFDF9E83E")] public class ViewInputManager: ILgTextServices, IKeyboardCallback, IViewInputMgr @@ -167,11 +168,6 @@ public IKeyboardDescription Keyboard return KeyboardController.GetKeyboard(langId, keyboardName); } } - - /// - /// Gets or sets the active keyboard. - /// - public IKeyboardDescription ActiveKeyboard { get; set; } #endregion #region ILgTextServices implementation From 2b1f9b922e3261a22944a99ce28114c7c5e96b61 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 29 May 2013 16:34:39 +0200 Subject: [PATCH 04/15] Keyboarding: Remove KeyboardHelper Use functionality of keyboarding library instead. Change-Id: Ic2228b22dde098240a0ea82b50ab487325645d3f --- Src/Common/CoreImpl/CoreImpl.csproj | 4 +- Src/Common/CoreImpl/KeyboardHelper.cs | 243 ------------------ Src/Common/FieldWorks/FieldWorks.cs | 1 - .../RootSiteTests/BasicViewTestsBase.cs | 7 - Src/Common/SimpleRootSite/EditingHelper.cs | 19 +- Src/Common/SimpleRootSite/SimpleRootSite.cs | 30 +-- Src/FwCoreDlgs/ValidCharactersDlg.cs | 10 +- Src/Language/LgKeymanHandler.cpp | 3 +- .../DiffView/DiffViewTests/DiffDialogTests.cs | 7 - Src/TeDll/TeDll.csproj | 4 + Src/TeDll/TeMainWnd.cs | 3 +- Src/TestUtils/BaseTest.cs | 2 - 12 files changed, 36 insertions(+), 297 deletions(-) delete mode 100644 Src/Common/CoreImpl/KeyboardHelper.cs diff --git a/Src/Common/CoreImpl/CoreImpl.csproj b/Src/Common/CoreImpl/CoreImpl.csproj index da1bd778a4..3cd155d909 100644 --- a/Src/Common/CoreImpl/CoreImpl.csproj +++ b/Src/Common/CoreImpl/CoreImpl.csproj @@ -1,4 +1,4 @@ - + Debug @@ -117,7 +117,6 @@ - True True @@ -178,7 +177,6 @@ - ../../../DistFiles diff --git a/Src/Common/CoreImpl/KeyboardHelper.cs b/Src/Common/CoreImpl/KeyboardHelper.cs deleted file mode 100644 index a7511dfc3f..0000000000 --- a/Src/Common/CoreImpl/KeyboardHelper.cs +++ /dev/null @@ -1,243 +0,0 @@ -// -------------------------------------------------------------------------------------------- -#region // Copyright (c) 2009, SIL International. All Rights Reserved. -// -// Copyright (c) 2009, SIL International. All Rights Reserved. -// -#endregion -// -// File: KeyboardHelper.cs -// Responsibility: TE Team -// -// -// Implementation of KeyboardHelper. The class contains static methods for switching keyboards. -// -// -------------------------------------------------------------------------------------------- -#define DEBUGGINGDISPOSE -using System; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using SIL.FieldWorks.Common.COMInterfaces; -using SIL.Utils; - -namespace SIL.CoreImpl -{ - /// ---------------------------------------------------------------------------------------- - /// - /// This class assists with keyboard switching. - /// - /// ---------------------------------------------------------------------------------------- - public static class KeyboardHelper - { - #region Implementation of KeyboardHelper - /// - /// Keyboard helper implementation. We provide a separate non-static implementation so - /// that we can explicitly dispose of it when running tests. - /// - private sealed class KeyboardHelperImpl: IDisposable - { - private readonly ILgTextServices m_lts; - private readonly ILgKeymanHandler m_keymanHandler; - - #region Constructor - public KeyboardHelperImpl() - { - m_keymanHandler = LgKeymanHandlerClass.Create(); - - if (!MiscUtils.IsUnix) - m_lts = LgTextServicesClass.Create(); - } - #endregion - - #region Disposable stuff -#if DEBUGGINGDISPOSE - // NOTE: KeyboardHelperImpl is implemented as a singleton. It is usually ok that - // this finalizer is called in production code. However, in tests we might get - // hangs if we don't properly dispose. Ideally we would also dispose in production - // code, but for now we're doing it the pragmatic way... - // This finalizer is here only for tracking down dispose issues in tests. It will - // cause the "Missing Dispose()" message to be written out. - // If you're running the application and getting this message you should comment - // the #define DEBUGGINGDISPOSE above. - ~KeyboardHelperImpl() - { - Dispose(false); - } -#endif - - /// - public bool IsDisposed { get; private set; } - - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - private void Dispose(bool fDisposing) - { - // If you get this message see note above ~KeyboardHelperImpl - System.Diagnostics.Debug.WriteLineIf(!fDisposing, "****** Missing Dispose() call for " + GetType() + ". ****** "); - if (fDisposing && !IsDisposed) - { - // dispose managed and unmanaged objects - if (m_keymanHandler != null) - m_keymanHandler.Close(); - } - if (m_keymanHandler != null && Marshal.IsComObject(m_keymanHandler)) - Marshal.ReleaseComObject(m_keymanHandler); - if (m_lts != null && Marshal.IsComObject(m_lts)) - Marshal.ReleaseComObject(m_lts); - IsDisposed = true; - } - #endregion - - /// ------------------------------------------------------------------------------------ - /// - /// Activates the specified keyboard. - /// - /// ------------------------------------------------------------------------------------ - public bool ActivateKeyboard(int lcid, string keymanKbd, ref int activeLangId, - ref string activeKeymanKbd) - { - if (MiscUtils.IsUnix) - return false; - - //System.Diagnostics.Debug.WriteLine( - // "KeyboardHelper.ActivateKeyboard() -> ILgTextServices::SetKeyboard(" + lcid + ")"); - bool fSelectLangPending = false; - m_lts.SetKeyboard(lcid, keymanKbd, ref activeLangId, ref activeKeymanKbd, - ref fSelectLangPending); - - return fSelectLangPending; - } - - /// ------------------------------------------------------------------------------------ - /// - /// Gets the active Keyman keyboard or an empty string if there is no active Keyman - /// keyboard - /// - /// ------------------------------------------------------------------------------------ - public string ActiveKeymanKeyboard - { - get - { - string sKeymanKbd = m_keymanHandler.ActiveKeyboardName; - - // This constant '(None)' can not be localized until the C++ version is localized. - // Even then they should use the same resource. - if (sKeymanKbd == null || sKeymanKbd == "(None)") - sKeymanKbd = string.Empty; - return sKeymanKbd; - } - } - } - #endregion - - #region Member variables - private static KeyboardHelperImpl s_keyboardHelper; - private static readonly object s_syncRoot = new object(); - #endregion - - private static KeyboardHelperImpl KeyboardHelperObject - { - get - { - if (s_keyboardHelper == null) - { - lock (s_syncRoot) - { - if (s_keyboardHelper == null) - s_keyboardHelper = new KeyboardHelperImpl(); - } - } - return s_keyboardHelper; - } - } - - /// - /// Release the KeyboardHelper singleton object - /// - public static void Release() - { - lock (s_syncRoot) - { - if (s_keyboardHelper != null) - { - s_keyboardHelper.Dispose(); - s_keyboardHelper = null; - } - } - } - - /// ----------------------------------------------------------------------------------- - /// - /// Activate the given keyboard. - /// - /// On Windows 98, sending this message unnecessarily destroys - /// the current keystroke context, so only do it when we're actually switching - /// - /// ----------------------------------------------------------------------------------- - public static void ActivateDefaultKeyboard() - { - InputLanguage inputLng = InputLanguage.DefaultInputLanguage; - ActivateKeyboard(inputLng.Culture.LCID); - } - - /// ------------------------------------------------------------------------------------ - /// - /// Activates the specified keyboard. - /// - /// ------------------------------------------------------------------------------------ - public static bool ActivateKeyboard(int lcid) - { - return ActivateKeyboard(lcid, null); - } - - /// ------------------------------------------------------------------------------------ - /// - /// Activates the specified keyboard. - /// - /// ------------------------------------------------------------------------------------ - public static bool ActivateKeyboard(int lcid, string keymanKbd) - { - int langId = 0; - string activeKeymanKbd = null; - return ActivateKeyboard(lcid, keymanKbd, ref langId, ref activeKeymanKbd); - } - - /// ------------------------------------------------------------------------------------ - /// - /// Activates the specified keyboard. - /// - /// ------------------------------------------------------------------------------------ - public static bool ActivateKeyboard(int lcid, ref int activeLangId, - ref string activeKeymanKbd) - { - return ActivateKeyboard(lcid, null, ref activeLangId, ref activeKeymanKbd); - } - - /// ------------------------------------------------------------------------------------ - /// - /// Activates the specified keyboard. - /// - /// ------------------------------------------------------------------------------------ - public static bool ActivateKeyboard(int lcid, string keymanKbd, ref int activeLangId, - ref string activeKeymanKbd) - { - return KeyboardHelperObject.ActivateKeyboard(lcid, keymanKbd, ref activeLangId, ref activeKeymanKbd); - } - - /// ------------------------------------------------------------------------------------ - /// - /// Gets the active Keyman keyboard or an empty string if there is no active Keyman - /// keyboard - /// - /// ------------------------------------------------------------------------------------ - public static string ActiveKeymanKeyboard - { - get { return KeyboardHelperObject.ActiveKeymanKeyboard; } - } - } -} diff --git a/Src/Common/FieldWorks/FieldWorks.cs b/Src/Common/FieldWorks/FieldWorks.cs index 9a22801b45..eefa4e73fa 100644 --- a/Src/Common/FieldWorks/FieldWorks.cs +++ b/Src/Common/FieldWorks/FieldWorks.cs @@ -3367,7 +3367,6 @@ private static void StaticDispose() s_threadHelper = null; FwRegistrySettings.Release(); - KeyboardHelper.Release(); } #if DEBUG diff --git a/Src/Common/RootSite/RootSiteTests/BasicViewTestsBase.cs b/Src/Common/RootSite/RootSiteTests/BasicViewTestsBase.cs index 40b661cd20..b5cf2a9062 100644 --- a/Src/Common/RootSite/RootSiteTests/BasicViewTestsBase.cs +++ b/Src/Common/RootSite/RootSiteTests/BasicViewTestsBase.cs @@ -51,13 +51,6 @@ protected virtual DummyBasicView CreateDummyBasicView() return new DummyBasicView(m_hvoRoot, m_flidContainingTexts); } - /// - public override void FixtureTeardown() - { - KeyboardHelper.Release(); - base.FixtureTeardown(); - } - /// ----------------------------------------------------------------------------------- /// /// Create a new basic view diff --git a/Src/Common/SimpleRootSite/EditingHelper.cs b/Src/Common/SimpleRootSite/EditingHelper.cs index 7e98307d2e..e894234e45 100644 --- a/Src/Common/SimpleRootSite/EditingHelper.cs +++ b/Src/Common/SimpleRootSite/EditingHelper.cs @@ -18,6 +18,7 @@ using System.Windows.Forms; using SIL.CoreImpl; using SIL.FieldWorks.Common.COMInterfaces; +using SIL.FieldWorks.Common.Keyboarding; using SIL.FieldWorks.Common.RootSites.Properties; using SIL.Utils; @@ -917,19 +918,19 @@ protected void CollectTypedInput(char chsFirst, StringBuilder buffer) { // The first character goes into the buffer buffer.Append(chsFirst); +#if !__MonoCS__ + // Note: When/if porting to MONO, the following block of code can be removed + // and still work. if (chsFirst < ' ' || chsFirst == (char)VwSpecialChars.kscDelForward) return; // We need to disable type-ahead when using a Keyman keyboard since it can // mess with the keyboard functionality. (FWR-2205) - if (Control == null || KeyboardHelper.ActiveKeymanKeyboard != string.Empty) + var keyboard = KeyboardController.ActiveKeyboard; + if (Control == null || (keyboard != null && keyboard.Type == KeyboardType.OtherIm)) return; -#if !__MonoCS__ // Collect any characters that are currently in the message queue - // Note: When/if porting to MONO, the following block of code can be removed - // and still work. However, make sure the final line in the method still remains - // (i.e. the line where stuBuffer is being set). Win32.MSG msg = new Win32.MSG(); while (true) { @@ -3076,11 +3077,11 @@ private void ActivateDefaultKeyboard() // inputLng.ToString() + // " [" + (int)inputLng.Handle + "], m_hklActive = " + (int)m_hklActive); - if (KeyboardHelper.ActivateKeyboard(inputLng.Culture.LCID, ref m_nActiveLangId, - ref m_sActiveKeymanKbd)) - { + bool fSelectLangPending = m_cSelectLangPending > 0; + KeyboardController.SetKeyboard(inputLng.Culture.LCID, null, ref m_nActiveLangId, + ref m_sActiveKeymanKbd, ref fSelectLangPending); + if (fSelectLangPending) m_cSelectLangPending++; - } m_hklActive = inputLng.Handle; m_sActiveKeymanKbd = null; diff --git a/Src/Common/SimpleRootSite/SimpleRootSite.cs b/Src/Common/SimpleRootSite/SimpleRootSite.cs index e8aea7a317..39c29d967a 100644 --- a/Src/Common/SimpleRootSite/SimpleRootSite.cs +++ b/Src/Common/SimpleRootSite/SimpleRootSite.cs @@ -25,6 +25,7 @@ using SIL.CoreImpl; using SIL.FieldWorks.Common.COMInterfaces; +using SIL.FieldWorks.Common.Keyboarding; using SIL.Utils; using XCore; @@ -3170,21 +3171,12 @@ public void OnKeymanKeyboardChange(IntPtr wpFlags, IntPtr lpHKL) if (vws == null) return; // not enough valid writing systems to make it worth changing. - string sKeymanKbd = KeyboardHelper.ActiveKeymanKeyboard; + var keyboard = KeyboardController.ActiveKeyboard; + string sKeymanKbd = keyboard.Type == KeyboardType.OtherIm ? keyboard.Name : string.Empty; int wsMatch = -1; int countNoKeymanKeyboard = 0; foreach (int ws in vws) - { - if (ws == 0) - continue; - ILgWritingSystem lgws = wsf.get_EngineOrNull(ws); - if (lgws == null) - continue; - if (string.IsNullOrEmpty(lgws.Keyboard)) - countNoKeymanKeyboard++; - } - foreach (int ws in vws) { // Don't consider switching to the default, dummy writing system. if (ws == 0) @@ -3194,13 +3186,17 @@ public void OnKeymanKeyboardChange(IntPtr wpFlags, IntPtr lpHKL) if (lgws == null) continue; - string sWsKbd = lgws.Keyboard; - if (sKeymanKbd == sWsKbd) + if (string.IsNullOrEmpty(lgws.Keyboard)) + countNoKeymanKeyboard++; + else { - wsMatch = ws; - if (wsMatch == vws[0]) - return; // no change from current. - break; + string sWsKbd = lgws.Keyboard; + if (sKeymanKbd == sWsKbd) + { + wsMatch = ws; + if (wsMatch == vws[0]) + return; // no change from current. + } } } diff --git a/Src/FwCoreDlgs/ValidCharactersDlg.cs b/Src/FwCoreDlgs/ValidCharactersDlg.cs index 6410004334..2fe85d19d8 100644 --- a/Src/FwCoreDlgs/ValidCharactersDlg.cs +++ b/Src/FwCoreDlgs/ValidCharactersDlg.cs @@ -30,6 +30,7 @@ using SIL.FieldWorks.Common.COMInterfaces; using SIL.FieldWorks.Common.Controls; using SIL.FieldWorks.Common.FwUtils; +using SIL.FieldWorks.Common.Keyboarding; using SIL.FieldWorks.Common.RootSites; using SIL.FieldWorks.Common.Widgets; using SIL.FieldWorks.FDO; @@ -1394,10 +1395,9 @@ private void tabControlAddFrom_SelectedIndexChanged(object sender, EventArgs e) case kiTabUnicode: break; } - if (fUseWsKeyboard) - KeyboardHelper.ActivateKeyboard(m_ws.LCID); - else - KeyboardHelper.ActivateDefaultKeyboard(); + KeyboardController.SetKeyboard( + fUseWsKeyboard ? m_ws.LCID : InputLanguage.DefaultInputLanguage.Culture.LCID, + fUseWsKeyboard ? m_ws.Keyboard : null); } /// ------------------------------------------------------------------------------------ @@ -1734,7 +1734,7 @@ private void btnHelp_Click(object sender, EventArgs e) protected override void OnClosed(EventArgs e) { base.OnClosed(e); - KeyboardHelper.ActivateDefaultKeyboard(); + KeyboardController.SetKeyboard(InputLanguage.DefaultInputLanguage.Culture.LCID, null); } #endregion diff --git a/Src/Language/LgKeymanHandler.cpp b/Src/Language/LgKeymanHandler.cpp index f168814224..19a33f1e4d 100644 --- a/Src/Language/LgKeymanHandler.cpp +++ b/Src/Language/LgKeymanHandler.cpp @@ -574,8 +574,7 @@ STDMETHODIMP LgKeymanHandler::put_ActiveKeyboardName(BSTR bstrName) } /*---------------------------------------------------------------------------------------------- - Return the windows message (obtained from RegisterWindowsMessage("WM_KMSELECTLANG"). - Review JohnT: Or should it be WM_KMKBCHANGE? + Return the windows message (obtained from RegisterWindowsMessage("WM_KMKBCHANGE"). ----------------------------------------------------------------------------------------------*/ STDMETHODIMP LgKeymanHandler::get_KeymanWindowsMessage(int * pwm) { diff --git a/Src/TE/DiffView/DiffViewTests/DiffDialogTests.cs b/Src/TE/DiffView/DiffViewTests/DiffDialogTests.cs index 781b71ad72..6a3a207ef4 100644 --- a/Src/TE/DiffView/DiffViewTests/DiffDialogTests.cs +++ b/Src/TE/DiffView/DiffViewTests/DiffDialogTests.cs @@ -446,13 +446,6 @@ public override void FixtureSetup() Cache.ServiceLocator.WritingSystems.DefaultVernacularWritingSystem.DefaultFontName = "Times New Roman"; } - /// - public override void FixtureTeardown() - { - KeyboardHelper.Release(); - base.FixtureTeardown(); - } - /// ------------------------------------------------------------------------------------ /// /// Override to start an undoable UOW. diff --git a/Src/TeDll/TeDll.csproj b/Src/TeDll/TeDll.csproj index 8c572775e2..14f86d161b 100644 --- a/Src/TeDll/TeDll.csproj +++ b/Src/TeDll/TeDll.csproj @@ -158,6 +158,10 @@ FwUtils ..\..\Output\Debug\FwUtils.dll + + False + ..\..\Output\Debug\Keyboarding.dll + False ..\..\Lib\Common\LibronixLinker.dll diff --git a/Src/TeDll/TeMainWnd.cs b/Src/TeDll/TeMainWnd.cs index 20fc215715..e7cd3c6017 100644 --- a/Src/TeDll/TeMainWnd.cs +++ b/Src/TeDll/TeMainWnd.cs @@ -27,6 +27,7 @@ using SIL.FieldWorks.Common.Controls; using SIL.FieldWorks.Common.Framework; using SIL.FieldWorks.Common.FwUtils; +using SIL.FieldWorks.Common.Keyboarding; using SIL.FieldWorks.Common.PrintLayout; using SIL.FieldWorks.Common.RootSites; using SIL.FieldWorks.Common.ScriptureUtils; @@ -5458,7 +5459,7 @@ protected bool OnUnsQuestions(object args) m_StyleSheet.GetUiFontForWritingSystem(Cache.DefaultVernWs, 0), vernWs.IcuLocale, vernWs.RightToLeftScript, Path.Combine(ScrTextCollection.SettingsDirectory ?? @"c:\My Paratext Projects", "cms"), ccSettings, App.ApplicationName, start, end, - vern => KeyboardHelper.ActivateKeyboard(vern ? vernWs.LCID : defaultWs.LCID), + vern => KeyboardController.SetKeyboard(vern ? vernWs.LCID : defaultWs.LCID, vern ? vernWs.Keyboard : defaultWs.Keyboard), () => ShowHelp.ShowHelpTopic(m_app, "khtpNoHelpTopic"), LookupTerm); // TODO: Come up with a Help topic diff --git a/Src/TestUtils/BaseTest.cs b/Src/TestUtils/BaseTest.cs index bcd4fa9bbe..c8e983984e 100644 --- a/Src/TestUtils/BaseTest.cs +++ b/Src/TestUtils/BaseTest.cs @@ -132,8 +132,6 @@ public virtual void FixtureSetup() [TestFixtureTearDown] public virtual void FixtureTeardown() { - KeyboardHelper.Release(); - // FWC-16: we have to call CoFreeUnusedLibraries. This causes sqlnclir.dll to get // unloaded. If we don't do this we get a deadlock after the fixture teardown // because we're running STA. From 6091ac4a470a5785cd1ad3ff9c661c1d44b47892 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 29 May 2013 18:58:51 +0200 Subject: [PATCH 05/15] Keyboarding: Remove IIMEKeyboardSwitcher interface This interface is no longer needed. Also LgKeymanHandler is now only used on Windows, so it got excluded on Linux. Change-Id: Ia73d5b72dc101104caa35a5a77589eb09ff27442 --- Lib/linux/Common/FwKernelTlb.h | 2 +- Lib/linux/Common/FwKernelTlb.tlb | Bin 98864 -> 98864 bytes Lib/linux/Common/LanguageTlb.h | 2 +- Lib/linux/Common/LanguageTlb.tlb | Bin 98872 -> 98872 bytes Lib/linux/Common/ViewsTlb.h | 132 +----------------- Lib/linux/Common/ViewsTlb.idl | 28 +--- Lib/linux/Common/ViewsTlb.tlb | Bin 84700 -> 84192 bytes Lib/linux/Common/idhfiles.MD5 | 2 +- .../KeyboardSwitcher/KeyboardSwitcher.cs | 2 +- Src/Language/LgKeymanHandler.cpp | 62 +------- Src/Language/LgKeymanHandler.h | 13 +- Src/Language/Makefile | 1 - Src/views/Views.idh | 24 ---- Src/views/Views_GUIDs.cpp | 1 - 14 files changed, 16 insertions(+), 253 deletions(-) diff --git a/Lib/linux/Common/FwKernelTlb.h b/Lib/linux/Common/FwKernelTlb.h index 5fa565705d..777d2277e5 100644 --- a/Lib/linux/Common/FwKernelTlb.h +++ b/Lib/linux/Common/FwKernelTlb.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Tue May 28 09:54:39 2013 +/* at Wed May 29 18:54:40 2013 */ /* Compiler settings for d:\fwrepo\fw\Output\Common\FwKernelTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 diff --git a/Lib/linux/Common/FwKernelTlb.tlb b/Lib/linux/Common/FwKernelTlb.tlb index e3e267dd2a58fd306c53fb2f32c4472d98dc427f..f27501314cf15eb95fe332b8227d414b9efb2b4a 100644 GIT binary patch delta 45 zcmdnc!nOg3($C3-r=}?QCRQpKSt=M>SecqwnHVS-85kOK2{T+YTDH0M-0IB$S;-GX delta 45 zcmdnc!nOg3($C3-l%^{9CRQpKStuA-TA7+y8CxnC85kOK2{Y_ZTC%zI-0IB$T)_`@ diff --git a/Lib/linux/Common/LanguageTlb.h b/Lib/linux/Common/LanguageTlb.h index 1ad18892d5..ba3cda98dd 100644 --- a/Lib/linux/Common/LanguageTlb.h +++ b/Lib/linux/Common/LanguageTlb.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Tue May 28 09:54:38 2013 +/* at Wed May 29 18:54:39 2013 */ /* Compiler settings for d:\fwrepo\fw\Output\Common\LanguageTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 diff --git a/Lib/linux/Common/LanguageTlb.tlb b/Lib/linux/Common/LanguageTlb.tlb index 9de4fc413c0e073f0285ad70324e9ac249789e7c..db0f444a7e65ee6b8fc6c46774975a484d6df075 100644 GIT binary patch delta 45 zcmdnd!nUJ@ZA1P!x$x8!1>eL<1tUuZLklZY6Dwm&1tSAPV=iHa3r5Q}_nuq5830~T B4{HDb delta 45 zcmdnd!nUJ@ZA1P!xscLS1>eL<1tSXu14}DY6Dwm21tSAPV=iHaeMw6;_nuq58316g B50d}@ diff --git a/Lib/linux/Common/ViewsTlb.h b/Lib/linux/Common/ViewsTlb.h index 417d5be276..eae757a7e1 100644 --- a/Lib/linux/Common/ViewsTlb.h +++ b/Lib/linux/Common/ViewsTlb.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Tue May 28 09:54:40 2013 +/* at Wed May 29 18:54:41 2013 */ /* Compiler settings for d:\fwrepo\fw\Output\Common\ViewsTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 @@ -371,12 +371,6 @@ typedef struct VwLayoutStream VwLayoutStream; #endif /* __VwLayoutStream_FWD_DEFINED__ */ -#ifndef __IIMEKeyboardSwitcher_FWD_DEFINED__ -#define __IIMEKeyboardSwitcher_FWD_DEFINED__ -typedef interface IIMEKeyboardSwitcher IIMEKeyboardSwitcher; -#endif /* __IIMEKeyboardSwitcher_FWD_DEFINED__ */ - - #ifndef __IPictureFactory_FWD_DEFINED__ #define __IPictureFactory_FWD_DEFINED__ typedef interface IPictureFactory IPictureFactory; @@ -1090,11 +1084,6 @@ IVwLayoutManager 13F3A421-4915-455b-B57F-AFD4073CFFA0 ); GENERIC_DECLARE_SMART_INTERFACE_PTR( -IIMEKeyboardSwitcher -, -4D2BC310-DADF-11DE-9E3A-0019DBF4566E -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( IPictureFactory , 110B7E88-2968-11E0-B493-0019DBF4566E @@ -9226,125 +9215,6 @@ class DECLSPEC_UUID("1CD09E06-6978-4969-A1FC-462723587C32") VwLayoutStream; #endif -#ifndef __IIMEKeyboardSwitcher_INTERFACE_DEFINED__ -#define __IIMEKeyboardSwitcher_INTERFACE_DEFINED__ - -/* interface IIMEKeyboardSwitcher */ -/* [unique][object][uuid] */ - - -#define IID_IIMEKeyboardSwitcher __uuidof(IIMEKeyboardSwitcher) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("4D2BC310-DADF-11DE-9E3A-0019DBF4566E") - IIMEKeyboardSwitcher : public IUnknown - { - public: - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IMEKeyboard( - /* [retval][out] */ BSTR *pbstr) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_IMEKeyboard( - /* [in] */ BSTR pbstr) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IMEKeyboardsCount( - /* [retval][out] */ int *pdCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetKeyboardName( - /* [in] */ int index, - /* [retval][out] */ BSTR *pbstr) = 0; - - virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; - - }; - -#else /* C style interface */ - - typedef struct IIMEKeyboardSwitcherVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - IIMEKeyboardSwitcher * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - IIMEKeyboardSwitcher * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - IIMEKeyboardSwitcher * This); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IMEKeyboard )( - IIMEKeyboardSwitcher * This, - /* [retval][out] */ BSTR *pbstr); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_IMEKeyboard )( - IIMEKeyboardSwitcher * This, - /* [in] */ BSTR pbstr); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IMEKeyboardsCount )( - IIMEKeyboardSwitcher * This, - /* [retval][out] */ int *pdCount); - - HRESULT ( STDMETHODCALLTYPE *GetKeyboardName )( - IIMEKeyboardSwitcher * This, - /* [in] */ int index, - /* [retval][out] */ BSTR *pbstr); - - HRESULT ( STDMETHODCALLTYPE *Close )( - IIMEKeyboardSwitcher * This); - - END_INTERFACE - } IIMEKeyboardSwitcherVtbl; - - interface IIMEKeyboardSwitcher - { - CONST_VTBL struct IIMEKeyboardSwitcherVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define IIMEKeyboardSwitcher_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define IIMEKeyboardSwitcher_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define IIMEKeyboardSwitcher_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define IIMEKeyboardSwitcher_get_IMEKeyboard(This,pbstr) \ - ( (This)->lpVtbl -> get_IMEKeyboard(This,pbstr) ) - -#define IIMEKeyboardSwitcher_put_IMEKeyboard(This,pbstr) \ - ( (This)->lpVtbl -> put_IMEKeyboard(This,pbstr) ) - -#define IIMEKeyboardSwitcher_get_IMEKeyboardsCount(This,pdCount) \ - ( (This)->lpVtbl -> get_IMEKeyboardsCount(This,pdCount) ) - -#define IIMEKeyboardSwitcher_GetKeyboardName(This,index,pbstr) \ - ( (This)->lpVtbl -> GetKeyboardName(This,index,pbstr) ) - -#define IIMEKeyboardSwitcher_Close(This) \ - ( (This)->lpVtbl -> Close(This) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __IIMEKeyboardSwitcher_INTERFACE_DEFINED__ */ - - #ifndef __IPictureFactory_INTERFACE_DEFINED__ #define __IPictureFactory_INTERFACE_DEFINED__ diff --git a/Lib/linux/Common/ViewsTlb.idl b/Lib/linux/Common/ViewsTlb.idl index 033f3577aa..a7ee1d2b14 100644 --- a/Lib/linux/Common/ViewsTlb.idl +++ b/Lib/linux/Common/ViewsTlb.idl @@ -5777,30 +5777,6 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IVwLayoutManager") [out, retval] int * pdxpHeight); }; - - - - -cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IIMEKeyboardSwitcher") cpp_quote(",") cpp_quote("4D2BC310-DADF-11DE-9E3A-0019DBF4566E") cpp_quote(");") [ uuid("4D2BC310-DADF-11DE-9E3A-0019DBF4566E"), object, pointer_default(unique) ] interface IIMEKeyboardSwitcher : IUnknown -{ - - [propget] HRESULT IMEKeyboard( - [out, retval] BSTR * pbstr); - - - [propput] HRESULT IMEKeyboard( - [in] BSTR pbstr); - - [propget] HRESULT IMEKeyboardsCount( - [out, retval] int * pdCount); - - HRESULT GetKeyboardName( - [in] int index, - [out, retval] BSTR * pbstr); - - HRESULT Close(); -} - @@ -5818,7 +5794,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IIMEKeyboardSwitche { interface IPictureFactory; }; -#line 5689 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 5665 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -6052,7 +6028,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IIMEKeyboardSwitche { interface IVwWindow; }; - #line 5923 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5899 "d:\\fwrepo\\fw\\src\\views\\Views.idh" typedef [v1_enum] enum VwMouseEvent diff --git a/Lib/linux/Common/ViewsTlb.tlb b/Lib/linux/Common/ViewsTlb.tlb index e35d76bef358172678abd30b4c1f3c8406e4cb1d..22083d48565b16fa3229df3753f1ba992a77db8a 100644 GIT binary patch delta 2590 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 diff --git a/Lib/linux/Common/idhfiles.MD5 b/Lib/linux/Common/idhfiles.MD5 index 2f8f3c9d44..51eccb70aa 100644 --- a/Lib/linux/Common/idhfiles.MD5 +++ b/Lib/linux/Common/idhfiles.MD5 @@ -1 +1 @@ -cf15076a09553aa7fb566683246f112a \ No newline at end of file +575c321c23f54e1da6add1766c445c56 \ No newline at end of file diff --git a/Src/Common/KeyboardSwitcher/KeyboardSwitcher.cs b/Src/Common/KeyboardSwitcher/KeyboardSwitcher.cs index df9db2ecd6..ca327f7ce0 100644 --- a/Src/Common/KeyboardSwitcher/KeyboardSwitcher.cs +++ b/Src/Common/KeyboardSwitcher/KeyboardSwitcher.cs @@ -13,7 +13,7 @@ namespace SIL.FieldWorks.Views /// This class allows COM clients to switch IME keyboards /// [Guid("4ED1E8bC-DAdE-11DE-B350-0019DBf4566E")] - public class KeyboardSwitcher : IIMEKeyboardSwitcher, IDisposable + public class KeyboardSwitcher : IDisposable { private IBusConnection Connection = IBusConnectionFactory.Create(); diff --git a/Src/Language/LgKeymanHandler.cpp b/Src/Language/LgKeymanHandler.cpp index 19a33f1e4d..d4327e962f 100644 --- a/Src/Language/LgKeymanHandler.cpp +++ b/Src/Language/LgKeymanHandler.cpp @@ -10,6 +10,7 @@ Last reviewed: Not yet. Description: A wrapper for the keyman program. -------------------------------------------------------------------------------*//*:End Ignore*/ +#if WIN32 //:>******************************************************************************************** //:> Include files @@ -98,7 +99,6 @@ bool KeymanOn() { // Finding a window called Keyman50 is the recommended technique for detecting Keyman 5 // AND ALSO Keyman 6. -#if WIN32 if (::FindWindowA(NULL, "Keyman50") != 0) return true; // Keyman 7 can typically be found by this code: @@ -111,9 +111,6 @@ bool KeymanOn() ::CloseHandle(hMutex); return true; } -#else // !WIN32 - // TODO-Linux: - need to intergate with Keyman -#endif // !WIN32 return false; // Keyman is not running. } @@ -125,11 +122,6 @@ LgKeymanHandler::LgKeymanHandler() { m_cref = 1; ModuleEntry::ModuleAddRef(); - -#if !WIN32 - // Create C# Keyboard Switcher which does most of the work on Linux. - m_qkbs.CreateInstance(CLSID_KeyboardSwitcher); -#endif } LgKeymanHandler::~LgKeymanHandler() @@ -244,8 +236,6 @@ STDMETHODIMP LgKeymanHandler::Init(ComBool fForce) // Get rid of any info from previous Init calls. s_vkiKeyboards.Clear(); - -#if WIN32 // Keyman must be running - but don't start it here to avoid possible conflicts if (!KeymanOn()) return S_OK; @@ -349,21 +339,6 @@ STDMETHODIMP LgKeymanHandler::Init(ComBool fForce) } s_fKeymanInitialized = true; -#else // !WIN32 - // Use C# Keyboard Switcher to build up a list of avaliable keyboards. - int nKeyboards; - m_qkbs->get_IMEKeyboardsCount(&nKeyboards); - for(int i = 0; i < nKeyboards; ++i) - { - SmartBstr bstrKeyboardName; - m_qkbs->GetKeyboardName(i, &bstrKeyboardName); - KbdInfo ki; - ki.m_stuName = bstrKeyboardName.Chars(); - ki.m_id = 0; // what todo about this? - s_vkiKeyboards.Push(ki); - } - s_fKeymanInitialized = true; -#endif // !WIN32 END_COM_METHOD(g_fact, IID_ILgKeymanHandler); } @@ -375,14 +350,6 @@ STDMETHODIMP LgKeymanHandler::Close() { BEGIN_COM_METHOD -#if !WIN32 - if (m_qkbs) - { - m_qkbs->Close(); - m_qkbs = NULL; - } -#endif - END_COM_METHOD(g_fact, IID_ILgKeymanHandler); } @@ -421,11 +388,8 @@ bool LgKeymanHandler::InitInternal() stuMsg.Load(kstidKeymanInitUnexpectedFailMsg); } s_fKeymanFailed = true; -#if WIN32 ::MessageBox(NULL, stuMsg.Chars(), stuCaption.Chars(), MB_OK | MB_ICONINFORMATION); -#else // !WIN32 - // TODO-Linux: port -#endif // !WIN32 + return s_fKeymanInitialized; } @@ -469,7 +433,7 @@ STDMETHODIMP LgKeymanHandler::get_ActiveKeyboardName(BSTR * pbstrName) ChkComOutPtr(pbstrName); if (!InitInternal()) return S_OK; -#if WIN32 + //int nActiveKeymanId = (*pGetActiveKeymanID)(); HMODULE hKeyman = GetModuleHandleA("keyman32.dll"); if(hKeyman == 0) @@ -505,13 +469,6 @@ STDMETHODIMP LgKeymanHandler::get_ActiveKeyboardName(BSTR * pbstrName) return S_OK; } } -#else - // Use C# Keyboard Switcher get the current active keyboard. - SmartBstr bstrKeyboardName; - m_qkbs->get_IMEKeyboard(&bstrKeyboardName); - *pbstrName = bstrKeyboardName.Detach(); - return S_OK; -#endif Assert(false); // Keyman gave us an ID, but it didn't match! return E_UNEXPECTED; END_COM_METHOD(g_fact, IID_ILgKeymanHandler); @@ -526,7 +483,7 @@ STDMETHODIMP LgKeymanHandler::put_ActiveKeyboardName(BSTR bstrName) ChkComBstrArgN(bstrName); if (!InitInternal() || !s_wm_kmselectlang) return S_OK; -#if WIN32 + if (BstrLen(bstrName) != 0) { for (int iki = 0; iki < s_vkiKeyboards.Size(); ++iki) @@ -566,10 +523,6 @@ STDMETHODIMP LgKeymanHandler::put_ActiveKeyboardName(BSTR bstrName) #endif ::PostMessage(::GetFocus(), s_wm_kmselectlang, knKeymanID, KEYMANID_NONKEYMAN); } -#else - // Use C# Keyboard Switcher set the current active keyboard. - m_qkbs->put_IMEKeyboard(bstrName); -#endif END_COM_METHOD(g_fact, IID_ILgKeymanHandler); } @@ -580,13 +533,11 @@ STDMETHODIMP LgKeymanHandler::get_KeymanWindowsMessage(int * pwm) { BEGIN_COM_METHOD ChkComOutPtr(pwm); -#if WIN32 + if (!s_wm_kmkbchange) s_wm_kmkbchange = ::RegisterWindowMessageW(L"WM_KMKBCHANGE"); *pwm = s_wm_kmkbchange; -#else - // TODO-Linux: port -#endif + END_COM_METHOD(g_fact, IID_ILgKeymanHandler); } @@ -595,3 +546,4 @@ STDMETHODIMP LgKeymanHandler::get_KeymanWindowsMessage(int * pwm) #include "Vector_i.cpp" template class Vector; template class Vector; // VecKbdInfo; +#endif \ No newline at end of file diff --git a/Src/Language/LgKeymanHandler.h b/Src/Language/LgKeymanHandler.h index 99ab2a508a..0a6658eefd 100644 --- a/Src/Language/LgKeymanHandler.h +++ b/Src/Language/LgKeymanHandler.h @@ -15,13 +15,7 @@ Last reviewed: Not yet. #ifndef LgKeymanHandler_INCLUDED #define LgKeymanHandler_INCLUDED - -#if !WIN32 -#include "ViewsTlb.h" -DEFINE_COM_PTR(IIMEKeyboardSwitcher); -class KeyboardSwitcher; -#define CLSID_KeyboardSwitcher __uuidof(KeyboardSwitcher) -#endif +#if WIN32 /*---------------------------------------------------------------------------------------------- Class: LgKeymanHandler @@ -74,9 +68,6 @@ class LgKeymanHandler : bool InitInternal(); void ThrowErrorWithInfo(HRESULT hrErr, int stidDescription); -#if !WIN32 - // C# COM object that switches keyboards. - IIMEKeyboardSwitcherPtr m_qkbs; -#endif }; +#endif // WIN32 #endif //LgKeymanHandler_INCLUDED diff --git a/Src/Language/Makefile b/Src/Language/Makefile index ae1b152e34..fd474bffd1 100644 --- a/Src/Language/Makefile +++ b/Src/Language/Makefile @@ -120,7 +120,6 @@ OBJ_LANG = \ $(INT_DIR)/LgInputMethodEditor.o \ $(INT_DIR)/LocaleIndex.o \ $(INT_DIR)/LgCodePageEnumerator.o \ - $(INT_DIR)/LgKeymanHandler.o \ $(INT_DIR)/FwXml.o \ $(INT_DIR)/WriteXml.o \ $(INT_DIR)/FwStyledText.o \ diff --git a/Src/views/Views.idh b/Src/views/Views.idh index b6fb878efd..427897f936 100644 --- a/Src/views/Views.idh +++ b/Src/views/Views.idh @@ -5644,30 +5644,6 @@ DeclareInterface(VwLayoutManager, Unknown, 13F3A421-4915-455b-B57F-AFD4073CFFA0) [out, retval] int * pdxpHeight); }; -/******************************************************************************************* - Interface IIMEKeyboardSwitcher - This interface is designed to allow changing the current IME keyboard in Linux from C++ code. -*******************************************************************************************/ -DeclareInterface(IMEKeyboardSwitcher, Unknown, 4D2BC310-DADF-11DE-9E3A-0019DBF4566E) -{ - // Gets the name of the IMEKeyboard for the focued input context - [propget] HRESULT IMEKeyboard( - [out, retval] BSTR * pbstr); - - // Sets IMEKeyboard for the focused input context - [propput] HRESULT IMEKeyboard( - [in] BSTR pbstr); - - [propget] HRESULT IMEKeyboardsCount( - [out, retval] int * pdCount); - - HRESULT GetKeyboardName( - [in] int index, - [out, retval] BSTR * pbstr); - - HRESULT Close(); -} - /******************************************************************************************* Interface IPictureFactory Allows creating a IPicture. diff --git a/Src/views/Views_GUIDs.cpp b/Src/views/Views_GUIDs.cpp index 1bf5567e49..627e8c28b0 100644 --- a/Src/views/Views_GUIDs.cpp +++ b/Src/views/Views_GUIDs.cpp @@ -42,7 +42,6 @@ DEFINE_UUIDOF(IVwDrawRootBuffered, 0xD9E9D65F, 0xE81F, 0x439e, 0x80, 0x10, 0x5B, DEFINE_UUIDOF(VwDrawRootBuffered, 0x97199458, 0x10C7, 0x49da, 0xB3, 0xAE, 0xEA, 0x92, 0x2E, 0xA6, 0x48, 0x59); DEFINE_UUIDOF(VwSynchronizer, 0x5E149A49, 0xCAEE, 0x4823, 0x97, 0xF7, 0xBB, 0x9D, 0xED, 0x2A, 0x62, 0xBC); DEFINE_UUIDOF(VwLayoutStream, 0x1CD09E06, 0x6978, 0x4969, 0xA1, 0xFC, 0x46, 0x27, 0x23, 0x58, 0x7C, 0x32); -DEFINE_UUIDOF(IIMEKeyboardSwitcher, 0x4D2BC310, 0xDADF, 0x11DE, 0x9E, 0x3A, 0x00, 0x19, 0xDB, 0xF4, 0x56, 0x6E); DEFINE_UUIDOF(IPictureFactory, 0x110B7E88, 0x2968, 0x11E0, 0xB4, 0x93, 0x00, 0x19, 0xDB, 0xF4, 0x56, 0x6E); DEFINE_UUIDOF(PictureFactory, 0x17A2E876, 0x2968, 0x11E0, 0x80, 0x46, 0x00, 0x19, 0xDB, 0xF4, 0x56, 0x6E); DEFINE_UUIDOF(IVwWindow, 0x8856396c, 0x63a9, 0x4bc7, 0xad, 0x47, 0x87, 0xec, 0x8b, 0x6e, 0xf5, 0xa4); From bd9a855e3da620fed0ed79e974629ae112af9934 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 5 Jun 2013 12:23:23 +0200 Subject: [PATCH 06/15] Fix clean target of C++ projects When migrating to git we deleted the delnode.exe tool which broke the clean target of the nmake files. Fortunately rmdir has learned to recursively delete directories so that we don't need a special tool anymore. Change-Id: Ie7e50a8a42b4fdec559b21c8dc3ea5f52f987822 --- Bld/_init.mak | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Bld/_init.mak b/Bld/_init.mak index cc9f6bb371..abdcb09c59 100644 --- a/Bld/_init.mak +++ b/Bld/_init.mak @@ -120,7 +120,7 @@ COPYFILE=copy DELETEFILE=del TYPEFILE=type MD=$(BUILD_ROOT)\bin\mkdir.exe -p -DELNODE=$(BUILD_ROOT)\bin\delnode.exe +DELNODE=rmdir /s /q FIXCOMHEADER=$(BUILD_ROOT)\bin\FixGenComHeaderFile.exe # next 4 are for .NET From 2901a760624e75c43b21e79ddc8c7663f544c624 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 26 Jun 2013 11:06:22 +0200 Subject: [PATCH 07/15] Fix resource leak MSDN documentation says that we should call ImmReleaseContext when we're done with the context. Change-Id: I0a5065fe546814945d0acd1dfe1d67d3e0f2ccd4 --- Lib/src/SilUtils/Win32Wrappers.cs | 13 +++++++++++++ Src/Common/SimpleRootSite/SimpleRootSite.cs | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/Lib/src/SilUtils/Win32Wrappers.cs b/Lib/src/SilUtils/Win32Wrappers.cs index 3ecc4575e7..7f521eaf5d 100644 --- a/Lib/src/SilUtils/Win32Wrappers.cs +++ b/Lib/src/SilUtils/Win32Wrappers.cs @@ -3438,6 +3438,19 @@ public enum NotificationMessages [DllImport("imm32.dll", CharSet=CharSet.Auto)] public static extern IntPtr ImmGetContext(HandleRef hWnd); + /// ------------------------------------------------------------------------------------ + /// + /// Releases the input context and unlocks the memory associated in the input context. + /// An application must call this function for each call to the ImmGetContext function. + /// + /// Handle to the window for which the input context was previously + /// retrieved. + /// Handle to the input context. + /// Returns true if successful, otherwise false. + /// ------------------------------------------------------------------------------------ + [DllImport("imm32.dll", CharSet = CharSet.Auto)] + public static extern bool ImmReleaseContext(HandleRef hWnd, HandleRef hIMC); + /// ------------------------------------------------------------------------------------ /// /// Retrieves the current conversion status. diff --git a/Src/Common/SimpleRootSite/SimpleRootSite.cs b/Src/Common/SimpleRootSite/SimpleRootSite.cs index 39c29d967a..0f7fc825c8 100644 --- a/Src/Common/SimpleRootSite/SimpleRootSite.cs +++ b/Src/Common/SimpleRootSite/SimpleRootSite.cs @@ -3666,6 +3666,8 @@ private void UpdateCurrentKeyboardStatus() out conversionMode, out sentenceMode); int lcid = LcidHelper.LangIdFromLCID(InputLanguage.CurrentInputLanguage.Culture.LCID); s_KeyboardModes[lcid] = new LcidKeyboardMode(conversionMode, sentenceMode); + Win32.ImmReleaseContext(new HandleRef(this, Handle), + new HandleRef(this, context)); } #else // TODO-Linux: May have to do something with keyboard here @@ -3692,6 +3694,8 @@ private void RestoreKeyboardStatus(int lcid) { Win32.ImmSetConversionStatus(new HandleRef(this, context), keyboardMode.ConversionMode, keyboardMode.SentenceMode); + Win32.ImmReleaseContext(new HandleRef(this, Handle), + new HandleRef(this, context)); } } #else From 2db57a5bf32eea7447bf6647726896ae690d35a2 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 9 Jul 2013 19:18:27 +0200 Subject: [PATCH 08/15] Fix clean target of C++ views project Also remove obsolete build batch files and remove obsolete NAnt call from remaining build batch files. Change-Id: Iaecdc0e273409fb6d556e57d256db196c595e26e --- Bin/mkComFWDlgs-tst.bat | 3 --- Bin/mkComFWDlgs.bat | 3 --- Bin/mkGenLib-tst.bat | 3 --- Bin/mkall.bat | 58 ----------------------------------------- Bin/mkallbld.bat | 4 --- Bin/mkfwk-tst.bat | 3 --- Bin/mkfwk.bat | 3 --- Bin/mkgrc.bat | 3 --- Bin/mkgre.bat | 3 --- Bin/mkhv.bat | 3 --- Bin/mkhw.bat | 3 --- Bin/mkhwt.bat | 3 --- Bin/mkhwv.bat | 3 --- Bin/mkhwx.bat | 3 --- Bin/mklg-tst.bat | 3 --- Bin/mklg.bat | 3 --- Bin/mksql-tst.bat | 20 -------------- Bin/mksql.bat | 12 --------- Bin/mktlbs.bat | 3 --- Bin/mktv.bat | 3 --- Bin/mkvw-tst.bat | 3 --- Bin/mkvw.bat | 3 --- Bin/mkwfiutil.bat | 13 --------- Src/views/views.vcxproj | 6 ++--- 24 files changed, 3 insertions(+), 164 deletions(-) delete mode 100755 Bin/mkall.bat delete mode 100755 Bin/mkallbld.bat delete mode 100755 Bin/mksql-tst.bat delete mode 100755 Bin/mksql.bat delete mode 100755 Bin/mkwfiutil.bat diff --git a/Bin/mkComFWDlgs-tst.bat b/Bin/mkComFWDlgs-tst.bat index 5f26ab7573..c200de1f76 100755 --- a/Bin/mkComFWDlgs-tst.bat +++ b/Bin/mkComFWDlgs-tst.bat @@ -8,9 +8,6 @@ if "%BUILD_ONLY_NOTEST%"=="DONTRUN" shift set BUILD_MAKEFILE=%BUILD_ROOT%\src\CommonCOMDlgs\Test\testCmnFWDlgs.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkComFWDlgs.bat b/Bin/mkComFWDlgs.bat index 10d89791dc..57b22bcf0c 100755 --- a/Bin/mkComFWDlgs.bat +++ b/Bin/mkComFWDlgs.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\Src\CommonCOMDlgs\CmnFwDlgs.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkGenLib-tst.bat b/Bin/mkGenLib-tst.bat index 466afae44e..b0e73d2658 100755 --- a/Bin/mkGenLib-tst.bat +++ b/Bin/mkGenLib-tst.bat @@ -8,9 +8,6 @@ if "%BUILD_ONLY_NOTEST%"=="DONTRUN" shift set BUILD_MAKEFILE=%BUILD_ROOT%\src\Generic\Test\testGenericLib.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkall.bat b/Bin/mkall.bat deleted file mode 100755 index 7ac0d9cc2a..0000000000 --- a/Bin/mkall.bat +++ /dev/null @@ -1,58 +0,0 @@ -@if "%_echo%"=="" echo off - -time /T - -if not "%OS%"=="" setlocal - -rem ***** Set FWROOT and BUILD_ROOT to the root of the FieldWorks project. ***** -call %0\..\_EnsureRoot.bat - -goto CHECK_OPTIONS - -:SET_OPTION -set %OPTION%=%OPTION_VALUE% -shift - -:CHECK_OPTIONS - -set OPTION=BUILD_TYPE -set OPTION_VALUE=%1 -if "%1"=="d" goto SET_OPTION -if "%1"=="r" goto SET_OPTION -if "%1"=="p" goto SET_OPTION -if "%1"=="b" goto SET_OPTION - -set OPTION=BUILD_ACTION -set OPTION_VALUE=%1 -if "%1"=="e" goto SET_OPTION -if "%1"=="c" goto SET_OPTION -if "%1"=="i" goto SET_OPTION -if "%1"=="cc" goto SET_OPTION -if "%1"=="ec" goto SET_OPTION - -set OPTION=BUILD_EXTRA -set OPTION_VALUE=%1 -if "%1"=="register" goto SET_OPTION -if "%1"=="unregister" goto SET_OPTION - -rem === Set up === -if "%BUILD_TYPE%"=="" set BUILD_TYPE=d -if "%BUILD_ACTION%"=="" set BUILD_ACTION=i - -if "%BUILD_TYPE%"=="b" set BUILD_CONFIG=bounds -if "%BUILD_TYPE%"=="d" set BUILD_CONFIG=debug -if "%BUILD_TYPE%"=="r" set BUILD_CONFIG=release -if "%BUILD_TYPE%"=="p" set BUILD_CONFIG=profile - -set ACTION=buildtest -if "%BUILD_ACTION%"=="c" set ACTION=buildtest cc -if "%BUILD_ACTION%"=="cc" set ACTION=buildtest cc -if "%BUILD_ACTION%"=="e" set ACTION=clean -if "%BUILD_ACTION%"=="ec" set ACTION=clean - -if "%BUILD_EXTRA%"=="register" set ACTION=%ACTION% register -if "%BUILD_EXTRA%"=="unregister" set ACTION=%ACTION% unregister - -cd %FWROOT%\Bld - -%FWROOT%\bin\nant\bin\nant %BUILD_CONFIG% %ACTION% mkall diff --git a/Bin/mkallbld.bat b/Bin/mkallbld.bat deleted file mode 100755 index de99e36f2d..0000000000 --- a/Bin/mkallbld.bat +++ /dev/null @@ -1,4 +0,0 @@ -rem This returns the environment error flag as an errorlevel for java script calls -rem We can't do this in mkall.bat because it exits rebuildall.bat -call c:\fwsrc\bin\mkall.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 -exit %FW_BUILD_ERROR% diff --git a/Bin/mkfwk-tst.bat b/Bin/mkfwk-tst.bat index d2f1a5a18d..ed194b0ce6 100755 --- a/Bin/mkfwk-tst.bat +++ b/Bin/mkfwk-tst.bat @@ -8,9 +8,6 @@ if "%BUILD_ONLY_NOTEST%"=="DONTRUN" shift set BUILD_MAKEFILE=%BUILD_ROOT%\src\Kernel\Test\testFwKernel.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkfwk.bat b/Bin/mkfwk.bat index 826dcb4b68..bf53931f37 100755 --- a/Bin/mkfwk.bat +++ b/Bin/mkfwk.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\src\Kernel\FwKernel.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkgrc.bat b/Bin/mkgrc.bat index f4f2323da3..5569c8dc59 100755 --- a/Bin/mkgrc.bat +++ b/Bin/mkgrc.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\src\Graphite\GrCompiler\GrCompiler.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkgre.bat b/Bin/mkgre.bat index 7efcf2674a..3aec4ce0e2 100755 --- a/Bin/mkgre.bat +++ b/Bin/mkgre.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\src\Graphite\GrEngine\GrEngine.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkhv.bat b/Bin/mkhv.bat index 717875d4da..dcf7686c0d 100755 --- a/Bin/mkhv.bat +++ b/Bin/mkhv.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\Samples\HelloWorld\HelloView\HelloView.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkhw.bat b/Bin/mkhw.bat index 1135de1b94..60cbfef063 100755 --- a/Bin/mkhw.bat +++ b/Bin/mkhw.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\Samples\HelloWorld\Simple\HelloWorld.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkhwt.bat b/Bin/mkhwt.bat index b4fa6fc0b6..571341b5ec 100755 --- a/Bin/mkhwt.bat +++ b/Bin/mkhwt.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\Samples\HelloWorld\Toolbar\HelloWorld.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkhwv.bat b/Bin/mkhwv.bat index 56ddda6847..65aaeaaa2d 100755 --- a/Bin/mkhwv.bat +++ b/Bin/mkhwv.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\Samples\HelloWorld\Viewbar\HelloWorld.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkhwx.bat b/Bin/mkhwx.bat index de47208518..62552edef0 100755 --- a/Bin/mkhwx.bat +++ b/Bin/mkhwx.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\Samples\HelloWorld\ActiveX\HelloWorld.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mklg-tst.bat b/Bin/mklg-tst.bat index 6df51ed3ca..864d7b4cd8 100755 --- a/Bin/mklg-tst.bat +++ b/Bin/mklg-tst.bat @@ -8,9 +8,6 @@ if "%BUILD_ONLY_NOTEST%"=="DONTRUN" shift set BUILD_MAKEFILE=%BUILD_ROOT%\src\Language\Test\testLanguage.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mklg.bat b/Bin/mklg.bat index a96bbc1f65..da2b24375f 100755 --- a/Bin/mklg.bat +++ b/Bin/mklg.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\Src\Language\Language.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mksql-tst.bat b/Bin/mksql-tst.bat deleted file mode 100755 index 04a9491df9..0000000000 --- a/Bin/mksql-tst.bat +++ /dev/null @@ -1,20 +0,0 @@ -@if "%_echo%"=="" echo off - -time /T - -rem ***** Set BUILD_ROOT to the root of the FieldWorks project. ***** -call %0\..\_EnsureRoot.bat - -echo ===================================================================== -echo Running %BUILD_ROOT%\Test\Python23\python fw_sqlunit.py ... -echo ===================================================================== -pushd %BUILD_ROOT%\Test\tsqlunit -%BUILD_ROOT%\Test\Python23\python fw_sqlunit.py - -set save_errorlevel=%errorlevel% -rem python sets the errorlevel environment variable -popd - -time /T - -exit /b %save_errorlevel% diff --git a/Bin/mksql.bat b/Bin/mksql.bat deleted file mode 100755 index 473111bb7b..0000000000 --- a/Bin/mksql.bat +++ /dev/null @@ -1,12 +0,0 @@ -@if "%_echo%"=="" echo off -if "%FW_BUILD_CORE_ERROR%"=="1" goto done - -rem ***** Set BUILD_ROOT to the root of the FieldWorks project. ***** -call %0\..\_EnsureRoot.bat - -set BUILD_MAKEFILE=%BUILD_ROOT%\Src\Sql.mak - -call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 - -set BUILD_MAKEFILE= -:done diff --git a/Bin/mktlbs.bat b/Bin/mktlbs.bat index 66368afacf..47915a1332 100755 --- a/Bin/mktlbs.bat +++ b/Bin/mktlbs.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\Src\Language\Language.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat dirs %BUILD_OUTPUT%\Common\LanguageTlb.tlb set BUILD_MAKEFILE=%BUILD_ROOT%\Src\Kernel\FwKernel.mak diff --git a/Bin/mktv.bat b/Bin/mktv.bat index 4c96fc49f5..a44dcfb4e8 100755 --- a/Bin/mktv.bat +++ b/Bin/mktv.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\test\testviewer\testviewer.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkvw-tst.bat b/Bin/mkvw-tst.bat index c60a81ea79..d544dc0999 100755 --- a/Bin/mkvw-tst.bat +++ b/Bin/mkvw-tst.bat @@ -8,9 +8,6 @@ if "%BUILD_ONLY_NOTEST%"=="DONTRUN" shift set BUILD_MAKEFILE=%BUILD_ROOT%\src\Views\Test\testViews.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkvw.bat b/Bin/mkvw.bat index d1617e5179..22cf235a50 100755 --- a/Bin/mkvw.bat +++ b/Bin/mkvw.bat @@ -5,9 +5,6 @@ call %0\..\_EnsureRoot.bat set BUILD_MAKEFILE=%BUILD_ROOT%\Src\Views\Views.mak -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 set BUILD_MAKEFILE= diff --git a/Bin/mkwfiutil.bat b/Bin/mkwfiutil.bat deleted file mode 100755 index 41e854bd05..0000000000 --- a/Bin/mkwfiutil.bat +++ /dev/null @@ -1,13 +0,0 @@ -@if "%_echo%"=="" echo off - -rem ***** Set BUILD_ROOT to the root of the FieldWorks project. ***** -call %0\..\_EnsureRoot.bat - -set BUILD_MAKEFILE=%BUILD_ROOT%\src\WW-WFIUtil\WFIUtil.mak - -rem ***** Create the version include file ***** -%BUILD_ROOT%\bin\nant\bin\nant.exe -buildfile:"%BUILD_ROOT%\bld\Version.build.xml" -D:BUILD_ROOT="%BUILD_ROOT%" -D:BUILD_LEVEL=%BUILD_LEVEL% - -call %BUILD_ROOT%\bld\_mkcore.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 - -set BUILD_MAKEFILE= diff --git a/Src/views/views.vcxproj b/Src/views/views.vcxproj index e5b5691681..2c669ca996 100644 --- a/Src/views/views.vcxproj +++ b/Src/views/views.vcxproj @@ -82,8 +82,8 @@ .\Debug\ ..\..\Bin\mkvw.bat d ..\..\Bin\mkvw.bat d cc - - ..\..\output\debug\views.dll + ..\..\Bin\mkvw.bat d e + ..\..\Output\Debug\views.dll $(NMakePreprocessorDefinitions) ..\..\Output\Common\Raw;..\..\Output\Common;..\Kernel;..\Generic;.;$(NMakeIncludeSearchPath) $(NMakeForcedIncludes) @@ -175,4 +175,4 @@ - + \ No newline at end of file From e0136141572793f470d78fcc171e249e32e49c1f Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Thu, 11 Jul 2013 22:28:14 +0200 Subject: [PATCH 09/15] Use .NET InputLanguage for switching keyboards on Windows - remove obsolete code - integrate LcidKeyboardStatus in keyboarding library (FWNX-1124) This change is part of FWNX-1150. Change-Id: I35ff94d4d864f13cd31f74b814c5055a1f45d8ef --- Lib/linux/Common/FwKernelTlb.h | 979 +----------------- Lib/linux/Common/FwKernelTlb.idl | 320 +----- Lib/linux/Common/FwKernelTlb.tlb | Bin 98864 -> 94624 bytes Lib/linux/Common/LanguageTlb.h | 979 +----------------- Lib/linux/Common/LanguageTlb.idl | 320 +----- Lib/linux/Common/LanguageTlb.tlb | Bin 98872 -> 94632 bytes Lib/linux/Common/ViewsTlb.h | 24 +- Lib/linux/Common/ViewsTlb.idl | 44 +- Lib/linux/Common/ViewsTlb.tlb | Bin 84192 -> 83900 bytes Lib/linux/Common/idhfiles.MD5 | 2 +- Lib/src/SilUtils/Win32Wrappers.cs | 47 + Src/Common/COMInterfaces/IcuWrappers.cs | 46 + Src/Common/CoreImpl/PalasoWritingSystem.cs | 8 +- Src/Common/Framework/Framework.csproj | 8 +- Src/Common/Framework/FwMainWnd.cs | 9 +- .../Interfaces/IKeyboardCallback.cs | 2 +- .../Interfaces/IKeyboardDescription.cs | 12 +- .../Interfaces/IKeyboardErrorDescription.cs | 2 +- .../Interfaces/IKeyboardEventHandler.cs | 20 +- .../Interfaces/IKeyboardMethods.cs | 17 +- .../IKeyboardAdaptor.cs | 10 +- .../IKeyboardController.cs | 61 +- Src/Common/Keyboarding/KeyboardController.cs | 183 ++-- Src/Common/Keyboarding/KeyboardDescription.cs | 44 +- .../Keyboarding/KeyboardDescriptionNull.cs | 11 +- .../Keyboarding/KeyboardDescriptionWrapper.cs | 20 +- .../Keyboarding/KeyboardErrorDescription.cs | 1 + Src/Common/Keyboarding/Keyboarding.csproj | 12 +- .../FakeKeyboardController.cs | 53 +- .../KeyboardingTests/KeyboardingTests.csproj | 5 + .../XkbKeyboardAdapterTests.cs | 31 +- .../Keyboarding/Linux/IbusKeyboardAdaptor.cs | 14 +- .../Keyboarding/Linux/LinuxKeyboardHelper.cs | 60 +- .../Keyboarding/Linux/XkbKeyboardAdaptor.cs | 45 +- .../Linux/XkbKeyboardDescription.cs | 7 +- .../Keyboarding/Linux/XklConfigRegistry.cs | 129 ++- .../Keyboarding/Types/KeyboardCollection.cs | 44 + .../Windows/KeymanKeyboardAdapter.cs | 119 --- .../Keyboarding/Windows/WinKeyboardAdaptor.cs | 314 +++++- .../Windows/WinKeyboardDescription.cs | 56 + .../Windows/WindowsKeyboardHelper.cs | 120 --- Src/Common/SimpleRootSite/EditingHelper.cs | 112 +- Src/Common/SimpleRootSite/SimpleRootSite.cs | 300 +----- Src/Common/SimpleRootSite/ViewInputManager.cs | 39 +- .../KeyboardControlTests.cs | 39 +- .../FwCoreDlgControls/KeyboardControl.cs | 58 +- Src/FwCoreDlgs/ValidCharactersDlg.cs | 6 +- Src/Kernel/FwKernel_GUIDs.cpp | 12 - Src/Language/Language.idh | 318 ------ Src/Language/Language.mak | 68 -- Src/Language/Language.vcxproj | 15 +- Src/Language/LanguageGlobals.cpp | 36 - Src/Language/LanguageGlobals.h | 45 - Src/Language/Language_GUIDs.cpp | 12 - Src/Language/LgCPWordTokenizer.cpp | 280 ----- Src/Language/LgCPWordTokenizer.h | 80 -- Src/Language/LgCodePageEnumerator.cpp | 287 ----- Src/Language/LgCodePageEnumerator.h | 113 -- Src/Language/LgFontManager.cpp | 320 ------ Src/Language/LgFontManager.h | 98 -- Src/Language/LgInputMethodEditor.cpp | 463 --------- Src/Language/LgInputMethodEditor.h | 84 -- Src/Language/LgKeymanHandler.cpp | 549 ---------- Src/Language/LgKeymanHandler.h | 73 -- Src/Language/LgTextServices.cpp | 457 -------- Src/Language/LgTextServices.h | 72 -- Src/Language/Main.h | 8 - Src/Language/Makefile | 66 -- Src/Language/Test/Makefile | 4 - Src/Language/Test/TestLanguage.vcxproj | 2 +- .../Test/TestLanguage.vcxproj.filters | 4 +- Src/Language/Test/TestLgFontManager.h | 77 -- Src/Language/Test/testLanguage.mak | 5 - Src/TeDll/TeMainWnd.cs | 2 +- Src/views/Views.idh | 14 +- Src/views/Views_GUIDs.cpp | 2 +- Src/views/VwRootBox.cpp | 122 --- Src/views/VwRootBox.h | 3 - 78 files changed, 1060 insertions(+), 7363 deletions(-) rename Src/Common/Keyboarding/{Interfaces => InternalInterfaces}/IKeyboardAdaptor.cs (79%) rename Src/Common/Keyboarding/{Interfaces => InternalInterfaces}/IKeyboardController.cs (52%) create mode 100644 Src/Common/Keyboarding/Types/KeyboardCollection.cs delete mode 100644 Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs create mode 100644 Src/Common/Keyboarding/Windows/WinKeyboardDescription.cs delete mode 100644 Src/Common/Keyboarding/Windows/WindowsKeyboardHelper.cs delete mode 100644 Src/Language/LanguageGlobals.cpp delete mode 100644 Src/Language/LanguageGlobals.h delete mode 100644 Src/Language/LgCPWordTokenizer.cpp delete mode 100644 Src/Language/LgCPWordTokenizer.h delete mode 100644 Src/Language/LgCodePageEnumerator.cpp delete mode 100644 Src/Language/LgCodePageEnumerator.h delete mode 100644 Src/Language/LgFontManager.cpp delete mode 100644 Src/Language/LgFontManager.h delete mode 100644 Src/Language/LgInputMethodEditor.cpp delete mode 100644 Src/Language/LgInputMethodEditor.h delete mode 100644 Src/Language/LgKeymanHandler.cpp delete mode 100644 Src/Language/LgKeymanHandler.h delete mode 100644 Src/Language/LgTextServices.cpp delete mode 100644 Src/Language/LgTextServices.h delete mode 100644 Src/Language/Test/TestLgFontManager.h diff --git a/Lib/linux/Common/FwKernelTlb.h b/Lib/linux/Common/FwKernelTlb.h index 777d2277e5..d831e54258 100644 --- a/Lib/linux/Common/FwKernelTlb.h +++ b/Lib/linux/Common/FwKernelTlb.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Wed May 29 18:54:40 2013 +/* at Wed Jun 05 12:23:50 2013 */ /* Compiler settings for d:\fwrepo\fw\Output\Common\FwKernelTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 @@ -233,12 +233,6 @@ typedef struct TsMultiString TsMultiString; #endif /* __TsMultiString_FWD_DEFINED__ */ -#ifndef __ILgInputMethodEditor_FWD_DEFINED__ -#define __ILgInputMethodEditor_FWD_DEFINED__ -typedef interface ILgInputMethodEditor ILgInputMethodEditor; -#endif /* __ILgInputMethodEditor_FWD_DEFINED__ */ - - #ifndef __IVwGraphics_FWD_DEFINED__ #define __IVwGraphics_FWD_DEFINED__ typedef interface IVwGraphics IVwGraphics; @@ -413,42 +407,6 @@ typedef interface ILgWritingSystem ILgWritingSystem; #endif /* __ILgWritingSystem_FWD_DEFINED__ */ -#ifndef __ILgTextServices_FWD_DEFINED__ -#define __ILgTextServices_FWD_DEFINED__ -typedef interface ILgTextServices ILgTextServices; -#endif /* __ILgTextServices_FWD_DEFINED__ */ - - -#ifndef __ILgFontManager_FWD_DEFINED__ -#define __ILgFontManager_FWD_DEFINED__ -typedef interface ILgFontManager ILgFontManager; -#endif /* __ILgFontManager_FWD_DEFINED__ */ - - -#ifndef __LgInputMethodEditor_FWD_DEFINED__ -#define __LgInputMethodEditor_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgInputMethodEditor LgInputMethodEditor; -#else -typedef struct LgInputMethodEditor LgInputMethodEditor; -#endif /* __cplusplus */ - -#endif /* __LgInputMethodEditor_FWD_DEFINED__ */ - - -#ifndef __LgFontManager_FWD_DEFINED__ -#define __LgFontManager_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgFontManager LgFontManager; -#else -typedef struct LgFontManager LgFontManager; -#endif /* __cplusplus */ - -#endif /* __LgFontManager_FWD_DEFINED__ */ - - #ifndef __ILgIcuCharPropEngine_FWD_DEFINED__ #define __ILgIcuCharPropEngine_FWD_DEFINED__ typedef interface ILgIcuCharPropEngine ILgIcuCharPropEngine; @@ -461,24 +419,6 @@ typedef interface ILgNumericEngine ILgNumericEngine; #endif /* __ILgNumericEngine_FWD_DEFINED__ */ -#ifndef __ILgKeymanHandler_FWD_DEFINED__ -#define __ILgKeymanHandler_FWD_DEFINED__ -typedef interface ILgKeymanHandler ILgKeymanHandler; -#endif /* __ILgKeymanHandler_FWD_DEFINED__ */ - - -#ifndef __ILgCodePageEnumerator_FWD_DEFINED__ -#define __ILgCodePageEnumerator_FWD_DEFINED__ -typedef interface ILgCodePageEnumerator ILgCodePageEnumerator; -#endif /* __ILgCodePageEnumerator_FWD_DEFINED__ */ - - -#ifndef __ILgLanguageEnumerator_FWD_DEFINED__ -#define __ILgLanguageEnumerator_FWD_DEFINED__ -typedef interface ILgLanguageEnumerator ILgLanguageEnumerator; -#endif /* __ILgLanguageEnumerator_FWD_DEFINED__ */ - - #ifndef __ILgIcuConverterEnumerator_FWD_DEFINED__ #define __ILgIcuConverterEnumerator_FWD_DEFINED__ typedef interface ILgIcuConverterEnumerator ILgIcuConverterEnumerator; @@ -605,54 +545,6 @@ typedef struct LgNumericEngine LgNumericEngine; #endif /* __LgNumericEngine_FWD_DEFINED__ */ -#ifndef __LgKeymanHandler_FWD_DEFINED__ -#define __LgKeymanHandler_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgKeymanHandler LgKeymanHandler; -#else -typedef struct LgKeymanHandler LgKeymanHandler; -#endif /* __cplusplus */ - -#endif /* __LgKeymanHandler_FWD_DEFINED__ */ - - -#ifndef __LgTextServices_FWD_DEFINED__ -#define __LgTextServices_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgTextServices LgTextServices; -#else -typedef struct LgTextServices LgTextServices; -#endif /* __cplusplus */ - -#endif /* __LgTextServices_FWD_DEFINED__ */ - - -#ifndef __LgCodePageEnumerator_FWD_DEFINED__ -#define __LgCodePageEnumerator_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgCodePageEnumerator LgCodePageEnumerator; -#else -typedef struct LgCodePageEnumerator LgCodePageEnumerator; -#endif /* __cplusplus */ - -#endif /* __LgCodePageEnumerator_FWD_DEFINED__ */ - - -#ifndef __LgLanguageEnumerator_FWD_DEFINED__ -#define __LgLanguageEnumerator_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgLanguageEnumerator LgLanguageEnumerator; -#else -typedef struct LgLanguageEnumerator LgLanguageEnumerator; -#endif /* __cplusplus */ - -#endif /* __LgLanguageEnumerator_FWD_DEFINED__ */ - - #ifndef __LgIcuConverterEnumerator_FWD_DEFINED__ #define __LgIcuConverterEnumerator_FWD_DEFINED__ @@ -1372,7 +1264,6 @@ FwGraphiteProcess - typedef /* [v1_enum] */ enum LgGeneralCharCategory { kccLu = 0, @@ -1498,26 +1389,6 @@ ILgWritingSystem , 9F74A170-E8BB-466d-8848-5FDB28AC5AF8 ); -GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgInputMethodEditor -, -E1B27A5F-DD1B-4BBA-9B72-00BDE03162FC -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgFontManager -, -73718689-B701-4241-A408-4C389ECD6664 -); -ATTACH_GUID_TO_CLASS(class, -659C2C2F-7AF6-4F9E-AC6F-7A03C8418FC9 -, -LgInputMethodEditor -); -ATTACH_GUID_TO_CLASS(class, -02C3F580-796D-4B5F-BE43-166D97319DA5 -, -LgFontManager -); typedef /* [v1_enum] */ enum LgCollatingOptions { fcoDefault = 0, @@ -1616,26 +1487,6 @@ ILgWritingSystemFactory 22376578-BFEB-4c46-8D72-C9154890DD16 ); GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgKeymanHandler -, -3F42144B-509F-4def-8DD3-6D8D26677001 -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgTextServices -, -5B6303DE-E635-4DD7-A7FC-345BEEF352D8 -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgCodePageEnumerator -, -2CFCF4B7-2FFE-4CF8-91BE-FBB57CC7782A -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgLanguageEnumerator -, -746A16E1-0C36-4268-A261-E8012B0D67C5 -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( ILgIcuConverterEnumerator , 8E6D558E-8755-4EA1-9FF6-039D375312E9 @@ -1701,26 +1552,6 @@ FF22A7AB-223E-4D04-B648-0AE40588261D LgNumericEngine ); ATTACH_GUID_TO_CLASS(class, -69ACA99C-F852-4C2C-9B5F-FF83238A17A5 -, -LgKeymanHandler -); -ATTACH_GUID_TO_CLASS(class, -720485C5-E8D5-4761-92F0-F70D2B3CF980 -, -LgTextServices -); -ATTACH_GUID_TO_CLASS(class, -9045F113-8626-41C0-A61E-A73FBE5920D1 -, -LgCodePageEnumerator -); -ATTACH_GUID_TO_CLASS(class, -B887505B-74DE-4ADC-A1D9-5553428C8D02 -, -LgLanguageEnumerator -); -ATTACH_GUID_TO_CLASS(class, 9E729461-F80D-4796-BA17-086BC61907F1 , LgIcuConverterEnumerator @@ -5413,165 +5244,6 @@ class DECLSPEC_UUID("7A1B89C0-C2D6-11d3-9BB7-00400541F9E9") TsMultiString; #endif -#ifndef __ILgInputMethodEditor_INTERFACE_DEFINED__ -#define __ILgInputMethodEditor_INTERFACE_DEFINED__ - -/* interface ILgInputMethodEditor */ -/* [unique][object][uuid] */ - - -#define IID_ILgInputMethodEditor __uuidof(ILgInputMethodEditor) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("E1B27A5F-DD1B-4BBA-9B72-00BDE03162FC") - ILgInputMethodEditor : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Setup( void) = 0; - - virtual /* [restricted][local] */ HRESULT STDMETHODCALLTYPE Replace( - /* [in] */ BSTR bstrInput, - /* [in] */ ITsTextProps *pttpInput, - /* [in] */ ITsStrBldr *ptsbOld, - /* [in] */ int ichMin, - /* [in] */ int ichLim, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP) = 0; - - virtual HRESULT STDMETHODCALLTYPE Backspace( - /* [in] */ int pichStart, - /* [in] */ int cactBackspace, - /* [in] */ ITsStrBldr *ptsbOld, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP, - /* [out] */ int *pcactBsRemaining) = 0; - - virtual HRESULT STDMETHODCALLTYPE DeleteForward( - /* [in] */ int pichStart, - /* [in] */ int cactDelForward, - /* [in] */ ITsStrBldr *ptsbInOut, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP, - /* [out] */ int *pcactDfRemaining) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsValidInsertionPoint( - /* [in] */ int ich, - /* [in] */ ITsString *ptss, - /* [retval][out] */ BOOL *pfValid) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILgInputMethodEditorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgInputMethodEditor * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgInputMethodEditor * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgInputMethodEditor * This); - - HRESULT ( STDMETHODCALLTYPE *Setup )( - ILgInputMethodEditor * This); - - /* [restricted][local] */ HRESULT ( STDMETHODCALLTYPE *Replace )( - ILgInputMethodEditor * This, - /* [in] */ BSTR bstrInput, - /* [in] */ ITsTextProps *pttpInput, - /* [in] */ ITsStrBldr *ptsbOld, - /* [in] */ int ichMin, - /* [in] */ int ichLim, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP); - - HRESULT ( STDMETHODCALLTYPE *Backspace )( - ILgInputMethodEditor * This, - /* [in] */ int pichStart, - /* [in] */ int cactBackspace, - /* [in] */ ITsStrBldr *ptsbOld, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP, - /* [out] */ int *pcactBsRemaining); - - HRESULT ( STDMETHODCALLTYPE *DeleteForward )( - ILgInputMethodEditor * This, - /* [in] */ int pichStart, - /* [in] */ int cactDelForward, - /* [in] */ ITsStrBldr *ptsbInOut, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP, - /* [out] */ int *pcactDfRemaining); - - HRESULT ( STDMETHODCALLTYPE *IsValidInsertionPoint )( - ILgInputMethodEditor * This, - /* [in] */ int ich, - /* [in] */ ITsString *ptss, - /* [retval][out] */ BOOL *pfValid); - - END_INTERFACE - } ILgInputMethodEditorVtbl; - - interface ILgInputMethodEditor - { - CONST_VTBL struct ILgInputMethodEditorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgInputMethodEditor_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgInputMethodEditor_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgInputMethodEditor_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgInputMethodEditor_Setup(This) \ - ( (This)->lpVtbl -> Setup(This) ) - -#define ILgInputMethodEditor_Replace(This,bstrInput,pttpInput,ptsbOld,ichMin,ichLim,pichModMin,pichModLim,pichIP) \ - ( (This)->lpVtbl -> Replace(This,bstrInput,pttpInput,ptsbOld,ichMin,ichLim,pichModMin,pichModLim,pichIP) ) - -#define ILgInputMethodEditor_Backspace(This,pichStart,cactBackspace,ptsbOld,pichModMin,pichModLim,pichIP,pcactBsRemaining) \ - ( (This)->lpVtbl -> Backspace(This,pichStart,cactBackspace,ptsbOld,pichModMin,pichModLim,pichIP,pcactBsRemaining) ) - -#define ILgInputMethodEditor_DeleteForward(This,pichStart,cactDelForward,ptsbInOut,pichModMin,pichModLim,pichIP,pcactDfRemaining) \ - ( (This)->lpVtbl -> DeleteForward(This,pichStart,cactDelForward,ptsbInOut,pichModMin,pichModLim,pichIP,pcactDfRemaining) ) - -#define ILgInputMethodEditor_IsValidInsertionPoint(This,ich,ptss,pfValid) \ - ( (This)->lpVtbl -> IsValidInsertionPoint(This,ich,ptss,pfValid) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgInputMethodEditor_INTERFACE_DEFINED__ */ - - #ifndef __IVwGraphics_INTERFACE_DEFINED__ #define __IVwGraphics_INTERFACE_DEFINED__ @@ -10001,295 +9673,79 @@ FwGraphiteProcess; #endif /* __ILgWritingSystem_INTERFACE_DEFINED__ */ -#ifndef __ILgTextServices_INTERFACE_DEFINED__ -#define __ILgTextServices_INTERFACE_DEFINED__ +#ifndef __ILgIcuCharPropEngine_INTERFACE_DEFINED__ +#define __ILgIcuCharPropEngine_INTERFACE_DEFINED__ -/* interface ILgTextServices */ +/* interface ILgIcuCharPropEngine */ /* [unique][object][uuid] */ -#define IID_ILgTextServices __uuidof(ILgTextServices) +#define IID_ILgIcuCharPropEngine __uuidof(ILgIcuCharPropEngine) #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("5B6303DE-E635-4DD7-A7FC-345BEEF352D8") - ILgTextServices : public IUnknown + MIDL_INTERFACE("E8689492-7622-427b-8518-6339294FD227") + ILgIcuCharPropEngine : public ILgCharacterPropertyEngine { public: - virtual HRESULT STDMETHODCALLTYPE SetKeyboard( - /* [in] */ int nLcid, - /* [in] */ BSTR bstrKeymanKbd, - /* [out][in] */ int *pnActiveLangId, - /* [out][in] */ BSTR *pbstrActiveKeymanKbd, - /* [out][in] */ ComBool *pfSelectLangPending) = 0; + virtual HRESULT STDMETHODCALLTYPE Initialize( + /* [in] */ BSTR bstrLanguage, + /* [in] */ BSTR bstrScript, + /* [in] */ BSTR bstrCountry, + /* [in] */ BSTR bstrVariant) = 0; + + virtual HRESULT STDMETHODCALLTYPE InitCharOverrides( + /* [in] */ BSTR bstrWsCharsList) = 0; }; #else /* C style interface */ - typedef struct ILgTextServicesVtbl + typedef struct ILgIcuCharPropEngineVtbl { BEGIN_INTERFACE HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgTextServices * This, + ILgIcuCharPropEngine * This, /* [in] */ REFIID riid, /* [annotation][iid_is][out] */ __RPC__deref_out void **ppvObject); ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgTextServices * This); + ILgIcuCharPropEngine * This); ULONG ( STDMETHODCALLTYPE *Release )( - ILgTextServices * This); + ILgIcuCharPropEngine * This); - HRESULT ( STDMETHODCALLTYPE *SetKeyboard )( - ILgTextServices * This, - /* [in] */ int nLcid, - /* [in] */ BSTR bstrKeymanKbd, - /* [out][in] */ int *pnActiveLangId, - /* [out][in] */ BSTR *pbstrActiveKeymanKbd, - /* [out][in] */ ComBool *pfSelectLangPending); + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_GeneralCategory )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ LgGeneralCharCategory *pcc); - END_INTERFACE - } ILgTextServicesVtbl; - - interface ILgTextServices - { - CONST_VTBL struct ILgTextServicesVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgTextServices_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgTextServices_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgTextServices_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgTextServices_SetKeyboard(This,nLcid,bstrKeymanKbd,pnActiveLangId,pbstrActiveKeymanKbd,pfSelectLangPending) \ - ( (This)->lpVtbl -> SetKeyboard(This,nLcid,bstrKeymanKbd,pnActiveLangId,pbstrActiveKeymanKbd,pfSelectLangPending) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgTextServices_INTERFACE_DEFINED__ */ - - -#ifndef __ILgFontManager_INTERFACE_DEFINED__ -#define __ILgFontManager_INTERFACE_DEFINED__ - -/* interface ILgFontManager */ -/* [unique][object][uuid] */ - - -#define IID_ILgFontManager __uuidof(ILgFontManager) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("73718689-B701-4241-A408-4C389ECD6664") - ILgFontManager : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE IsFontAvailable( - /* [in] */ BSTR bstrName, - /* [retval][out] */ ComBool *pfAvail) = 0; + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BidiCategory )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ LgBidiCategory *pbic); - virtual HRESULT STDMETHODCALLTYPE IsFontAvailableRgch( - /* [in] */ int cch, - /* [in] */ OLECHAR *prgchName, - /* [retval][out] */ ComBool *pfAvail) = 0; + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsLetter )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ ComBool *pfRet); - virtual HRESULT STDMETHODCALLTYPE AvailableFonts( - /* [out] */ BSTR *pbstrNames) = 0; + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsWordForming )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ ComBool *pfRet); - virtual HRESULT STDMETHODCALLTYPE RefreshFontList( void) = 0; + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsPunctuation )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ ComBool *pfRet); - }; - -#else /* C style interface */ - - typedef struct ILgFontManagerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgFontManager * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgFontManager * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgFontManager * This); - - HRESULT ( STDMETHODCALLTYPE *IsFontAvailable )( - ILgFontManager * This, - /* [in] */ BSTR bstrName, - /* [retval][out] */ ComBool *pfAvail); - - HRESULT ( STDMETHODCALLTYPE *IsFontAvailableRgch )( - ILgFontManager * This, - /* [in] */ int cch, - /* [in] */ OLECHAR *prgchName, - /* [retval][out] */ ComBool *pfAvail); - - HRESULT ( STDMETHODCALLTYPE *AvailableFonts )( - ILgFontManager * This, - /* [out] */ BSTR *pbstrNames); - - HRESULT ( STDMETHODCALLTYPE *RefreshFontList )( - ILgFontManager * This); - - END_INTERFACE - } ILgFontManagerVtbl; - - interface ILgFontManager - { - CONST_VTBL struct ILgFontManagerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgFontManager_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgFontManager_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgFontManager_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgFontManager_IsFontAvailable(This,bstrName,pfAvail) \ - ( (This)->lpVtbl -> IsFontAvailable(This,bstrName,pfAvail) ) - -#define ILgFontManager_IsFontAvailableRgch(This,cch,prgchName,pfAvail) \ - ( (This)->lpVtbl -> IsFontAvailableRgch(This,cch,prgchName,pfAvail) ) - -#define ILgFontManager_AvailableFonts(This,pbstrNames) \ - ( (This)->lpVtbl -> AvailableFonts(This,pbstrNames) ) - -#define ILgFontManager_RefreshFontList(This) \ - ( (This)->lpVtbl -> RefreshFontList(This) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgFontManager_INTERFACE_DEFINED__ */ - - -#define CLSID_LgInputMethodEditor __uuidof(LgInputMethodEditor) - -#ifdef __cplusplus - -class DECLSPEC_UUID("659C2C2F-7AF6-4F9E-AC6F-7A03C8418FC9") -LgInputMethodEditor; -#endif - -#define CLSID_LgFontManager __uuidof(LgFontManager) - -#ifdef __cplusplus - -class DECLSPEC_UUID("02C3F580-796D-4B5F-BE43-166D97319DA5") -LgFontManager; -#endif - -#ifndef __ILgIcuCharPropEngine_INTERFACE_DEFINED__ -#define __ILgIcuCharPropEngine_INTERFACE_DEFINED__ - -/* interface ILgIcuCharPropEngine */ -/* [unique][object][uuid] */ - - -#define IID_ILgIcuCharPropEngine __uuidof(ILgIcuCharPropEngine) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("E8689492-7622-427b-8518-6339294FD227") - ILgIcuCharPropEngine : public ILgCharacterPropertyEngine - { - public: - virtual HRESULT STDMETHODCALLTYPE Initialize( - /* [in] */ BSTR bstrLanguage, - /* [in] */ BSTR bstrScript, - /* [in] */ BSTR bstrCountry, - /* [in] */ BSTR bstrVariant) = 0; - - virtual HRESULT STDMETHODCALLTYPE InitCharOverrides( - /* [in] */ BSTR bstrWsCharsList) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILgIcuCharPropEngineVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgIcuCharPropEngine * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgIcuCharPropEngine * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgIcuCharPropEngine * This); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_GeneralCategory )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ LgGeneralCharCategory *pcc); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BidiCategory )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ LgBidiCategory *pbic); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsLetter )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ ComBool *pfRet); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsWordForming )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ ComBool *pfRet); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsPunctuation )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ ComBool *pfRet); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsNumber )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ ComBool *pfRet); + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsNumber )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ ComBool *pfRet); /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsSeparator )( ILgIcuCharPropEngine * This, @@ -10952,323 +10408,6 @@ LgFontManager; #endif /* __ILgNumericEngine_INTERFACE_DEFINED__ */ -#ifndef __ILgKeymanHandler_INTERFACE_DEFINED__ -#define __ILgKeymanHandler_INTERFACE_DEFINED__ - -/* interface ILgKeymanHandler */ -/* [unique][object][uuid] */ - - -#define IID_ILgKeymanHandler __uuidof(ILgKeymanHandler) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("3F42144B-509F-4def-8DD3-6D8D26677001") - ILgKeymanHandler : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Init( - /* [in] */ ComBool fForce) = 0; - - virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NLayout( - /* [retval][out] */ int *pclayout) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( - /* [in] */ int ilayout, - /* [retval][out] */ BSTR *pbstrName) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ActiveKeyboardName( - /* [retval][out] */ BSTR *pbstrName) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ActiveKeyboardName( - /* [in] */ BSTR bstrName) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeymanWindowsMessage( - /* [retval][out] */ int *pwm) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILgKeymanHandlerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgKeymanHandler * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgKeymanHandler * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgKeymanHandler * This); - - HRESULT ( STDMETHODCALLTYPE *Init )( - ILgKeymanHandler * This, - /* [in] */ ComBool fForce); - - HRESULT ( STDMETHODCALLTYPE *Close )( - ILgKeymanHandler * This); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NLayout )( - ILgKeymanHandler * This, - /* [retval][out] */ int *pclayout); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( - ILgKeymanHandler * This, - /* [in] */ int ilayout, - /* [retval][out] */ BSTR *pbstrName); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ActiveKeyboardName )( - ILgKeymanHandler * This, - /* [retval][out] */ BSTR *pbstrName); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ActiveKeyboardName )( - ILgKeymanHandler * This, - /* [in] */ BSTR bstrName); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeymanWindowsMessage )( - ILgKeymanHandler * This, - /* [retval][out] */ int *pwm); - - END_INTERFACE - } ILgKeymanHandlerVtbl; - - interface ILgKeymanHandler - { - CONST_VTBL struct ILgKeymanHandlerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgKeymanHandler_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgKeymanHandler_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgKeymanHandler_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgKeymanHandler_Init(This,fForce) \ - ( (This)->lpVtbl -> Init(This,fForce) ) - -#define ILgKeymanHandler_Close(This) \ - ( (This)->lpVtbl -> Close(This) ) - -#define ILgKeymanHandler_get_NLayout(This,pclayout) \ - ( (This)->lpVtbl -> get_NLayout(This,pclayout) ) - -#define ILgKeymanHandler_get_Name(This,ilayout,pbstrName) \ - ( (This)->lpVtbl -> get_Name(This,ilayout,pbstrName) ) - -#define ILgKeymanHandler_get_ActiveKeyboardName(This,pbstrName) \ - ( (This)->lpVtbl -> get_ActiveKeyboardName(This,pbstrName) ) - -#define ILgKeymanHandler_put_ActiveKeyboardName(This,bstrName) \ - ( (This)->lpVtbl -> put_ActiveKeyboardName(This,bstrName) ) - -#define ILgKeymanHandler_get_KeymanWindowsMessage(This,pwm) \ - ( (This)->lpVtbl -> get_KeymanWindowsMessage(This,pwm) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgKeymanHandler_INTERFACE_DEFINED__ */ - - -#ifndef __ILgCodePageEnumerator_INTERFACE_DEFINED__ -#define __ILgCodePageEnumerator_INTERFACE_DEFINED__ - -/* interface ILgCodePageEnumerator */ -/* [unique][object][uuid] */ - - -#define IID_ILgCodePageEnumerator __uuidof(ILgCodePageEnumerator) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2CFCF4B7-2FFE-4CF8-91BE-FBB57CC7782A") - ILgCodePageEnumerator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Init( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Next( - /* [out] */ int *pnId, - /* [out] */ BSTR *pbstrName) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILgCodePageEnumeratorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgCodePageEnumerator * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgCodePageEnumerator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgCodePageEnumerator * This); - - HRESULT ( STDMETHODCALLTYPE *Init )( - ILgCodePageEnumerator * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - ILgCodePageEnumerator * This, - /* [out] */ int *pnId, - /* [out] */ BSTR *pbstrName); - - END_INTERFACE - } ILgCodePageEnumeratorVtbl; - - interface ILgCodePageEnumerator - { - CONST_VTBL struct ILgCodePageEnumeratorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgCodePageEnumerator_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgCodePageEnumerator_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgCodePageEnumerator_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgCodePageEnumerator_Init(This) \ - ( (This)->lpVtbl -> Init(This) ) - -#define ILgCodePageEnumerator_Next(This,pnId,pbstrName) \ - ( (This)->lpVtbl -> Next(This,pnId,pbstrName) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgCodePageEnumerator_INTERFACE_DEFINED__ */ - - -#ifndef __ILgLanguageEnumerator_INTERFACE_DEFINED__ -#define __ILgLanguageEnumerator_INTERFACE_DEFINED__ - -/* interface ILgLanguageEnumerator */ -/* [unique][object][uuid] */ - - -#define IID_ILgLanguageEnumerator __uuidof(ILgLanguageEnumerator) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("746A16E1-0C36-4268-A261-E8012B0D67C5") - ILgLanguageEnumerator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Init( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Next( - /* [out] */ int *pnId, - /* [out] */ BSTR *pbstrName) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILgLanguageEnumeratorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgLanguageEnumerator * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgLanguageEnumerator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgLanguageEnumerator * This); - - HRESULT ( STDMETHODCALLTYPE *Init )( - ILgLanguageEnumerator * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - ILgLanguageEnumerator * This, - /* [out] */ int *pnId, - /* [out] */ BSTR *pbstrName); - - END_INTERFACE - } ILgLanguageEnumeratorVtbl; - - interface ILgLanguageEnumerator - { - CONST_VTBL struct ILgLanguageEnumeratorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgLanguageEnumerator_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgLanguageEnumerator_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgLanguageEnumerator_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgLanguageEnumerator_Init(This) \ - ( (This)->lpVtbl -> Init(This) ) - -#define ILgLanguageEnumerator_Next(This,pnId,pbstrName) \ - ( (This)->lpVtbl -> Next(This,pnId,pbstrName) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgLanguageEnumerator_INTERFACE_DEFINED__ */ - - #ifndef __ILgIcuConverterEnumerator_INTERFACE_DEFINED__ #define __ILgIcuConverterEnumerator_INTERFACE_DEFINED__ @@ -11982,38 +11121,6 @@ class DECLSPEC_UUID("FF22A7AB-223E-4D04-B648-0AE40588261D") LgNumericEngine; #endif -#define CLSID_LgKeymanHandler __uuidof(LgKeymanHandler) - -#ifdef __cplusplus - -class DECLSPEC_UUID("69ACA99C-F852-4C2C-9B5F-FF83238A17A5") -LgKeymanHandler; -#endif - -#define CLSID_LgTextServices __uuidof(LgTextServices) - -#ifdef __cplusplus - -class DECLSPEC_UUID("720485C5-E8D5-4761-92F0-F70D2B3CF980") -LgTextServices; -#endif - -#define CLSID_LgCodePageEnumerator __uuidof(LgCodePageEnumerator) - -#ifdef __cplusplus - -class DECLSPEC_UUID("9045F113-8626-41C0-A61E-A73FBE5920D1") -LgCodePageEnumerator; -#endif - -#define CLSID_LgLanguageEnumerator __uuidof(LgLanguageEnumerator) - -#ifdef __cplusplus - -class DECLSPEC_UUID("B887505B-74DE-4ADC-A1D9-5553428C8D02") -LgLanguageEnumerator; -#endif - #define CLSID_LgIcuConverterEnumerator __uuidof(LgIcuConverterEnumerator) #ifdef __cplusplus diff --git a/Lib/linux/Common/FwKernelTlb.idl b/Lib/linux/Common/FwKernelTlb.idl index 99ceb524dc..d1e5dfcfe6 100644 --- a/Lib/linux/Common/FwKernelTlb.idl +++ b/Lib/linux/Common/FwKernelTlb.idl @@ -3680,7 +3680,6 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 interface ICollation; interface ILgWritingSystem; interface ILgWritingSystemFactory; - interface ILgTextServices; @@ -3959,177 +3958,10 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 - - - - - - - - - - - - - - - - - - - - - - - - - - - cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgInputMethodEditor") cpp_quote(",") cpp_quote("E1B27A5F-DD1B-4BBA-9B72-00BDE03162FC") cpp_quote(");") [ uuid("E1B27A5F-DD1B-4BBA-9B72-00BDE03162FC"), object, pointer_default(unique) ] interface ILgInputMethodEditor : IUnknown - { - - - HRESULT Setup(); - - - - - - - - - - - - - - - - - - - [local, restricted] HRESULT Replace( - [in] BSTR bstrInput, - [in] ITsTextProps * pttpInput, - [in] ITsStrBldr * ptsbOld, - [in] int ichMin, - [in] int ichLim, - [out] int * pichModMin, - [out] int * pichModLim, - [out] int * pichIP); - - - - - - - - - - - - - - HRESULT Backspace( - [in] int pichStart, - [in] int cactBackspace, - [in] ITsStrBldr * ptsbOld, - [out] int * pichModMin, - [out] int * pichModLim, - [out] int * pichIP, - [out] int * pcactBsRemaining); - - - - - - - - - - - - - HRESULT DeleteForward( - [in] int pichStart, - [in] int cactDelForward, - [in] ITsStrBldr * ptsbInOut, - [out] int * pichModMin, - [out] int * pichModLim, - [out] int * pichIP, - [out] int * pcactDfRemaining); - - - - - HRESULT IsValidInsertionPoint( - [in] int ich, - [in] ITsString * ptss, - [out, retval] BOOL * pfValid); - }; - - - - - - - - - - - - - - - - - - - - - - - - - cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgFontManager") cpp_quote(",") cpp_quote("73718689-B701-4241-A408-4C389ECD6664") cpp_quote(");") [ uuid("73718689-B701-4241-A408-4C389ECD6664"), object, pointer_default(unique) ] interface ILgFontManager : IUnknown - { - - HRESULT IsFontAvailable( - [in] BSTR bstrName, - [out, retval] ComBool * pfAvail); - - - HRESULT IsFontAvailableRgch( - [in] int cch, - [in] OLECHAR * prgchName, - [out, retval] ComBool * pfAvail); - - - HRESULT AvailableFonts( - [out] BSTR * pbstrNames); - - - HRESULT RefreshFontList(); - }; - - - - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("659C2C2F-7AF6-4F9E-AC6F-7A03C8418FC9") cpp_quote(",") cpp_quote("LgInputMethodEditor") cpp_quote(");") [ uuid(659C2C2F-7AF6-4F9E-AC6F-7A03C8418FC9) ] coclass LgInputMethodEditor - { - interface ILgInputMethodEditor; - }; - - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("02C3F580-796D-4B5F-BE43-166D97319DA5") cpp_quote(",") cpp_quote("LgFontManager") cpp_quote(");") [ uuid(02C3F580-796D-4B5F-BE43-166D97319DA5) ] coclass LgFontManager - { - interface ILgFontManager; - }; - #line 498 "d:\\fwrepo\\fw\\src\\Language\\Language.idh" - - @@ -5317,140 +5149,6 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 -cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgKeymanHandler") cpp_quote(",") cpp_quote("3F42144B-509F-4def-8DD3-6D8D26677001") cpp_quote(");") [ uuid("3F42144B-509F-4def-8DD3-6D8D26677001"), object, pointer_default(unique) ] interface ILgKeymanHandler : IUnknown -{ - - - - - - - HRESULT Init( - [in] ComBool fForce); - - - - HRESULT Close(); - - - [propget] HRESULT NLayout( - [out, retval] int * pclayout); - - [propget] HRESULT Name( - [in] int ilayout, - [out, retval] BSTR * pbstrName); - - [propget] HRESULT ActiveKeyboardName( - [out, retval] BSTR * pbstrName); - [propput] HRESULT ActiveKeyboardName( - [in] BSTR bstrName); - - [propget] HRESULT KeymanWindowsMessage( - [out, retval] int * pwm); - -}; - - - - - - - - - - - - - - - - - - - - -cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgTextServices") cpp_quote(",") cpp_quote("5B6303DE-E635-4DD7-A7FC-345BEEF352D8") cpp_quote(");") [ uuid("5B6303DE-E635-4DD7-A7FC-345BEEF352D8"), object, pointer_default(unique) ] interface ILgTextServices : IUnknown -{ - - HRESULT SetKeyboard( - [in] int nLcid, - [in] BSTR bstrKeymanKbd, - [in, out] int * pnActiveLangId, - [in, out] BSTR * pbstrActiveKeymanKbd, - [in, out] ComBool * pfSelectLangPending - ); -}; - - - - - - - - - - - - - - - -cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgCodePageEnumerator") cpp_quote(",") cpp_quote("2CFCF4B7-2FFE-4CF8-91BE-FBB57CC7782A") cpp_quote(");") [ uuid("2CFCF4B7-2FFE-4CF8-91BE-FBB57CC7782A"), object, pointer_default(unique) ] interface ILgCodePageEnumerator : IUnknown -{ - - - - HRESULT Init(); - - - HRESULT Next( - [out] int * pnId, - [out] BSTR * pbstrName); -}; - - - - - - - - - - - - - - - -cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgLanguageEnumerator") cpp_quote(",") cpp_quote("746A16E1-0C36-4268-A261-E8012B0D67C5") cpp_quote(");") [ uuid("746A16E1-0C36-4268-A261-E8012B0D67C5"), object, pointer_default(unique) ] interface ILgLanguageEnumerator : IUnknown -{ - - - - HRESULT Init(); - - - - HRESULT Next( - [out] int * pnId, - [out] BSTR * pbstrName); -}; - - - - - - - - - - - - - - - - cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgIcuConverterEnumerator") cpp_quote(",") cpp_quote("8E6D558E-8755-4EA1-9FF6-039D375312E9") cpp_quote(");") [ uuid("8E6D558E-8755-4EA1-9FF6-039D375312E9"), object, pointer_default(unique) ] interface ILgIcuConverterEnumerator : IUnknown { @@ -5715,22 +5413,6 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IRegexMatcher") cpp interface ILgNumericEngine; }; - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("69ACA99C-F852-4C2C-9B5F-FF83238A17A5") cpp_quote(",") cpp_quote("LgKeymanHandler") cpp_quote(");") [ uuid(69ACA99C-F852-4C2C-9B5F-FF83238A17A5) ] coclass LgKeymanHandler - { - interface ILgKeymanHandler; - }; - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("720485C5-E8D5-4761-92F0-F70D2B3CF980") cpp_quote(",") cpp_quote("LgTextServices") cpp_quote(");") [ uuid(720485C5-E8D5-4761-92F0-F70D2B3CF980) ] coclass LgTextServices - { - interface ILgTextServices; - }; - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("9045F113-8626-41C0-A61E-A73FBE5920D1") cpp_quote(",") cpp_quote("LgCodePageEnumerator") cpp_quote(");") [ uuid(9045F113-8626-41C0-A61E-A73FBE5920D1) ] coclass LgCodePageEnumerator - { - interface ILgCodePageEnumerator; - }; - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("B887505B-74DE-4ADC-A1D9-5553428C8D02") cpp_quote(",") cpp_quote("LgLanguageEnumerator") cpp_quote(");") [ uuid(B887505B-74DE-4ADC-A1D9-5553428C8D02) ] coclass LgLanguageEnumerator - { - interface ILgLanguageEnumerator; - }; cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("9E729461-F80D-4796-BA17-086BC61907F1") cpp_quote(",") cpp_quote("LgIcuConverterEnumerator") cpp_quote(");") [ uuid(9E729461-F80D-4796-BA17-086BC61907F1) ] coclass LgIcuConverterEnumerator { interface ILgIcuConverterEnumerator; @@ -5747,7 +5429,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IRegexMatcher") cpp { interface ILgIcuLocaleEnumerator; }; -#line 2118 "d:\\fwrepo\\fw\\src\\Language\\Language.idh" +#line 1800 "d:\\fwrepo\\fw\\src\\Language\\Language.idh" #line 25 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" }; diff --git a/Lib/linux/Common/FwKernelTlb.tlb b/Lib/linux/Common/FwKernelTlb.tlb index f27501314cf15eb95fe332b8227d414b9efb2b4a..15213ce179f2e75aa258302bd7efe2ec6e64b83d 100644 GIT binary patch delta 11709 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 D*>3WL delta 14952 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 RD0Bgl&b{;#!&Z-=|G!P!Sc?Dv diff --git a/Lib/linux/Common/LanguageTlb.h b/Lib/linux/Common/LanguageTlb.h index ba3cda98dd..07d4fb6931 100644 --- a/Lib/linux/Common/LanguageTlb.h +++ b/Lib/linux/Common/LanguageTlb.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Wed May 29 18:54:39 2013 +/* at Wed Jun 05 12:23:49 2013 */ /* Compiler settings for d:\fwrepo\fw\Output\Common\LanguageTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 @@ -233,12 +233,6 @@ typedef struct TsMultiString TsMultiString; #endif /* __TsMultiString_FWD_DEFINED__ */ -#ifndef __ILgInputMethodEditor_FWD_DEFINED__ -#define __ILgInputMethodEditor_FWD_DEFINED__ -typedef interface ILgInputMethodEditor ILgInputMethodEditor; -#endif /* __ILgInputMethodEditor_FWD_DEFINED__ */ - - #ifndef __IVwGraphics_FWD_DEFINED__ #define __IVwGraphics_FWD_DEFINED__ typedef interface IVwGraphics IVwGraphics; @@ -413,42 +407,6 @@ typedef interface ILgWritingSystem ILgWritingSystem; #endif /* __ILgWritingSystem_FWD_DEFINED__ */ -#ifndef __ILgTextServices_FWD_DEFINED__ -#define __ILgTextServices_FWD_DEFINED__ -typedef interface ILgTextServices ILgTextServices; -#endif /* __ILgTextServices_FWD_DEFINED__ */ - - -#ifndef __ILgFontManager_FWD_DEFINED__ -#define __ILgFontManager_FWD_DEFINED__ -typedef interface ILgFontManager ILgFontManager; -#endif /* __ILgFontManager_FWD_DEFINED__ */ - - -#ifndef __LgInputMethodEditor_FWD_DEFINED__ -#define __LgInputMethodEditor_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgInputMethodEditor LgInputMethodEditor; -#else -typedef struct LgInputMethodEditor LgInputMethodEditor; -#endif /* __cplusplus */ - -#endif /* __LgInputMethodEditor_FWD_DEFINED__ */ - - -#ifndef __LgFontManager_FWD_DEFINED__ -#define __LgFontManager_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgFontManager LgFontManager; -#else -typedef struct LgFontManager LgFontManager; -#endif /* __cplusplus */ - -#endif /* __LgFontManager_FWD_DEFINED__ */ - - #ifndef __ILgIcuCharPropEngine_FWD_DEFINED__ #define __ILgIcuCharPropEngine_FWD_DEFINED__ typedef interface ILgIcuCharPropEngine ILgIcuCharPropEngine; @@ -461,24 +419,6 @@ typedef interface ILgNumericEngine ILgNumericEngine; #endif /* __ILgNumericEngine_FWD_DEFINED__ */ -#ifndef __ILgKeymanHandler_FWD_DEFINED__ -#define __ILgKeymanHandler_FWD_DEFINED__ -typedef interface ILgKeymanHandler ILgKeymanHandler; -#endif /* __ILgKeymanHandler_FWD_DEFINED__ */ - - -#ifndef __ILgCodePageEnumerator_FWD_DEFINED__ -#define __ILgCodePageEnumerator_FWD_DEFINED__ -typedef interface ILgCodePageEnumerator ILgCodePageEnumerator; -#endif /* __ILgCodePageEnumerator_FWD_DEFINED__ */ - - -#ifndef __ILgLanguageEnumerator_FWD_DEFINED__ -#define __ILgLanguageEnumerator_FWD_DEFINED__ -typedef interface ILgLanguageEnumerator ILgLanguageEnumerator; -#endif /* __ILgLanguageEnumerator_FWD_DEFINED__ */ - - #ifndef __ILgIcuConverterEnumerator_FWD_DEFINED__ #define __ILgIcuConverterEnumerator_FWD_DEFINED__ typedef interface ILgIcuConverterEnumerator ILgIcuConverterEnumerator; @@ -605,54 +545,6 @@ typedef struct LgNumericEngine LgNumericEngine; #endif /* __LgNumericEngine_FWD_DEFINED__ */ -#ifndef __LgKeymanHandler_FWD_DEFINED__ -#define __LgKeymanHandler_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgKeymanHandler LgKeymanHandler; -#else -typedef struct LgKeymanHandler LgKeymanHandler; -#endif /* __cplusplus */ - -#endif /* __LgKeymanHandler_FWD_DEFINED__ */ - - -#ifndef __LgTextServices_FWD_DEFINED__ -#define __LgTextServices_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgTextServices LgTextServices; -#else -typedef struct LgTextServices LgTextServices; -#endif /* __cplusplus */ - -#endif /* __LgTextServices_FWD_DEFINED__ */ - - -#ifndef __LgCodePageEnumerator_FWD_DEFINED__ -#define __LgCodePageEnumerator_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgCodePageEnumerator LgCodePageEnumerator; -#else -typedef struct LgCodePageEnumerator LgCodePageEnumerator; -#endif /* __cplusplus */ - -#endif /* __LgCodePageEnumerator_FWD_DEFINED__ */ - - -#ifndef __LgLanguageEnumerator_FWD_DEFINED__ -#define __LgLanguageEnumerator_FWD_DEFINED__ - -#ifdef __cplusplus -typedef class LgLanguageEnumerator LgLanguageEnumerator; -#else -typedef struct LgLanguageEnumerator LgLanguageEnumerator; -#endif /* __cplusplus */ - -#endif /* __LgLanguageEnumerator_FWD_DEFINED__ */ - - #ifndef __LgIcuConverterEnumerator_FWD_DEFINED__ #define __LgIcuConverterEnumerator_FWD_DEFINED__ @@ -1373,7 +1265,6 @@ FwGraphiteProcess - typedef /* [v1_enum] */ enum LgGeneralCharCategory { kccLu = 0, @@ -1499,26 +1390,6 @@ ILgWritingSystem , 9F74A170-E8BB-466d-8848-5FDB28AC5AF8 ); -GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgInputMethodEditor -, -E1B27A5F-DD1B-4BBA-9B72-00BDE03162FC -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgFontManager -, -73718689-B701-4241-A408-4C389ECD6664 -); -ATTACH_GUID_TO_CLASS(class, -659C2C2F-7AF6-4F9E-AC6F-7A03C8418FC9 -, -LgInputMethodEditor -); -ATTACH_GUID_TO_CLASS(class, -02C3F580-796D-4B5F-BE43-166D97319DA5 -, -LgFontManager -); typedef /* [v1_enum] */ enum LgCollatingOptions { fcoDefault = 0, @@ -1617,26 +1488,6 @@ ILgWritingSystemFactory 22376578-BFEB-4c46-8D72-C9154890DD16 ); GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgKeymanHandler -, -3F42144B-509F-4def-8DD3-6D8D26677001 -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgTextServices -, -5B6303DE-E635-4DD7-A7FC-345BEEF352D8 -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgCodePageEnumerator -, -2CFCF4B7-2FFE-4CF8-91BE-FBB57CC7782A -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( -ILgLanguageEnumerator -, -746A16E1-0C36-4268-A261-E8012B0D67C5 -); -GENERIC_DECLARE_SMART_INTERFACE_PTR( ILgIcuConverterEnumerator , 8E6D558E-8755-4EA1-9FF6-039D375312E9 @@ -1702,26 +1553,6 @@ FF22A7AB-223E-4D04-B648-0AE40588261D LgNumericEngine ); ATTACH_GUID_TO_CLASS(class, -69ACA99C-F852-4C2C-9B5F-FF83238A17A5 -, -LgKeymanHandler -); -ATTACH_GUID_TO_CLASS(class, -720485C5-E8D5-4761-92F0-F70D2B3CF980 -, -LgTextServices -); -ATTACH_GUID_TO_CLASS(class, -9045F113-8626-41C0-A61E-A73FBE5920D1 -, -LgCodePageEnumerator -); -ATTACH_GUID_TO_CLASS(class, -B887505B-74DE-4ADC-A1D9-5553428C8D02 -, -LgLanguageEnumerator -); -ATTACH_GUID_TO_CLASS(class, 9E729461-F80D-4796-BA17-086BC61907F1 , LgIcuConverterEnumerator @@ -5414,165 +5245,6 @@ class DECLSPEC_UUID("7A1B89C0-C2D6-11d3-9BB7-00400541F9E9") TsMultiString; #endif -#ifndef __ILgInputMethodEditor_INTERFACE_DEFINED__ -#define __ILgInputMethodEditor_INTERFACE_DEFINED__ - -/* interface ILgInputMethodEditor */ -/* [unique][object][uuid] */ - - -#define IID_ILgInputMethodEditor __uuidof(ILgInputMethodEditor) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("E1B27A5F-DD1B-4BBA-9B72-00BDE03162FC") - ILgInputMethodEditor : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Setup( void) = 0; - - virtual /* [restricted][local] */ HRESULT STDMETHODCALLTYPE Replace( - /* [in] */ BSTR bstrInput, - /* [in] */ ITsTextProps *pttpInput, - /* [in] */ ITsStrBldr *ptsbOld, - /* [in] */ int ichMin, - /* [in] */ int ichLim, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP) = 0; - - virtual HRESULT STDMETHODCALLTYPE Backspace( - /* [in] */ int pichStart, - /* [in] */ int cactBackspace, - /* [in] */ ITsStrBldr *ptsbOld, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP, - /* [out] */ int *pcactBsRemaining) = 0; - - virtual HRESULT STDMETHODCALLTYPE DeleteForward( - /* [in] */ int pichStart, - /* [in] */ int cactDelForward, - /* [in] */ ITsStrBldr *ptsbInOut, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP, - /* [out] */ int *pcactDfRemaining) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsValidInsertionPoint( - /* [in] */ int ich, - /* [in] */ ITsString *ptss, - /* [retval][out] */ BOOL *pfValid) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILgInputMethodEditorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgInputMethodEditor * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgInputMethodEditor * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgInputMethodEditor * This); - - HRESULT ( STDMETHODCALLTYPE *Setup )( - ILgInputMethodEditor * This); - - /* [restricted][local] */ HRESULT ( STDMETHODCALLTYPE *Replace )( - ILgInputMethodEditor * This, - /* [in] */ BSTR bstrInput, - /* [in] */ ITsTextProps *pttpInput, - /* [in] */ ITsStrBldr *ptsbOld, - /* [in] */ int ichMin, - /* [in] */ int ichLim, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP); - - HRESULT ( STDMETHODCALLTYPE *Backspace )( - ILgInputMethodEditor * This, - /* [in] */ int pichStart, - /* [in] */ int cactBackspace, - /* [in] */ ITsStrBldr *ptsbOld, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP, - /* [out] */ int *pcactBsRemaining); - - HRESULT ( STDMETHODCALLTYPE *DeleteForward )( - ILgInputMethodEditor * This, - /* [in] */ int pichStart, - /* [in] */ int cactDelForward, - /* [in] */ ITsStrBldr *ptsbInOut, - /* [out] */ int *pichModMin, - /* [out] */ int *pichModLim, - /* [out] */ int *pichIP, - /* [out] */ int *pcactDfRemaining); - - HRESULT ( STDMETHODCALLTYPE *IsValidInsertionPoint )( - ILgInputMethodEditor * This, - /* [in] */ int ich, - /* [in] */ ITsString *ptss, - /* [retval][out] */ BOOL *pfValid); - - END_INTERFACE - } ILgInputMethodEditorVtbl; - - interface ILgInputMethodEditor - { - CONST_VTBL struct ILgInputMethodEditorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgInputMethodEditor_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgInputMethodEditor_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgInputMethodEditor_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgInputMethodEditor_Setup(This) \ - ( (This)->lpVtbl -> Setup(This) ) - -#define ILgInputMethodEditor_Replace(This,bstrInput,pttpInput,ptsbOld,ichMin,ichLim,pichModMin,pichModLim,pichIP) \ - ( (This)->lpVtbl -> Replace(This,bstrInput,pttpInput,ptsbOld,ichMin,ichLim,pichModMin,pichModLim,pichIP) ) - -#define ILgInputMethodEditor_Backspace(This,pichStart,cactBackspace,ptsbOld,pichModMin,pichModLim,pichIP,pcactBsRemaining) \ - ( (This)->lpVtbl -> Backspace(This,pichStart,cactBackspace,ptsbOld,pichModMin,pichModLim,pichIP,pcactBsRemaining) ) - -#define ILgInputMethodEditor_DeleteForward(This,pichStart,cactDelForward,ptsbInOut,pichModMin,pichModLim,pichIP,pcactDfRemaining) \ - ( (This)->lpVtbl -> DeleteForward(This,pichStart,cactDelForward,ptsbInOut,pichModMin,pichModLim,pichIP,pcactDfRemaining) ) - -#define ILgInputMethodEditor_IsValidInsertionPoint(This,ich,ptss,pfValid) \ - ( (This)->lpVtbl -> IsValidInsertionPoint(This,ich,ptss,pfValid) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgInputMethodEditor_INTERFACE_DEFINED__ */ - - #ifndef __IVwGraphics_INTERFACE_DEFINED__ #define __IVwGraphics_INTERFACE_DEFINED__ @@ -10002,295 +9674,79 @@ FwGraphiteProcess; #endif /* __ILgWritingSystem_INTERFACE_DEFINED__ */ -#ifndef __ILgTextServices_INTERFACE_DEFINED__ -#define __ILgTextServices_INTERFACE_DEFINED__ +#ifndef __ILgIcuCharPropEngine_INTERFACE_DEFINED__ +#define __ILgIcuCharPropEngine_INTERFACE_DEFINED__ -/* interface ILgTextServices */ +/* interface ILgIcuCharPropEngine */ /* [unique][object][uuid] */ -#define IID_ILgTextServices __uuidof(ILgTextServices) +#define IID_ILgIcuCharPropEngine __uuidof(ILgIcuCharPropEngine) #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("5B6303DE-E635-4DD7-A7FC-345BEEF352D8") - ILgTextServices : public IUnknown + MIDL_INTERFACE("E8689492-7622-427b-8518-6339294FD227") + ILgIcuCharPropEngine : public ILgCharacterPropertyEngine { public: - virtual HRESULT STDMETHODCALLTYPE SetKeyboard( - /* [in] */ int nLcid, - /* [in] */ BSTR bstrKeymanKbd, - /* [out][in] */ int *pnActiveLangId, - /* [out][in] */ BSTR *pbstrActiveKeymanKbd, - /* [out][in] */ ComBool *pfSelectLangPending) = 0; + virtual HRESULT STDMETHODCALLTYPE Initialize( + /* [in] */ BSTR bstrLanguage, + /* [in] */ BSTR bstrScript, + /* [in] */ BSTR bstrCountry, + /* [in] */ BSTR bstrVariant) = 0; + + virtual HRESULT STDMETHODCALLTYPE InitCharOverrides( + /* [in] */ BSTR bstrWsCharsList) = 0; }; #else /* C style interface */ - typedef struct ILgTextServicesVtbl + typedef struct ILgIcuCharPropEngineVtbl { BEGIN_INTERFACE HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgTextServices * This, + ILgIcuCharPropEngine * This, /* [in] */ REFIID riid, /* [annotation][iid_is][out] */ __RPC__deref_out void **ppvObject); ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgTextServices * This); + ILgIcuCharPropEngine * This); ULONG ( STDMETHODCALLTYPE *Release )( - ILgTextServices * This); + ILgIcuCharPropEngine * This); - HRESULT ( STDMETHODCALLTYPE *SetKeyboard )( - ILgTextServices * This, - /* [in] */ int nLcid, - /* [in] */ BSTR bstrKeymanKbd, - /* [out][in] */ int *pnActiveLangId, - /* [out][in] */ BSTR *pbstrActiveKeymanKbd, - /* [out][in] */ ComBool *pfSelectLangPending); + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_GeneralCategory )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ LgGeneralCharCategory *pcc); - END_INTERFACE - } ILgTextServicesVtbl; - - interface ILgTextServices - { - CONST_VTBL struct ILgTextServicesVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgTextServices_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgTextServices_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgTextServices_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgTextServices_SetKeyboard(This,nLcid,bstrKeymanKbd,pnActiveLangId,pbstrActiveKeymanKbd,pfSelectLangPending) \ - ( (This)->lpVtbl -> SetKeyboard(This,nLcid,bstrKeymanKbd,pnActiveLangId,pbstrActiveKeymanKbd,pfSelectLangPending) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgTextServices_INTERFACE_DEFINED__ */ - - -#ifndef __ILgFontManager_INTERFACE_DEFINED__ -#define __ILgFontManager_INTERFACE_DEFINED__ - -/* interface ILgFontManager */ -/* [unique][object][uuid] */ - - -#define IID_ILgFontManager __uuidof(ILgFontManager) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("73718689-B701-4241-A408-4C389ECD6664") - ILgFontManager : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE IsFontAvailable( - /* [in] */ BSTR bstrName, - /* [retval][out] */ ComBool *pfAvail) = 0; + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BidiCategory )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ LgBidiCategory *pbic); - virtual HRESULT STDMETHODCALLTYPE IsFontAvailableRgch( - /* [in] */ int cch, - /* [in] */ OLECHAR *prgchName, - /* [retval][out] */ ComBool *pfAvail) = 0; + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsLetter )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ ComBool *pfRet); - virtual HRESULT STDMETHODCALLTYPE AvailableFonts( - /* [out] */ BSTR *pbstrNames) = 0; + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsWordForming )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ ComBool *pfRet); - virtual HRESULT STDMETHODCALLTYPE RefreshFontList( void) = 0; + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsPunctuation )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ ComBool *pfRet); - }; - -#else /* C style interface */ - - typedef struct ILgFontManagerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgFontManager * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgFontManager * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgFontManager * This); - - HRESULT ( STDMETHODCALLTYPE *IsFontAvailable )( - ILgFontManager * This, - /* [in] */ BSTR bstrName, - /* [retval][out] */ ComBool *pfAvail); - - HRESULT ( STDMETHODCALLTYPE *IsFontAvailableRgch )( - ILgFontManager * This, - /* [in] */ int cch, - /* [in] */ OLECHAR *prgchName, - /* [retval][out] */ ComBool *pfAvail); - - HRESULT ( STDMETHODCALLTYPE *AvailableFonts )( - ILgFontManager * This, - /* [out] */ BSTR *pbstrNames); - - HRESULT ( STDMETHODCALLTYPE *RefreshFontList )( - ILgFontManager * This); - - END_INTERFACE - } ILgFontManagerVtbl; - - interface ILgFontManager - { - CONST_VTBL struct ILgFontManagerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgFontManager_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgFontManager_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgFontManager_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgFontManager_IsFontAvailable(This,bstrName,pfAvail) \ - ( (This)->lpVtbl -> IsFontAvailable(This,bstrName,pfAvail) ) - -#define ILgFontManager_IsFontAvailableRgch(This,cch,prgchName,pfAvail) \ - ( (This)->lpVtbl -> IsFontAvailableRgch(This,cch,prgchName,pfAvail) ) - -#define ILgFontManager_AvailableFonts(This,pbstrNames) \ - ( (This)->lpVtbl -> AvailableFonts(This,pbstrNames) ) - -#define ILgFontManager_RefreshFontList(This) \ - ( (This)->lpVtbl -> RefreshFontList(This) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgFontManager_INTERFACE_DEFINED__ */ - - -#define CLSID_LgInputMethodEditor __uuidof(LgInputMethodEditor) - -#ifdef __cplusplus - -class DECLSPEC_UUID("659C2C2F-7AF6-4F9E-AC6F-7A03C8418FC9") -LgInputMethodEditor; -#endif - -#define CLSID_LgFontManager __uuidof(LgFontManager) - -#ifdef __cplusplus - -class DECLSPEC_UUID("02C3F580-796D-4B5F-BE43-166D97319DA5") -LgFontManager; -#endif - -#ifndef __ILgIcuCharPropEngine_INTERFACE_DEFINED__ -#define __ILgIcuCharPropEngine_INTERFACE_DEFINED__ - -/* interface ILgIcuCharPropEngine */ -/* [unique][object][uuid] */ - - -#define IID_ILgIcuCharPropEngine __uuidof(ILgIcuCharPropEngine) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("E8689492-7622-427b-8518-6339294FD227") - ILgIcuCharPropEngine : public ILgCharacterPropertyEngine - { - public: - virtual HRESULT STDMETHODCALLTYPE Initialize( - /* [in] */ BSTR bstrLanguage, - /* [in] */ BSTR bstrScript, - /* [in] */ BSTR bstrCountry, - /* [in] */ BSTR bstrVariant) = 0; - - virtual HRESULT STDMETHODCALLTYPE InitCharOverrides( - /* [in] */ BSTR bstrWsCharsList) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILgIcuCharPropEngineVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgIcuCharPropEngine * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgIcuCharPropEngine * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgIcuCharPropEngine * This); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_GeneralCategory )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ LgGeneralCharCategory *pcc); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_BidiCategory )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ LgBidiCategory *pbic); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsLetter )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ ComBool *pfRet); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsWordForming )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ ComBool *pfRet); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsPunctuation )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ ComBool *pfRet); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsNumber )( - ILgIcuCharPropEngine * This, - /* [in] */ int ch, - /* [retval][out] */ ComBool *pfRet); + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsNumber )( + ILgIcuCharPropEngine * This, + /* [in] */ int ch, + /* [retval][out] */ ComBool *pfRet); /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsSeparator )( ILgIcuCharPropEngine * This, @@ -10953,323 +10409,6 @@ LgFontManager; #endif /* __ILgNumericEngine_INTERFACE_DEFINED__ */ -#ifndef __ILgKeymanHandler_INTERFACE_DEFINED__ -#define __ILgKeymanHandler_INTERFACE_DEFINED__ - -/* interface ILgKeymanHandler */ -/* [unique][object][uuid] */ - - -#define IID_ILgKeymanHandler __uuidof(ILgKeymanHandler) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("3F42144B-509F-4def-8DD3-6D8D26677001") - ILgKeymanHandler : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Init( - /* [in] */ ComBool fForce) = 0; - - virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_NLayout( - /* [retval][out] */ int *pclayout) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Name( - /* [in] */ int ilayout, - /* [retval][out] */ BSTR *pbstrName) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ActiveKeyboardName( - /* [retval][out] */ BSTR *pbstrName) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ActiveKeyboardName( - /* [in] */ BSTR bstrName) = 0; - - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_KeymanWindowsMessage( - /* [retval][out] */ int *pwm) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILgKeymanHandlerVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgKeymanHandler * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgKeymanHandler * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgKeymanHandler * This); - - HRESULT ( STDMETHODCALLTYPE *Init )( - ILgKeymanHandler * This, - /* [in] */ ComBool fForce); - - HRESULT ( STDMETHODCALLTYPE *Close )( - ILgKeymanHandler * This); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_NLayout )( - ILgKeymanHandler * This, - /* [retval][out] */ int *pclayout); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Name )( - ILgKeymanHandler * This, - /* [in] */ int ilayout, - /* [retval][out] */ BSTR *pbstrName); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ActiveKeyboardName )( - ILgKeymanHandler * This, - /* [retval][out] */ BSTR *pbstrName); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ActiveKeyboardName )( - ILgKeymanHandler * This, - /* [in] */ BSTR bstrName); - - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_KeymanWindowsMessage )( - ILgKeymanHandler * This, - /* [retval][out] */ int *pwm); - - END_INTERFACE - } ILgKeymanHandlerVtbl; - - interface ILgKeymanHandler - { - CONST_VTBL struct ILgKeymanHandlerVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgKeymanHandler_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgKeymanHandler_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgKeymanHandler_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgKeymanHandler_Init(This,fForce) \ - ( (This)->lpVtbl -> Init(This,fForce) ) - -#define ILgKeymanHandler_Close(This) \ - ( (This)->lpVtbl -> Close(This) ) - -#define ILgKeymanHandler_get_NLayout(This,pclayout) \ - ( (This)->lpVtbl -> get_NLayout(This,pclayout) ) - -#define ILgKeymanHandler_get_Name(This,ilayout,pbstrName) \ - ( (This)->lpVtbl -> get_Name(This,ilayout,pbstrName) ) - -#define ILgKeymanHandler_get_ActiveKeyboardName(This,pbstrName) \ - ( (This)->lpVtbl -> get_ActiveKeyboardName(This,pbstrName) ) - -#define ILgKeymanHandler_put_ActiveKeyboardName(This,bstrName) \ - ( (This)->lpVtbl -> put_ActiveKeyboardName(This,bstrName) ) - -#define ILgKeymanHandler_get_KeymanWindowsMessage(This,pwm) \ - ( (This)->lpVtbl -> get_KeymanWindowsMessage(This,pwm) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgKeymanHandler_INTERFACE_DEFINED__ */ - - -#ifndef __ILgCodePageEnumerator_INTERFACE_DEFINED__ -#define __ILgCodePageEnumerator_INTERFACE_DEFINED__ - -/* interface ILgCodePageEnumerator */ -/* [unique][object][uuid] */ - - -#define IID_ILgCodePageEnumerator __uuidof(ILgCodePageEnumerator) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("2CFCF4B7-2FFE-4CF8-91BE-FBB57CC7782A") - ILgCodePageEnumerator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Init( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Next( - /* [out] */ int *pnId, - /* [out] */ BSTR *pbstrName) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILgCodePageEnumeratorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgCodePageEnumerator * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgCodePageEnumerator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgCodePageEnumerator * This); - - HRESULT ( STDMETHODCALLTYPE *Init )( - ILgCodePageEnumerator * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - ILgCodePageEnumerator * This, - /* [out] */ int *pnId, - /* [out] */ BSTR *pbstrName); - - END_INTERFACE - } ILgCodePageEnumeratorVtbl; - - interface ILgCodePageEnumerator - { - CONST_VTBL struct ILgCodePageEnumeratorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgCodePageEnumerator_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgCodePageEnumerator_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgCodePageEnumerator_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgCodePageEnumerator_Init(This) \ - ( (This)->lpVtbl -> Init(This) ) - -#define ILgCodePageEnumerator_Next(This,pnId,pbstrName) \ - ( (This)->lpVtbl -> Next(This,pnId,pbstrName) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgCodePageEnumerator_INTERFACE_DEFINED__ */ - - -#ifndef __ILgLanguageEnumerator_INTERFACE_DEFINED__ -#define __ILgLanguageEnumerator_INTERFACE_DEFINED__ - -/* interface ILgLanguageEnumerator */ -/* [unique][object][uuid] */ - - -#define IID_ILgLanguageEnumerator __uuidof(ILgLanguageEnumerator) - -#if defined(__cplusplus) && !defined(CINTERFACE) - - MIDL_INTERFACE("746A16E1-0C36-4268-A261-E8012B0D67C5") - ILgLanguageEnumerator : public IUnknown - { - public: - virtual HRESULT STDMETHODCALLTYPE Init( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE Next( - /* [out] */ int *pnId, - /* [out] */ BSTR *pbstrName) = 0; - - }; - -#else /* C style interface */ - - typedef struct ILgLanguageEnumeratorVtbl - { - BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( - ILgLanguageEnumerator * This, - /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ - __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( - ILgLanguageEnumerator * This); - - ULONG ( STDMETHODCALLTYPE *Release )( - ILgLanguageEnumerator * This); - - HRESULT ( STDMETHODCALLTYPE *Init )( - ILgLanguageEnumerator * This); - - HRESULT ( STDMETHODCALLTYPE *Next )( - ILgLanguageEnumerator * This, - /* [out] */ int *pnId, - /* [out] */ BSTR *pbstrName); - - END_INTERFACE - } ILgLanguageEnumeratorVtbl; - - interface ILgLanguageEnumerator - { - CONST_VTBL struct ILgLanguageEnumeratorVtbl *lpVtbl; - }; - - - -#ifdef COBJMACROS - - -#define ILgLanguageEnumerator_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) - -#define ILgLanguageEnumerator_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) - -#define ILgLanguageEnumerator_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) - - -#define ILgLanguageEnumerator_Init(This) \ - ( (This)->lpVtbl -> Init(This) ) - -#define ILgLanguageEnumerator_Next(This,pnId,pbstrName) \ - ( (This)->lpVtbl -> Next(This,pnId,pbstrName) ) - -#endif /* COBJMACROS */ - - -#endif /* C style interface */ - - - - -#endif /* __ILgLanguageEnumerator_INTERFACE_DEFINED__ */ - - #ifndef __ILgIcuConverterEnumerator_INTERFACE_DEFINED__ #define __ILgIcuConverterEnumerator_INTERFACE_DEFINED__ @@ -11983,38 +11122,6 @@ class DECLSPEC_UUID("FF22A7AB-223E-4D04-B648-0AE40588261D") LgNumericEngine; #endif -#define CLSID_LgKeymanHandler __uuidof(LgKeymanHandler) - -#ifdef __cplusplus - -class DECLSPEC_UUID("69ACA99C-F852-4C2C-9B5F-FF83238A17A5") -LgKeymanHandler; -#endif - -#define CLSID_LgTextServices __uuidof(LgTextServices) - -#ifdef __cplusplus - -class DECLSPEC_UUID("720485C5-E8D5-4761-92F0-F70D2B3CF980") -LgTextServices; -#endif - -#define CLSID_LgCodePageEnumerator __uuidof(LgCodePageEnumerator) - -#ifdef __cplusplus - -class DECLSPEC_UUID("9045F113-8626-41C0-A61E-A73FBE5920D1") -LgCodePageEnumerator; -#endif - -#define CLSID_LgLanguageEnumerator __uuidof(LgLanguageEnumerator) - -#ifdef __cplusplus - -class DECLSPEC_UUID("B887505B-74DE-4ADC-A1D9-5553428C8D02") -LgLanguageEnumerator; -#endif - #define CLSID_LgIcuConverterEnumerator __uuidof(LgIcuConverterEnumerator) #ifdef __cplusplus diff --git a/Lib/linux/Common/LanguageTlb.idl b/Lib/linux/Common/LanguageTlb.idl index dcfe98bcfc..d1a7f5210e 100644 --- a/Lib/linux/Common/LanguageTlb.idl +++ b/Lib/linux/Common/LanguageTlb.idl @@ -3689,7 +3689,6 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 interface ICollation; interface ILgWritingSystem; interface ILgWritingSystemFactory; - interface ILgTextServices; @@ -3968,177 +3967,10 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 - - - - - - - - - - - - - - - - - - - - - - - - - - - cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgInputMethodEditor") cpp_quote(",") cpp_quote("E1B27A5F-DD1B-4BBA-9B72-00BDE03162FC") cpp_quote(");") [ uuid("E1B27A5F-DD1B-4BBA-9B72-00BDE03162FC"), object, pointer_default(unique) ] interface ILgInputMethodEditor : IUnknown - { - - - HRESULT Setup(); - - - - - - - - - - - - - - - - - - - [local, restricted] HRESULT Replace( - [in] BSTR bstrInput, - [in] ITsTextProps * pttpInput, - [in] ITsStrBldr * ptsbOld, - [in] int ichMin, - [in] int ichLim, - [out] int * pichModMin, - [out] int * pichModLim, - [out] int * pichIP); - - - - - - - - - - - - - - HRESULT Backspace( - [in] int pichStart, - [in] int cactBackspace, - [in] ITsStrBldr * ptsbOld, - [out] int * pichModMin, - [out] int * pichModLim, - [out] int * pichIP, - [out] int * pcactBsRemaining); - - - - - - - - - - - - - HRESULT DeleteForward( - [in] int pichStart, - [in] int cactDelForward, - [in] ITsStrBldr * ptsbInOut, - [out] int * pichModMin, - [out] int * pichModLim, - [out] int * pichIP, - [out] int * pcactDfRemaining); - - - - - HRESULT IsValidInsertionPoint( - [in] int ich, - [in] ITsString * ptss, - [out, retval] BOOL * pfValid); - }; - - - - - - - - - - - - - - - - - - - - - - - - - cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgFontManager") cpp_quote(",") cpp_quote("73718689-B701-4241-A408-4C389ECD6664") cpp_quote(");") [ uuid("73718689-B701-4241-A408-4C389ECD6664"), object, pointer_default(unique) ] interface ILgFontManager : IUnknown - { - - HRESULT IsFontAvailable( - [in] BSTR bstrName, - [out, retval] ComBool * pfAvail); - - - HRESULT IsFontAvailableRgch( - [in] int cch, - [in] OLECHAR * prgchName, - [out, retval] ComBool * pfAvail); - - - HRESULT AvailableFonts( - [out] BSTR * pbstrNames); - - - HRESULT RefreshFontList(); - }; - - - - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("659C2C2F-7AF6-4F9E-AC6F-7A03C8418FC9") cpp_quote(",") cpp_quote("LgInputMethodEditor") cpp_quote(");") [ uuid(659C2C2F-7AF6-4F9E-AC6F-7A03C8418FC9) ] coclass LgInputMethodEditor - { - interface ILgInputMethodEditor; - }; - - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("02C3F580-796D-4B5F-BE43-166D97319DA5") cpp_quote(",") cpp_quote("LgFontManager") cpp_quote(");") [ uuid(02C3F580-796D-4B5F-BE43-166D97319DA5) ] coclass LgFontManager - { - interface ILgFontManager; - }; - #line 498 "d:\\fwrepo\\fw\\src\\language\\Language.idh" - - @@ -5326,140 +5158,6 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 -cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgKeymanHandler") cpp_quote(",") cpp_quote("3F42144B-509F-4def-8DD3-6D8D26677001") cpp_quote(");") [ uuid("3F42144B-509F-4def-8DD3-6D8D26677001"), object, pointer_default(unique) ] interface ILgKeymanHandler : IUnknown -{ - - - - - - - HRESULT Init( - [in] ComBool fForce); - - - - HRESULT Close(); - - - [propget] HRESULT NLayout( - [out, retval] int * pclayout); - - [propget] HRESULT Name( - [in] int ilayout, - [out, retval] BSTR * pbstrName); - - [propget] HRESULT ActiveKeyboardName( - [out, retval] BSTR * pbstrName); - [propput] HRESULT ActiveKeyboardName( - [in] BSTR bstrName); - - [propget] HRESULT KeymanWindowsMessage( - [out, retval] int * pwm); - -}; - - - - - - - - - - - - - - - - - - - - -cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgTextServices") cpp_quote(",") cpp_quote("5B6303DE-E635-4DD7-A7FC-345BEEF352D8") cpp_quote(");") [ uuid("5B6303DE-E635-4DD7-A7FC-345BEEF352D8"), object, pointer_default(unique) ] interface ILgTextServices : IUnknown -{ - - HRESULT SetKeyboard( - [in] int nLcid, - [in] BSTR bstrKeymanKbd, - [in, out] int * pnActiveLangId, - [in, out] BSTR * pbstrActiveKeymanKbd, - [in, out] ComBool * pfSelectLangPending - ); -}; - - - - - - - - - - - - - - - -cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgCodePageEnumerator") cpp_quote(",") cpp_quote("2CFCF4B7-2FFE-4CF8-91BE-FBB57CC7782A") cpp_quote(");") [ uuid("2CFCF4B7-2FFE-4CF8-91BE-FBB57CC7782A"), object, pointer_default(unique) ] interface ILgCodePageEnumerator : IUnknown -{ - - - - HRESULT Init(); - - - HRESULT Next( - [out] int * pnId, - [out] BSTR * pbstrName); -}; - - - - - - - - - - - - - - - -cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgLanguageEnumerator") cpp_quote(",") cpp_quote("746A16E1-0C36-4268-A261-E8012B0D67C5") cpp_quote(");") [ uuid("746A16E1-0C36-4268-A261-E8012B0D67C5"), object, pointer_default(unique) ] interface ILgLanguageEnumerator : IUnknown -{ - - - - HRESULT Init(); - - - - HRESULT Next( - [out] int * pnId, - [out] BSTR * pbstrName); -}; - - - - - - - - - - - - - - - - cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgIcuConverterEnumerator") cpp_quote(",") cpp_quote("8E6D558E-8755-4EA1-9FF6-039D375312E9") cpp_quote(");") [ uuid("8E6D558E-8755-4EA1-9FF6-039D375312E9"), object, pointer_default(unique) ] interface ILgIcuConverterEnumerator : IUnknown { @@ -5724,22 +5422,6 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IRegexMatcher") cpp interface ILgNumericEngine; }; - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("69ACA99C-F852-4C2C-9B5F-FF83238A17A5") cpp_quote(",") cpp_quote("LgKeymanHandler") cpp_quote(");") [ uuid(69ACA99C-F852-4C2C-9B5F-FF83238A17A5) ] coclass LgKeymanHandler - { - interface ILgKeymanHandler; - }; - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("720485C5-E8D5-4761-92F0-F70D2B3CF980") cpp_quote(",") cpp_quote("LgTextServices") cpp_quote(");") [ uuid(720485C5-E8D5-4761-92F0-F70D2B3CF980) ] coclass LgTextServices - { - interface ILgTextServices; - }; - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("9045F113-8626-41C0-A61E-A73FBE5920D1") cpp_quote(",") cpp_quote("LgCodePageEnumerator") cpp_quote(");") [ uuid(9045F113-8626-41C0-A61E-A73FBE5920D1) ] coclass LgCodePageEnumerator - { - interface ILgCodePageEnumerator; - }; - cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("B887505B-74DE-4ADC-A1D9-5553428C8D02") cpp_quote(",") cpp_quote("LgLanguageEnumerator") cpp_quote(");") [ uuid(B887505B-74DE-4ADC-A1D9-5553428C8D02) ] coclass LgLanguageEnumerator - { - interface ILgLanguageEnumerator; - }; cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("9E729461-F80D-4796-BA17-086BC61907F1") cpp_quote(",") cpp_quote("LgIcuConverterEnumerator") cpp_quote(");") [ uuid(9E729461-F80D-4796-BA17-086BC61907F1) ] coclass LgIcuConverterEnumerator { interface ILgIcuConverterEnumerator; @@ -5756,7 +5438,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IRegexMatcher") cpp { interface ILgIcuLocaleEnumerator; }; -#line 2118 "d:\\fwrepo\\fw\\src\\language\\Language.idh" +#line 1800 "d:\\fwrepo\\fw\\src\\language\\Language.idh" #line 34 "d:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" }; diff --git a/Lib/linux/Common/LanguageTlb.tlb b/Lib/linux/Common/LanguageTlb.tlb index db0f444a7e65ee6b8fc6c46774975a484d6df075..ec1f4708b9ed0eefa588f0dd2593088643f0862f 100644 GIT binary patch delta 11719 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

H?}}FCZOlPbgCCWl|mK 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 diff --git a/Lib/linux/Common/ViewsTlb.h b/Lib/linux/Common/ViewsTlb.h index eae757a7e1..9a94e9478d 100644 --- a/Lib/linux/Common/ViewsTlb.h +++ b/Lib/linux/Common/ViewsTlb.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Wed May 29 18:54:41 2013 +/* at Wed Jun 05 12:23:51 2013 */ /* Compiler settings for d:\fwrepo\fw\Output\Common\ViewsTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 @@ -856,7 +856,7 @@ enum VwBoundaryMark GENERIC_DECLARE_SMART_INTERFACE_PTR( IVwRootBox , -85DB7D7D-D47B-440e-A213-F62D5224C982 +A8944421-3A75-4DD5-A469-2EE251228A26 ); ATTACH_GUID_TO_CLASS(class, 705C1A9A-D6DC-4C3F-9B29-85F0C4F4B7BE @@ -5299,7 +5299,7 @@ e41668f7-d506-4c8a-a5d7-feae5630797e #if defined(__cplusplus) && !defined(CINTERFACE) - MIDL_INTERFACE("85DB7D7D-D47B-440e-A213-F62D5224C982") + MIDL_INTERFACE("A8944421-3A75-4DD5-A469-2EE251228A26") IVwRootBox : public IVwNotifyChange { public: @@ -5591,13 +5591,6 @@ e41668f7-d506-4c8a-a5d7-feae5630797e /* [in] */ int ysTop, /* [in] */ int dysHeight) = 0; - virtual HRESULT STDMETHODCALLTYPE SetKeyboardForWs( - /* [in] */ /* external definition not present */ ILgWritingSystem *pws, - /* [out][in] */ BSTR *pbstrActiveKeymanKbd, - /* [out][in] */ int *pnActiveLangId, - /* [out][in] */ int *phklActive, - /* [out][in] */ ComBool *pfSelectLangPending) = 0; - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MaxParasToScan( /* [retval][out] */ int *pcParas) = 0; @@ -5996,14 +5989,6 @@ e41668f7-d506-4c8a-a5d7-feae5630797e /* [in] */ int ysTop, /* [in] */ int dysHeight); - HRESULT ( STDMETHODCALLTYPE *SetKeyboardForWs )( - IVwRootBox * This, - /* [in] */ /* external definition not present */ ILgWritingSystem *pws, - /* [out][in] */ BSTR *pbstrActiveKeymanKbd, - /* [out][in] */ int *pnActiveLangId, - /* [out][in] */ int *phklActive, - /* [out][in] */ ComBool *pfSelectLangPending); - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MaxParasToScan )( IVwRootBox * This, /* [retval][out] */ int *pcParas); @@ -6239,9 +6224,6 @@ e41668f7-d506-4c8a-a5d7-feae5630797e #define IVwRootBox_DrawRoot2(This,pvg,rcSrc,rcDst,fDrawSel,ysTop,dysHeight) \ ( (This)->lpVtbl -> DrawRoot2(This,pvg,rcSrc,rcDst,fDrawSel,ysTop,dysHeight) ) -#define IVwRootBox_SetKeyboardForWs(This,pws,pbstrActiveKeymanKbd,pnActiveLangId,phklActive,pfSelectLangPending) \ - ( (This)->lpVtbl -> SetKeyboardForWs(This,pws,pbstrActiveKeymanKbd,pnActiveLangId,phklActive,pfSelectLangPending) ) - #define IVwRootBox_get_MaxParasToScan(This,pcParas) \ ( (This)->lpVtbl -> get_MaxParasToScan(This,pcParas) ) diff --git a/Lib/linux/Common/ViewsTlb.idl b/Lib/linux/Common/ViewsTlb.idl index a7ee1d2b14..f43f8a73ad 100644 --- a/Lib/linux/Common/ViewsTlb.idl +++ b/Lib/linux/Common/ViewsTlb.idl @@ -1797,7 +1797,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 - cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IVwRootBox") cpp_quote(",") cpp_quote("85DB7D7D-D47B-440e-A213-F62D5224C982") cpp_quote(");") [ uuid("85DB7D7D-D47B-440e-A213-F62D5224C982"), object, pointer_default(unique) ] interface IVwRootBox : IVwNotifyChange + cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IVwRootBox") cpp_quote(",") cpp_quote("A8944421-3A75-4DD5-A469-2EE251228A26") cpp_quote(");") [ uuid("A8944421-3A75-4DD5-A469-2EE251228A26"), object, pointer_default(unique) ] interface IVwRootBox : IVwNotifyChange { @@ -2479,18 +2479,6 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 - HRESULT SetKeyboardForWs( - [in] ILgWritingSystem * pws, - [in, out] BSTR * pbstrActiveKeymanKbd, - [in, out] int * pnActiveLangId, - [in, out] int * phklActive, - [in, out] ComBool * pfSelectLangPending); - - - - - - @@ -2542,7 +2530,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwRootBox; }; -#line 2413 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 2401 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -4385,14 +4373,14 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 -#line 4256 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 4244 "d:\\fwrepo\\fw\\src\\views\\Views.idh" }; cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("CCE2A7ED-464C-4ec7-A0B0-E3C1F6B94C5A") cpp_quote(",") cpp_quote("VwStylesheet") cpp_quote(");") [ uuid(CCE2A7ED-464C-4ec7-A0B0-E3C1F6B94C5A) ] coclass VwStylesheet { interface IVwStylesheet; }; -#line 4263 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 4251 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -4469,7 +4457,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwPropertyStore; }; - #line 4340 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 4328 "d:\\fwrepo\\fw\\src\\views\\Views.idh" typedef [v1_enum] enum VwOverlayFlags @@ -4753,7 +4741,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwOverlay; }; - #line 4624 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 4612 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -4965,7 +4953,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwPrintContext; }; - #line 4836 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 4824 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5276,7 +5264,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwPattern; }; - #line 5147 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5135 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5310,7 +5298,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 interface IVwTxtSrcInit2; interface IVwTextSource; }; - #line 5181 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5169 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5342,7 +5330,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 interface IVwTxtSrcInit; interface IVwTextSource; }; - #line 5213 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5201 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5384,7 +5372,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwSearchKiller; }; - #line 5255 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5243 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5464,7 +5452,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwDrawRootBuffered; }; - #line 5335 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5323 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5512,7 +5500,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwSynchronizer; }; - #line 5383 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5371 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5681,7 +5669,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("1CD09E06-6978-4969-A1FC-4627 { interface IVwLayoutStream; }; -#line 5552 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 5540 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5794,7 +5782,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IVwLayoutManager") { interface IPictureFactory; }; -#line 5665 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 5653 "d:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -6028,7 +6016,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IVwLayoutManager") { interface IVwWindow; }; - #line 5899 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5887 "d:\\fwrepo\\fw\\src\\views\\Views.idh" typedef [v1_enum] enum VwMouseEvent diff --git a/Lib/linux/Common/ViewsTlb.tlb b/Lib/linux/Common/ViewsTlb.tlb index 22083d48565b16fa3229df3753f1ba992a77db8a..8c0a665cb77973a586369486e6f4a5c74fadfe29 100644 GIT binary patch delta 10019 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 diff --git a/Lib/linux/Common/idhfiles.MD5 b/Lib/linux/Common/idhfiles.MD5 index 51eccb70aa..3409b97f41 100644 --- a/Lib/linux/Common/idhfiles.MD5 +++ b/Lib/linux/Common/idhfiles.MD5 @@ -1 +1 @@ -575c321c23f54e1da6add1766c445c56 \ No newline at end of file +fb188e895c550f50d43b9d929daa0ce8 \ No newline at end of file diff --git a/Lib/src/SilUtils/Win32Wrappers.cs b/Lib/src/SilUtils/Win32Wrappers.cs index 7f521eaf5d..b159eb930f 100644 --- a/Lib/src/SilUtils/Win32Wrappers.cs +++ b/Lib/src/SilUtils/Win32Wrappers.cs @@ -3428,12 +3428,59 @@ public enum NotificationMessages #region Imm32.dll + ///

+ /// These values are used with the ImmGetConversionStatus and ImmSetConversionStatus functions. + /// + [Flags] + public enum IME_CMODE: uint + { + /// Alphanumeric input mode. This is the default. + ALPHANUMERIC = 0x0000, + /// Set to 1 if NATIVE mode; 0 if ALPHANUMERIC mode. + NATIVE = 0x0001, + /// Set to 1 if KATAKANA mode; 0 if HIRAGANA mode. + KATAKANA = 0x0002, // only effect under IME_CMODE_NATIVE + /// Set to 1 if full shape mode; 0 if half shape mode. + FULLSHAPE = 0x0008, + /// Set to 1 if ROMAN input mode; 0 if not. + ROMAN = 0x0010, + /// Set to 1 if character code input mode; 0 if not. + CHARCODE = 0x0020, + /// Set to 1 if HANJA convert mode; 0 if not. + HANJACONVERT = 0x0040, + /// Set to 1 if Soft Keyboard mode; 0 if not. + SOFTKBD = 0x0080, + /// Set to 1 to prevent processing of conversions by IME; 0 if not. + NOCONVERSION = 0x0100, + /// Set to 1 if EUDC conversion mode; 0 if not. + EUDC = 0x0200, + /// Set to 1 if SYMBOL conversion mode; 0 if not. + SYMBOL = 0x0400, + /// Set to 1 if fixed conversion mode; 0 if not. + FIXED = 0x0800, + } + + /// ------------------------------------------------------------------------------------ + /// + /// Determines if the specified input locale has an IME. + /// + /// Input locale identifier. + /// Returns a true if the specified locale has an IME, or false + /// otherwise. + /// ------------------------------------------------------------------------------------ + [DllImport("imm32.dll", CharSet = CharSet.Auto)] + public static extern bool ImmIsIME(HandleRef hKL); + /// ------------------------------------------------------------------------------------ /// /// Retrieve the input context associated with the specified window. /// /// The window handle. /// Returns the handle to the input context. + /// An application should routinely use this function to retrieve the current + /// input context before attempting to access information in the context. + /// The application must call ImmReleaseContext when it is finished with the input + /// context. /// ------------------------------------------------------------------------------------ [DllImport("imm32.dll", CharSet=CharSet.Auto)] public static extern IntPtr ImmGetContext(HandleRef hWnd); diff --git a/Src/Common/COMInterfaces/IcuWrappers.cs b/Src/Common/COMInterfaces/IcuWrappers.cs index 8f7213d360..c38fe7823f 100644 --- a/Src/Common/COMInterfaces/IcuWrappers.cs +++ b/Src/Common/COMInterfaces/IcuWrappers.cs @@ -889,6 +889,29 @@ public static int GetLanguageCode(string localeID, out string language, out UErr } } + /// ------------------------------------------------------------------------------------ + /// + /// Gets the language code for the specified locale. + /// + /// the locale to get the language code with + /// the language code for the locale. + /// Thrown if ICU method fails with an error. + /// + /// ------------------------------------------------------------------------------------ + public static string GetLanguageCode(string locale) + { + string languageCode; + UErrorCode err; + GetLanguageCode(locale, out languageCode, out err); + if (err != UErrorCode.U_ZERO_ERROR) + { + throw new ArgumentException( + string.Format("ICU uloc_getLanguage with argument '{0}' failed with error {1}", locale, err), + "locale"); + } + return languageCode; + } + /// ------------------------------------------------------------------------------------ /// /// Gets the script code for the specified locale. @@ -975,6 +998,29 @@ public static int GetCountryCode(string localeID, out string country, out UError } } + /// ------------------------------------------------------------------------------------ + /// + /// Gets the country code for the specified locale. + /// + /// the locale to get the country code with + /// The country code for the locale. + /// Thrown if ICU method fails with an error. + /// + /// ------------------------------------------------------------------------------------ + public static string GetCountryCode(string locale) + { + string countryCode; + UErrorCode err; + GetCountryCode(locale, out countryCode, out err); + if (err != UErrorCode.U_ZERO_ERROR) + { + throw new ArgumentException( + string.Format("ICU uloc_getCountry with argument '{0}' failed with error {1}", locale, err), + "locale"); + } + return countryCode; + } + /// ------------------------------------------------------------------------------------ /// /// Gets the variant code for the specified locale. diff --git a/Src/Common/CoreImpl/PalasoWritingSystem.cs b/Src/Common/CoreImpl/PalasoWritingSystem.cs index c8b309dfd8..8eff8d72bc 100644 --- a/Src/Common/CoreImpl/PalasoWritingSystem.cs +++ b/Src/Common/CoreImpl/PalasoWritingSystem.cs @@ -332,9 +332,13 @@ public override string DefaultFontName } /// - /// Gets or sets the Windows locale ID. + /// Gets or sets the Windows locale ID, consisting of sort-id (4 bits) and language-id + /// (16 bits, low word). /// - /// The LCID. + /// NOTE: the LCID consists of sort-id (4 bits) and language id (16bits, low + /// word). This is different from the input locale identifier (ILID), which consist of + /// input method id (16 bits) and language id (16 bits, low word). Often LCID and ILID + /// will be the same, but not necessarily. public int LCID { get diff --git a/Src/Common/Framework/Framework.csproj b/Src/Common/Framework/Framework.csproj index 3e9389b968..85f3846540 100644 --- a/Src/Common/Framework/Framework.csproj +++ b/Src/Common/Framework/Framework.csproj @@ -113,10 +113,6 @@ ..\..\..\Output\Debug\COMInterfaces.dll False - - ..\..\..\Output\Debug\Controls.Design.dll - False - False ..\..\..\Output\Debug\CoreImpl.dll @@ -150,6 +146,10 @@ ..\..\..\Bin\Interop.IWshRuntimeLibrary.dll False + + False + ..\..\..\Output\Debug\Keyboarding.dll + False ..\..\..\DistFiles\Microsoft.Practices.ServiceLocation.dll diff --git a/Src/Common/Framework/FwMainWnd.cs b/Src/Common/Framework/FwMainWnd.cs index 71c53916f7..e75756280e 100644 --- a/Src/Common/Framework/FwMainWnd.cs +++ b/Src/Common/Framework/FwMainWnd.cs @@ -32,6 +32,7 @@ using SIL.FieldWorks.Resources; using SIL.Utils; using XCore; +using SIL.FieldWorks.Common.Keyboarding; namespace SIL.FieldWorks.Common.Framework { @@ -2825,9 +2826,8 @@ protected virtual bool OnFileProjectProperties(object args) // so we manually switch to the default keyboard here so that the Project Properties // dialog displays the default keyboard. When we're all done we switch back to the // keyboard we had recently. (TE-4683) - int oldWs = 0; - if (EditingHelper != null) // JohnT: guard against e.g. TE-6543. - oldWs = EditingHelper.SetKeyboardForWs(-1); + var keyboard = KeyboardController.ActiveKeyboard; + // Disable windows on cache to prevent painting when fonts for writing system are changed m_app.EnableMainWindows(false); bool fDbRenamed = false; @@ -2879,8 +2879,7 @@ protected virtual bool OnFileProjectProperties(object args) if (!IsDisposed) { // Restore the previous keyboard - if (oldWs != 0 && EditingHelper != null) - EditingHelper.SetKeyboardForWs(oldWs); + KeyboardController.SetKeyboard(keyboard); } } } diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs index f85dbecb72..d9e252c429 100644 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs +++ b/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs @@ -8,7 +8,7 @@ // -------------------------------------------------------------------------------------------- using System; -namespace SIL.FieldWorks.Common.Keyboarding +namespace SIL.FieldWorks.Common.Keyboarding.Interfaces { /// /// Interface that needs to be implemented by the view/document. This interface allows the diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardDescription.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardDescription.cs index b5da23c089..dadef64b8d 100644 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardDescription.cs +++ b/Src/Common/Keyboarding/Interfaces/IKeyboardDescription.cs @@ -8,7 +8,7 @@ // -------------------------------------------------------------------------------------------- using System; -namespace SIL.FieldWorks.Common.Keyboarding +namespace SIL.FieldWorks.Common.Keyboarding.Interfaces { /// /// The different keyboard types we're supporting. @@ -33,7 +33,7 @@ public interface IKeyboardDescription /// /// Gets an identifier of the language/keyboard layout /// - int Id { get; } + string Id { get; } /// /// Gets the type of this keyboard (system or other) @@ -41,14 +41,16 @@ public interface IKeyboardDescription KeyboardType Type { get; } /// - /// Gets a human-readable name of the language. + /// Gets a human-readable name of the input language. /// string Name { get; } /// - /// Gets the keyboard adaptor that handles this keyboard. + /// The Locale of the keyboard in the format languagecode2-country/regioncode2. + /// This is mainly significant on Windows, which distinguishes (for example) + /// a German keyboard used in Germany, Switzerland, and Holland. /// - IKeyboardAdaptor Engine { get; } + string Locale { get; } /// /// Activate this keyboard layout. diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardErrorDescription.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardErrorDescription.cs index 0ee35831b4..5b91ef6d0b 100644 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardErrorDescription.cs +++ b/Src/Common/Keyboarding/Interfaces/IKeyboardErrorDescription.cs @@ -8,7 +8,7 @@ // -------------------------------------------------------------------------------------------- using System; -namespace SIL.FieldWorks.Common.Keyboarding +namespace SIL.FieldWorks.Common.Keyboarding.Interfaces { /// /// Describes a keyboard layout that either gave an exception or other error trying to diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardEventHandler.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardEventHandler.cs index fa35cd4968..31ff43907f 100644 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardEventHandler.cs +++ b/Src/Common/Keyboarding/Interfaces/IKeyboardEventHandler.cs @@ -8,8 +8,9 @@ // -------------------------------------------------------------------------------------------- using System; using System.Drawing; +using System.Windows.Forms; -namespace SIL.FieldWorks.Common.Keyboarding +namespace SIL.FieldWorks.Common.Keyboarding.Interfaces { /// /// The different types of a selection change @@ -29,6 +30,9 @@ public enum SelChangeType Deleted = 4, } + // TODO EberhardB: address JohnT's review comments on + // https://gerrit.lsdev.sil.org/#/c/1241/8/Src/Common/Keyboarding/Interfaces/IKeyboardEventHandler.cs + /// /// Event handler that the keyboard controller or the keyboard implements to get notified /// about changes and events in the view/document. @@ -80,5 +84,19 @@ bool OnMouseEvent(IKeyboardCallback callback, int xd, int yd, Rectangle rcSrc, /// /// Corresponding C++ method is VwTextStore::OnDocChange. void OnTextChange(IKeyboardCallback callback); + + /// + /// Called when the control receives focus + /// + /// The keyboard active for the control + /// The control that receives focus + void OnSetFocus(IKeyboardDescription keyboard, Control control); + + /// + /// Called when the control loses focus + /// + /// The keyboard active for the control + /// The control that loses focus + void OnKillFocus(IKeyboardDescription keyboard, Control control); } } diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs index e92beaac96..e07fb24da2 100644 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs +++ b/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs @@ -8,7 +8,7 @@ // -------------------------------------------------------------------------------------------- using System; -namespace SIL.FieldWorks.Common.Keyboarding +namespace SIL.FieldWorks.Common.Keyboarding.Interfaces { /// /// This interface provides additional methods for keyboards @@ -20,16 +20,6 @@ public interface IKeyboardMethods /// void TerminateAllCompositions(IKeyboardCallback callback); - /// - /// Activate the input method - /// - void SetFocus(IKeyboardCallback callback); - - /// - /// Deactivate the input method - /// - void KillFocus(IKeyboardCallback callback); - /// /// Gets a value indicating whether a composition window is active. /// @@ -55,10 +45,5 @@ public interface IKeyboardMethods /// /// Corresponding C++ method is VwTextStore::OnLoseFocus. void DisableInput(IKeyboardCallback callback); - - /// - /// Gets the active keyboard. - /// - IKeyboardDescription ActiveKeyboard { get; } } } diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardAdaptor.cs b/Src/Common/Keyboarding/InternalInterfaces/IKeyboardAdaptor.cs similarity index 79% rename from Src/Common/Keyboarding/Interfaces/IKeyboardAdaptor.cs rename to Src/Common/Keyboarding/InternalInterfaces/IKeyboardAdaptor.cs index faa0758493..7f026e33aa 100644 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardAdaptor.cs +++ b/Src/Common/Keyboarding/InternalInterfaces/IKeyboardAdaptor.cs @@ -8,13 +8,14 @@ // -------------------------------------------------------------------------------------------- using System; using System.Collections.Generic; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; -namespace SIL.FieldWorks.Common.Keyboarding +namespace SIL.FieldWorks.Common.Keyboarding.InternalInterfaces { /// /// Methods and properties for dealing with keyboards /// - public interface IKeyboardAdaptor + internal interface IKeyboardAdaptor { /// /// Initialize the installed keyboards @@ -36,10 +37,7 @@ public interface IKeyboardAdaptor /// Activates the keyboard /// /// The keyboard to activate - /// A second keyboard (usually a system keyboard) that, - /// depending on the implementation, might also get activated when this keyboard gets - /// activated, or null. - void ActivateKeyboard(IKeyboardDescription keyboard, IKeyboardDescription systemKeyboard); + void ActivateKeyboard(IKeyboardDescription keyboard); /// /// Deactivates the keyboard diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardController.cs b/Src/Common/Keyboarding/InternalInterfaces/IKeyboardController.cs similarity index 52% rename from Src/Common/Keyboarding/Interfaces/IKeyboardController.cs rename to Src/Common/Keyboarding/InternalInterfaces/IKeyboardController.cs index fa5baa6a4d..e8197ddb06 100644 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardController.cs +++ b/Src/Common/Keyboarding/InternalInterfaces/IKeyboardController.cs @@ -8,38 +8,48 @@ // -------------------------------------------------------------------------------------------- using System; using System.Collections.Generic; +using SIL.CoreImpl; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.Types; -namespace SIL.FieldWorks.Common.Keyboarding.Interfaces +namespace SIL.FieldWorks.Common.Keyboarding.InternalInterfaces { /// /// Internal interface for the implementation of the keyboard controller. Implement this /// interface if you want to provide a double for unit testing. Otherwise the default /// implementation is sufficient. /// - interface IKeyboardController: IDisposable + internal interface IKeyboardController: IDisposable { /// - /// Tries to get the keyboard specified by or (if - /// not found) . Returns KeyboardDescription.Zero if - /// no keyboard can be found. + /// Tries to get the keyboard with the specified . /// - IKeyboardDescription GetKeyboard(int? lcid, string otherImKeyboard); - /// - IKeyboardDescription GetKeyboard(int lcid); - /// - IKeyboardDescription GetKeyboard(string otherImKeyboard); + /// + /// Returns KeyboardDescription.Zero if no keyboard can be found. + /// + IKeyboardDescription GetKeyboard(string layoutName); + + IKeyboardDescription GetKeyboard(string layoutName, string locale); /// - /// Sets the keyboard. + /// Tries to get the keyboard for the specified . /// - /// Keyboard identifier of system keyboard - /// Identifier for other input method keyboard (Keyman/ibus) - /// - /// The active keyboard lcid. - /// Active other input method keyboard. - /// - void SetKeyboard(int lcid, string otherImKeyboard, ref int nActiveLangId, - ref string activeOtherImKeyboard, ref bool fSelectLangPending); + /// + /// Returns KeyboardDescription.Zero if no keyboard can be found. + /// + IKeyboardDescription GetKeyboard(IWritingSystem writingSystem); + + /// + /// Sets the keyboard + /// + void SetKeyboard(IKeyboardDescription keyboard); + + void SetKeyboard(string layoutName); + + void SetKeyboard(string layoutName, string locale); + + // TODO: Change param type to IWritingSystemDefinition + void SetKeyboard(IWritingSystem writingSystem); /// /// Gets the installed keyboard layouts/languages. @@ -56,14 +66,21 @@ void SetKeyboard(int lcid, string otherImKeyboard, ref int nActiveLangId, /// /// Gets the available keyboards /// - Dictionary Keyboards { get; } + KeyboardCollection Keyboards { get; } /// - /// Gets or sets the implementation of the internal event handlers. + /// Gets or sets the implementation of the internal event handlers. Can be set + /// in unit tests to replace parts of the implementation. /// IKeyboardEventHandler InternalEventHandler { get; set; } /// - /// Gets or sets the implementation of the internal methods. + /// Gets or sets the implementation of the internal methods. Can be set + /// in unit tests to replace parts of the implementation. /// IKeyboardMethods InternalMethods { get; set; } + + /// + /// Gets or sets the currently active keyboard + /// + IKeyboardDescription ActiveKeyboard { get; set; } } } diff --git a/Src/Common/Keyboarding/KeyboardController.cs b/Src/Common/Keyboarding/KeyboardController.cs index 5d90e45e0c..86ca515617 100644 --- a/Src/Common/Keyboarding/KeyboardController.cs +++ b/Src/Common/Keyboarding/KeyboardController.cs @@ -10,7 +10,9 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using SIL.CoreImpl; using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; using SIL.Utils; #if __MonoCS__ using SIL.FieldWorks.Views; @@ -18,6 +20,7 @@ #else using SIL.FieldWorks.Common.Keyboarding.Windows; #endif +using SIL.FieldWorks.Common.Keyboarding.Types; namespace SIL.FieldWorks.Common.Keyboarding { @@ -37,7 +40,7 @@ public static class Manager /// /// Sets the available keyboard adaptors /// - public static void SetKeyboardAdaptors(IKeyboardAdaptor[] adaptors) + internal static void SetKeyboardAdaptors(IKeyboardAdaptor[] adaptors) { if (SingletonsContainer.Contains()) { @@ -71,7 +74,7 @@ public static void Reset() #if __MonoCS__ new XkbKeyboardAdaptor(), new IbusKeyboardAdaptor() #else - new WinKeyboardAdaptor(), new KeymanKeyboardAdapter() + new WinKeyboardAdaptor() #endif }); } @@ -86,29 +89,26 @@ internal static void InitializeAdaptors() /// /// Adds a keyboard to the list of installed keyboards /// - /// Identifier of the language/keyboard layout (LCID), or hash code - /// of the keyboard name. /// Keyboard description object - public static void RegisterKeyboard(int lcid, IKeyboardDescription description) + public static void RegisterKeyboard(IKeyboardDescription description) { - Debug.Assert(!Instance.Keyboards.ContainsKey(lcid), - String.Format("KeyboardController.Manager.RegisterKeyboard called with duplicate keyboard lcid '{0}', with description '{1}'.", lcid, description)); - - Instance.Keyboards[lcid] = description; + if (!Instance.Keyboards.Contains(description)) + Instance.Keyboards.Add(description); } } #endregion #region Class KeyboardControllerImpl - private class KeyboardControllerImpl: IKeyboardController, IDisposable + private sealed class KeyboardControllerImpl: IKeyboardController, IDisposable { - public Dictionary Keyboards { get; private set; } + public KeyboardCollection Keyboards { get; private set; } public IKeyboardEventHandler InternalEventHandler { get; set; } public IKeyboardMethods InternalMethods { get; set; } public KeyboardControllerImpl() { - Keyboards = new Dictionary(); + Keyboards = new KeyboardCollection(); + ActiveKeyboard = new KeyboardDescriptionNull(); } #region Disposable stuff @@ -131,7 +131,7 @@ public void Dispose() } /// - protected virtual void Dispose(bool fDisposing) + private void Dispose(bool fDisposing) { System.Diagnostics.Debug.WriteLineIf(!fDisposing, "****** Missing Dispose() call for " + GetType() + ". *******"); @@ -149,53 +149,65 @@ protected virtual void Dispose(bool fDisposing) } #endregion - /// - /// Tries to get the keyboard specified by or (if - /// not found) . Returns KeyboardDescription.Zero if - /// no keyboard can be found. - /// - public IKeyboardDescription GetKeyboard(int? lcid, string otherImKeyboard) + public IKeyboardDescription GetKeyboard(string layoutNameWithLocale) { - IKeyboardDescription systemKeyboard = null; - IKeyboardDescription otherKeyboard = null; - if (lcid.HasValue) - Keyboards.TryGetValue(lcid.Value, out systemKeyboard); + if (string.IsNullOrEmpty(layoutNameWithLocale)) + return KeyboardDescription.Zero; - if (!string.IsNullOrEmpty(otherImKeyboard)) - Keyboards.TryGetValue(otherImKeyboard.GetHashCode(), out otherKeyboard); - - if (otherKeyboard != null && systemKeyboard != null) - return new KeyboardDescriptionWrapper(systemKeyboard, otherKeyboard); - return systemKeyboard ?? otherKeyboard ?? KeyboardDescription.Zero; + return Keyboards.Contains(layoutNameWithLocale) ? + Keyboards[layoutNameWithLocale] : KeyboardDescription.Zero; } - public IKeyboardDescription GetKeyboard(int lcid) + public IKeyboardDescription GetKeyboard(string layoutName, string locale) { - return GetKeyboard(lcid, null); + if (string.IsNullOrEmpty(layoutName) && string.IsNullOrEmpty(locale)) + return KeyboardDescription.Zero; + + return Keyboards.Contains(layoutName, locale) ? + Keyboards[layoutName, locale] : KeyboardDescription.Zero; } - public IKeyboardDescription GetKeyboard(string otherImKeyboard) + /// + /// Tries to get the keyboard for the specified . + /// + /// + /// Returns KeyboardDescription.Zero if no keyboard can be found. + /// + public IKeyboardDescription GetKeyboard(IWritingSystem writingSystem) { - return GetKeyboard(null, otherImKeyboard); + // TODO: use writingSystem.LocalKeyboard + if (writingSystem == null) + return KeyboardDescription.Zero; + return GetKeyboard(writingSystem.Keyboard); } /// /// Sets the keyboard. /// - /// Keyboard identifier of system keyboard - /// Identifier for other input method keyboard (Keyman/ibus) - /// - /// The active keyboard lcid. - /// Active other input method keyboard. - /// - public void SetKeyboard(int lcid, string otherImKeyboard, ref int nActiveLangId, - ref string activeOtherImKeyboard, ref bool fSelectLangPending) + /// Keyboard layout name + public void SetKeyboard(string layoutName) + { + SetKeyboard(GetKeyboard(layoutName)); + } + + public void SetKeyboard(string layoutName, string locale) { - var keyboard = GetKeyboard(lcid, otherImKeyboard); - keyboard.Activate(); - nActiveLangId = lcid; - activeOtherImKeyboard = otherImKeyboard; - fSelectLangPending = true; + SetKeyboard(GetKeyboard(layoutName, locale)); + } + + public void SetKeyboard(IWritingSystem writingSystem) + { + // TODO: use writingSystem.LocalKeyboard + SetKeyboard(writingSystem.Keyboard); + } + + public void SetKeyboard(IKeyboardDescription keyboard) + { + if (ActiveKeyboard.Id != keyboard.Id) + { + ActiveKeyboard.Deactivate(); + keyboard.Activate(); + } } /// @@ -205,7 +217,7 @@ public List InstalledKeyboards { get { - return Keyboards.Values.ToList(); + return Keyboards.ToList(); } } @@ -224,6 +236,11 @@ public List ErrorKeyboards return Adaptors.SelectMany(adaptor => adaptor.ErrorKeyboards).ToList(); } } + + /// + /// Gets or sets the currently active keyboard + /// + public IKeyboardDescription ActiveKeyboard { get; set; } } #endregion @@ -240,11 +257,14 @@ private static IKeyboardController Create() #if __MonoCS__ var keyboardHelper = new LinuxKeyboardHelper(); -#else - var keyboardHelper = new WindowsKeyboardHelper(); -#endif controller.InternalEventHandler = keyboardHelper; controller.InternalMethods = keyboardHelper; +#else + // On Windows the Views code implements unmanaged VwTextSource + // so that we don't need the InternalEventHandler/InternalMethods. + // It is implemented in unmanaged code for performance reasons + // because it interacts with TSF. +#endif return controller; } @@ -308,62 +328,37 @@ public static List ErrorKeyboards } /// - /// Tries to get the keyboard specified by or (if not - /// found) . Returns KeyboardDescription.Zero if no - /// keyboard can be found. + /// Tries to get the keyboard specified by . + /// Returns KeyboardDescription.Zero if no keyboard can be found. /// - public static IKeyboardDescription GetKeyboard(int? lcid, string otherImKeyboard) + public static IKeyboardDescription GetKeyboard(string layoutName) { - return Instance.GetKeyboard(lcid, otherImKeyboard); + return Instance.GetKeyboard(layoutName); } - /// - /// Tries to get the keyboard specified by . - /// Returns KeyboardDescription.Zero if no keyboard can be found. - /// - public static IKeyboardDescription GetKeyboard(int lcid) + public static IKeyboardDescription GetKeyboard(string layoutName, string locale) { - return Instance.GetKeyboard(lcid); + return Instance.GetKeyboard(layoutName, locale); } - /// - /// Tries to get the keyboard specified by . - /// Returns KeyboardDescription.Zero if no keyboard can be found. - /// - public static IKeyboardDescription GetKeyboard(string otherImKeyboard) + public static IKeyboardDescription GetKeyboard(IWritingSystem writingSystem) { - return Instance.GetKeyboard(otherImKeyboard); + return Instance.GetKeyboard(writingSystem); } - /// - /// Sets the keyboard. - /// - /// Keyboard identifier of system keyboard - /// Identifier for other input method keyboard (Keyman/ibus) - /// - public static void SetKeyboard(int lcid, string otherImKeyboard) + public static void SetKeyboard(IKeyboardDescription keyboard) { - int nActiveLangId = 0; - string activeOtherImKeyboard = string.Empty; - bool fSelectLangPending = false; - Instance.SetKeyboard(lcid, otherImKeyboard, ref nActiveLangId, - ref activeOtherImKeyboard, ref fSelectLangPending); + Instance.SetKeyboard(keyboard); } - /// - /// Sets the keyboard. - /// - /// Keyboard identifier of system keyboard - /// Identifier for other input method keyboard (Keyman/ibus) - /// - /// The active keyboard lcid. - /// Active other input method keyboard. - /// - public static void SetKeyboard(int lcid, string otherImKeyboard, ref int nActiveLangId, - ref string activeOtherImKeyboard, ref bool fSelectLangPending) + public static void SetKeyboard(string layoutName) { - Instance.SetKeyboard(lcid, otherImKeyboard, ref nActiveLangId, - ref activeOtherImKeyboard, ref fSelectLangPending); + Instance.SetKeyboard(layoutName); + } + + public static void SetKeyboard(IWritingSystem writingSystem) + { + Instance.SetKeyboard(writingSystem); } /// @@ -376,8 +371,10 @@ public static void SetKeyboard(int lcid, string otherImKeyboard, ref int nActive /// public static IKeyboardDescription ActiveKeyboard { - get { return Instance.InternalMethods.ActiveKeyboard; } + get { return Instance.ActiveKeyboard; } + internal set { Instance.ActiveKeyboard = value; } } + #endregion } diff --git a/Src/Common/Keyboarding/KeyboardDescription.cs b/Src/Common/Keyboarding/KeyboardDescription.cs index 825f16e79b..5695654cef 100644 --- a/Src/Common/Keyboarding/KeyboardDescription.cs +++ b/Src/Common/Keyboarding/KeyboardDescription.cs @@ -7,6 +7,8 @@ // // -------------------------------------------------------------------------------------------- using System; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; namespace SIL.FieldWorks.Common.Keyboarding { @@ -24,8 +26,8 @@ public class KeyboardDescription: IKeyboardDescription /// Initializes a new instance of the /// class. /// - public KeyboardDescription(int id, string name, IKeyboardAdaptor engine) - : this(id, name, engine, KeyboardType.System) + internal KeyboardDescription(string name, string locale, IKeyboardAdaptor engine) + : this(name, locale, engine, KeyboardType.System) { } @@ -33,18 +35,33 @@ public KeyboardDescription(int id, string name, IKeyboardAdaptor engine) /// Initializes a new instance of the /// class. /// - public KeyboardDescription(int id, string name, IKeyboardAdaptor engine, KeyboardType type) + internal KeyboardDescription(string name, string locale, + IKeyboardAdaptor engine, KeyboardType type) { - Id = id; Name = name; + Locale = locale; Engine = engine; Type = type; } /// - /// Gets an identifier of the language/keyboard layout (LCID). + /// Gets an identifier of the language/keyboard layout. /// - public int Id { get; private set; } + public string Id + { + get + { + return GetId(Locale, Name); + } + } + + /// + /// Gets the identifier for the keyboard based on the provided locale and layout. + /// + public static string GetId(string locale, string layout) + { + return string.Format("{0}_{1}", locale, layout); + } /// /// Gets the type of this keyboard (system or other) @@ -56,10 +73,17 @@ public KeyboardDescription(int id, string name, IKeyboardAdaptor engine, Keyboar /// public string Name { get; private set; } + /// + /// The Locale of the keyboard in the format languagecode2-country/regioncode2. + /// This is mainly significant on Windows, which distinguishes (for example) + /// a German keyboard used in Germany, Switzerland, and Holland. + /// + public string Locale { get; private set; } + /// /// Gets the keyboard adaptor that handles this keyboard. /// - public IKeyboardAdaptor Engine { get; private set; } + internal IKeyboardAdaptor Engine { get; private set; } /// /// Activate this keyboard. @@ -67,7 +91,7 @@ public KeyboardDescription(int id, string name, IKeyboardAdaptor engine, Keyboar public void Activate() { if (Engine != null) - Engine.ActivateKeyboard(this, null); + Engine.ActivateKeyboard(this); } /// @@ -97,7 +121,7 @@ public override bool Equals(object obj) if (obj == null || !(obj is IKeyboardDescription)) return false; var other = (IKeyboardDescription)obj; - return other.Id == Id && other.Name == Name; + return other.Name == Name && other.Locale == Locale; } /// @@ -106,7 +130,7 @@ public override bool Equals(object obj) /// public override int GetHashCode() { - return Id.GetHashCode() ^ Name.GetHashCode() ^ base.GetHashCode(); + return Name.GetHashCode() ^ Locale.GetHashCode(); } } } diff --git a/Src/Common/Keyboarding/KeyboardDescriptionNull.cs b/Src/Common/Keyboarding/KeyboardDescriptionNull.cs index 4b95ab4c8c..fc13141d8c 100644 --- a/Src/Common/Keyboarding/KeyboardDescriptionNull.cs +++ b/Src/Common/Keyboarding/KeyboardDescriptionNull.cs @@ -7,6 +7,8 @@ // // -------------------------------------------------------------------------------------------- using System; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; namespace SIL.FieldWorks.Common.Keyboarding { @@ -24,9 +26,9 @@ public void Deactivate() { } - public int Id + public string Id { - get { return 0; } + get { return string.Empty; } } public KeyboardType Type @@ -39,6 +41,11 @@ public string Name get { return string.Empty; } } + public string Locale + { + get { return string.Empty; } + } + public IKeyboardAdaptor Engine { get diff --git a/Src/Common/Keyboarding/KeyboardDescriptionWrapper.cs b/Src/Common/Keyboarding/KeyboardDescriptionWrapper.cs index 46ad02a841..03337d20b5 100644 --- a/Src/Common/Keyboarding/KeyboardDescriptionWrapper.cs +++ b/Src/Common/Keyboarding/KeyboardDescriptionWrapper.cs @@ -7,6 +7,8 @@ // // -------------------------------------------------------------------------------------------- using System; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; namespace SIL.FieldWorks.Common.Keyboarding { @@ -39,7 +41,8 @@ private IKeyboardDescription PrimaryKeyboard #region IKeyboardDescription implementation public void Activate() { - Engine.ActivateKeyboard(PrimaryKeyboard, m_SystemKeyboard); + throw new NotImplementedException("TODO: remove this class. It's no longer needed"); + //Engine.ActivateKeyboard(PrimaryKeyboard, m_SystemKeyboard); } public void Deactivate() @@ -47,7 +50,7 @@ public void Deactivate() Engine.DeactivateKeyboard(PrimaryKeyboard); } - public int Id + public string Id { get { return PrimaryKeyboard.Id; } } @@ -62,9 +65,20 @@ public string Name get { return PrimaryKeyboard.Name; } } + public string Locale + { + get { return PrimaryKeyboard.Locale; } + } + public IKeyboardAdaptor Engine { - get { return PrimaryKeyboard.Engine; } + get + { + var keyboard = PrimaryKeyboard as KeyboardDescription; + if (keyboard == null) + return null; + return keyboard.Engine; + } } #endregion diff --git a/Src/Common/Keyboarding/KeyboardErrorDescription.cs b/Src/Common/Keyboarding/KeyboardErrorDescription.cs index 96abb1d4a7..d6fa36351a 100644 --- a/Src/Common/Keyboarding/KeyboardErrorDescription.cs +++ b/Src/Common/Keyboarding/KeyboardErrorDescription.cs @@ -7,6 +7,7 @@ // // -------------------------------------------------------------------------------------------- using System; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; namespace SIL.FieldWorks.Common.Keyboarding { diff --git a/Src/Common/Keyboarding/Keyboarding.csproj b/Src/Common/Keyboarding/Keyboarding.csproj index 038d1d3bd1..f5b0452cec 100644 --- a/Src/Common/Keyboarding/Keyboarding.csproj +++ b/Src/Common/Keyboarding/Keyboarding.csproj @@ -68,6 +68,10 @@ False ..\..\..\Output\Debug\BasicUtils.dll + + False + ..\..\..\Output\Debug\CoreImpl.dll + False ..\..\..\Output\Debug\KeyboardSwitcher.dll @@ -92,10 +96,11 @@ + - + @@ -109,11 +114,10 @@ - - - + + diff --git a/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs b/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs index fa2028eef5..9a4e3398d8 100644 --- a/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs +++ b/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs @@ -10,7 +10,11 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Drawing; +using System.Windows.Forms; +using SIL.CoreImpl; using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; +using SIL.FieldWorks.Common.Keyboarding.Types; using SIL.Utils; namespace SIL.FieldWorks.Common.Keyboarding @@ -18,7 +22,7 @@ namespace SIL.FieldWorks.Common.Keyboarding /// /// Implements a fake do-nothing keyboard controller. /// - public sealed class FakeKeyboardController: IKeyboardController, IKeyboardEventHandler, IKeyboardMethods + internal sealed class FakeKeyboardController: IKeyboardController, IKeyboardEventHandler, IKeyboardMethods { /// /// Installs this fake keyboard controller instead of the real one @@ -30,6 +34,11 @@ public static void Install() SingletonsContainer.Add(typeof(IKeyboardController).FullName, new FakeKeyboardController()); } + public FakeKeyboardController() + { + ActiveKeyboard = new KeyboardDescriptionNull(); + } + #region IDisposable implementation public void Dispose() { @@ -37,23 +46,35 @@ public void Dispose() #endregion #region IKeyboardController implementation - public IKeyboardDescription GetKeyboard(int? lcid, string otherImKeyboard) + public IKeyboardDescription GetKeyboard(string layoutName) { return null; } - public IKeyboardDescription GetKeyboard(int lcid) + public IKeyboardDescription GetKeyboard(string layoutName, string locale) { return null; } - public IKeyboardDescription GetKeyboard(string otherImKeyboard) + public IKeyboardDescription GetKeyboard(IWritingSystem writingSystem) { return null; } - public void SetKeyboard(int lcid, string otherImKeyboard, ref int nActiveLangId, - ref string activeOtherImKeyboard, ref bool fSelectLangPending) + + public void SetKeyboard(string layoutName) + { + } + + public void SetKeyboard(string layoutName, string locale) + { + } + + public void SetKeyboard(IKeyboardDescription keyboard) + { + } + + public void SetKeyboard(IWritingSystem writingSystem) { } @@ -73,11 +94,11 @@ public List ErrorKeyboards } } - public Dictionary Keyboards + public KeyboardCollection Keyboards { get { - return new Dictionary(); + return new KeyboardCollection(); } } @@ -117,18 +138,19 @@ public void OnSelectionChange(IKeyboardCallback callback, SelChangeType how) public void OnTextChange(IKeyboardCallback callback) { } - #endregion - #region IKeyboardMethods implementation - public void TerminateAllCompositions(IKeyboardCallback callback) + public void OnSetFocus(IKeyboardDescription keyboard, Control control) { } - public void SetFocus(IKeyboardCallback callback) + public void OnKillFocus(IKeyboardDescription keyboard, Control control) { } - public void KillFocus(IKeyboardCallback callback) + #endregion + + #region IKeyboardMethods implementation + public void TerminateAllCompositions(IKeyboardCallback callback) { } @@ -150,10 +172,7 @@ public void DisableInput(IKeyboardCallback callback) { } - public IKeyboardDescription ActiveKeyboard - { - get { return new KeyboardDescriptionNull(); } - } + public IKeyboardDescription ActiveKeyboard { get; set; } #endregion } diff --git a/Src/Common/Keyboarding/KeyboardingTests/KeyboardingTests.csproj b/Src/Common/Keyboarding/KeyboardingTests/KeyboardingTests.csproj index 51c34921c6..a133c30591 100644 --- a/Src/Common/Keyboarding/KeyboardingTests/KeyboardingTests.csproj +++ b/Src/Common/Keyboarding/KeyboardingTests/KeyboardingTests.csproj @@ -56,6 +56,10 @@ False ..\..\..\..\Output\Debug\BasicUtilsTests.dll + + False + ..\..\..\..\Output\Debug\COMInterfaces.dll + ..\..\..\..\Bin\NUnit\bin\nunit.framework.dll @@ -70,6 +74,7 @@ ..\..\..\..\Output\Debug\CoreImpl.dll + False ..\..\..\..\Output\Debug\TestUtils.dll diff --git a/Src/Common/Keyboarding/KeyboardingTests/XkbKeyboardAdapterTests.cs b/Src/Common/Keyboarding/KeyboardingTests/XkbKeyboardAdapterTests.cs index 9d86f8ee66..b9832350f4 100644 --- a/Src/Common/Keyboarding/KeyboardingTests/XkbKeyboardAdapterTests.cs +++ b/Src/Common/Keyboarding/KeyboardingTests/XkbKeyboardAdapterTests.cs @@ -13,6 +13,7 @@ using System.Runtime.InteropServices; using NUnit.Framework; using SIL.FieldWorks.Common.Keyboarding; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; using SIL.FieldWorks.Common.Keyboarding.Linux; using SIL.FieldWorks.Test.TestUtils; using X11.XKlavier; @@ -124,7 +125,7 @@ public void InstalledKeyboards_USA() KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); var keyboards = KeyboardController.InstalledKeyboards; Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual(1033, keyboards[0].Id); + Assert.AreEqual("en-US_English (United States)", keyboards[0].Id); Assert.AreEqual(ExpectedKeyboardUSA, keyboards[0].Name); Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); } @@ -138,7 +139,7 @@ public void InstalledKeyboards_Germany() KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); var keyboards = KeyboardController.InstalledKeyboards; Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual(1031, keyboards[0].Id); + Assert.AreEqual("de-DE_German (Germany)", keyboards[0].Id); Assert.AreEqual(ExpectedKeyboardGermany, keyboards[0].Name); Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); } @@ -152,7 +153,7 @@ public void InstalledKeyboards_FrenchWithVariant() KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); var keyboards = KeyboardController.InstalledKeyboards; Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual(1036, keyboards[0].Id); + Assert.AreEqual("fr-FR_French (France) - French (eliminate dead keys)", keyboards[0].Id); Assert.AreEqual(ExpectedKeyboardFranceEliminateDeadKeys, keyboards[0].Name); Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); } @@ -166,7 +167,7 @@ public void InstalledKeyboards_GB() KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); var keyboards = KeyboardController.InstalledKeyboards; Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual(2057, keyboards[0].Id); + Assert.AreEqual("en-GB_English (United Kingdom)", keyboards[0].Id); Assert.AreEqual(ExpectedKeyboardUK, keyboards[0].Name); Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); } @@ -185,13 +186,11 @@ public void InstalledKeyboards_Belgium() keyboards.Sort((x, y) => { return x.Id.CompareTo(y.Id); }); var expectedKeyboards = new List() - { new KeyboardDescription(2060, "French (Belgium)", null) }; - // Windows doesn't define German (Belgium), so there is no LCID defined. ICU returns - // some arbitrary number (7 in my case). We cheat and expect what we get here. - expectedKeyboards.Add(new KeyboardDescription(keyboards[0].Id, "German (Belgium)", null)); + { new KeyboardDescription("German (Belgium)", "de-BE", null) }; + expectedKeyboards.Add(new KeyboardDescription("French (Belgium)", "fr-BE", null)); if (keyboards.Count > 2) - expectedKeyboards.Add(new KeyboardDescription(2067, "Dutch (Belgium)", null)); + expectedKeyboards.Add(new KeyboardDescription("Dutch (Belgium)", "nl-BE", null)); CollectionAssert.AreEquivalent(expectedKeyboards, keyboards); Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); @@ -206,9 +205,9 @@ public void InstalledKeyboards_Multiple() KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); var keyboards = KeyboardController.InstalledKeyboards; Assert.AreEqual(2, keyboards.Count); - Assert.AreEqual(1033, keyboards[0].Id); + Assert.AreEqual("en-US_English (United States)", keyboards[0].Id); Assert.AreEqual(ExpectedKeyboardUSA, keyboards[0].Name); - Assert.AreEqual(1031, keyboards[1].Id); + Assert.AreEqual("de-DE_German (Germany)", keyboards[1].Id); Assert.AreEqual(ExpectedKeyboardGermany, keyboards[1].Name); Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); } @@ -226,7 +225,7 @@ public void InstalledKeyboards_Germany_GermanCulture() KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); var keyboards = KeyboardController.InstalledKeyboards; Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual(1031, keyboards[0].Id); + Assert.AreEqual("de-DE_Deutsch (Deutschland)", keyboards[0].Id); Assert.AreEqual("Deutsch (Deutschland)", keyboards[0].Name); Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); } @@ -244,7 +243,7 @@ public void InstalledKeyboards_NorthernSami() KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); var keyboards = KeyboardController.InstalledKeyboards; Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual(59, keyboards[0].Id); + Assert.AreEqual("se-FI_Northern Sami (Finland) - Northern Saami (Finland)", keyboards[0].Id); Assert.AreEqual(ExpectedKeyboardFinlandNorthernSaami, keyboards[0].Name); Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); } @@ -274,7 +273,7 @@ public void ActivateKeyboard_FirstTime_NotCrash() var keyboards = KeyboardController.InstalledKeyboards; - adaptor.ActivateKeyboard(keyboards[0], null); + adaptor.ActivateKeyboard(keyboards[0]); } /// @@ -289,12 +288,12 @@ public void ActivateKeyboard_SecondTime_NotCrash() var adaptor = new XkbKeyboardAdaptor(); KeyboardController.Manager.SetKeyboardAdaptors(new [] { adaptor }); var keyboards = KeyboardController.InstalledKeyboards; - adaptor.ActivateKeyboard(keyboards[0], null); + adaptor.ActivateKeyboard(keyboards[0]); adaptor = new XkbKeyboardAdaptor(); KeyboardController.Manager.SetKeyboardAdaptors(new [] { adaptor }); keyboards = KeyboardController.InstalledKeyboards; - adaptor.ActivateKeyboard(keyboards[0], null); + adaptor.ActivateKeyboard(keyboards[0]); } } } diff --git a/Src/Common/Keyboarding/Linux/IbusKeyboardAdaptor.cs b/Src/Common/Keyboarding/Linux/IbusKeyboardAdaptor.cs index 20606299bd..477d498457 100644 --- a/Src/Common/Keyboarding/Linux/IbusKeyboardAdaptor.cs +++ b/Src/Common/Keyboarding/Linux/IbusKeyboardAdaptor.cs @@ -10,6 +10,8 @@ using System; using System.Collections.Generic; using SIL.FieldWorks.Common.Keyboarding; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; using SIL.FieldWorks.Views; namespace SIL.FieldWorks.Common.Keyboarding.Linux @@ -36,9 +38,9 @@ private void InitKeyboards() for (int i = 0; i < nKeyboards; i++) { var name = m_KeyboardSwitcher.GetKeyboardName(i); - var id = name.GetHashCode(); - var keyboard = new KeyboardDescription(id, name, this, KeyboardType.OtherIm); - KeyboardController.Manager.RegisterKeyboard(id, keyboard); + // REVIEW: what value should we pass as the locale name? + var keyboard = new KeyboardDescription(name, string.Empty, this, KeyboardType.OtherIm); + KeyboardController.Manager.RegisterKeyboard(keyboard); } } @@ -62,12 +64,18 @@ public void Close() m_KeyboardSwitcher = null; } + public void ActivateKeyboard(IKeyboardDescription keyboard) + { + // TODO: implement + } + /// /// Activates the keyboard /// public void ActivateKeyboard(IKeyboardDescription keyboard, IKeyboardDescription systemKeyboard) { + // TODO: Remove once the other overload is implemented m_KeyboardSwitcher.IMEKeyboard = keyboard.Name; if (systemKeyboard != null) diff --git a/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs b/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs index 9c07c91fee..74c717d9b8 100644 --- a/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs +++ b/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs @@ -9,6 +9,9 @@ #if __MonoCS__ using System; using System.Drawing; +using System.Windows.Forms; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; namespace SIL.FieldWorks.Common.Keyboarding.Linux { @@ -17,9 +20,17 @@ namespace SIL.FieldWorks.Common.Keyboarding.Linux /// public class LinuxKeyboardHelper: IKeyboardEventHandler, IKeyboardMethods { - private IKeyboardDescription m_ActiveKeyboard = new KeyboardDescriptionNull(); + public LinuxKeyboardHelper() + { + } + + private void ActivateKeyboard(IKeyboardDescription keyboard) + { + keyboard.Activate(); + KeyboardController.ActiveKeyboard = keyboard; + } - #region IKeyboardEventHandler implementation +#region IKeyboardEventHandler implementation /// /// Called before a property gets updated. /// @@ -37,7 +48,7 @@ public bool OnMouseEvent(IKeyboardCallback callback, int xd, int yd, Rectangle r Rectangle rcDst, MouseEvent mouseEvent) { if (mouseEvent == MouseEvent.kmeDown) - SetFocus(callback); + ActivateKeyboard(callback.Keyboard); return false; } @@ -63,36 +74,38 @@ public void OnSelectionChange(IKeyboardCallback callback, SelChangeType how) public void OnTextChange(IKeyboardCallback callback) { } - #endregion // IKeyboardEventHandler - #region IKeyboardMethods implementation /// - /// End all active compositions. + /// Activate the input method /// - public void TerminateAllCompositions(IKeyboardCallback callback) + public void OnSetFocus(IKeyboardDescription keyboard, Control control) { + ActivateKeyboard(keyboard); } /// - /// Activate the input method + /// Deactivate the input method /// - public void SetFocus(IKeyboardCallback callback) + public void OnKillFocus(IKeyboardDescription keyboard, Control control) { - var keyboard = callback.Keyboard; - keyboard.Activate(); - m_ActiveKeyboard = keyboard; + if (KeyboardController.ActiveKeyboard != null) + { + // REVIEW (JohnT): Are you sure this is enough not to disrupt other programs that + // may not attempt keyboard manipulation? I have a vague recollection of SimpleRootSite + // trying to keep track of the IME that is active for other programs and restore it. + KeyboardController.ActiveKeyboard.Deactivate(); + KeyboardController.ActiveKeyboard = new KeyboardDescriptionNull(); + } } +#endregion // IKeyboardEventHandler + +#region IKeyboardMethods implementation /// - /// Deactivate the input method + /// End all active compositions. /// - public void KillFocus(IKeyboardCallback callback) + public void TerminateAllCompositions(IKeyboardCallback callback) { - if (m_ActiveKeyboard != null) - { - m_ActiveKeyboard.Deactivate(); - m_ActiveKeyboard = new KeyboardDescriptionNull(); - } } /// @@ -129,14 +142,7 @@ public bool IsEndingComposition(IKeyboardCallback callback) return false; } - /// - /// Gets the active keyboard. - /// - public IKeyboardDescription ActiveKeyboard - { - get { return m_ActiveKeyboard; } - } - #endregion +#endregion } } #endif diff --git a/Src/Common/Keyboarding/Linux/XkbKeyboardAdaptor.cs b/Src/Common/Keyboarding/Linux/XkbKeyboardAdaptor.cs index 76b686d0a3..95fae8b4b3 100644 --- a/Src/Common/Keyboarding/Linux/XkbKeyboardAdaptor.cs +++ b/Src/Common/Keyboarding/Linux/XkbKeyboardAdaptor.cs @@ -12,6 +12,8 @@ using System.Diagnostics; using X11.XKlavier; using SIL.FieldWorks.Common.COMInterfaces; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; namespace SIL.FieldWorks.Common.Keyboarding.Linux { @@ -71,7 +73,7 @@ private void InitLocales() var configRegistry = XklConfigRegistry.Create(m_engine); var layouts = configRegistry.Layouts; - var icuLocales = IcuLocalesByLanguageCountry; + //var icuLocales = IcuLocalesByLanguageCountry; for (int iGroup = 0; iGroup < m_engine.GroupNames.Length; iGroup++) { @@ -100,25 +102,26 @@ private void InitLocales() layout.Country, layout.LayoutVariant); } - IcuLocale icuLocale; - int lcid; - if (icuLocales.TryGetValue(layout.Locale, out icuLocale)) - lcid = icuLocale.LCID; - else - lcid = Icu.GetLCID(layout.Locale); - - if (lcid <= 0) - { - if (iLayout == 0) - unrecognizedLayout = groupName; - } - else + // TODO: fix implementation without LCID + //IcuLocale icuLocale; + //int lcid; + //if (icuLocales.TryGetValue(layout.Locale, out icuLocale)) + // lcid = icuLocale.LCID; + //else + // lcid = Icu.GetLCID(layout.Locale); + + //if (lcid <= 0) + //{ + // if (iLayout == 0) + // unrecognizedLayout = groupName; + //} + //else { - // if we find the LCID for at least one layout, we don't report - // the other failing variations of this layout as error. + //// if we find the LCID for at least one layout, we don't report + //// the other failing variations of this layout as error. unrecognizedLayout = null; - var keyboard = new XkbKeyboardDescription(lcid, description, this, iGroup); - KeyboardController.Manager.RegisterKeyboard(lcid, keyboard); + var keyboard = new XkbKeyboardDescription(description, layout.Locale, this, iGroup); + KeyboardController.Manager.RegisterKeyboard(keyboard); } } if (unrecognizedLayout != null) @@ -146,10 +149,10 @@ public void Close() m_engine = null; } - public void ActivateKeyboard(IKeyboardDescription keyboard, - IKeyboardDescription ignored) + public void ActivateKeyboard(IKeyboardDescription keyboard) { - Debug.Assert(keyboard.Engine == this); + Debug.Assert(keyboard is KeyboardDescription); + Debug.Assert(((KeyboardDescription)keyboard).Engine == this); Debug.Assert(keyboard is XkbKeyboardDescription); var xkbKeyboard = keyboard as XkbKeyboardDescription; if (xkbKeyboard == null) diff --git a/Src/Common/Keyboarding/Linux/XkbKeyboardDescription.cs b/Src/Common/Keyboarding/Linux/XkbKeyboardDescription.cs index 947d746ff6..39a5d8d4bc 100644 --- a/Src/Common/Keyboarding/Linux/XkbKeyboardDescription.cs +++ b/Src/Common/Keyboarding/Linux/XkbKeyboardDescription.cs @@ -9,6 +9,7 @@ #if __MonoCS__ using System; using SIL.FieldWorks.Common.Keyboarding; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; namespace SIL.FieldWorks.Common.Keyboarding.Linux { @@ -21,12 +22,12 @@ public class XkbKeyboardDescription: KeyboardDescription /// Initializes a new instance of the /// class. /// - /// Keyboard identifier. /// Name of the keyboard layout + /// The locale of the keyboard /// The keyboard adaptor that will handle this keyboard /// The group index of this xkb keyboard - public XkbKeyboardDescription(int id, string name, IKeyboardAdaptor engine, - int groupIndex): base(id, name, engine) + internal XkbKeyboardDescription(string name, string locale, IKeyboardAdaptor engine, + int groupIndex): base(name, locale, engine) { GroupIndex = groupIndex; } diff --git a/Src/Common/Keyboarding/Linux/XklConfigRegistry.cs b/Src/Common/Keyboarding/Linux/XklConfigRegistry.cs index 0250d3c5ba..8363b7af37 100644 --- a/Src/Common/Keyboarding/Linux/XklConfigRegistry.cs +++ b/Src/Common/Keyboarding/Linux/XklConfigRegistry.cs @@ -21,50 +21,12 @@ namespace X11.XKlavier /// internal class XklConfigRegistry { + #region struct LayoutDescription /// /// XKB keyboard layout description /// public struct LayoutDescription { - #region Alternative language codes - // ICU uses the ISO 639-3 language codes; xkb has at least some ISO 639-2/B codes. - // According to http://en.wikipedia.org/wiki/ISO_639-2#B_and_T_codes there are 20 languages - // that have both B and T codes, so we need to translate those. - private static Dictionary s_AlternateLanguageCodes; - - private Dictionary AlternateLanguageCodes - { - get - { - if (s_AlternateLanguageCodes == null) - { - s_AlternateLanguageCodes = new Dictionary(); - s_AlternateLanguageCodes["alb"] = "sqi"; // Albanian - s_AlternateLanguageCodes["arm"] = "hye"; // Armenian - s_AlternateLanguageCodes["baq"] = "eus"; // Basque - s_AlternateLanguageCodes["bur"] = "mya"; // Burmese - s_AlternateLanguageCodes["chi"] = "zho"; // Chinese - s_AlternateLanguageCodes["cze"] = "ces"; // Czech - s_AlternateLanguageCodes["dut"] = "nld"; // Dutch, Flemish - s_AlternateLanguageCodes["fre"] = "fra"; // French - s_AlternateLanguageCodes["geo"] = "kat"; // Georgian - s_AlternateLanguageCodes["ger"] = "deu"; // German - s_AlternateLanguageCodes["gre"] = "ell"; // Modern Greek (1453–) - s_AlternateLanguageCodes["ice"] = "isl"; // Icelandic - s_AlternateLanguageCodes["mac"] = "mkd"; // Macedonian - s_AlternateLanguageCodes["mao"] = "mri"; // Maori - s_AlternateLanguageCodes["may"] = "msa"; // Malay - s_AlternateLanguageCodes["per"] = "fas"; // Persian - s_AlternateLanguageCodes["rum"] = "ron"; // Romanian - s_AlternateLanguageCodes["slo"] = "slk"; // Slovak - s_AlternateLanguageCodes["tib"] = "bod"; // Tibetan - s_AlternateLanguageCodes["wel"] = "cym"; // Welsh - } - return s_AlternateLanguageCodes; - } - } - #endregion - /// /// Gets or sets the layout identifier. /// @@ -85,30 +47,22 @@ private Dictionary AlternateLanguageCodes public string LayoutVariant { get; internal set; } /// - /// Gets the locale for the current layout + /// Gets the locale for the current layout. Language and country code are + /// separated by '-'. /// + /// The ICU documentation says that the components should be separated by + /// an underscore, but that contradicts the way Windows does it. And ICU seems + /// to understand the '-' as well. public string Locale { - get { return LanguageCode + "_" + CountryCode; } + get { return LanguageCode + "-" + CountryCode; } } - private string m_LanguageCode; /// - /// Gets or sets the 3-letter language abbreviation (mostly ISO 639-2/B). + /// Gets or sets the 2-letter language abbreviation (mostly ISO 639-1). /// - public string LanguageCode - { - get { return m_LanguageCode; } - internal set - { - string langCode; - if (AlternateLanguageCodes.TryGetValue(value, out langCode)) - m_LanguageCode = langCode; - else - m_LanguageCode = value; - } - } + public string LanguageCode { get; internal set;} /// /// Gets the language name in the culture of the current thread @@ -126,13 +80,12 @@ public string Language } /// - /// Gets or sets the 3-letter country abbreviation. This is taken from the short - /// description of the layout converted to uppercase. + /// Gets or sets the country code (mostly 2-letter codes). /// public string CountryCode { get; internal set; } /// - /// Gets the contry name in the culture of the current thread + /// Gets the country name in the culture of the current thread /// public string Country { @@ -154,6 +107,46 @@ public override string ToString() Locale, LanguageCode, Language, CountryCode, Country); } } + #endregion + + #region Alternative language codes + // ICU uses the ISO 639-3 language codes; xkb has at least some ISO 639-2/B codes. + // According to http://en.wikipedia.org/wiki/ISO_639-2#B_and_T_codes there are 20 languages + // that have both B and T codes, so we need to translate those. + private static Dictionary s_AlternateLanguageCodes; + + private Dictionary AlternateLanguageCodes + { + get + { + if (s_AlternateLanguageCodes == null) + { + s_AlternateLanguageCodes = new Dictionary(); + s_AlternateLanguageCodes["alb"] = "sqi"; // Albanian + s_AlternateLanguageCodes["arm"] = "hye"; // Armenian + s_AlternateLanguageCodes["baq"] = "eus"; // Basque + s_AlternateLanguageCodes["bur"] = "mya"; // Burmese + s_AlternateLanguageCodes["chi"] = "zho"; // Chinese + s_AlternateLanguageCodes["cze"] = "ces"; // Czech + s_AlternateLanguageCodes["dut"] = "nld"; // Dutch, Flemish + s_AlternateLanguageCodes["fre"] = "fra"; // French + s_AlternateLanguageCodes["geo"] = "kat"; // Georgian + s_AlternateLanguageCodes["ger"] = "deu"; // German + s_AlternateLanguageCodes["gre"] = "ell"; // Modern Greek (1453–) + s_AlternateLanguageCodes["ice"] = "isl"; // Icelandic + s_AlternateLanguageCodes["mac"] = "mkd"; // Macedonian + s_AlternateLanguageCodes["mao"] = "mri"; // Maori + s_AlternateLanguageCodes["may"] = "msa"; // Malay + s_AlternateLanguageCodes["per"] = "fas"; // Persian + s_AlternateLanguageCodes["rum"] = "ron"; // Romanian + s_AlternateLanguageCodes["slo"] = "slk"; // Slovak + s_AlternateLanguageCodes["tib"] = "bod"; // Tibetan + s_AlternateLanguageCodes["wel"] = "cym"; // Welsh + } + return s_AlternateLanguageCodes; + } + } + #endregion private Dictionary> m_Layouts; @@ -190,6 +183,14 @@ public Dictionary> Layouts } } + private string Get2LetterLanguageCode(string langCode3letter) + { + string newLangCode; + if (AlternateLanguageCodes.TryGetValue(langCode3letter, out newLangCode)) + langCode3letter = newLangCode; + return Icu.GetLanguageCode(langCode3letter); + } + private void ProcessLanguage(IntPtr configRegistry, ref XklConfigItem item, IntPtr unused) { IntPtr dataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(item)); @@ -219,15 +220,9 @@ private void ProcessOneLayoutForLanguage(IntPtr configRegistry, ref XklConfigIte LayoutId = subitemIsNull ? item.Name : item.Name + "\t" + subitem.Name, Description = description, LayoutVariant = subitemIsNull ? string.Empty : subitem.Description, - LanguageCode = language.Name }; - if (item.Short_Description.Length < 3) - { - // we have a two letter country code; need to find the three-letter one - newLayout.CountryCode = - Icu.GetISO3Country(item.Short_Description + "_" + item.Name).ToUpper(); - } - else - newLayout.CountryCode = item.Short_Description.ToUpper(); + LanguageCode = Get2LetterLanguageCode(language.Name), + CountryCode = item.Name.ToUpper() + }; layouts.Add(newLayout); } diff --git a/Src/Common/Keyboarding/Types/KeyboardCollection.cs b/Src/Common/Keyboarding/Types/KeyboardCollection.cs new file mode 100644 index 0000000000..4cf1f20302 --- /dev/null +++ b/Src/Common/Keyboarding/Types/KeyboardCollection.cs @@ -0,0 +1,44 @@ +// --------------------------------------------------------------------------------------------- +#region // Copyright (c) 2013, SIL International. All Rights Reserved. +// +// Copyright (c) 2013, SIL International. All Rights Reserved. +// +// Distributable under the terms of either the Common Public License or the +// GNU Lesser General Public License, as specified in the LICENSING.txt file. +// +#endregion +// --------------------------------------------------------------------------------------------- +using System; +using System.Collections.ObjectModel; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; + +namespace SIL.FieldWorks.Common.Keyboarding.Types +{ + /// ---------------------------------------------------------------------------------------- + /// + /// A collection of keyboard descriptions + /// + /// ---------------------------------------------------------------------------------------- + public class KeyboardCollection: KeyedCollection + { + #region Overrides of KeyedCollection + /// + ///Returns the key from the specified . + /// + protected override string GetKeyForItem(IKeyboardDescription item) + { + return item.Id; + } + #endregion + + public bool Contains(string layout, string locale) + { + return Contains(KeyboardDescription.GetId(layout, locale)); + } + + public IKeyboardDescription this[string layout, string locale] + { + get { return this[KeyboardDescription.GetId(layout, locale)]; } + } + } +} diff --git a/Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs b/Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs deleted file mode 100644 index 053ad26625..0000000000 --- a/Src/Common/Keyboarding/Windows/KeymanKeyboardAdapter.cs +++ /dev/null @@ -1,119 +0,0 @@ -// --------------------------------------------------------------------------------------------- -#region // Copyright (c) 2013, SIL International. All Rights Reserved. -// -// Copyright (c) 2013, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -#endregion -// --------------------------------------------------------------------------------------------- -#if !__MonoCS__ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using SIL.FieldWorks.Common.COMInterfaces; - -namespace SIL.FieldWorks.Common.Keyboarding.Windows -{ - /// ---------------------------------------------------------------------------------------- - /// - /// Class for handling Keyman keyboards - /// - /// ---------------------------------------------------------------------------------------- - internal class KeymanKeyboardAdapter: IKeyboardAdaptor - { - private List m_BadLocales; - private ILgTextServices m_lts; - private ILgKeymanHandler m_keymanHandler; - - public KeymanKeyboardAdapter() - { - m_keymanHandler = LgKeymanHandlerClass.Create(); - m_lts = LgTextServicesClass.Create(); - } - - #region IKeyboardAdaptor Members - - public void Initialize() - { - m_BadLocales = new List(); - try - { - // Update handler with any new/removed keyman keyboards - m_keymanHandler.Init(true); - } - catch (Exception e) - { - m_BadLocales.Add(new KeyboardErrorDescription(KeyboardType.OtherIm, e)); - return; - } - - for (int i = 0; i < m_keymanHandler.NLayout; i++) - { - var name = m_keymanHandler.get_Name(i); - - // JohnT: haven't been able to reproduce FWR-1935, but apparently there's some bizarre - // circumstance where one of the names comes back null. If so, leave it out. - if (!string.IsNullOrEmpty(name)) - { - var desc = GetKeyboardDescription(name); - KeyboardController.Manager.RegisterKeyboard(desc.Id, desc); - } - } - } - - public void Close() - { - if (m_keymanHandler != null) - { - m_keymanHandler.Close(); - if (Marshal.IsComObject(m_keymanHandler)) - Marshal.ReleaseComObject(m_keymanHandler); - } - m_keymanHandler = null; - - if (m_lts != null && Marshal.IsComObject(m_lts)) - Marshal.ReleaseComObject(m_lts); - m_lts = null; - } - - public List ErrorKeyboards - { - get { return m_BadLocales; } - } - - public void ActivateKeyboard(IKeyboardDescription keyboard, IKeyboardDescription systemKeyboard) - { - var fSelectLangPending = false; - var activeLangId = 0; - var keymanKeyboardName = string.Empty; - - m_lts.SetKeyboard(systemKeyboard.Id, keyboard.Name, ref activeLangId, ref keymanKeyboardName, - ref fSelectLangPending); - } - - public void DeactivateKeyboard(IKeyboardDescription keyboard) - { - m_keymanHandler.ActiveKeyboardName = null; - } - - #endregion - - private IKeyboardDescription GetKeyboardDescription(string name) - { - if (string.IsNullOrEmpty(name)) - return null; - - var id = name.GetHashCode(); - - return new KeyboardDescription(id, name, this, KeyboardType.OtherIm); - } - - public IKeyboardDescription ActiveKeyboard - { - get { return GetKeyboardDescription(m_keymanHandler.ActiveKeyboardName); } - } - } -} -#endif diff --git a/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs b/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs index a5735f1c98..e48fa393dc 100644 --- a/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs +++ b/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs @@ -9,80 +9,307 @@ #if !__MonoCS__ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Linq; using System.Runtime.InteropServices; - -using SIL.FieldWorks.Common.COMInterfaces; +using System.Windows.Forms; +using Microsoft.Win32; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; +using SIL.Utils; namespace SIL.FieldWorks.Common.Keyboarding.Windows { /// /// Class for handling Windows system keyboards /// + [SuppressMessage("Gendarme.Rules.Design", "TypesWithDisposableFieldsShouldBeDisposableRule", + Justification = "m_Timer gets disposed in Close() which gets called from KeyboardControllerImpl.Dispose")] internal class WinKeyboardAdaptor: IKeyboardAdaptor { private List m_BadLocales; - private ILgTextServices m_lts; + private Timer m_Timer; + private InputLanguage m_ExpectedInputLanguage; + private WinKeyboardDescription m_ExpectedKeyboard; + private bool m_fSwitchedLanguages; - public WinKeyboardAdaptor() + private void GetLocales() { - m_lts = LgTextServicesClass.Create(); + m_BadLocales = new List(); + // ENHANCE: For "Chinese (Simplified, PRC)" we always get back + // "Chinese (Simplified) - US Keyboard" no matter what IME the + // user added in the system settings. And it's reported only once + // even when the user adds multiple IMEs. + foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages) + { + // NOTE: InputLanguage.LayoutName has a bug in that it always returns the name + // of the first layout even when a culture has multiple layouts assigned. + // Therefore we use GetLayoutNameEx to retrieve the information from the registry. + var layoutName = GetLayoutNameEx(lang.Handle); + //var cultureId = string.Format("{0:X4}", (int)(lang.Handle) & 0xFFFF); + string displayName; + string locale; + try + { + displayName = lang.Culture.DisplayName; + locale = lang.Culture.Name; + } + catch (CultureNotFoundException) + { + // we get an exception for non-supported cultures, probably because of a + // badly applied .NET patch. + // http://www.ironspeed.com/Designer/3.2.4/WebHelp/Part_VI/Culture_ID__XXX__is_not_a_supported_culture.htm and others + displayName = "[Unknown Language]"; + locale = "en-US"; + } + KeyboardController.Manager.RegisterKeyboard(new WinKeyboardDescription( + GetDisplayName(displayName, layoutName), locale, this, + (int)lang.Handle)); + } } - private void GetLocales() + private static string GetDisplayName(string cultureName, string layoutName) { - // REVIEW (EberhardB): Could we use InputLanguage instead of LgLanguageEnumerator? + return string.Format("{1} - {0}", cultureName, layoutName); + } - ILgLanguageEnumerator lenum = LgLanguageEnumeratorClass.Create(); - int id = 0; - m_BadLocales = new List(); - try + private string GetLayoutNameEx(IntPtr handle) + { + // InputLanguage.LayoutName is not to be trusted, especially where there are mutiple + // layouts (input methods) associated with a language. This function also provides + // the additional benefit that it does not matter whether a user switches from using + // InKey in Portable mode to using it in Installed mode (perhaps as the project is + // moved from one computer to another), as this function will identify the correct + // input language regardless, rather than (unhelpfully ) calling an InKey layout in + // portable mode the "US" layout. The layout is identified soley by the high-word of + // the HKL (a.k.a. InputLanguage.Handle). (The low word of the HKL identifies the + // language.) + // This function determines an HKL's LayoutName based on the following order of + // precedence: + // - Look up HKL in HKCU\\Software\\InKey\\SubstituteLayoutNames + // - Look up basic (non-extended) layout in HKLM\\SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts + // -Scan for ID of extended layout in HKLM\\SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts + var hkl = string.Format("{0:X8}", (int)handle); + var layoutName = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Software\InKey\SubstituteLayoutNames", hkl, null); + if (!string.IsNullOrEmpty(layoutName)) + return layoutName; + + layoutName = (string)Registry.GetValue(string.Concat(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\0000", + hkl.Substring(0, 4)), "Layout Text", null); + + if (!string.IsNullOrEmpty(layoutName)) + return layoutName; + + using (var regKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Keyboard Layouts")) { - lenum.Init(); - for (; ; ) + string layoutId = "0" + hkl.Substring(1, 3); + foreach (string subKeyName in regKey.GetSubKeyNames().Reverse()) // Scan in reverse order for efficiency, as the extended layouts are at the end. { - string name; - try + using (var klid = regKey.OpenSubKey(subKeyName)) { - lenum.Next(out id, out name); + if (((string)klid.GetValue("Layout ID")).Equals(layoutId, StringComparison.InvariantCultureIgnoreCase)) + return (string)klid.GetValue("Layout Text"); } - catch (OutOfMemoryException) + } + } + + return null; + } + + /// + /// Gets the InputLanguage that has the same layout as . + /// + private InputLanguage GetInputLanguage(IKeyboardDescription keyboardDescription) + { + InputLanguage sameLayout = null; + InputLanguage sameCulture = null; + foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages) + { + // TODO: write some tests + try + { + if (GetLayoutNameEx(lang.Handle) == keyboardDescription.Name) { - throw; + if (keyboardDescription.Locale == lang.Culture.Name) + return lang; + if (sameLayout == null) + sameLayout = lang; } - catch - { // if we fail to get a language, skip this one, but display once in error message. - m_BadLocales.Add(new KeyboardErrorDescription(KeyboardType.System, id)); - // Under certain conditions it can happen that lenum.Next() returns - // E_UNEXPECTED right away. We're then stuck in an infinite loop. - if (m_BadLocales.Count > 1000 || id == 0) - break; - continue; + else if (keyboardDescription.Locale == lang.Culture.Name && sameCulture == null) + sameCulture = lang; + } + catch (CultureNotFoundException) + { + // we get an exception for non-supported cultures, probably because of a + // badly applied .NET patch. + // http://www.ironspeed.com/Designer/3.2.4/WebHelp/Part_VI/Culture_ID__XXX__is_not_a_supported_culture.htm and others + } + } + return sameLayout ?? sameCulture; + } + + /// + /// Gets the keyboard description for the layout of . + /// + private WinKeyboardDescription GetKeyboardDescription(InputLanguage inputLanguage) + { + WinKeyboardDescription sameLayout = null; + WinKeyboardDescription sameCulture = null; + // TODO: write some tests + foreach (WinKeyboardDescription keyboardDescription in KeyboardController.InstalledKeyboards) + { + try + { + if (GetLayoutNameEx(inputLanguage.Handle) == keyboardDescription.Name) + { + if (keyboardDescription.Locale == inputLanguage.Culture.Name) + return keyboardDescription; + if (sameLayout == null) + sameLayout = keyboardDescription; } - if (id == 0) - break; - KeyboardController.Manager.RegisterKeyboard(id, new KeyboardDescription(id, name, this)); + else if (keyboardDescription.Locale == inputLanguage.Culture.Name && sameCulture == null) + sameCulture = keyboardDescription; + } + catch (CultureNotFoundException) + { + // we get an exception for non-supported cultures, probably because of a + // badly applied .NET patch. + // http://www.ironspeed.com/Designer/3.2.4/WebHelp/Part_VI/Culture_ID__XXX__is_not_a_supported_culture.htm and others } } - finally + return sameLayout ?? sameCulture; + } + + private void OnTimerTick(object sender, EventArgs eventArgs) + { + if (m_ExpectedInputLanguage == null || m_ExpectedKeyboard == null) + return; + + if (!m_fSwitchedLanguages) + { + m_Timer.Enabled = false; + return; + } + + if (InputLanguage.CurrentInputLanguage.Handle == m_ExpectedInputLanguage.Handle) { - // LT-8465 when Windows and Language Options changes are made lenum does not - // always get updated correctly so we are ensuring the memory for this - // ComObject gets released. - Marshal.FinalReleaseComObject(lenum); + m_ExpectedInputLanguage = null; + m_ExpectedKeyboard = null; + m_fSwitchedLanguages = false; + return; } + + SwitchKeyboard(m_ExpectedKeyboard, m_ExpectedInputLanguage); + } + + private void SwitchKeyboard(WinKeyboardDescription winKeyboard, InputLanguage inputLanguage) + { + m_ExpectedKeyboard = winKeyboard; + m_ExpectedInputLanguage = inputLanguage; + try + { + InputLanguage.CurrentInputLanguage = inputLanguage; + } + catch (ArgumentException) + { + // throws exception for non-supported culture, though seems to set it OK. + } + + KeyboardController.ActiveKeyboard = winKeyboard; + + // The following two lines help to work around a Windows bug (happens at least on + // XP-SP3): When you set the current input language (by any method), if there is more + // than one loaded input language associated with that same culture, Windows may + // initially go along with your request, and even respond to an immediate query of + // the current input language with the answer you expect. However, within a fraction + // of a second, it often takes the initiative to again change the input language to + // the _other_ input language having that same culture. We check that the proper + // input language gets set by enabling a timer so that we can re-set the input + // language if necessary. + m_fSwitchedLanguages = true; + // stop timer first so that the 0.5s interval restarts. + m_Timer.Stop(); + m_Timer.Start(); } #region IKeyboardAdaptor Members + [SuppressMessage("Gendarme.Rules.Correctness", "EnsureLocalDisposalRule", + Justification = "m_Timer gets disposed in Close() which gets called from KeyboardControllerImpl.Dispose")] public void Initialize() { + m_Timer = new Timer { Interval = 500 }; + m_Timer.Tick += OnTimerTick; + GetLocales(); + + // Form.ActiveForm can be null when running unit tests + if (Form.ActiveForm != null) + Form.ActiveForm.InputLanguageChanged += ActiveFormOnInputLanguageChanged; + } + + /// + /// Save the state of the conversion and sentence mode for the current IME + /// so that we can restore it later. + /// + private void SaveImeConversionStatus(WinKeyboardDescription winKeyboard) + { + if (winKeyboard == null) + return; + + var windowHandle = new HandleRef(this, + winKeyboard.WindowHandle != IntPtr.Zero ? winKeyboard.WindowHandle : Win32.GetFocus()); + var contextPtr = Win32.ImmGetContext(windowHandle); + if (contextPtr == IntPtr.Zero) + return; + + var contextHandle = new HandleRef(this, contextPtr); + int conversionMode; + int sentenceMode; + Win32.ImmGetConversionStatus(contextHandle, out conversionMode, out sentenceMode); + winKeyboard.ConversionMode = conversionMode; + winKeyboard.SentenceMode = sentenceMode; + Win32.ImmReleaseContext(windowHandle, contextHandle); + } + + /// + /// Restore the conversion and sentence mode to the states they had last time + /// we activated this keyboard (unless we never activated this keyboard since the app + /// got started, in which case we use sensible default values). + /// + private void RestoreImeConversionStatus(WinKeyboardDescription winKeyboard) + { + if (winKeyboard == null) + return; + + // Restore the state of the new keyboard to the previous value. If we don't do + // that e.g. in Chinese IME the input mode will toggle between English and + // Chinese (LT-7487 et al). + var windowPtr = winKeyboard.WindowHandle != IntPtr.Zero ? winKeyboard.WindowHandle : Win32.GetFocus(); + var windowHandle = new HandleRef(this, windowPtr); + var contextPtr = Win32.ImmGetContext(windowHandle); + if (contextPtr == IntPtr.Zero) + return; + + var contextHandle = new HandleRef(this, contextPtr); + Win32.ImmSetConversionStatus(contextHandle, winKeyboard.ConversionMode, winKeyboard.SentenceMode); + Win32.ImmReleaseContext(windowHandle, contextHandle); + winKeyboard.WindowHandle = windowPtr; + } + + private void ActiveFormOnInputLanguageChanged(object sender, InputLanguageChangedEventArgs inputLanguageChangedEventArgs) + { + RestoreImeConversionStatus(GetKeyboardDescription(inputLanguageChangedEventArgs.InputLanguage)); } public void Close() { - if (m_lts != null && Marshal.IsComObject(m_lts)) - Marshal.ReleaseComObject(m_lts); - m_lts = null; + if (m_Timer != null) + { + m_Timer.Dispose(); + m_Timer = null; + } } public List ErrorKeyboards @@ -90,18 +317,17 @@ public List ErrorKeyboards get { return m_BadLocales; } } - public void ActivateKeyboard(IKeyboardDescription keyboard, IKeyboardDescription ignored) + public void ActivateKeyboard(IKeyboardDescription keyboard) { - var fSelectLangPending = false; - var activeLangId = 0; - var notUsed = string.Empty; - - m_lts.SetKeyboard(keyboard.Id, null, ref activeLangId, ref notUsed, - ref fSelectLangPending); + SwitchKeyboard(keyboard as WinKeyboardDescription, GetInputLanguage(keyboard)); } public void DeactivateKeyboard(IKeyboardDescription keyboard) { + var winKeyboard = keyboard as WinKeyboardDescription; + Debug.Assert(winKeyboard != null); + + SaveImeConversionStatus(winKeyboard); } #endregion } diff --git a/Src/Common/Keyboarding/Windows/WinKeyboardDescription.cs b/Src/Common/Keyboarding/Windows/WinKeyboardDescription.cs new file mode 100644 index 0000000000..6a3e16685c --- /dev/null +++ b/Src/Common/Keyboarding/Windows/WinKeyboardDescription.cs @@ -0,0 +1,56 @@ +// --------------------------------------------------------------------------------------------- +#region // Copyright (c) 2013, SIL International. All Rights Reserved. +// +// Copyright (c) 2013, SIL International. All Rights Reserved. +// +// Distributable under the terms of either the Common Public License or the +// GNU Lesser General Public License, as specified in the LICENSING.txt file. +// +#endregion +// --------------------------------------------------------------------------------------------- +#if !__MonoCS__ +using System; +using System.Diagnostics.CodeAnalysis; +using SIL.FieldWorks.Common.Keyboarding; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; +using SIL.Utils; + +namespace SIL.FieldWorks.Common.Keyboarding.Windows +{ + /// ---------------------------------------------------------------------------------------- + /// + /// Keyboard description for a Windows system keyboard + /// + /// Holds information about a specific keyboard, especially for IMEs (e.g. whether + /// English input mode is selected) in addition to the default keyboard description. This + /// is necessary to restore the current setting when switching between fields with + /// differing keyboards. The user expects that a keyboard keeps its state between fields. + /// + /// ---------------------------------------------------------------------------------------- + [SuppressMessage("Gendarme.Rules.Design", "TypesWithNativeFieldsShouldBeDisposableRule", + Justification = "WindowHandle is a reference to a control")] + internal class WinKeyboardDescription : KeyboardDescription + { + /// + /// Initializes a new instance of the + /// class. + /// + public WinKeyboardDescription(string name, string locale, IKeyboardAdaptor engine, int keyboardHandle) + : base(name, locale, engine, KeyboardType.System) + { + ConversionMode = (int)(Win32.IME_CMODE.NATIVE | Win32.IME_CMODE.SYMBOL); + KeyboardHandle = keyboardHandle; + } + + public int ConversionMode { get; set; } + public int SentenceMode { get; set; } + public IntPtr WindowHandle { get; set; } + + // MS defines the Handle as IntPtr, but in reality it is always a 32-bit value, + // so Int32 is better suited. A keyboard handle is just a numeric value, not + // a pointer to some internal datastructure. + public int KeyboardHandle { get; private set; } + } +} +#endif diff --git a/Src/Common/Keyboarding/Windows/WindowsKeyboardHelper.cs b/Src/Common/Keyboarding/Windows/WindowsKeyboardHelper.cs deleted file mode 100644 index 3da4b3dfba..0000000000 --- a/Src/Common/Keyboarding/Windows/WindowsKeyboardHelper.cs +++ /dev/null @@ -1,120 +0,0 @@ -// --------------------------------------------------------------------------------------------- -#region // Copyright (c) 2013, SIL International. All Rights Reserved. -// -// Copyright (c) 2013, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -#endregion -// --------------------------------------------------------------------------------------------- -#if !__MonoCS__ -using System; -using System.Drawing; - -namespace SIL.FieldWorks.Common.Keyboarding.Windows -{ - /// ---------------------------------------------------------------------------------------- - /// - /// Common keyboard event handling class for Windows (system and keyman) keyboards. - /// - /// Most functionality is implemented in C++ in VwTextStore and doesn't make use - /// of the IKeyboardEventHandler and IKeyboardMethods interfaces. - /// ---------------------------------------------------------------------------------------- - public class WindowsKeyboardHelper: IKeyboardEventHandler, IKeyboardMethods - { - private IKeyboardDescription m_ActiveKeyboard = new KeyboardDescriptionNull(); - - #region IKeyboardEventHandler Members - - public bool OnUpdateProp(IKeyboardCallback callback) - { - throw new NotImplementedException(); - } - - public bool OnMouseEvent(IKeyboardCallback callback, int xd, int yd, Rectangle rcSrc, - Rectangle rcDst, MouseEvent mouseEvent) - { - throw new NotImplementedException(); - } - - public void OnLayoutChange(IKeyboardCallback callback) - { - throw new NotImplementedException(); - } - - public void OnSelectionChange(IKeyboardCallback callback, SelChangeType how) - { - throw new NotImplementedException(); - } - - public void OnTextChange(IKeyboardCallback callback) - { - throw new NotImplementedException(); - } - - #endregion - - #region IKeyboardMethods Members - - public void TerminateAllCompositions(IKeyboardCallback callback) - { - throw new NotImplementedException(); - } - - public void SetFocus(IKeyboardCallback callback) - { - var keyboard = callback.Keyboard; - keyboard.Activate(); - m_ActiveKeyboard = keyboard; - } - - public void KillFocus(IKeyboardCallback callback) - { - if (m_ActiveKeyboard != null) - { - m_ActiveKeyboard.Deactivate(); - m_ActiveKeyboard = new KeyboardDescriptionNull(); - } - } - - public bool IsCompositionActive(IKeyboardCallback callback) - { - throw new NotImplementedException(); - } - - public bool IsEndingComposition(IKeyboardCallback callback) - { - throw new NotImplementedException(); - } - - public void EnableInput(IKeyboardCallback callback) - { - throw new NotImplementedException(); - } - - public void DisableInput(IKeyboardCallback callback) - { - throw new NotImplementedException(); - } - - /// - /// Gets the active keyboard. - /// - public IKeyboardDescription ActiveKeyboard - { - get - { - foreach (var adaptor in KeyboardController.Adaptors) - { - var keymanAdaptor = adaptor as KeymanKeyboardAdapter; - if (keymanAdaptor != null) - return keymanAdaptor.ActiveKeyboard; - } - return m_ActiveKeyboard; - } - } - #endregion - } -} -#endif diff --git a/Src/Common/SimpleRootSite/EditingHelper.cs b/Src/Common/SimpleRootSite/EditingHelper.cs index e894234e45..d842659a2f 100644 --- a/Src/Common/SimpleRootSite/EditingHelper.cs +++ b/Src/Common/SimpleRootSite/EditingHelper.cs @@ -19,6 +19,7 @@ using SIL.CoreImpl; using SIL.FieldWorks.Common.COMInterfaces; using SIL.FieldWorks.Common.Keyboarding; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; using SIL.FieldWorks.Common.RootSites.Properties; using SIL.Utils; @@ -221,14 +222,6 @@ public class EditingHelper : IFWDisposable, ISelectionChangeNotifier private UserControl m_control; // currently either SimpleRootSite or PublicationControl. /// Object that provides editing callback methods (in production code, this is usually (always?) the rootsite) protected IEditingCallbacks m_callbacks; - /// handle of current system keyboard/language - private IntPtr m_hklActive; - /// current Keyman keyboard - private string m_sActiveKeymanKbd; //"xxxUnknownyyy"; - /// Current keyboard's langid - private int m_nActiveLangId; - /// count of pending Keyman keyboard changes to ignore - private int m_cSelectLangPending; /// The default cursor to use private Cursor m_defaultCursor; @@ -243,7 +236,6 @@ public class EditingHelper : IFWDisposable, ISelectionChangeNotifier /// every time the selection changes) Protected to allow for testing - production /// subclasses should not access this member directly protected SelectionHelper m_currentSelection; - private int m_lastKeyboardWS = -1; /// Flag to prevent deletion of an object protected bool m_preventObjDeletions; @@ -388,9 +380,6 @@ protected virtual void Dispose(bool disposing) } // Dispose unmanaged resources here, whether disposing is true or false. - // Should this be zapped? - //Marshal.FreeCoTaskMem(m_hklActive); - //m_hklActive = IntPtr.Zero; m_control = null; m_callbacks = null; m_currentSelection = null; @@ -1258,15 +1247,6 @@ public IVwViewConstructor ViewConstructor } } - /// - /// Get/Set the active input language. - /// - internal int ActiveLanguageId - { - get { return m_nActiveLangId; } - set { m_nActiveLangId = value; } - } - /// ------------------------------------------------------------------------------------ /// /// Gets a value indicating whether the current view is a Scripture view. @@ -1399,17 +1379,6 @@ public UserControl Control get { CheckDisposed(); return m_control; } } - /// ------------------------------------------------------------------------------------ - /// - /// Get/Set count indicating how many language selections are pending. - /// - /// ------------------------------------------------------------------------------------ - public int SelectLangPending - { - get { CheckDisposed(); return m_cSelectLangPending; } - set { CheckDisposed(); m_cSelectLangPending = value; } - } - /// ----------------------------------------------------------------------------------- /// /// Gets or sets the cursor that will always be shown. @@ -2957,44 +2926,15 @@ internal void WritingSystemHvoChanged() /// ----------------------------------------------------------------------------------- protected void SetKeyboardForWs(ILgWritingSystem ws) { - if(Callbacks == null) - { - return; - } - IVwRootBox rootb = Callbacks.EditedRootBox; - - if (ws == null || rootb == null) + if(Callbacks == null || ws == null) { - //Debug.WriteLine("EditingHelper.SetKeyboardForWs(" + - // ws.WritingSystem + "[" + ws.IcuLocale + - // "]) -> ActivateDefaultKeyboard()"); ActivateDefaultKeyboard(); return; } + try { - int nWs = ws.Handle; - if (nWs == m_lastKeyboardWS) - return; - m_lastKeyboardWS = nWs; - - //Debug.WriteLine("EditingHelper.SetKeyboardForWs(" + - // ws.WritingSystem + "(" + ws.IcuLocale + - // ") -> rootb.SetKeyboardForWs(hklActive = " + (int)hklActive + ")"); - - int hklActive = (int)m_hklActive; - - bool fSelectLangPending = false; - rootb.SetKeyboardForWs(ws, ref m_sActiveKeymanKbd, ref m_nActiveLangId, - ref hklActive, ref fSelectLangPending); - if (fSelectLangPending) - m_cSelectLangPending++; - m_hklActive = (IntPtr)hklActive; - - //Debug.WriteLine("EditingHelper.SetKeyboardForWs(" + - // ws.WritingSystem + "(" + ws.IcuLocale + - // ") - after rootb.SetKeyboardForWs(), LangId = " + m_nActiveLangId + - // ", hklActive = " + (int)hklActive); + KeyboardController.SetKeyboard(ws as IWritingSystem); } catch { @@ -3010,19 +2950,16 @@ protected void SetKeyboardForWs(ILgWritingSystem ws) /// Sets the keyboard for a writing system. /// /// The new ws. - /// The previous writing system /// ------------------------------------------------------------------------------------ - public int SetKeyboardForWs(int newWs) + public void SetKeyboardForWs(int newWs) { CheckDisposed(); - int oldWs = m_lastKeyboardWS; if (Callbacks == null || !Callbacks.GotCacheOrWs || WritingSystemFactory == null) - return oldWs; // Can't do anything useful, so let's not do anything at all. + return; // Can't do anything useful, so let's not do anything at all. ILgWritingSystem ws = WritingSystemFactory.get_EngineOrNull(newWs); SetKeyboardForWs(ws); - return oldWs; } /// ----------------------------------------------------------------------------------- @@ -3058,35 +2995,13 @@ public void SetKeyboardForSelection(IVwSelection vwsel) /// /// Activates the default keyboard. /// - /// On Windows 98, sending this message unnecessarily destroys - /// the current keystroke context, so only do it when we're actually switching - /// /// ------------------------------------------------------------------------------------ private void ActivateDefaultKeyboard() { InputLanguage inputLng = InputLanguage.DefaultInputLanguage; - Debug.Assert(inputLng != null); - // REVIEW: Do we really need to try to keep track of m_hklActive and have this - // logic to prevent "switching" when we're going to the same keyboard? The above - // remark suggests this was needed only for Windows 98. - if (inputLng == null || (m_hklActive != (IntPtr)0 && inputLng.Handle == m_hklActive)) - return; - - //Debug.WriteLine("EditingHelper.ActivateKeyboard() - inputLng = " + - // inputLng.ToString() + - // " [" + (int)inputLng.Handle + "], m_hklActive = " + (int)m_hklActive); - - bool fSelectLangPending = m_cSelectLangPending > 0; - KeyboardController.SetKeyboard(inputLng.Culture.LCID, null, ref m_nActiveLangId, - ref m_sActiveKeymanKbd, ref fSelectLangPending); - if (fSelectLangPending) - m_cSelectLangPending++; - m_hklActive = inputLng.Handle; - m_sActiveKeymanKbd = null; - // REVIEW: this is not quite right if the sort is not 0 (default). - m_nActiveLangId = inputLng.Culture.LCID; + KeyboardController.SetKeyboard(inputLng.LayoutName); } /// @@ -3142,11 +3057,6 @@ internal void BestStyleNameChanged() public void LostFocus(Control newFocusedControl, bool fIsChildWindow) { CheckDisposed(); - m_hklActive = (IntPtr) 0; - m_sActiveKeymanKbd = null; //"xxxUnknownyyy"; - m_nActiveLangId = 0; - m_cSelectLangPending = 0; - m_lastKeyboardWS = -1; //Debug.WriteLine(string.Format("EditingHelper.LostFocus:\n\t\t\tlost: {3} ({4}), Name={5}\n\t\t\tnew: {0} ({1}), Name={2}", // newFocusedControl != null ? newFocusedControl.ToString() : "", @@ -3178,14 +3088,6 @@ private static bool ShouldRestoreKeyboardSwitchingTo(Control newFocusedControl) /// internal void GotFocus() { - // Added to solve a problem in TE Back Translation view where these values can be out of - // sync with current selected keyboard. Problem is caused by how selection is restored - // to each pane when view is created. - m_hklActive = (IntPtr)0; - m_sActiveKeymanKbd = null; //"xxxUnknownyyy"; - m_nActiveLangId = 0; - m_cSelectLangPending = 0; - m_lastKeyboardWS = -1; } #endregion diff --git a/Src/Common/SimpleRootSite/SimpleRootSite.cs b/Src/Common/SimpleRootSite/SimpleRootSite.cs index 0f7fc825c8..3247473948 100644 --- a/Src/Common/SimpleRootSite/SimpleRootSite.cs +++ b/Src/Common/SimpleRootSite/SimpleRootSite.cs @@ -167,80 +167,6 @@ public void CheckDisposed() public class SimpleRootSite : UserControl, IVwRootSite, IRootSite, IxCoreColleague, IEditingCallbacks, IReceiveSequentialMessages, IMessageFilter, IFWDisposable { - #region Class LcidKeyboardStatus - /// ------------------------------------------------------------------------------------ - /// - /// Holds information about a specific keyboard, especially for IMEs (e.g. whether - /// English input mode is selected). This is necessary to restore the current setting - /// when switching between fields with differing keyboards. The user expects that a - /// keyboard keeps its state between fields. - /// - /// ------------------------------------------------------------------------------------ - protected class LcidKeyboardMode - { - // we use Nullable for our two fields - private int? m_ConversionMode; - private int? m_SentenceMode; - - /// -------------------------------------------------------------------------------- - /// - /// Initializes a new instance of the class. - /// - /// -------------------------------------------------------------------------------- - public LcidKeyboardMode() - { - m_ConversionMode = null; - m_SentenceMode = null; - } - - /// -------------------------------------------------------------------------------- - /// - /// Initializes a new instance of the class. - /// - /// The conversion mode. - /// The sentence mode. - /// -------------------------------------------------------------------------------- - public LcidKeyboardMode(int conversionMode, int sentenceMode) - { - m_ConversionMode = conversionMode; - m_SentenceMode = sentenceMode; - } - - /// -------------------------------------------------------------------------------- - /// - /// Gets a value indicating whether the conversion or sentence mode properties have - /// a value. - /// - /// -------------------------------------------------------------------------------- - public bool HasValue - { - get { return m_ConversionMode.HasValue || m_SentenceMode.HasValue; } - } - - /// -------------------------------------------------------------------------------- - /// - /// Gets or sets the conversion mode. - /// - /// -------------------------------------------------------------------------------- - public int ConversionMode - { - get { return m_ConversionMode ?? 0; } - set { m_ConversionMode = value; } - } - - /// -------------------------------------------------------------------------------- - /// - /// Gets or sets the sentence mode. - /// - /// -------------------------------------------------------------------------------- - public int SentenceMode - { - get { return m_SentenceMode ?? 0; } - set { m_SentenceMode = value; } - } - } - #endregion - #region Events /// /// This event notifies you that the right mouse button was clicked, @@ -374,23 +300,6 @@ public int SentenceMode /// protected int m_wsPending; - /// Keyman select language message - protected static readonly uint s_wm_kmselectlang = -#if !__MonoCS__ - Win32.RegisterWindowMessage("WM_KMSELECTLANG"); -#else - // This Keyman stuff will not work on Linux. - 0; -#endif - /// Keyman change keyboard message - protected static readonly uint s_wm_kmkbchange = -#if !__MonoCS__ - Win32.RegisterWindowMessage("WM_KMKBCHANGE"); -#else - // This Keyman stuff will not work on Linux. - 0; -#endif - /// height of an optional fixed header at the top of the client window. protected int m_dyHeader; @@ -425,14 +334,6 @@ public int SentenceMode /// Flag used to ensure that OnInputLangChanged gets registered once. private bool m_fRegisteredOnInputLangChanged = false; -#if !__MonoCS__ - /// Keep track of the keyboard states for the different LCIDs (writing systems). - /// This variable can be static since the same keyboard should behave the same in all - /// fields in this application. - private static Dictionary s_KeyboardModes = - new Dictionary(); -#endif - /// /// This is set true during processing of the OnPaint message. It serves to suppress /// certain behavior that ought not to happen during a paint. @@ -3153,84 +3054,6 @@ internal int ConvertKeyValue(int keyValue) return m_orientationManager.ConvertKeyValue(keyValue); } - /// ------------------------------------------------------------------------------------ - /// The Keyman keyboard has changed. Determine the writing system that is - /// probably implied, and apply it to the current range and/or future typing. - /// ------------------------------------------------------------------------------------ - public void OnKeymanKeyboardChange(IntPtr wpFlags, IntPtr lpHKL) - { - CheckDisposed(); - if (m_rootb == null) - return; // For paranoia. - IVwSelection vwsel = m_rootb.Selection; - if (vwsel == null) - return; // can't do anything useful. - - ILgWritingSystemFactory wsf; - List vws = EditingHelper.GetWsListCurrentFirst(vwsel, out wsf); - if (vws == null) - return; // not enough valid writing systems to make it worth changing. - - var keyboard = KeyboardController.ActiveKeyboard; - string sKeymanKbd = keyboard.Type == KeyboardType.OtherIm ? keyboard.Name : string.Empty; - - int wsMatch = -1; - int countNoKeymanKeyboard = 0; - foreach (int ws in vws) - { - // Don't consider switching to the default, dummy writing system. - if (ws == 0) - continue; - - ILgWritingSystem lgws = wsf.get_EngineOrNull(ws); - if (lgws == null) - continue; - - if (string.IsNullOrEmpty(lgws.Keyboard)) - countNoKeymanKeyboard++; - else - { - string sWsKbd = lgws.Keyboard; - if (sKeymanKbd == sWsKbd) - { - wsMatch = ws; - if (wsMatch == vws[0]) - return; // no change from current. - } - } - } - - if (wsMatch == -1) // no known writing system uses this keyboard - return; - - // Don't switch to some writing system just on the strength of not using a keyman - // keyboard at all, unless it is the only active one that does not. - if (string.IsNullOrEmpty(sKeymanKbd) && countNoKeymanKeyboard > 1) - return; - - m_wsPending = -1; - bool fRange = vwsel.IsRange; - if (fRange) - { - // Delay handling it until we get an insertion point. - m_wsPending = wsMatch; - return; - } - - // props of current selection, an IP (therefore only 1 lot of props). - ITsTextProps[] vttpTmp; - IVwPropertyStore[] vvpsTmp; - int cttp; - SelectionHelper.GetSelectionProps(vwsel, out vttpTmp, out vvpsTmp, out cttp); - - ITsPropsBldr tpb = vttpTmp[0].GetBldr(); - tpb.SetIntPropValues((int)FwTextPropType.ktptWs, - (int)FwTextPropVar.ktpvDefault, wsMatch); - ITsTextProps[] rgttpNew = new ITsTextProps[1]; - rgttpNew[0] = tpb.GetTextProps(); - vwsel.SetSelectionProps(1, rgttpNew); - } - /// ------------------------------------------------------------------------------------ /// /// Set the accessible name that the root box will return for this root site. @@ -3485,18 +3308,18 @@ protected void OnSetFocus(Message m) // we must not. // (Note: setting a WS by setting the Keyman keyboard is still not working, because // it seems .NET applications don't get the notification from Keyman.) -#if !__MonoCS__ - IntPtr hwndOld = m.WParam; - int procIdOld, procIdThis; - Win32.GetWindowThreadProcessId(hwndOld, out procIdOld); - Win32.GetWindowThreadProcessId(Handle, out procIdThis); - if (procIdOld == procIdThis && m_rootb != null && EditingHelper != null) - EditingHelper.SetKeyboardForSelection(m_rootb.Selection); -#else - // REVIEW: do we have to compare the process the old and new window belongs to? - if (m_rootb != null && EditingHelper != null) - EditingHelper.SetKeyboardForSelection(m_rootb.Selection); -#endif +//#if !__MonoCS__ +// IntPtr hwndOld = m.WParam; +// int procIdOld, procIdThis; +// Win32.GetWindowThreadProcessId(hwndOld, out procIdOld); +// Win32.GetWindowThreadProcessId(Handle, out procIdThis); +// if (procIdOld == procIdThis && m_rootb != null && EditingHelper != null) +// EditingHelper.SetKeyboardForSelection(m_rootb.Selection); +//#else +// // REVIEW: do we have to compare the process the old and new window belongs to? +// if (m_rootb != null && EditingHelper != null) +// EditingHelper.SetKeyboardForSelection(m_rootb.Selection); +//#endif // Start the blinking cursor timer here and stop it in the OnKillFocus handler later. if (m_Timer != null) @@ -3537,22 +3360,6 @@ protected override void OnGotFocus(EventArgs e) this.EnsureDefaultSelection(); Activate(VwSelectionState.vssEnabled); - // Restore the state of the new keyboard to the previous value. If we don't do - // that e.g. in Chinese IME the input mode will toggle between English and - // Chinese (LT-7487 et al). - // We used to do this only in OnInputLanguageChanged(), but WM_INPUTLANGCHANGED - // messages are no longer sequenced (but WM_SETFOCUS is), and so the field doesn't - // have focus yet when we process WM_INPUTLANGCHANGED. This means we don't call - // RestoreKeyboardStatus which results in toggling between English and Chinese - // input of Chinese IME. - int wsSel = SelectionHelper.GetFirstWsOfSelection(m_rootb.Selection); - if (wsSel != 0) - { - ILgWritingSystem qws = WritingSystemFactory.get_EngineOrNull(wsSel); - if (qws != null) - RestoreKeyboardStatus(qws.LCID); - } - EditingHelper.GotFocus(); } @@ -3614,8 +3421,6 @@ protected virtual void OnKillFocus(Control newWindow, bool fIsChildWindow) UpdateSelectionEnabledState(newWindow); - UpdateCurrentKeyboardStatus(); - // This window is losing control of the keyboard, so make sure when we get the focus // again we reset it to what we want. EditingHelper.LostFocus(newWindow, fIsChildWindow); @@ -3649,60 +3454,6 @@ public interface ISuppressDefaultKeyboardOnKillFocus { } - /// ------------------------------------------------------------------------------------ - /// - /// Updates the current keyboard status so that we can restore this state. - /// - /// ------------------------------------------------------------------------------------ - private void UpdateCurrentKeyboardStatus() - { -#if !__MonoCS__ - IntPtr context = Win32.ImmGetContext(new HandleRef(this, Handle)); - if (context != IntPtr.Zero) - { - int conversionMode; - int sentenceMode; - Win32.ImmGetConversionStatus(new HandleRef(this, context), - out conversionMode, out sentenceMode); - int lcid = LcidHelper.LangIdFromLCID(InputLanguage.CurrentInputLanguage.Culture.LCID); - s_KeyboardModes[lcid] = new LcidKeyboardMode(conversionMode, sentenceMode); - Win32.ImmReleaseContext(new HandleRef(this, Handle), - new HandleRef(this, context)); - } -#else - // TODO-Linux: May have to do something with keyboard here -#endif - } - - /// ------------------------------------------------------------------------------------ - /// - /// Restores the IME keyboard status. - /// - /// The locale id. - /// ------------------------------------------------------------------------------------ - private void RestoreKeyboardStatus(int lcid) - { -#if !__MonoCS__ - // Restore the state of the new keyboard to the previous value. If we don't do - // that e.g. in Chinese IME the input mode will toggle between English and - // Chinese (LT-7488). - LcidKeyboardMode keyboardMode; - if (s_KeyboardModes.TryGetValue(lcid, out keyboardMode) && keyboardMode.HasValue) - { - IntPtr context = Win32.ImmGetContext(new HandleRef(this, Handle)); - if (context != IntPtr.Zero) - { - Win32.ImmSetConversionStatus(new HandleRef(this, context), - keyboardMode.ConversionMode, keyboardMode.SentenceMode); - Win32.ImmReleaseContext(new HandleRef(this, Handle), - new HandleRef(this, context)); - } - } -#else - // TODO-Linux: do we need to port this? -#endif - } - /// ----------------------------------------------------------------------------------- /// /// Process mouse move @@ -5160,7 +4911,6 @@ protected virtual void OnInputLangChanged(object sender, InputLanguageChangedEve int lcid = LcidHelper.LangIdFromLCID(e.Culture.LCID); // Since we're being told it changed, assume this really is current, as opposed // to whatever we last set it to. - m_editingHelper.ActiveLanguageId = lcid; if (m_fHandlingOnGotFocus) { int wsSel = SelectionHelper.GetFirstWsOfSelection(vwsel); @@ -5178,8 +4928,6 @@ protected virtual void OnInputLangChanged(object sender, InputLanguageChangedEve // of behavior. See LT-7488 and LT-5345. Activate(VwSelectionState.vssEnabled); - RestoreKeyboardStatus(lcid); - //Debug.WriteLine("End SimpleRootSite.OnInputLangChanged(" + lcid + // ") [hwnd = " + this.Handle + "] -> HandleKeyBoardChange(vwsel, " + lcid + // ")"); @@ -6574,30 +6322,6 @@ public virtual void OriginalWndProc(ref Message msg) OnKillFocus(Control.FromHandle(msg.WParam), MiscUtils.IsChildWindowOfForm(ParentForm, msg.WParam)); return; - default: - { - if (msg.Msg == s_wm_kmselectlang) - { - Debug.Assert(s_wm_kmselectlang != 0); - if (msg.WParam == (IntPtr)4) - { - OnKeymanKeyboardChange(msg.WParam, msg.LParam); - } - else if (msg.WParam == (IntPtr)1) - { - // We get these both as a result of our own changes, and changes - // resulting from control keys. If we just initiated a change ourselves, - // ignore it. - if (EditingHelper.SelectLangPending > 0) - EditingHelper.SelectLangPending--; - else - OnKeymanKeyboardChange(msg.WParam, msg.LParam); - } - } - else if (msg.Msg == s_wm_kmkbchange) - Debug.Assert(s_wm_kmkbchange != 0); - break; - } } base.WndProc(ref msg); } diff --git a/Src/Common/SimpleRootSite/ViewInputManager.cs b/Src/Common/SimpleRootSite/ViewInputManager.cs index b4946e77fc..b7192de9a6 100644 --- a/Src/Common/SimpleRootSite/ViewInputManager.cs +++ b/Src/Common/SimpleRootSite/ViewInputManager.cs @@ -9,8 +9,10 @@ using System; using System.Drawing; using System.Runtime.InteropServices; +using SIL.CoreImpl; using SIL.FieldWorks.Common.COMInterfaces; using SIL.FieldWorks.Common.Keyboarding; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; using SIL.Utils; namespace SIL.FieldWorks.Common.RootSites @@ -20,7 +22,7 @@ namespace SIL.FieldWorks.Common.RootSites /// VwRootBox. On Windows we use VwTextStore instead. /// [Guid("830BAF1F-6F84-46EF-B63E-3C1BFDF9E83E")] - public class ViewInputManager: ILgTextServices, IKeyboardCallback, IViewInputMgr + public class ViewInputManager: IKeyboardCallback, IViewInputMgr { private IVwRootBox m_rootb; @@ -124,7 +126,7 @@ public void OnTextChange() } #endregion /* IViewInputMgr */ - private ILgWritingSystem CurrentWritingSystem + private IWritingSystem CurrentWritingSystem { get { @@ -137,7 +139,7 @@ private ILgWritingSystem CurrentWritingSystem if (wsf == null) return null; - return wsf.get_EngineOrNull(nWs); + return wsf.get_EngineOrNull(nWs) as IWritingSystem; } } @@ -155,38 +157,9 @@ public IKeyboardDescription Keyboard if (ws == null) return KeyboardDescription.Zero; - var locale = ws.LCID; - var langId = ws.CurrentLCID; - var keyboardName = string.Empty; - - // From VwRootBox::SetKeyboardForWs: - // We possibly set a Keyman keyboard, more precisely than the langid can do. Only attempt - // this if we are using the default langid for the ws. - if (locale == langId) - keyboardName = ws.Keyboard; - - return KeyboardController.GetKeyboard(langId, keyboardName); + return KeyboardController.GetKeyboard(ws); } } #endregion - - #region ILgTextServices implementation - /// - /// Sets the keyboard. - /// - /// Keyboard identifier of system keyboard - /// Identifier for other input method keyboard (Keyman/ibus) - /// - /// The active keyboard lcid. - /// Active other input method keyboard. - /// - public void SetKeyboard(int lcid, string otherImKeyboard, ref int nActiveLangId, - ref string activeOtherImKeyboard, ref bool fSelectLangPending) - { - KeyboardController.SetKeyboard(lcid, otherImKeyboard, ref nActiveLangId, - ref activeOtherImKeyboard, ref fSelectLangPending); - } - - #endregion } } diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/KeyboardControlTests.cs b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/KeyboardControlTests.cs index 37ed733d25..ff84124679 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/KeyboardControlTests.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/KeyboardControlTests.cs @@ -10,6 +10,8 @@ using NUnit.Framework; using SIL.FieldWorks.Common.COMInterfaces; using SIL.FieldWorks.Common.Keyboarding; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; +using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; using SIL.FieldWorks.FwCoreDlgControls; using SIL.FieldWorks.Test.TestUtils; using SIL.Utils; @@ -360,8 +362,7 @@ public List ErrorKeyboards get { return DummyErrorKeyboards; } } - public void ActivateKeyboard(IKeyboardDescription keyboard, - IKeyboardDescription systemKeyboard) + public void ActivateKeyboard(IKeyboardDescription keyboard) { // do nothing } @@ -373,7 +374,7 @@ public void DeactivateKeyboard(IKeyboardDescription keyboard) public void Initialize() { foreach (var keyboard in DummyInstalledKeyboards) - KeyboardController.Manager.RegisterKeyboard(keyboard.Id, keyboard); + KeyboardController.Manager.RegisterKeyboard(keyboard); } public void Close() @@ -394,26 +395,6 @@ public void Setup() DummyKeyboardAdaptor.Reset(); } - /// - /// Get available ibus keyboards. Don't run automatically since automated test - /// environment may not have the right keyboards set. - /// - [Test] - [Category("ByHand")] - [Platform(Include = "Linux", Reason = "Linux specific test")] - public void GetAvailableKeyboards_GetsKeyboards() - { - var expectedKeyboards = new List(); - expectedKeyboards.Add("ispell (m17n)"); - - List actualKeyboards = ReflectionHelper.CallStaticMethod("FwCoreDlgControls.dll", - "SIL.FieldWorks.FwCoreDlgControls.KeyboardControl", "GetAvailableKeyboards", - new object[] {null}) as List; - - Assert.That(actualKeyboards, Is.EquivalentTo(expectedKeyboards), - "Available keyboards do not match expected."); - } - /// /// Get available keyboards/languages. Don't run automatically since the installed /// keyboards/languages vary on different systems. @@ -433,8 +414,8 @@ public void InitLanguageCombo() bool found = false; foreach (IKeyboardDescription item in combo.Items) { - Console.WriteLine("{0}: {1}", item.Id, item.Name); - if (item.Id == 1033) + Console.WriteLine("{0}: {1} {2}", item.Id, item.Name, item.Locale); + if (item.Locale == "en-US") found = true; } @@ -451,8 +432,8 @@ public void InitLanguageCombo_AllOk() { DummyKeyboardAdaptor.DummyInstalledKeyboards = new List(new [] { - new KeyboardDescription(1033, "English (United States)", null), - new KeyboardDescription(1031, "German (Germany)", null) + new KeyboardDescription("English (United States)", "en-US", null), + new KeyboardDescription("German (Germany)", "de-DE", null) }); KeyboardController.Manager.SetKeyboardAdaptors(new [] { new DummyKeyboardAdaptor() }); @@ -477,8 +458,8 @@ public void InitLanguageCombo_Errors() { DummyKeyboardAdaptor.DummyInstalledKeyboards = new List(new [] { - new KeyboardDescription(1033, "English (United States)", null), - new KeyboardDescription(1031, "German (Germany)", null) + new KeyboardDescription("English (United States)", "en-US", null), + new KeyboardDescription("German (Germany)", "de-DE", null) }); DummyKeyboardAdaptor.DummyErrorKeyboards = new List(new [] { diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs b/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs index 2ee1f8ef6e..9954512b29 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs +++ b/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Globalization; using System.Linq; using System.Runtime.InteropServices; using System.Windows.Forms; @@ -9,6 +10,7 @@ using SIL.FieldWorks.Common.COMInterfaces; using SIL.FieldWorks.Common.Controls; using SIL.FieldWorks.Common.Keyboarding; +using SIL.FieldWorks.Common.Keyboarding.Interfaces; using SIL.Utils; namespace SIL.FieldWorks.FwCoreDlgControls @@ -31,8 +33,7 @@ public KeyboardControl() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); - m_keyboardComboBox.DropDown += new EventHandler(m_keyboardComboBox_DropDown); - m_langIdComboBox.DropDown += new EventHandler(m_langIdComboBox_DropDown); + m_langIdComboBox.DropDown += m_langIdComboBox_DropDown; } void m_langIdComboBox_DropDown(object sender, EventArgs e) @@ -40,11 +41,6 @@ void m_langIdComboBox_DropDown(object sender, EventArgs e) InitLanguageCombo(); } - void m_keyboardComboBox_DropDown(object sender, EventArgs e) - { - InitKeymanCombo(); - } - /// /// Check to see if the object has been disposed. /// All public Properties and Methods should call this @@ -171,47 +167,9 @@ public void Reset() if (m_ws == null) return; - InitKeymanCombo(); InitLanguageCombo(); } - /// ------------------------------------------------------------------------------------ - /// - /// Inits the keyman combo. - /// - /// ------------------------------------------------------------------------------------ - private void InitKeymanCombo() - { - CheckDisposed(); - - m_keyboardComboBox.Items.Clear(); // Clear out any old items from combobox list - var strKbdName = string.IsNullOrEmpty(m_ws.Keyboard) ? FwCoreDlgControls.kstid_None : - m_ws.Keyboard; - m_keyboardComboBox.Items.Add(FwCoreDlgControls.kstid_None); - - var badLocales = KeyboardController.ErrorKeyboards.Where( - keyboard => keyboard.Type == KeyboardType.OtherIm).ToList(); - if (badLocales.Count > 0 && !m_fKeymanInitErrorReported) - { - m_fKeymanInitErrorReported = true; - string caption = FwCoreDlgControls.kstidKeymanInitFailed; - var exception = badLocales[0].Details as Exception; - string message = exception != null ? exception.Message : null; - if (string.IsNullOrEmpty(message)) - message = caption; - MessageBoxUtils.Show(ParentForm, message, caption, - MessageBoxButtons.OK, MessageBoxIcon.Information); - } - - foreach (var item in KeyboardController.InstalledKeyboards.Where( - keyboard => keyboard.Type == KeyboardType.OtherIm)) - { - m_keyboardComboBox.Items.Add(item.Name); - } - - m_keyboardComboBox.SelectedItem = strKbdName; - } - // Since InitLanguageCombo gets called from an OnGetFocus, and the message box causes a // change in focus, we need to avoid an endless loop of error messages. private static bool errorMessage1Out; @@ -245,7 +203,7 @@ private void InitLanguageCombo() { m_langIdComboBox.Items.Add(item); // The 'if' below should make a 'fr-CAN' language choose a french keyboard, if installed. - if (item.Id == selectedId) + if (CultureInfo.CreateSpecificCulture(item.Locale).LCID == selectedId) selectedName = item.Name; } catch @@ -289,7 +247,9 @@ private void InitLanguageCombo() // The DefaultInputLanguage should already be in the control if (selectedName == FwCoreDlgControls.kstidInvalidKeyboard) { - m_langIdComboBox.Items.Add(new KeyboardDescription(selectedId, selectedName, null)); + // TODO: add item for the invalid keyboard. Hopefully this control will be + // replaced by one from Palaso; otherwise we'll need to implement this. + //m_langIdComboBox.Items.Add(new KeyboardDescription(selectedId, selectedName, null)); } } } @@ -301,7 +261,9 @@ private void m_cbLangId_SelectedIndexChanged(object sender, EventArgs e) { if (m_langIdComboBox.SelectedItem == null) return; - m_ws.LCID = ((IKeyboardDescription)m_langIdComboBox.SelectedItem).Id; + var keyboard = m_langIdComboBox.SelectedItem as IKeyboardDescription; + m_ws.LCID = CultureInfo.CreateSpecificCulture(keyboard.Locale).LCID; + m_ws.Keyboard = keyboard.Name; } private void m_cboKeyboard_SelectedIndexChanged(object sender, EventArgs e) diff --git a/Src/FwCoreDlgs/ValidCharactersDlg.cs b/Src/FwCoreDlgs/ValidCharactersDlg.cs index a91b2fd1af..82b2fcb2da 100644 --- a/Src/FwCoreDlgs/ValidCharactersDlg.cs +++ b/Src/FwCoreDlgs/ValidCharactersDlg.cs @@ -1395,9 +1395,7 @@ private void tabControlAddFrom_SelectedIndexChanged(object sender, EventArgs e) case kiTabUnicode: break; } - KeyboardController.SetKeyboard( - fUseWsKeyboard ? m_ws.LCID : InputLanguage.DefaultInputLanguage.Culture.LCID, - fUseWsKeyboard ? m_ws.Keyboard : null); + KeyboardController.SetKeyboard(fUseWsKeyboard ? m_ws.Keyboard : null); } /// ------------------------------------------------------------------------------------ @@ -1734,7 +1732,7 @@ private void btnHelp_Click(object sender, EventArgs e) protected override void OnClosed(EventArgs e) { base.OnClosed(e); - KeyboardController.SetKeyboard(InputLanguage.DefaultInputLanguage.Culture.LCID, null); + KeyboardController.SetKeyboard(string.Empty); } #endregion diff --git a/Src/Kernel/FwKernel_GUIDs.cpp b/Src/Kernel/FwKernel_GUIDs.cpp index 1483e94545..0f60cb1c5a 100644 --- a/Src/Kernel/FwKernel_GUIDs.cpp +++ b/Src/Kernel/FwKernel_GUIDs.cpp @@ -25,7 +25,6 @@ DEFINE_UUIDOF(TsStrBldr, 0xF1EF76EB, 0xBE04, 0x11d3, 0x8D, 0x9A, 0x00, 0x50, 0x0 DEFINE_UUIDOF(TsIncStrBldr, 0xF1EF76EC, 0xBE04, 0x11d3, 0x8D, 0x9A, 0x00, 0x50, 0x04, 0xDE, 0xFE, 0xC4); DEFINE_UUIDOF(TsPropsBldr, 0xF1EF76ED, 0xBE04, 0x11d3, 0x8D, 0x9A, 0x00, 0x50, 0x04, 0xDE, 0xFE, 0xC4); DEFINE_UUIDOF(TsMultiString, 0x7A1B89C0, 0xC2D6, 0x11d3, 0x9B, 0xB7, 0x00, 0x40, 0x05, 0x41, 0xF9, 0xE9); -DEFINE_UUIDOF(ILgInputMethodEditor, 0xE1B27A5F, 0xDD1B, 0x4BBA, 0x9B, 0x72, 0x00, 0xBD, 0xE0, 0x31, 0x62, 0xFC); DEFINE_UUIDOF(IVwGraphics, 0xF7233278, 0xEA87, 0x4FC9, 0x83, 0xE2, 0xCB, 0x7C, 0xC4, 0x5D, 0xEB, 0xE7); DEFINE_UUIDOF(IJustifyingRenderer, 0x1141174B, 0x923F, 0x4C43, 0xBA, 0x43, 0x8A, 0x32, 0x6B, 0x76, 0xA3, 0xF2); DEFINE_UUIDOF(ISimpleInit, 0x6433D19E, 0x2DA2, 0x4041, 0xB2, 0x02, 0xDB, 0x11, 0x8E, 0xE1, 0x69, 0x4D); @@ -49,15 +48,8 @@ DEFINE_UUIDOF(ILgSpellChecker, 0xE3661AF5, 0x26C6, 0x4907, 0x92, 0x43, 0x61, 0x0 DEFINE_UUIDOF(ILgCollatingEngine, 0xD27A3D8C, 0xD3FE, 0x4E25, 0x90, 0x97, 0x8F, 0x4A, 0x1F, 0xB3, 0x03, 0x61); DEFINE_UUIDOF(ILgSearchEngine, 0x09FCA8D5, 0x5BF6, 0x4BFF, 0xA3, 0x17, 0xE0, 0x12, 0x64, 0x10, 0xD7, 0x9A); DEFINE_UUIDOF(ILgWritingSystem, 0x9F74A170, 0xE8BB, 0x466d, 0x88, 0x48, 0x5F, 0xDB, 0x28, 0xAC, 0x5A, 0xF8); -DEFINE_UUIDOF(ILgTextServices, 0x5B6303DE, 0xE635, 0x4DD7, 0xA7, 0xFC, 0x34, 0x5B, 0xEE, 0xF3, 0x52, 0xD8); -DEFINE_UUIDOF(ILgFontManager, 0x73718689, 0xB701, 0x4241, 0xA4, 0x08, 0x4C, 0x38, 0x9E, 0xCD, 0x66, 0x64); -DEFINE_UUIDOF(LgInputMethodEditor, 0x659C2C2F, 0x7AF6, 0x4F9E, 0xAC, 0x6F, 0x7A, 0x03, 0xC8, 0x41, 0x8F, 0xC9); -DEFINE_UUIDOF(LgFontManager, 0x02C3F580, 0x796D, 0x4B5F, 0xBE, 0x43, 0x16, 0x6D, 0x97, 0x31, 0x9D, 0xA5); DEFINE_UUIDOF(ILgIcuCharPropEngine, 0xE8689492, 0x7622, 0x427b, 0x85, 0x18, 0x63, 0x39, 0x29, 0x4F, 0xD2, 0x27); DEFINE_UUIDOF(ILgNumericEngine, 0xCBBF35E1, 0xCE39, 0x4EEC, 0xAE, 0xBD, 0x5B, 0x4A, 0xAA, 0xA5, 0x2B, 0x6C); -DEFINE_UUIDOF(ILgKeymanHandler, 0x3F42144B, 0x509F, 0x4def, 0x8D, 0xD3, 0x6D, 0x8D, 0x26, 0x67, 0x70, 0x01); -DEFINE_UUIDOF(ILgCodePageEnumerator, 0x2CFCF4B7, 0x2FFE, 0x4CF8, 0x91, 0xBE, 0xFB, 0xB5, 0x7C, 0xC7, 0x78, 0x2A); -DEFINE_UUIDOF(ILgLanguageEnumerator, 0x746A16E1, 0x0C36, 0x4268, 0xA2, 0x61, 0xE8, 0x01, 0x2B, 0x0D, 0x67, 0xC5); DEFINE_UUIDOF(ILgIcuConverterEnumerator, 0x8E6D558E, 0x8755, 0x4EA1, 0x9F, 0xF6, 0x03, 0x9D, 0x37, 0x53, 0x12, 0xE9); DEFINE_UUIDOF(ILgIcuTransliteratorEnumerator, 0x50F2492C, 0x6C46, 0x48BA, 0x8B, 0x7F, 0x5F, 0x04, 0x15, 0x3A, 0xB2, 0xCC); DEFINE_UUIDOF(ILgIcuLocaleEnumerator, 0x08F649D0, 0xD8AB, 0x447B, 0xAA, 0xB6, 0x21, 0xF8, 0x5C, 0xFA, 0x74, 0x3C); @@ -71,10 +63,6 @@ DEFINE_UUIDOF(LgCPWordTokenizer, 0x7CE7CE94, 0xAC47, 0x42A5, 0x82, 0x3F, 0x2F, 0 DEFINE_UUIDOF(LgWfiSpellChecker, 0x818445E2, 0x0282, 0x4688, 0x8B, 0xB7, 0x14, 0x7F, 0xAA, 0xCF, 0xF7, 0x3A); DEFINE_UUIDOF(LgMSWordSpellChecker, 0x5CF96DA5, 0x299E, 0x4FC5, 0xA9, 0x90, 0x2D, 0x2F, 0xCE, 0xE7, 0x83, 0x4D); DEFINE_UUIDOF(LgNumericEngine, 0xFF22A7AB, 0x223E, 0x4D04, 0xB6, 0x48, 0x0A, 0xE4, 0x05, 0x88, 0x26, 0x1D); -DEFINE_UUIDOF(LgKeymanHandler, 0x69ACA99C, 0xF852, 0x4C2C, 0x9B, 0x5F, 0xFF, 0x83, 0x23, 0x8A, 0x17, 0xA5); -DEFINE_UUIDOF(LgTextServices, 0x720485C5, 0xE8D5, 0x4761, 0x92, 0xF0, 0xF7, 0x0D, 0x2B, 0x3C, 0xF9, 0x80); -DEFINE_UUIDOF(LgCodePageEnumerator, 0x9045F113, 0x8626, 0x41C0, 0xA6, 0x1E, 0xA7, 0x3F, 0xBE, 0x59, 0x20, 0xD1); -DEFINE_UUIDOF(LgLanguageEnumerator, 0xB887505B, 0x74DE, 0x4ADC, 0xA1, 0xD9, 0x55, 0x53, 0x42, 0x8C, 0x8D, 0x02); DEFINE_UUIDOF(LgIcuConverterEnumerator, 0x9E729461, 0xF80D, 0x4796, 0xBA, 0x17, 0x08, 0x6B, 0xC6, 0x19, 0x07, 0xF1); DEFINE_UUIDOF(LgIcuTransliteratorEnumerator, 0x3F1FD0A4, 0xB2B1, 0x4589, 0xBC, 0x82, 0x9C, 0xEF, 0x5B, 0xA8, 0x4F, 0x4E); DEFINE_UUIDOF(LgIcuResourceBundle, 0x0DD7FC1A, 0xAB97, 0x4A39, 0x88, 0x2C, 0x26, 0x97, 0x60, 0xD8, 0x66, 0x19); diff --git a/Src/Language/Language.idh b/Src/Language/Language.idh index 2fda7a5c0d..c2e4897afd 100644 --- a/Src/Language/Language.idh +++ b/Src/Language/Language.idh @@ -47,7 +47,6 @@ Description: interface ICollation; interface ILgWritingSystem; interface ILgWritingSystemFactory; - interface ILgTextServices; //:>**************************************************************************************** //:> Enumerations @@ -325,177 +324,10 @@ Description: //:> These are the interfaces for the engines--the code that actually does the work. //:>**************************************************************************************** - /******************************************************************************************* - Interface ILgInputMethodEditor - Functions related to special ways of typing for exotic writing systems. - The ${#Setup} method is called before the user types something and may do things at the - system level (such as setting the current system IME or Keyman file) to change what is - received through WM_CHAR. The other methods allow post-processing of what is received - through WM_CHAR. - - @h3{When to implement} - Clients should not normally implement this interface. Standard implementations are in - Language.dll. If you have a very unusual input method requirement, you could make your - own implementation. - - Note: current FieldWorks code is @i{not} using this approach to typing. Check out - @HTTP{intranet.sil.org/softwaredev/project_status.htm} to see if there are any plans. - - @h3{When to use} - Most programmers will not use this interface directly. It is used by the Views - subsystem and controls that accept typing in vernacular scripts. - - @h3{How to obtain an instance} - At present, you can't. Eventually OldWritingSystem will implement a method. Some - implemenations may also be available through CoCreateInstance. - - @h3{Hungarian: ime} - - *******************************************************************************************/ - DeclareInterface(LgInputMethodEditor, Unknown, E1B27A5F-DD1B-4BBA-9B72-00BDE03162FC) - { - // GET THE SYSTEM READY TO use this input method; for example, switch Keyman to the - // proper table. - HRESULT Setup(); - - // Given something the user typed, following any preprocessing that happens - // automatically as a result of Setup (e.g., Keyman processing), do any further - // processing required to actually replace the selected part of the string with what - // the user typed. - // The default implementation just replaces characters from ichMin to ichLim with - // those from bstrInput, then sets *pichModMin to ichMin, and *pichModLim and - // *pichIP both to ichMin + BstrLen(bstrInput). - // @param bstrInput What the user typed. - // @param pttpInput Text properties desired for new text - // @param ptsbOld Original, unedited text, gets modified by this method - // @param ichMin Range in old ptsbOld to replace - // @param ichLim Range in old ptsbOld to replace - // @param pichModMin Range in modified ptsbOld that is different from before - // @param pichModLim Range in modified ptsbOld that is different from before - // @param pichIP Position of insertion point in modified string - // @return The result is the modified string represented by ptsbOld. - // @exception E_INVALIDARG ichMin/Lim is not a valid range within ptsbOld - [local, restricted] HRESULT Replace( - [in] BSTR bstrInput, - [in] ITsTextProps * pttpInput, - [in] ITsStrBldr * ptsbOld, - [in] int ichMin, - [in] int ichLim, - [out] int * pichModMin, - [out] int * pichModLim, - [out] int * pichIP); - - // The user pressed a certain number of backspaces. Delete an appropriate amount of - // the string represented by the input string builder, indicating exactly what changed. - // Also, if there were not enough characters to delete, indicate how many backspaces - // were left over. - // @param pichStart start position (delete characters before here) - // @param cactBackspace number of backspaces pressed - // @param ptsbOld the text being edited; gets changed by this call - // @param pichModMin range in output text affected - // @param pichModLim range in output text affected - // @param pichIP position of IP in modified string - // @param pcactBsRemaining Number not handled, caller should apply to previous run or - // string - HRESULT Backspace( - [in] int pichStart, - [in] int cactBackspace, - [in] ITsStrBldr * ptsbOld, - [out] int * pichModMin, - [out] int * pichModLim, - [out] int * pichIP, - [out] int * pcactBsRemaining); - - // The user pressed a certain number of delete forward characters. Compute the effect on - // ptsbInOut - // Also, if there were not enough characters to delete, indicate how many backspaces - // were left over. - // @param pichStart start position (delete characters after here) - // @param cactDelForward number of DF pressed - // @param ptsbInOut the text being edited; gets changed by this call - // @param pichModMin range in output text affected - // @param pichModLim range in output text affected - // @param pichIP position of IP in modified string - // @param pcactDfRemaining Number not handled, caller should apply to next run or string - HRESULT DeleteForward( - [in] int pichStart, - [in] int cactDelForward, - [in] ITsStrBldr * ptsbInOut, - [out] int * pichModMin, - [out] int * pichModLim, - [out] int * pichIP, - [out] int * pcactDfRemaining); - - // Return true if input method considers an IP at the specified index reasonable. - // Note that really useful IPs should also satisfy the Renderer; see - // ${ILgSegment#IsValidInsertionPoint}. - HRESULT IsValidInsertionPoint( - [in] int ich, - [in] ITsString * ptss, - [out, retval] BOOL * pfValid); - }; - - /******************************************************************************************* - Interface ILgFontManager - Obtain a list of the (TrueType) fonts that are available on the system, and handle - simple queries about font availability. - - Note: the font manager may load the available fonts once, and use this cached list - to answer subsequent queries. To be sure the answer to a query is current, call - RefreshFontList. - - @h3{When to implement} - Clients should not implement this interface. There is a standard implementation in - Language.dll. - - @h3{When to use} - Use this interface when you need to know whether a given font is available on the - system, or to get a list of available fonts. - - @h3{How to obtain an instance} - Use CoCreateInstance, CLSID_LgFontManager. Or use the CreateInstance() method of a - smart pointer. - - @h3{Hungarian: fm} - *******************************************************************************************/ - DeclareInterface(LgFontManager, Unknown, 73718689-B701-4241-A408-4C389ECD6664) - { - // Is the given font available? - HRESULT IsFontAvailable( - [in] BSTR bstrName, - [out, retval] ComBool * pfAvail); - - // Is the given font available? - HRESULT IsFontAvailableRgch( - [in] int cch, - [in] OLECHAR * prgchName, - [out, retval] ComBool * pfAvail); - - // Get the list of available fonts delimited by L'\0'. - HRESULT AvailableFonts( - [out] BSTR * pbstrNames); - - // Update the list of fonts (by re-reading from the OS). - HRESULT RefreshFontList(); - }; - - //:>**************************************************************************************** //:> CoClass definitions. //:>**************************************************************************************** - #ifndef NO_COCLASSES - DeclareCoClass(LgInputMethodEditor, 659C2C2F-7AF6-4F9E-AC6F-7A03C8418FC9) - { - interface ILgInputMethodEditor; - }; - - DeclareCoClass(LgFontManager, 02C3F580-796D-4B5F-BE43-166D97319DA5) - { - interface ILgFontManager; - }; - #endif // !NO_COCLASSES - // Flags used to specify variations on how to collate. // Default is all listed options off. // Except where noted, options are orthogonal and may be ORed together for combined @@ -1669,140 +1501,6 @@ Description: [in] int ws); }; -/******************************************************************************************* - Interface ILgKeymanHandler - - An interface that manages Keyman, being able to invoke a keyboard, find out which - one is active, find out which keyboards are available, return the windows message that - Keyman sends when a keyboard is selected, and so forth. - - @h3{When to implement} - The standard implementation should suffice. - - @h3{When to use} - Whenever you want to manipulate or query Keyman - - @h3{Hungarian: lkh} -*******************************************************************************************/ -DeclareInterface(LgKeymanHandler, Unknown, 3F42144B-509F-4def-8DD3-6D8D26677001) -{ - - // Initialize the Keyboard handler. Set fForce to re-initialize even if already - // initialized, for example, if a keyboard has been added or removed. - // All data is static, so it is only necessary to call this for one instance. - // Actually, it is not strictly necessary to call it at all, as other methods will - // do so if necessary. - HRESULT Init( - [in] ComBool fForce); - - // Gracefully shut down the keyboard handler. We need this for calling from .NET so - // that we don't rely on garbage collection. - HRESULT Close(); - - // Obtain the number of keyboard layouts currently avaiable. - [propget] HRESULT NLayout( - [out, retval] int * pclayout); - // Obtain the ith layout name. - [propget] HRESULT Name( - [in] int ilayout, - [out, retval] BSTR * pbstrName); - // Get/Set the active keyboard. - [propget] HRESULT ActiveKeyboardName( - [out, retval] BSTR * pbstrName); - [propput] HRESULT ActiveKeyboardName( - [in] BSTR bstrName); - // Return the windows message (obtained from RegisterWindowsMessage("WM_KMSELECTLANG"). - [propget] HRESULT KeymanWindowsMessage( - [out, retval] int * pwm); - // Enhance JohnT: might be useful to add GetKeymanVersion, StartKeyman. -}; - -/******************************************************************************************* - Interface ILgTextServices - - Provide access to TSF functionality wrapped in easy-to-call methods. - - @h3{When to implement} - Clients should not implement this interface. There is a standard implementation in - Language.dll. - - @h3{When to use} - When TSF related functionality is needed, especially from C# code which does not have - a built-in access path. - - @h3{How to obtain an instance} - Use CoCreateInstance, CLSID_LgTextServices. Or use the CreateInstance() method of a - smart pointer. - - @h3{Hungarian: lts} -*******************************************************************************************/ -DeclareInterface(LgTextServices, Unknown, 5B6303DE-E635-4DD7-A7FC-345BEEF352D8) -{ - // Set the system keyboard and TSF language. - HRESULT SetKeyboard( - [in] int nLcid, - [in] BSTR bstrKeymanKbd, - [in, out] int * pnActiveLangId, - [in, out] BSTR * pbstrActiveKeymanKbd, - [in, out] ComBool * pfSelectLangPending - ); -}; - -/******************************************************************************************* - Interface ILgCodePageEnumerator - - An interface that allows retrieving a list of the code pages installed on the system, - with names suitable for displaying in a combo box. - - @h3{When to implement} - The standard implementation should suffice. - - @h3{When to use} - Whenever you want to retrieve a list of available code pages. - - @h3{Hungarian: lcpe} -*******************************************************************************************/ -DeclareInterface(LgCodePageEnumerator, Unknown, 2CFCF4B7-2FFE-4CF8-91BE-FBB57CC7782A) -{ - - // Initialize enumerator. This default initializer gives all known code pages. - // We may eventually have others that allow them to be limited. - HRESULT Init(); - - // Get the next code page. When there are no more, sets pnId to 0 and pbstrName to null. - HRESULT Next( - [out] int * pnId, - [out] BSTR * pbstrName); -}; - -/******************************************************************************************* - Interface ILgLanguageEnumerator - - An interface that allows retrieving a list of the languages installed on the system, - with names suitable for displaying in a combo box. - - @h3{When to implement} - The standard implementation should suffice. - - @h3{When to use} - Whenever you want to retrieve a list of available languages. - - @h3{Hungarian: lcpe} -*******************************************************************************************/ -DeclareInterface(LgLanguageEnumerator, Unknown, 746A16E1-0C36-4268-A261-E8012B0D67C5) -{ - - // Initialize enumerator. This default initializer gives all installed languages. - // We may eventually have others that allow them to be limited. - HRESULT Init(); - - // Get the next language. When there are no more, sets pnId to 0 and pbstrName to null. - // For a language unsupported by the OS, it returns the id along with E_FAIL. - HRESULT Next( - [out] int * pnId, - [out] BSTR * pbstrName); -}; - /******************************************************************************************* Interface ILgIcuConverterEnumerator @@ -2082,22 +1780,6 @@ DeclareInterface(RegexMatcher, Unknown, 6C62CCF0-4EE1-493C-8092-319B6CFBEEBC) interface ILgNumericEngine; }; - DeclareCoClass(LgKeymanHandler, 69ACA99C-F852-4C2C-9B5F-FF83238A17A5) - { - interface ILgKeymanHandler; - }; - DeclareCoClass(LgTextServices, 720485C5-E8D5-4761-92F0-F70D2B3CF980) - { - interface ILgTextServices; - }; - DeclareCoClass(LgCodePageEnumerator, 9045F113-8626-41C0-A61E-A73FBE5920D1) - { - interface ILgCodePageEnumerator; - }; - DeclareCoClass(LgLanguageEnumerator, B887505B-74DE-4ADC-A1D9-5553428C8D02) - { - interface ILgLanguageEnumerator; - }; DeclareCoClass(LgIcuConverterEnumerator, 9E729461-F80D-4796-BA17-086BC61907F1) { interface ILgIcuConverterEnumerator; diff --git a/Src/Language/Language.mak b/Src/Language/Language.mak index bb6df50b18..7c48d0853a 100644 --- a/Src/Language/Language.mak +++ b/Src/Language/Language.mak @@ -57,97 +57,29 @@ LINK_LIBS=Generic.lib Usp10.lib xmlparse.lib $(LINK_LIBS) # === Object Lists === -# not currently used -OBJ_LANMODEL=\ - $(INT_DIR)\genpch\LgCharOverride.obj\ - $(INT_DIR)\autopch\LgCharPropSpec.obj\ - $(INT_DIR)\autopch\LgCharSpec.obj\ - $(INT_DIR)\autopch\LgCollaterSpec.obj\ - $(INT_DIR)\autopch\LgComponent.obj\ - $(INT_DIR)\autopch\LgConverterSpec.obj\ - $(INT_DIR)\autopch\LgConvertStringSpec.obj\ - $(INT_DIR)\autopch\LgExternalSpecComponent.obj\ - $(INT_DIR)\autopch\LgLineBreakSpaceSpec.obj\ - $(INT_DIR)\autopch\LgLineBreakSpec.obj\ - $(INT_DIR)\autopch\LgOwnedSpecComponent.obj\ - $(INT_DIR)\autopch\LgNumericConverterSpec.obj\ - $(INT_DIR)\autopch\LgRenderSpec.obj\ - $(INT_DIR)\autopch\LgRomanRendererSpec.obj\ - $(INT_DIR)\autopch\LgSpec.obj\ - $(INT_DIR)\autopch\LgSpellCheckSpec.obj\ - $(INT_DIR)\autopch\LgSysCollaterSpec.obj\ - $(INT_DIR)\autopch\LgTokenizerSpec.obj\ - $(INT_DIR)\autopch\LgUnicodeCollaterSpec.obj\ - $(INT_DIR)\autopch\LgUserClassSpec.obj\ - $(INT_DIR)\autopch\LgWfiCheckerSpec.obj\ - $(INT_DIR)\autopch\LgWinRendSpec.obj\ - $(INT_DIR)\autopch\LgWordBreakSpaceSpec.obj\ - $(INT_DIR)\autopch\LgCPWordTokenizer.obj\ - $(INT_DIR)\autopch\LgNumericEngine.obj\ - $(INT_DIR)\autopch\FwStyledText.obj\ - $(INT_DIR)\autopch\WriteXml.obj\ - $(INT_DIR)\autopch\LangDef.obj\ - $(INT_DIR)\usepch\TextProps1.obj\ - $(INT_DIR)\autopch\FwXml.obj\ - OBJ_LANG=\ $(INT_DIR)\genpch\RegexMatcherWrapper.obj\ $(INT_DIR)\autopch\LgIcuWrappers.obj\ - $(INT_DIR)\autopch\LgCodePageEnumerator.obj\ - $(INT_DIR)\autopch\LgKeymanHandler.obj\ $(INT_DIR)\autopch\UniscribeEngine.obj\ $(INT_DIR)\autopch\UniscribeSegment.obj\ $(INT_DIR)\autopch\RomRenderEngine.obj\ $(INT_DIR)\autopch\RomRenderSegment.obj\ $(INT_DIR)\autopch\LgSimpleEngines.obj\ $(INT_DIR)\autopch\LgIcuCharPropEngine.obj\ - $(INT_DIR)\autopch\LgFontManager.obj\ $(INT_DIR)\autopch\LgUnicodeCollater.obj\ - $(INT_DIR)\autopch\LgInputMethodEditor.obj\ $(INT_DIR)\autopch\ModuleEntry.obj\ $(INT_DIR)\autopch\FwStyledText.obj\ $(INT_DIR)\autopch\WriteXml.obj\ $(INT_DIR)\usepch\TextProps1.obj\ $(INT_DIR)\autopch\FwXml.obj\ - $(INT_DIR)\autopch\LgTextServices.obj\ - $(INT_DIR)\autopch\LanguageGlobals.obj\ $(INT_DIR)\autopch\dlldatax.obj\ -XMO_LANGSERV=\ - $(COM_INT_DIR)\LgCharOverride.xmo\ - $(COM_INT_DIR)\LgCharPropSpec.xmo\ - $(COM_INT_DIR)\LgCharSpec.xmo\ - $(COM_INT_DIR)\LgCollaterSpec.xmo\ - $(COM_INT_DIR)\LgComponent.xmo\ - $(COM_INT_DIR)\LgConverterSpec.xmo\ - $(COM_INT_DIR)\LgConvertStringSpec.xmo\ - $(COM_INT_DIR)\LgWritingSystemModel.xmo\ - $(COM_INT_DIR)\LgExternalSpecComponent.xmo\ - $(COM_INT_DIR)\LgLineBreakSpaceSpec.xmo\ - $(COM_INT_DIR)\LgLineBreakSpec.xmo\ - $(COM_INT_DIR)\LgOwnedSpecComponent.xmo\ - $(COM_INT_DIR)\LgNumericConverterSpec.xmo\ - $(COM_INT_DIR)\LgRenderSpec.xmo\ - $(COM_INT_DIR)\LgRomanRendererSpec.xmo\ - $(COM_INT_DIR)\LgSpec.xmo\ - $(COM_INT_DIR)\LgSpellCheckSpec.xmo\ - $(COM_INT_DIR)\LgSysCollaterSpec.xmo\ - $(COM_INT_DIR)\LgTokenizerSpec.xmo\ - $(COM_INT_DIR)\LgUnicodeCollaterSpec.xmo\ - $(COM_INT_DIR)\LgUserClassSpec.xmo\ - $(COM_INT_DIR)\LgWfiCheckerSpec.xmo\ - $(COM_INT_DIR)\LgWinRendSpec.xmo\ - $(COM_INT_DIR)\LgWordBreakSpaceSpec.xmo\ - OBJ_GRUTIL=\ ## $(INT_DIR)\autopch\TtfUtil.obj\ $(INT_DIR)\autopch\GrUtil.obj\ - -# XMO_ALL=$(XMO_LANGSERV) - IDL_MAIN=$(COM_OUT_DIR)\LanguageTlb.idl PS_MAIN=LanguagePs diff --git a/Src/Language/Language.vcxproj b/Src/Language/Language.vcxproj index 404dfbaea7..387be729e1 100644 --- a/Src/Language/Language.vcxproj +++ b/Src/Language/Language.vcxproj @@ -94,16 +94,10 @@ - - - - - - @@ -114,16 +108,10 @@ - - - - - - @@ -138,6 +126,7 @@ + @@ -146,4 +135,4 @@ - \ No newline at end of file + diff --git a/Src/Language/LanguageGlobals.cpp b/Src/Language/LanguageGlobals.cpp deleted file mode 100644 index a1bd46858e..0000000000 --- a/Src/Language/LanguageGlobals.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/*-----------------------------------------------------------------------*//*:Ignore in Surveyor -Copyright (C) 2010 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LanguageGlobals.cpp -Responsibility: Calgary -Last reviewed: - - Contains what should be the only static or global objects (not scalers) that - exist in the Language module. --------------------------------------------------------------------------------*//*:End Ignore*/ - -#include "Main.h" - -// Nothing should directly reference this. -static LanguageGlobals g_language; - -LanguageGlobals::LanguageGlobals() -{ - -} - -LanguageGlobals::~LanguageGlobals() -{ - -} - -// The single global instance of the LgFontManager. -LgFontManager LanguageGlobals::g_fm; // Global LgFontManager. - -#ifdef WIN32 -// The single global instance of the LgTextServices. -LgTextServices LanguageGlobals::g_lts; -#endif diff --git a/Src/Language/LanguageGlobals.h b/Src/Language/LanguageGlobals.h deleted file mode 100644 index 88d022cab4..0000000000 --- a/Src/Language/LanguageGlobals.h +++ /dev/null @@ -1,45 +0,0 @@ -/*-----------------------------------------------------------------------*//*:Ignore in Surveyor -Copyright (C) 2010 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LanguageGlobals.h -Responsibility: Calgary -Last reviewed: - - Contains what should be the only static or global objects (not scalers) that - exist in the Language module. - This was done to control the order of construction and (mainly) destruction). - see FWNX-177. --------------------------------------------------------------------------------*//*:End Ignore*/ - -#if _MSC_VER -#pragma once -#endif -#ifndef LanguageGlobals_H -#define LanguageGlobals_H 1 - -#include "LgFontManager.h" - -#ifdef WIN32 -#include "LgTextServices.h" -#endif - -class LanguageGlobals -{ -public: - LanguageGlobals(); - ~LanguageGlobals(); - - // Originally from LgFontManager.h - static LgFontManager g_fm; // Global LgFontManager. - -#ifdef WIN32 - // Originally from LgTextServices.cpp - static LgTextServices g_lts; -#endif - -}; - -#endif diff --git a/Src/Language/Language_GUIDs.cpp b/Src/Language/Language_GUIDs.cpp index 4f38ba86c5..19791219a4 100644 --- a/Src/Language/Language_GUIDs.cpp +++ b/Src/Language/Language_GUIDs.cpp @@ -25,7 +25,6 @@ DEFINE_UUIDOF(TsStrBldr, 0xF1EF76EB, 0xBE04, 0x11d3, 0x8D, 0x9A, 0x00, 0x50, 0x0 DEFINE_UUIDOF(TsIncStrBldr, 0xF1EF76EC, 0xBE04, 0x11d3, 0x8D, 0x9A, 0x00, 0x50, 0x04, 0xDE, 0xFE, 0xC4); DEFINE_UUIDOF(TsPropsBldr, 0xF1EF76ED, 0xBE04, 0x11d3, 0x8D, 0x9A, 0x00, 0x50, 0x04, 0xDE, 0xFE, 0xC4); DEFINE_UUIDOF(TsMultiString, 0x7A1B89C0, 0xC2D6, 0x11d3, 0x9B, 0xB7, 0x00, 0x40, 0x05, 0x41, 0xF9, 0xE9); -DEFINE_UUIDOF(ILgInputMethodEditor, 0xE1B27A5F, 0xDD1B, 0x4BBA, 0x9B, 0x72, 0x00, 0xBD, 0xE0, 0x31, 0x62, 0xFC); DEFINE_UUIDOF(IVwGraphics, 0xF7233278, 0xEA87, 0x4FC9, 0x83, 0xE2, 0xCB, 0x7C, 0xC4, 0x5D, 0xEB, 0xE7); DEFINE_UUIDOF(IJustifyingRenderer, 0x1141174B, 0x923F, 0x4C43, 0xBA, 0x43, 0x8A, 0x32, 0x6B, 0x76, 0xA3, 0xF2); DEFINE_UUIDOF(ISimpleInit, 0x6433D19E, 0x2DA2, 0x4041, 0xB2, 0x02, 0xDB, 0x11, 0x8E, 0xE1, 0x69, 0x4D); @@ -49,15 +48,8 @@ DEFINE_UUIDOF(ILgSpellChecker, 0xE3661AF5, 0x26C6, 0x4907, 0x92, 0x43, 0x61, 0x0 DEFINE_UUIDOF(ILgCollatingEngine, 0xD27A3D8C, 0xD3FE, 0x4E25, 0x90, 0x97, 0x8F, 0x4A, 0x1F, 0xB3, 0x03, 0x61); DEFINE_UUIDOF(ILgSearchEngine, 0x09FCA8D5, 0x5BF6, 0x4BFF, 0xA3, 0x17, 0xE0, 0x12, 0x64, 0x10, 0xD7, 0x9A); DEFINE_UUIDOF(ILgWritingSystem, 0x9F74A170, 0xE8BB, 0x466d, 0x88, 0x48, 0x5F, 0xDB, 0x28, 0xAC, 0x5A, 0xF8); -DEFINE_UUIDOF(ILgTextServices, 0x5B6303DE, 0xE635, 0x4DD7, 0xA7, 0xFC, 0x34, 0x5B, 0xEE, 0xF3, 0x52, 0xD8); -DEFINE_UUIDOF(ILgFontManager, 0x73718689, 0xB701, 0x4241, 0xA4, 0x08, 0x4C, 0x38, 0x9E, 0xCD, 0x66, 0x64); -DEFINE_UUIDOF(LgInputMethodEditor, 0x659C2C2F, 0x7AF6, 0x4F9E, 0xAC, 0x6F, 0x7A, 0x03, 0xC8, 0x41, 0x8F, 0xC9); -DEFINE_UUIDOF(LgFontManager, 0x02C3F580, 0x796D, 0x4B5F, 0xBE, 0x43, 0x16, 0x6D, 0x97, 0x31, 0x9D, 0xA5); DEFINE_UUIDOF(ILgIcuCharPropEngine, 0xE8689492, 0x7622, 0x427b, 0x85, 0x18, 0x63, 0x39, 0x29, 0x4F, 0xD2, 0x27); DEFINE_UUIDOF(ILgNumericEngine, 0xCBBF35E1, 0xCE39, 0x4EEC, 0xAE, 0xBD, 0x5B, 0x4A, 0xAA, 0xA5, 0x2B, 0x6C); -DEFINE_UUIDOF(ILgKeymanHandler, 0x3F42144B, 0x509F, 0x4def, 0x8D, 0xD3, 0x6D, 0x8D, 0x26, 0x67, 0x70, 0x01); -DEFINE_UUIDOF(ILgCodePageEnumerator, 0x2CFCF4B7, 0x2FFE, 0x4CF8, 0x91, 0xBE, 0xFB, 0xB5, 0x7C, 0xC7, 0x78, 0x2A); -DEFINE_UUIDOF(ILgLanguageEnumerator, 0x746A16E1, 0x0C36, 0x4268, 0xA2, 0x61, 0xE8, 0x01, 0x2B, 0x0D, 0x67, 0xC5); DEFINE_UUIDOF(ILgIcuConverterEnumerator, 0x8E6D558E, 0x8755, 0x4EA1, 0x9F, 0xF6, 0x03, 0x9D, 0x37, 0x53, 0x12, 0xE9); DEFINE_UUIDOF(ILgIcuTransliteratorEnumerator, 0x50F2492C, 0x6C46, 0x48BA, 0x8B, 0x7F, 0x5F, 0x04, 0x15, 0x3A, 0xB2, 0xCC); DEFINE_UUIDOF(ILgIcuLocaleEnumerator, 0x08F649D0, 0xD8AB, 0x447B, 0xAA, 0xB6, 0x21, 0xF8, 0x5C, 0xFA, 0x74, 0x3C); @@ -71,10 +63,6 @@ DEFINE_UUIDOF(LgCPWordTokenizer, 0x7CE7CE94, 0xAC47, 0x42A5, 0x82, 0x3F, 0x2F, 0 DEFINE_UUIDOF(LgWfiSpellChecker, 0x818445E2, 0x0282, 0x4688, 0x8B, 0xB7, 0x14, 0x7F, 0xAA, 0xCF, 0xF7, 0x3A); DEFINE_UUIDOF(LgMSWordSpellChecker, 0x5CF96DA5, 0x299E, 0x4FC5, 0xA9, 0x90, 0x2D, 0x2F, 0xCE, 0xE7, 0x83, 0x4D); DEFINE_UUIDOF(LgNumericEngine, 0xFF22A7AB, 0x223E, 0x4D04, 0xB6, 0x48, 0x0A, 0xE4, 0x05, 0x88, 0x26, 0x1D); -DEFINE_UUIDOF(LgKeymanHandler, 0x69ACA99C, 0xF852, 0x4C2C, 0x9B, 0x5F, 0xFF, 0x83, 0x23, 0x8A, 0x17, 0xA5); -DEFINE_UUIDOF(LgTextServices, 0x720485C5, 0xE8D5, 0x4761, 0x92, 0xF0, 0xF7, 0x0D, 0x2B, 0x3C, 0xF9, 0x80); -DEFINE_UUIDOF(LgCodePageEnumerator, 0x9045F113, 0x8626, 0x41C0, 0xA6, 0x1E, 0xA7, 0x3F, 0xBE, 0x59, 0x20, 0xD1); -DEFINE_UUIDOF(LgLanguageEnumerator, 0xB887505B, 0x74DE, 0x4ADC, 0xA1, 0xD9, 0x55, 0x53, 0x42, 0x8C, 0x8D, 0x02); DEFINE_UUIDOF(LgIcuConverterEnumerator, 0x9E729461, 0xF80D, 0x4796, 0xBA, 0x17, 0x08, 0x6B, 0xC6, 0x19, 0x07, 0xF1); DEFINE_UUIDOF(LgIcuTransliteratorEnumerator, 0x3F1FD0A4, 0xB2B1, 0x4589, 0xBC, 0x82, 0x9C, 0xEF, 0x5B, 0xA8, 0x4F, 0x4E); DEFINE_UUIDOF(LgIcuResourceBundle, 0x0DD7FC1A, 0xAB97, 0x4A39, 0x88, 0x2C, 0x26, 0x97, 0x60, 0xD8, 0x66, 0x19); diff --git a/Src/Language/LgCPWordTokenizer.cpp b/Src/Language/LgCPWordTokenizer.cpp deleted file mode 100644 index f497646a6c..0000000000 --- a/Src/Language/LgCPWordTokenizer.cpp +++ /dev/null @@ -1,280 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 1999, 2001 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgCPWordTokenizer.cpp -Responsibility: John Thomson -Last reviewed: Not yet. - -Description: A Tokenizer that finds word breaks by looking for sequences of word-forming - tokens. A word-forming token is recognized by the IsWordforming function - contained in the header file. The IsWordforming function recognizes capital - and lowercase letters to be word-forming by using the predefined function isalpha. --------------------------------------------------------------------------------*//*:End Ignore*/ - -//:>******************************************************************************************** -//:> Include files -//:>******************************************************************************************** -#include "Main.h" - -#pragma hdrstop -#undef THIS_FILE -DEFINE_THIS_FILE - -//:>******************************************************************************************** -//:> Forward declarations -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Local Constants and static variables -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Constructor/Destructor -//:>******************************************************************************************** - -LgCPWordTokenizer::LgCPWordTokenizer() -{ - m_cref = 1; - ModuleEntry::ModuleAddRef(); -} - -LgCPWordTokenizer::~LgCPWordTokenizer() -{ - ModuleEntry::ModuleRelease(); -} -//:>******************************************************************************************** -//:> Generic factory stuff to allow creating an instance with CoCreateInstance. -//:>******************************************************************************************** -static GenericFactory g_fact( - "SIL.Language1.LgCPWordTokenizer", - &CLSID_LgCPWordTokenizer, - "SIL char property based word tokenizer", - "Apartment", - &LgCPWordTokenizer::CreateCom); - - -void LgCPWordTokenizer::CreateCom(IUnknown *punkCtl, REFIID riid, void ** ppv) -{ - AssertPtr(ppv); - Assert(!*ppv); - if (punkCtl) - ThrowHr(WarnHr(CLASS_E_NOAGGREGATION)); - - ComSmartPtr qcpwt; - qcpwt.Attach(NewObj LgCPWordTokenizer()); // ref count initialy 1 - CheckHr(pcpwt->QueryInterface(riid, ppv)); -} - -//:>******************************************************************************************** -//:> IUnknown Methods -//:>******************************************************************************************** -STDMETHODIMP LgCPWordTokenizer::QueryInterface(REFIID riid, void **ppv) -{ - AssertPtr(ppv); - if (!ppv) - return WarnHr(E_POINTER); - *ppv = NULL; - - if (riid == IID_IUnknown) - *ppv = static_cast(static_cast(this)); - else if (riid == IID_ILgTokenizer) - *ppv = static_cast(this); - else if (riid == IID_ISupportErrorInfo) - { - *ppv = NewObj CSupportErrorInfo2(static_cast(this), - IID_ISimpleInit, IID_ILgTokenizer); - return S_OK; - } - else - return E_NOINTERFACE; - - AddRef(); - return NOERROR; -} - - -//:>******************************************************************************************** -//:> ISimpleInit Methods -//:>******************************************************************************************** - -/*---------------------------------------------------------------------------------------------- - Initialize an instance from a ClassInitMoniker - - To create a suitable moniker, do something like this: - - IClassInitMonikerPtr qcim; - hr = qcim.CreateInstance(CLSID_ClassInitMoniker); - hr = qcim->InitNew(CLSID_LgCPWordTokenizer, NULL, 0); - - Note that no init data is required by this implementation which is based on standard - character properties. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgCPWordTokenizer::InitNew(const BYTE * prgb, int cb) -{ - BEGIN_COM_METHOD - ChkComArrayArg(prgb, cb); - - // Nothing to do at present. - END_COM_METHOD(g_fact, IID_ISimpleInit); -} - -/*---------------------------------------------------------------------------------------------- - Return the initialization value previously set by InitNew. - - @param pbstr Pointer to a BSTR for returning the initialization data. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgCPWordTokenizer::get_InitializationData(BSTR * pbstr) -{ - BEGIN_COM_METHOD - ChkComOutPtr(pbstr); - // Leave output null. - END_COM_METHOD(g_fact, IID_ISimpleInit); -} - - -//:>******************************************************************************************** -//:> ILgTokenizer Methods -//:>******************************************************************************************** - -/*---------------------------------------------------------------------------------------------- - Get the next token of whatever kind this tokenizer supports from the input string. - Return E_FAIL if there are no more. (Also set *pichMin and *pichLim to -1.) - ENHANCE: should we pass an ichFirst? -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgCPWordTokenizer::GetToken(OLECHAR * prgchInput, int cch, int * pichMin, - int * pichLim) -{ - BEGIN_COM_METHOD - ChkComArrayArg(prgchInput, cch); - ChkComArgPtr(pichMin); - ChkComArgPtr(pichLim); - - // checks arguments - - int cchCount = 0; - bool fFirst = false; // flags if a wordforming character has been found - - // steps through input - while(cchCount < cch) - { - // checks to see if input is a wordforming character - if(IsWordforming(*prgchInput)) - { - // input is the first wordforming character - if(!fFirst) - { - *pichMin = cchCount; - fFirst = true; - } - } - // if input is not a wordforming character and pichMin has been set - else - { - if(fFirst) - { - *pichLim = cchCount; - return S_OK; - } - } - prgchInput++; - cchCount++; - } - // no token is found - if(!fFirst) - { - *pichMin = *pichLim = -1; - return E_FAIL; - } - // token goes to the end of input - else - *pichLim = cch; - END_COM_METHOD(g_fact, IID_ILgTokenizer); -} - -/*---------------------------------------------------------------------------------------------- - For VB, get the start of the first token that begins at or after ichFirst - Characters before ichFirst are not examined; the result is as if the string - began at ichFirst. - Return E_FAIL if no token found -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgCPWordTokenizer::get_TokenStart(BSTR bstrInput, int ichFirst, int * pichMin) -{ - BEGIN_COM_METHOD - ChkComBstrArgN(bstrInput); - ChkComArgPtr(pichMin); - if (ichFirst < 0) - ThrowInternalError(E_INVALIDARG, "Negative char offset"); - - OLECHAR * pchInput; - int cch = 0; - pchInput = bstrInput + ichFirst; - - while (*pchInput != '\0') - { - // if the input is wordforming, assign to pichMin and exit loop - if(IsWordforming(*pchInput)) - { - *pichMin = cch; - return S_OK; - } - pchInput++; - cch++; - } - // a wordforming character is not found - return E_FAIL; - END_COM_METHOD(g_fact, IID_ILgTokenizer); -} - -/*---------------------------------------------------------------------------------------------- - For VB, get the end of the first token that BEGINS at or after ichFirst. - Note: ichFirst may be the result obtained from a previous call to TokenStart, - rather than the value passed to TokenStart, but to obtain the limit of the same - token it must not be larger than that. In other words, this method does NOT - find the first end-of-token at or after ichFirst: it must find a complete token - starting there. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgCPWordTokenizer::get_TokenEnd(BSTR bstrInput, int ichFirst, int * pichLim) -{ - BEGIN_COM_METHOD - ChkComBstrArgN(bstrInput); - ChkComArgPtr(pichLim); - if (ichFirst < 0) - ThrowInternalError(E_INVALIDARG, "Negative char offset"); - - OLECHAR * pchInput; - bool fFirst = false; - int cch = 0; - pchInput = bstrInput + ichFirst; - - while(*pchInput != '\0') - { - if(IsWordforming(*pchInput)) - { - // if first wordforming character is found - if(!fFirst) - fFirst = true; - } - else - { - // a non-wordforming character is found after fFirst is true - if(fFirst) - { - *pichLim = cch; - return S_OK; - } - } - cch++; - pchInput++; - } - // if no wordforming characters are found - if(!fFirst) - return E_FAIL; - - // end of string is reached before finding pichLim - else - *pichLim = cch; - END_COM_METHOD(g_fact, IID_ILgTokenizer); -} diff --git a/Src/Language/LgCPWordTokenizer.h b/Src/Language/LgCPWordTokenizer.h deleted file mode 100644 index aa716c48a7..0000000000 --- a/Src/Language/LgCPWordTokenizer.h +++ /dev/null @@ -1,80 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 1999, 2001 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgCPWordTokenizer.h -Responsibility: John Thomson -Last reviewed: Not yet. - -Description: - --------------------------------------------------------------------------------*//*:End Ignore*/ -#pragma once -#ifndef LGCPWORDTOKENIZER_INCLUDED -#define LGCPWORDTOKENIZER_INCLUDED - -/*---------------------------------------------------------------------------------------------- -Class: LgCPWordTokenizer -Description: A Tokenizer that finds word breaks by looking for sequences of word-forming - tokens. A word-forming token is a letter, capital or lowercase (as recognized - by the built-in function isalpha. -Hungarian: cpwt -----------------------------------------------------------------------------------------------*/ -class LgCPWordTokenizer : - public ILgTokenizer, - public ISimpleInit -{ -public: - // Static methods - static void CreateCom(IUnknown *punkOuter, REFIID iid, void ** ppv); - - // Constructors/destructors/etc. - LgCPWordTokenizer(); - virtual ~LgCPWordTokenizer(); - - // IUnknown methods - STDMETHOD(QueryInterface)(REFIID iid, void ** ppv); - STDMETHOD_(UCOMINT32, AddRef)(void) - { - return InterlockedIncrement(&m_cref); - } - STDMETHOD_(UCOMINT32, Release)(void) - { - long cref = InterlockedDecrement(&m_cref); - if (cref == 0) { - m_cref = 1; - delete this; - } - return cref; - } - - // ISimpleInit Methods - STDMETHOD(InitNew)(const BYTE * prgb, int cb); - STDMETHOD(get_InitializationData)(BSTR * pbstr); - - // ILgTokenizer methods - STDMETHOD(GetToken)(OLECHAR * prgchInput, int cch, int * pichMin, int * pichLim); - STDMETHOD(get_TokenStart)(BSTR bstrInput, int ichFirst, int *pichMin); - STDMETHOD(get_TokenEnd)(BSTR bstrInput, int ichFirst, int *pichLim); - - // Member variable access - - // Other public methods - -protected: - // Member variables - long m_cref; // standard COM ref count - - // Static methods - - // Constructors/destructors/etc. - - // Other protected methods - bool IsWordforming(OLECHAR ch) - { - return isalpha(ch); - } -}; -#endif //LGCPWORDTOKENIZER_INCLUDED diff --git a/Src/Language/LgCodePageEnumerator.cpp b/Src/Language/LgCodePageEnumerator.cpp deleted file mode 100644 index 1617fb97ef..0000000000 --- a/Src/Language/LgCodePageEnumerator.cpp +++ /dev/null @@ -1,287 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 1999, 2001 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgCodePageEnumerator.cpp -Responsibility: John Thomson -Last reviewed: Not yet. - -Description: - --------------------------------------------------------------------------------*//*:End Ignore*/ - -//:>******************************************************************************************** -//:> Include files -//:>******************************************************************************************** -#include "Main.h" -#pragma hdrstop -// any other headers (not precompiled) - -#undef THIS_FILE -DEFINE_THIS_FILE - -//:>******************************************************************************************** -//:> Forward declarations -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Local Constants and static variables -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Constructor/Destructor -//:>******************************************************************************************** - -LgCodePageEnumerator::LgCodePageEnumerator() -{ - m_cref = 1; - ModuleEntry::ModuleAddRef(); - -} - -LgCodePageEnumerator::~LgCodePageEnumerator() -{ - ModuleEntry::ModuleRelease(); -} - -//:>******************************************************************************************** -//:> Generic factory stuff to allow creating an instance with CoCreateInstance. -//:>******************************************************************************************** -static GenericFactory g_fact( - _T("SIL.Language1.LgCodePageEnumerator"), - &CLSID_LgCodePageEnumerator, - _T("SIL code page enumerator"), - _T("Apartment"), - &LgCodePageEnumerator::CreateCom); - - -void LgCodePageEnumerator::CreateCom(IUnknown *punkCtl, REFIID riid, void ** ppv) -{ - AssertPtr(ppv); - Assert(!*ppv); - if (punkCtl) - ThrowHr(WarnHr(CLASS_E_NOAGGREGATION)); - - ComSmartPtr qlcpe; - qlcpe.Attach(NewObj LgCodePageEnumerator()); // ref count initialy 1 - CheckHr(qlcpe->QueryInterface(riid, ppv)); -} - - - -//:>******************************************************************************************** -//:> IUnknown Methods -//:>******************************************************************************************** -STDMETHODIMP LgCodePageEnumerator::QueryInterface(REFIID riid, void **ppv) -{ - AssertPtr(ppv); - if (!ppv) - return WarnHr(E_POINTER); - *ppv = NULL; - - if (riid == IID_IUnknown) - *ppv = static_cast(static_cast(this)); - else if (riid == IID_ILgCodePageEnumerator) - *ppv = static_cast(static_cast(this)); - else if (riid == IID_ISupportErrorInfo) - { - *ppv = NewObj CSupportErrorInfo(static_cast(this), - IID_ILgCodePageEnumerator); - return S_OK; - } - else - return E_NOINTERFACE; - - AddRef(); - return NOERROR; -} - -//:>******************************************************************************************** -//:> ILgCodePageEnumerator Methods -//:>******************************************************************************************** - -STDMETHODIMP LgCodePageEnumerator::Init() -{ - BEGIN_COM_METHOD -#if WIN32 - IMultiLanguage2Ptr qml2; - qml2.CreateInstance(CLSID_CMultiLanguage); - CheckHr(qml2->EnumCodePages(MIMECONTF_VALID, 0, &m_qecp)); -#else - // TODO-Linux FWNX-114: implement windows code page support on Linux -#endif - END_COM_METHOD(g_fact, IID_ILgCodePageEnumerator); -} - -STDMETHODIMP LgCodePageEnumerator::Next(int * pnId, BSTR * pbstrName) -{ - BEGIN_COM_METHOD - ChkComOutPtr(pnId); - ChkComOutPtr(pbstrName); -#if WIN32 - if (!m_qecp) - ThrowHr(WarnHr(E_UNEXPECTED)); - MIMECPINFO info; - - ULONG celt; - CheckHr(m_qecp->Next(1, &info, &celt)); - if (celt == 1) - { - *pbstrName = SysAllocString(info.wszDescription); - if (!*pbstrName) - ThrowHr(WarnHr(E_OUTOFMEMORY)); - *pnId = info.uiCodePage; - } -#else - // TODO-Linux FWNX-114: implement windows code page support on Linux - *pnId = 0; - *pbstrName = NULL; -#endif - - END_COM_METHOD(g_fact, IID_ILgCodePageEnumerator); -} - -//:>******************************************************************************************** -//:> Forward declarations -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Local Constants and static variables -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Constructor/Destructor -//:>******************************************************************************************** - -LgLanguageEnumerator::LgLanguageEnumerator() -{ - m_cref = 1; - ModuleEntry::ModuleAddRef(); - m_ulCount = 0; - m_iLangId = 0; -} - -LgLanguageEnumerator::~LgLanguageEnumerator() -{ - ModuleEntry::ModuleRelease(); - if (m_prgLangIds) - { - CoTaskMemFree(m_prgLangIds); - m_prgLangIds = NULL; - m_ulCount = 0; - } - -} - -//:>******************************************************************************************** -//:> Generic factory stuff to allow creating an instance with CoCreateInstance. -//:>******************************************************************************************** -static GenericFactory g_factLang( - _T("SIL.Language1.LgLanguageEnumerator"), - &CLSID_LgLanguageEnumerator, - _T("SIL language enumerator"), - _T("Apartment"), - &LgLanguageEnumerator::CreateCom); - - -void LgLanguageEnumerator::CreateCom(IUnknown *punkCtl, REFIID riid, void ** ppv) -{ - AssertPtr(ppv); - Assert(!*ppv); - if (punkCtl) - ThrowHr(WarnHr(CLASS_E_NOAGGREGATION)); - - ComSmartPtr qlcpe; - qlcpe.Attach(NewObj LgLanguageEnumerator()); // ref count initialy 1 - CheckHr(qlcpe->QueryInterface(riid, ppv)); -} - - - -//:>******************************************************************************************** -//:> IUnknown Methods -//:>******************************************************************************************** -STDMETHODIMP LgLanguageEnumerator::QueryInterface(REFIID riid, void **ppv) -{ - AssertPtr(ppv); - if (!ppv) - return WarnHr(E_POINTER); - *ppv = NULL; - - if (riid == IID_IUnknown) - *ppv = static_cast(static_cast(this)); - else if (riid == IID_ILgLanguageEnumerator) - *ppv = static_cast(static_cast(this)); - else if (riid == IID_ISupportErrorInfo) - { - *ppv = NewObj CSupportErrorInfo(static_cast(this), - IID_ILgLanguageEnumerator); - return S_OK; - } - else - return E_NOINTERFACE; - - AddRef(); - return NOERROR; -} - -//:>******************************************************************************************** -//:> ILgLanguageEnumerator Methods -//:>******************************************************************************************** - -STDMETHODIMP LgLanguageEnumerator::Init() -{ - BEGIN_COM_METHOD -#if WIN32 - ITfInputProcessorProfilesPtr qProfiles; - qProfiles.CreateInstance(CLSID_TF_InputProcessorProfiles); - - m_iLangId = 0; - // GetLanguageList might return 0 languages, e.g. when run from Hudson CI machine where - // the tests are run with Local System account. - return qProfiles->GetLanguageList(&m_prgLangIds, &m_ulCount); -#else - // TODO-Linux: need to be able to port this. to some Linux equivelent -#endif - END_COM_METHOD(g_factLang, IID_ILgLanguageEnumerator); -} - -STDMETHODIMP LgLanguageEnumerator::Next(int * pnLoc, BSTR * pbstrName) -{ - BEGIN_COM_METHOD -#if WIN32 - ChkComOutPtr(pnLoc); - ChkComOutPtr(pbstrName); - if (!m_prgLangIds) - ThrowHr(WarnHr(E_UNEXPECTED)); - if (m_iLangId >= m_ulCount) - return S_OK; // past end, leave *pnLoc 0 and *pbstrName null. - - wchar szLangName[MAX_PATH]; - - //Get the language name and print it to the debug window. - if( 0 == GetLocaleInfoW(MAKELCID(m_prgLangIds[m_iLangId], SORT_DEFAULT), - LOCALE_SLANGUAGE, - szLangName, - MAX_PATH)) - { - //InKey can give values that are not supported by the operating system. - //Return the bad id with an error message - *pnLoc = m_prgLangIds[m_iLangId++]; - return E_FAIL; - } - - *pbstrName = SysAllocString(szLangName); - if (!*pbstrName) - ThrowHr(WarnHr(E_OUTOFMEMORY)); - *pnLoc = m_prgLangIds[m_iLangId++]; -#else - // TODO-Linux: need to be able to port this. to some Linux equivelent - *pnLoc = 0; - *pbstrName = NULL; -#endif - - END_COM_METHOD(g_factLang, IID_ILgLanguageEnumerator); -} diff --git a/Src/Language/LgCodePageEnumerator.h b/Src/Language/LgCodePageEnumerator.h deleted file mode 100644 index 27e025071d..0000000000 --- a/Src/Language/LgCodePageEnumerator.h +++ /dev/null @@ -1,113 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 1999, 2001 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgCodePageEnumerator.h -Responsibility: John Thomson -Last reviewed: Not yet. - -Description: - --------------------------------------------------------------------------------*//*:End Ignore*/ -#pragma once -#ifndef LgCodePageEnumerator_INCLUDED -#define LgCodePageEnumerator_INCLUDED - -#if WIN32 -DEFINE_COM_PTR(IEnumCodePage); -DEFINE_COM_PTR(IMultiLanguage2); -#endif - -/*---------------------------------------------------------------------------------------------- -Class: LgCodePageEnumerator -Description: -Hungarian: lcpe -----------------------------------------------------------------------------------------------*/ -class LgCodePageEnumerator : ILgCodePageEnumerator -{ -public: - // Static methods - static void CreateCom(IUnknown *punkOuter, REFIID iid, void ** ppv); - - // Constructors/destructors/etc. - LgCodePageEnumerator(); - virtual ~LgCodePageEnumerator(); - - // IUnknown methods - STDMETHOD(QueryInterface)(REFIID iid, void ** ppv); - STDMETHOD_(UCOMINT32, AddRef)(void) - { - return InterlockedIncrement(&m_cref); - } - STDMETHOD_(UCOMINT32, Release)(void) - { - long cref = InterlockedDecrement(&m_cref); - if (cref == 0) { - m_cref = 1; - delete this; - } - return cref; - } - - // ILgCodePageEnumerator Methods - STDMETHOD(Init)(); - STDMETHOD(Next)(int * pnId, BSTR * pbstrName); - -protected: - // Member variables - long m_cref; - -#if WIN32 - IEnumCodePagePtr m_qecp; -#endif -}; - -#if WIN32 -DEFINE_COM_PTR(ITfInputProcessorProfiles); -#endif -/*---------------------------------------------------------------------------------------------- -Class: LgLanguageEnumerator -Description: -Hungarian: lcpe -----------------------------------------------------------------------------------------------*/ -class LgLanguageEnumerator : ILgLanguageEnumerator -{ -public: - // Static methods - static void CreateCom(IUnknown *punkOuter, REFIID iid, void ** ppv); - - // Constructors/destructors/etc. - LgLanguageEnumerator(); - virtual ~LgLanguageEnumerator(); - - // IUnknown methods - STDMETHOD(QueryInterface)(REFIID iid, void ** ppv); - STDMETHOD_(UCOMINT32, AddRef)(void) - { - return InterlockedIncrement(&m_cref); - } - STDMETHOD_(UCOMINT32, Release)(void) - { - long cref = InterlockedDecrement(&m_cref); - if (cref == 0) { - m_cref = 1; - delete this; - } - return cref; - } - - // ILgLanguageEnumerator Methods - STDMETHOD(Init)(); - STDMETHOD(Next)(int * pnId, BSTR * pbstrName); - -protected: - // Member variables - long m_cref; - - LANGID *m_prgLangIds; // Array set up by init and freed by destructor - ULONG m_ulCount; // Count of langids in m_prgLangIds - ULONG m_iLangId; // Supports enumeration by identifying current position. -}; -#endif //LgCodePageEnumerator_INCLUDED diff --git a/Src/Language/LgFontManager.cpp b/Src/Language/LgFontManager.cpp deleted file mode 100644 index e1746bbcd7..0000000000 --- a/Src/Language/LgFontManager.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 1999, 2001 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgFontManager.cpp -Responsibility: Larry Waswick -Last reviewed: Not yet. - -Description: - --------------------------------------------------------------------------------*//*:End Ignore*/ - -//:>******************************************************************************************** -//:> Include files -//:>******************************************************************************************** -#include "Main.h" -#pragma hdrstop -//:> Any other headers (not precompiled). -#include "Vector_i.cpp" -#if !WIN32 -#include -#endif - -#undef THIS_FILE -DEFINE_THIS_FILE - -OleStringLiteral pszSys(L"System"); -static Pcsz g_pszSys = pszSys; - -//:>******************************************************************************************** -//:> Forward declarations. -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Local Constants and static variables. -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Constructor/Destructor. -//:>******************************************************************************************** - -/*------------------------------------------------------------------------------------------ - This generic constructor simply gets the list of the (TrueType) fonts for the global - variable g_fm. -------------------------------------------------------------------------------------------*/ -LgFontManager::LgFontManager(void) -{ - // Don't call ModuleAddRef since there is a global singleton LgFontManager. Its - // AddRef and Release methods call ModuleAddRef and ModuleRelease. - GetFontNames(); -} - -LgFontManager::~LgFontManager() -{ -} - -//:>******************************************************************************************** -//:> Generic factory stuff to allow creating an instance with CoCreateInstance. -//:>******************************************************************************************** -// Generic factory used to create an instance of LgFontManager with CoCreateInstance. -static GenericFactory g_fact( - _T("SIL.Language1.FontManager"), - &CLSID_LgFontManager, - _T("SIL Font Manager"), - _T("Apartment"), - &LgFontManager::CreateCom); - - -/*---------------------------------------------------------------------------------------------- - Called by the GenericFactory to "create" an ILgFontManager; it just returns the global one. -----------------------------------------------------------------------------------------------*/ -void LgFontManager::CreateCom(IUnknown * punkCtl, REFIID riid, void ** ppv) -{ - AssertPtr(ppv); - Assert(!*ppv); - if (punkCtl) - ThrowHr(WarnHr(CLASS_E_NOAGGREGATION)); - - CheckHr(LanguageGlobals::g_fm.QueryInterface(riid, ppv)); -} - - -//:>******************************************************************************************** -//:> IUnknown Methods. -//:>******************************************************************************************** -// Get a pointer to the interface identified as iid. -STDMETHODIMP LgFontManager::QueryInterface(REFIID riid, void ** ppv) -{ - AssertPtr(ppv); - if (!ppv) - return WarnHr(E_POINTER); - *ppv = NULL; - - if (riid == IID_IUnknown) - *ppv = static_cast(static_cast(this)); - else if (riid == IID_ILgFontManager) - *ppv = static_cast(this); - else if (riid == IID_ISupportErrorInfo) - { - *ppv = NewObj CSupportErrorInfo(this,IID_ILgFontManager); - return S_OK; - } - else - return E_NOINTERFACE; - - reinterpret_cast(*ppv)->AddRef(); - return NOERROR; -} - - -//:>******************************************************************************************** -//:> ILgFontManager methods. -//:>******************************************************************************************** - -/*---------------------------------------------------------------------------------------------- - Answer in fAvail whether the font named bstrName is available, i.e., in the font list. - - @h3{Parameters} - @code{ - bstrName Name of font. - pfAvail Points to true if the font bstrname is available; false if not. - } -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgFontManager::IsFontAvailable(BSTR bstrName, ComBool * pfAvail) -{ - BEGIN_COM_METHOD; - ChkComBstrArgN(bstrName); - if (!bstrName) - return E_INVALIDARG; - ChkComOutPtr(pfAvail); - - *pfAvail = false; - for (int i = 0; i < m_vstuFonts.Size(); i++) - { - if (m_vstuFonts[i] == bstrName) - { - *pfAvail = true; - return S_OK; - } - } - - END_COM_METHOD(g_fact, IID_ILgFontManager); -} - -/*---------------------------------------------------------------------------------------------- - Answer in fAvail whether the font, made up of cch OLECHAR's in prgchName, is available, - i.e., in the font list. - - @h3{Parameters} - @code{ - cch Count of characters in the font name. - prgchName Range of characters that make up the font name. - pfAvail Points to true if the font prgchName is available; false if not. - } -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgFontManager::IsFontAvailableRgch(int cch, OLECHAR * prgchName, ComBool * pfAvail) -{ - BEGIN_COM_METHOD; - ChkComArrayArg(prgchName, cch); - if (!cch) - return E_INVALIDARG; - ChkComOutPtr(pfAvail); - - *pfAvail = false; - for (int i = 0; i < m_vstuFonts.Size(); i++) - { - if (m_vstuFonts[i].Equals(prgchName, cch)) - { - *pfAvail = true; - return S_OK; - } - } - - END_COM_METHOD(g_fact, IID_ILgFontManager); -} - -/*---------------------------------------------------------------------------------------------- - Answer a comma-separated string of font names in pbstrNames. - - @h3{Parameters} - @code{ - pbstrNames comma-separated string of font names. - } -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgFontManager::AvailableFonts(BSTR * pbstrNames) -{ - BEGIN_COM_METHOD; - ChkComArgPtr(pbstrNames); - - StrUni rgchwComma(L","); - - // Get the list of system fonts, if not already done. - if (0 == m_vstuFonts.Size()) - GetFontNames(); - - // Append font names, each followed by a delimiter. - StrUni stuNames = m_vstuFonts[0]; - for (int i = 1; i < m_vstuFonts.Size(); i++) - { - stuNames.Append(rgchwComma.Chars()); - stuNames.Append(m_vstuFonts[i]); - } - - // SysFreeString(*pbstrNames); // Free previous string, if any. - *pbstrNames = SysAllocString(stuNames.Chars()); - if (!*pbstrNames) - ThrowOutOfMemory(); - - END_COM_METHOD(g_fact, IID_ILgFontManager); -} - -/*---------------------------------------------------------------------------------------------- - Call GetFontNames to refresh the list of fonts. This will trigger a call to FontCallBack, - which will add each font name to the vector stored in m_vstuFonts. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgFontManager::RefreshFontList(void) -{ - BEGIN_COM_METHOD; - - GetFontNames(); - - END_COM_METHOD(g_fact, IID_ILgFontManager); -} - - -//:>******************************************************************************************** -//:> Protected methods. -//:>******************************************************************************************** -#if WIN32 -/*---------------------------------------------------------------------------------------------- - This callback function for EnumFontFamiliesEx, called by GetFontNames, will add each font - name to the vector stored in m_vstuFonts. Keep the vector sorted. -----------------------------------------------------------------------------------------------*/ -int CALLBACK LgFontManager::FontCallBack(ENUMLOGFONTEX * pelfe, NEWTEXTMETRICEX * pntme, - DWORD ft, LPARAM lp) -{ - const achar * pszFont = pelfe->elfLogFont.lfFaceName; - - // The third condition below eliminates font names which begin with '@'. These are a bit - // of a mystery, and seem to represent very large Unicode fonts. For example "@Batang". - // Note that when EnumFontFamiliesEx returns "@Batang" it will also, separately, return - // "Batang", so "Batang" will still be in the list. - if (ft & TRUETYPE_FONTTYPE && _tcscmp(pszFont, g_pszSys) && (*pszFont != '@')) - { - int i = 0; - // Search for the font name pszFont in the sorted vector m_vstuFonts. - for ( - ; - i < LanguageGlobals::g_fm.m_vstuFonts.Size() && LanguageGlobals::g_fm.m_vstuFonts[i] < pszFont; - i++); - - // Add the font name to the vector m_vstuFonts if it is not there already. - if (i == LanguageGlobals::g_fm.m_vstuFonts.Size()) - LanguageGlobals::g_fm.m_vstuFonts.Push(pszFont); - else if (LanguageGlobals::g_fm.m_vstuFonts[i] != pszFont) - LanguageGlobals::g_fm.m_vstuFonts.Insert(i, pszFont); - } - - return 1; // Continue enumerating. -} -#endif //WIN32 - -//:>******************************************************************************************** -//:> Private methods. -//:>******************************************************************************************** - -/*---------------------------------------------------------------------------------------------- - Use an information context to get the available fonts. -----------------------------------------------------------------------------------------------*/ -void LgFontManager::GetFontNames(void) -{ - AssertObj(this); -#if WIN32 - LOGFONT lf; - HDC hdc; - - hdc =CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL); - if (hdc) - { - ClearItems(&lf, 1); - lf.lfCharSet = DEFAULT_CHARSET; - - ::EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)&FontCallBack, 0, 0); - - BOOL fSuccess; - fSuccess = ::DeleteDC(hdc); - Assert(fSuccess); - } -#else - PangoFontMap * pFontMap = pango_cairo_font_map_get_default(); - int nFamilies; - PangoFontFamily ** pFontFamily; - pango_font_map_list_families(pFontMap, &pFontFamily, &nFamilies); - - while (--nFamilies >= 0) - { - const char * fontName = pango_font_family_get_name(pFontFamily[nFamilies]); - int i = 0; - // Search for the font name fontName in the sorted vector m_vstuFonts. - for ( - ; - i < LanguageGlobals::g_fm.m_vstuFonts.Size() && LanguageGlobals::g_fm.m_vstuFonts[i] < fontName; - i++) - { - //Do Nothing - } - - // Add the font name to the vector m_vstuFonts if it is not there already. - if (i == LanguageGlobals::g_fm.m_vstuFonts.Size()) - LanguageGlobals::g_fm.m_vstuFonts.Push(fontName); - else if (LanguageGlobals::g_fm.m_vstuFonts[i] != fontName) - LanguageGlobals::g_fm.m_vstuFonts.Insert(i, fontName); - } - - g_free(pFontFamily); -#endif //WIN32 - -} diff --git a/Src/Language/LgFontManager.h b/Src/Language/LgFontManager.h deleted file mode 100644 index 3fceb08b13..0000000000 --- a/Src/Language/LgFontManager.h +++ /dev/null @@ -1,98 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 1999, 2001 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgFontManager.h -Responsibility: Larry Waswick -Last reviewed: Not yet. --------------------------------------------------------------------------------*//*:End Ignore*/ -#pragma once -#ifndef LgFontManager_H -#define LgFontManager_H - -/*---------------------------------------------------------------------------------------------- - Obtain a list of the (TrueType) fonts that are available on the system, and handle simple - queries about font availability. - - Note: the font manager may load the available fonts once, and use this cached list to answer - subsequent queries. To be sure the answer to a query is current, call RefreshFontList. - - @h3{Data Structures} - @code{ - m_vstuFonts - Vector to hold font names. - } - - @h3{Hungarian: fm} -----------------------------------------------------------------------------------------------*/ -class LgFontManager : public ILgFontManager -{ -public: - static void CreateCom(IUnknown *punkCtl, REFIID riid, void ** ppv); - - virtual ~LgFontManager(); - - //:>**************************************************************************************** - //:> IUnknown methods. - //:>**************************************************************************************** - // Get a pointer to the interface identified as iid. - STDMETHOD(QueryInterface)(REFIID iid, void ** ppv); - - // Add a reference by calling addref on the module, since this is a singleton. - STDMETHOD_(UCOMINT32, AddRef)(void) - { - return ModuleEntry::ModuleAddRef(); - } - // Release a reference by calling release on the module, since this is a singleton. - STDMETHOD_(UCOMINT32, Release)(void) - { - return ModuleEntry::ModuleRelease(); - } - - //:>**************************************************************************************** - //:> ILgFontManager methods. - //:>**************************************************************************************** - STDMETHOD(IsFontAvailable)(BSTR bstrName, ComBool * pfAvail); - STDMETHOD(IsFontAvailableRgch)(int cch, OLECHAR * prgchName, ComBool * pfAvail); - STDMETHOD(AvailableFonts)(BSTR * pbstrNames); - STDMETHOD(RefreshFontList)(void); - -#ifdef DEBUG - // Check to make certain we have a valid internal state for debugging purposes. - bool AssertValid(void) - { - AssertPtr(this); - AssertObj(&m_vstuFonts); - return true; - } -#endif // DEBUG - -protected: - /*------------------------------------------------------------------------------------------ - This generic constructor simply gets the list of the (TrueType) fonts for the global - variable g_fm. - ------------------------------------------------------------------------------------------*/ - LgFontManager(void); - -#if WIN32 - static int CALLBACK FontCallBack(ENUMLOGFONTEX * pelfe, NEWTEXTMETRICEX * pntme, - DWORD ft, LPARAM lp); -#endif - - friend class LanguageGlobals; - - //:>**************************************************************************************** - //:> Member variables. - //:>**************************************************************************************** - // Vector to hold font names. - Vector m_vstuFonts; - -private: - // Get the available fonts. - void GetFontNames(void); -}; - -DEFINE_COM_PTR(LgFontManager); - -#endif //!LgFontManager_H diff --git a/Src/Language/LgInputMethodEditor.cpp b/Src/Language/LgInputMethodEditor.cpp deleted file mode 100644 index c25657b6d6..0000000000 --- a/Src/Language/LgInputMethodEditor.cpp +++ /dev/null @@ -1,463 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 1999, 2001 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgInputMethodEditor.cpp -Responsibility: Rand Burgett -Last reviewed: Not yet. - -Description: - --------------------------------------------------------------------------------*//*:End Ignore*/ - -//:>******************************************************************************************** -//:> Include files -//:>******************************************************************************************** -#include "Main.h" -#pragma hdrstop -// any other headers (not precompiled) - -#undef THIS_FILE -DEFINE_THIS_FILE - -//:>******************************************************************************************** -//:> Forward declarations -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Local Constants and static variables -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Constructor/Destructor -//:>******************************************************************************************** - -LgInputMethodEditor::LgInputMethodEditor() -{ - m_cref = 1; - ModuleEntry::ModuleAddRef(); -} - -LgInputMethodEditor::~LgInputMethodEditor() -{ - ModuleEntry::ModuleRelease(); -} - -//:>******************************************************************************************** -//:> Generic factory stuff to allow creating an instance with CoCreateInstance. -//:>******************************************************************************************** -static GenericFactory g_fact( - _T("SIL.Language1.LgInputMethodEditor"), - &CLSID_LgInputMethodEditor, - _T("SIL Input Method Editor"), - _T("Apartment"), - &LgInputMethodEditor::CreateCom); - - -void LgInputMethodEditor::CreateCom(IUnknown *punkCtl, REFIID riid, void ** ppv) -{ - AssertPtr(ppv); - Assert(!*ppv); - if (punkCtl) - ThrowHr(WarnHr(CLASS_E_NOAGGREGATION)); - - ComSmartPtr qime; - qime.Attach(NewObj LgInputMethodEditor()); // ref count initialy 1 - CheckHr(qime->QueryInterface(riid, ppv)); -} - - - -//:>******************************************************************************************** -//:> IUnknown Methods -//:>******************************************************************************************** -STDMETHODIMP LgInputMethodEditor::QueryInterface(REFIID riid, void **ppv) -{ - AssertPtr(ppv); - if (!ppv) - return WarnHr(E_POINTER); - *ppv = NULL; - - if (riid == IID_IUnknown) - *ppv = static_cast(static_cast(this)); - else if (riid == IID_ISimpleInit) - *ppv = static_cast(this); - else if (riid == IID_ILgInputMethodEditor) - *ppv = static_cast(this); - else if (riid == IID_ISupportErrorInfo) - { - *ppv = NewObj CSupportErrorInfo2(static_cast(this), - IID_ISimpleInit, IID_ILgInputMethodEditor); - return S_OK; - } - else - return E_NOINTERFACE; - - AddRef(); - return NOERROR; -} - -//:>******************************************************************************************** -//:> ISimpleInit Methods -//:>******************************************************************************************** - -/*---------------------------------------------------------------------------------------------- - Initialize an instance, typically from a ClassInitMoniker - - To create a suitable moniker, do something like this: - - const wchar * psz = L"Times New Roman;Helvetica,Arial;Courier"; - IClassInitMonikerPtr qcim; - hr = qcim.CreateInstance(CLSID_ClassInitMoniker); - hr = qcim->InitNew(CLSID_LgSystemCollater, (const BYTE *)psz, StrLen(psz) * isizeof(wchar)); - - Commas separate font names in a list; semi-colons separate lists for Serif, SansSerif, - and Monospace (in that order). - - ENHANCE JohnT: should we verify that the fonts in question are installed? -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgInputMethodEditor::InitNew(const BYTE * prgb, int cb) -{ - BEGIN_COM_METHOD; - ChkComArrayArg(prgb, cb); - - return S_OK; - - END_COM_METHOD(g_fact, IID_ISimpleInit); -} - -/*---------------------------------------------------------------------------------------------- - Return the initialization value previously set by InitNew. - - @param pbstr Pointer to a BSTR for returning the initialization data. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgInputMethodEditor::get_InitializationData(BSTR * pbstr) -{ - BEGIN_COM_METHOD; - ChkComArgPtr(pbstr); - - *pbstr = NULL; - - END_COM_METHOD(g_fact, IID_ISimpleInit); -} - - -//:>******************************************************************************************** -//:> ILgInputMethodEditor methods -//:>******************************************************************************************** -/*---------------------------------------------------------------------------------------------- -Setup(); - Given something the user typed, following any preprocessing that happens - automatically as a result of Setup (e.g., Keyman processing), do any further - processing required to actually replace the selected part of the string with what the user typed. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgInputMethodEditor::Setup() -{ - BEGIN_COM_METHOD; - - return S_OK; - - END_COM_METHOD(g_fact, IID_ILgFontManager); -} - -/*---------------------------------------------------------------------------------------------- -Replace - The default implementation just replaces characters from ichMin to ichLim with - those from bstrInput, then set *pichModMin to ichMin, and *pichModLim and - *pichIP both to ichMin + BstrLen(bstrInput). - - Arguments: - bstrInput what user typed - pttpInput text properties desired for new text - ptsbOld original, unedited text, gets modified - ichMin, ichLim range in original to replace - pichModMin, pichModLim range in output text affected - pichIP position of IP in modified string - -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgInputMethodEditor::Replace(BSTR bstrInput, ITsTextProps * pttpInput, - ITsStrBldr * ptsbOld, int ichMin, int ichLim, int * pichModMin, int * pichModLim, - int * pichIP) -{ - BEGIN_COM_METHOD; - ChkComBstrArgN(bstrInput); - ChkComArgPtrN(pttpInput); - ChkComArgPtr(ptsbOld); - ChkComOutPtr(pichModMin); - ChkComOutPtr(pichModLim); - ChkComOutPtr(pichIP); - - int cCh; - SmartBstr sbstr; - CheckHr(ptsbOld->get_Length(&cCh)); - if (ichMin < 0 || ichLim > cCh || ichMin > ichLim) - { - *pichModMin = 0; - *pichModLim = 0; - *pichIP = 0; - ThrowHr(WarnHr(E_INVALIDARG)); - } - - // Check to make sure the ichMin is not between a surrognte pair. - do - { - if (0 < ichMin) - { - CheckHr(ptsbOld->GetChars(ichMin, ichMin + 1, &sbstr)); - if (sbstr[0] < 0xDC00 || sbstr[0] > 0xDFFF) - break; - } - else - { - break; - } - } while (--ichMin > 0); - - // Check to make sure the ichLim is not between a surrgante pair. - do - { - if (cCh > ichLim) - { - CheckHr(ptsbOld->GetChars(ichLim, ichLim + 1, &sbstr)); - if (sbstr[0] < 0xDC00 || sbstr[0] > 0xDFFF) - break; - } - else - { - break; - } - } while (++ichLim < cCh); - - // Now, do the real work - - CheckHr(ptsbOld->Replace(ichMin, ichLim, bstrInput, pttpInput)); - *pichModMin = ichMin; - *pichModLim = ichMin + BstrLen(bstrInput); - *pichIP = ichMin + BstrLen(bstrInput); - - END_COM_METHOD(g_fact, IID_ILgFontManager); -} - -/*---------------------------------------------------------------------------------------------- - Backspace - The user pressed a certain number of backspaces. Delete an appropriate amount of - the string represented by the input string builder, indicating exactly what changed. - Also, if there were not enough characters to delete, indicate how many backspaces - were left over. - - Arguments: - ichStart starting position of backspaces - cactBackspace number of backspaces pressed - ptsbOld original, unedited text, gets modified - pichModMin, pichModLim range in output text affected - pichIP position of IP in modified string - pcactBsRemaining Number not handled, to affect previous writing system - -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgInputMethodEditor::Backspace(int ichStart, int cactBackspace, - ITsStrBldr * ptsbOld, int * pichModMin, int * pichModLim, int * pichIP, - int * pcactBsRemaining) -{ - BEGIN_COM_METHOD; - ChkComArgPtr(ptsbOld); - ChkComOutPtr(pichModMin); - ChkComOutPtr(pichModLim); - ChkComOutPtr(pichIP); - ChkComOutPtr(pcactBsRemaining); - - int cCh; - int ichMin; - int ich; - int ichMin1; - int iBsIn; - int cBsOut=0; - SmartBstr sbstr; - - if (ichStart < 1) - { - *pichModMin = 0; - *pichModLim = 0; - *pichIP = 0; - *pcactBsRemaining = cactBackspace; - return S_OK; - } - - // Check to make sure the ichStart is not between a surrgante pair. - CheckHr(ptsbOld->get_Length(&cCh)); - if (cCh > ichStart) - { - CheckHr(ptsbOld->GetChars(ichStart, ichStart + 1, &sbstr)); - if (sbstr[0] > 0xDBFF && sbstr[0] < 0xE000) - ichStart++; - } - - // increase backspace count for any other surrgate pairs. - iBsIn = cactBackspace; - ichMin1 = ichStart - (cactBackspace * 2) - 1; - if (ichMin1 < 0) - ichMin1 = 0; - CheckHr(ptsbOld->GetChars(ichMin1, ichStart, &sbstr)); - ich = ichStart - ichMin1 - 1; - do - { - if (sbstr[ich] < 0xDC00 || sbstr[ich] > 0xDFFF) - --iBsIn; - ++cBsOut; - if (--ich < 0) - break; - } while (iBsIn > 0); - cactBackspace = cBsOut + iBsIn; - - // Now, do the real work - if (ichStart > cactBackspace) - { - ichMin = ichStart - cactBackspace; - CheckHr(ptsbOld->Replace(ichMin, ichStart, NULL, NULL)); - *pichModMin = ichMin; - *pichModLim = ichMin; - *pichIP = ichMin; - *pcactBsRemaining = 0; - } - else - { - CheckHr(ptsbOld->Replace(0, ichStart, NULL, NULL)); - *pichModMin = 0; - *pichModLim = 0; - *pichIP = 0; - *pcactBsRemaining = cactBackspace - ichStart; - } - - END_COM_METHOD(g_fact, IID_ILgFontManager); -} - -/*---------------------------------------------------------------------------------------------- - DeleteForward - The user pressed a certain number of forward deletes. Forward delete an appropriate - amount of the string represented by the input string builder, indicating exactly what - changed. lso, if there were not enough characters to delete, indicate how many deletes - were left over. - - Arguments: - ichStart starting position of deletes - cactDelForward number of DF pressed - ptsbOld original, unedited text, gets modified - pichModMin, pichModLim range in output text affected - pichIP position of IP in modified string - pcactDfRemaining Number not handled, to affect next writing system - -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgInputMethodEditor::DeleteForward(int ichStart, int cactDelForward, - ITsStrBldr * ptsbOld, int * pichModMin, int * pichModLim, int * pichIP, - int * pcactDfRemaining) -{ - BEGIN_COM_METHOD; - ChkComArgPtr(ptsbOld); - ChkComOutPtr(pichModMin); - ChkComOutPtr(pichModLim); - ChkComOutPtr(pichIP); - ChkComOutPtr(pcactDfRemaining); - - int cCh; - int ichLim; - int ich; - int iDfIn; - int cDfOut=0; - SmartBstr sbstr; - - CheckHr(ptsbOld->get_Length(&cCh)); - if (ichStart > cCh - 2) - { - *pichModMin = cCh; - *pichModLim = cCh; - *pichIP = cCh; - *pcactDfRemaining = cactDelForward; - ThrowHr(WarnHr(E_INVALIDARG)); - } - - // Check to make sure the ichStart is not between a surrgante pair. - if (cCh > ichStart) - { - CheckHr(ptsbOld->GetChars(ichStart, ichStart + 1, &sbstr)); - if (sbstr[0] > 0xDBFF && sbstr[0] < 0xE000) - ichStart--; - } - - // increase DeleteForward count for any other surrgate pairs. - iDfIn = cactDelForward; - ichLim = ichStart + (cactDelForward * 2) + 1; - if (ichLim > cCh) - ichLim = cCh; - CheckHr(ptsbOld->GetChars(ichStart, ichLim, &sbstr)); - ich = ichStart; - do - { - if (sbstr[ich] < 0xDC00 || sbstr[ich] > 0xDFFF) - --iDfIn; - ++cDfOut; - if (++ich >= cCh) - break; - } while (iDfIn > 0); - cactDelForward = cDfOut + iDfIn; - - // Now, do the real work - if (ichStart + cactDelForward < cCh) - { - ichLim = ichStart + cactDelForward; - CheckHr(ptsbOld->Replace(ichStart, ichLim, NULL, NULL)); - *pichModMin = ichStart; - *pichModLim = ichStart; - *pichIP = ichStart; - *pcactDfRemaining = 0; - } - else - { - CheckHr(ptsbOld->Replace(ichStart, cCh, NULL, NULL)); - *pichModMin = ichStart; - *pichModLim = ichStart; - *pichIP = ichStart; - *pcactDfRemaining = iDfIn; - } - - END_COM_METHOD(g_fact, IID_ILgFontManager); -} - -/*---------------------------------------------------------------------------------------------- - IsValidInsertionPoint - True if input method considers an IP at the specified index reasonable. - Note that really useful IPs should also satisfy the Renderer; see - ILgSegment>>IsValidInsertionPoint. - - Arguments: - ich - ptss - pfValid - -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgInputMethodEditor::IsValidInsertionPoint(int ich, ITsString * ptss, - BOOL * pfValid) -// TODO: Shouldn't pfValid be a ComBool? -{ - BEGIN_COM_METHOD; - ChkComArgPtr(ptss); - ChkComOutPtr(pfValid); - - int cCh; - SmartBstr sbstr; - CheckHr(ptss->get_Length(&cCh)); - if (ich == cCh) - { - *pfValid = 1; - } - else if ((ich >= 0) && (ich < cCh)) - { - CheckHr(ptss->GetChars(ich, ich + 1, &sbstr)); - *pfValid = ((sbstr[0] < 0xDC00) || (sbstr[0] > 0xDFFF)) && (ich >= 0) && (ich <= cCh); - } - else - { - *pfValid = 0; - } - END_COM_METHOD(g_fact, IID_ILgFontManager); -} diff --git a/Src/Language/LgInputMethodEditor.h b/Src/Language/LgInputMethodEditor.h deleted file mode 100644 index a930d923b8..0000000000 --- a/Src/Language/LgInputMethodEditor.h +++ /dev/null @@ -1,84 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 1999, 2001 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgInputMethodEditor.h -Responsibility: Rand Burgett -Last reviewed: Not yet. - -Description: - --------------------------------------------------------------------------------*//*:End Ignore*/ -#pragma once -#ifndef LgInputMethodEditor_INCLUDED -#define LgInputMethodEditor_INCLUDED - -/*---------------------------------------------------------------------------------------------- -Class: LgInputMethodEditor -Description: -Hungarian: ime -----------------------------------------------------------------------------------------------*/ -class LgInputMethodEditor : - public ILgInputMethodEditor, - public ISimpleInit -{ -public: - // Static methods - static void CreateCom(IUnknown *punkOuter, REFIID iid, void ** ppv); - - // Constructors/destructors/etc. - LgInputMethodEditor(); - virtual ~LgInputMethodEditor(); - - // IUnknown methods - STDMETHOD(QueryInterface)(REFIID iid, void ** ppv); - STDMETHOD_(UCOMINT32, AddRef)(void) - { - return InterlockedIncrement(&m_cref); - } - STDMETHOD_(UCOMINT32, Release)(void) - { - long cref = InterlockedDecrement(&m_cref); - if (cref == 0) { - m_cref = 1; - delete this; - } - return cref; - } - - // ISimpleInit Methods - STDMETHOD(InitNew)(const BYTE * prgb, int cb); - STDMETHOD(get_InitializationData)(BSTR * pbstr); - - // IRenderEngine methods - STDMETHOD(Setup)(); - - STDMETHOD(Replace)(BSTR bstrInput, ITsTextProps* pttpInput, ITsStrBldr* ptsbOld, - int ichMin, int ichLim, int* pichModMin, int* pichModLim, int* pichIP); - - STDMETHOD(Backspace)(int pichStart, int cactBackspace, ITsStrBldr* ptsbOld, - int* pichModMin, int* pichModLim, int* pichIP, int* pcactBsRemaining); - - STDMETHOD(DeleteForward)(int pichStart, int cactDelForward, ITsStrBldr* ptsbOld, - int* pichModMin, int* pichModLim, int* pichIP, int* pcactDfRemaining); - - STDMETHOD(IsValidInsertionPoint)(int ich, ITsString* ptss, BOOL* pfValid); - -protected: - // Member variables - long m_cref; - - // Static methods - - // Constructors/destructors/etc. - - // Other protected methods -// void AdjustEndForWidth(IVwGraphics * pvg); - void FindLineBreak(const byte * prglbs, const int ichMin, const int ichLim, - const LgLineBreak lbrkRequired, int& ichBreak, int& ichDim); -}; -DEFINE_COM_PTR(LgInputMethodEditor); - -#endif //LgInputMethodEditor_INCLUDED diff --git a/Src/Language/LgKeymanHandler.cpp b/Src/Language/LgKeymanHandler.cpp deleted file mode 100644 index d4327e962f..0000000000 --- a/Src/Language/LgKeymanHandler.cpp +++ /dev/null @@ -1,549 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 1999-2007 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgKeymanHandler.cpp -Responsibility: John Thomson -Last reviewed: Not yet. - -Description: A wrapper for the keyman program. --------------------------------------------------------------------------------*//*:End Ignore*/ -#if WIN32 - -//:>******************************************************************************************** -//:> Include files -//:>******************************************************************************************** -#include "Main.h" - -#pragma hdrstop -#include "limits.h" -#undef THIS_FILE -DEFINE_THIS_FILE - -//:>******************************************************************************************** -//:>A bit of special header information needed only in this file, for interacting with Keyman. -//:>******************************************************************************************** - -#ifndef _KEYMANAPI_H -#define _KEYMANAPI_H - -typedef struct tagKEYBOARDINFO -{ - DWORD KeymanID; - DWORD HotKey; - DWORD KeyboardID; - char Name[256]; - // The original type for pKeyboard was LPKEYBOARD Keyboard, but we don't have defn of - // LPKEYBOARD - int * pKeyboard; - DWORD nIMDLLs; - DWORD /*LPIMDLL*/ IMDLLs; - // JohnT: The definition Marc gave me didn't have this, but the objects version 6 returns - // are four bytes bigger than Marc's typedef indicated. This aligns things properly and - // makes sure we allocate enough memory. - //DWORD Dummy; -} KEYBOARDINFO, *LPKEYBOARDINFO; - -typedef BOOL (WINAPI *PFNKeyman_BuildKeyboardList)(LPKEYBOARDINFO kbd, int*n); -//extern "C" HWND WINAPI Keyman_GetLastActiveWindow(); -//extern "C" HWND WINAPI Keyman_GetLastFocusWindow(); - -// Marc Durdin gave me a header with this, but not LPKEYBOARD; hopefully we don't need it. -//extern "C" PWSTR WINAPI GetSystemStore(LPKEYBOARD kb, DWORD SystemID); -// I'm making the first argument int * to correspond to what I made pKeyboard in KEYBOARDINFO, -// since that's the only place we get an argument from. -typedef PWSTR (WINAPI *PFNGetSystemStore)(int * pKeyboard, DWORD SystemID); -#define TSS_NAME 7 // from Tavultesoft FAQ4 sample - -typedef DWORD (WINAPI *PFNGetActiveKeymanID)(); - -#define KEYMAN_API_V6 0x0600 - -//extern "C" DWORD WINAPI Keyman_GetAPIVersion(); - -#endif - -// statics required for Keyman -//:>******************************************************************************************** -//:> Local Constants and static variables -//:>******************************************************************************************** -struct KbdInfo -{ - StrUni m_stuName; - int m_id; -}; -typedef Vector VecKbdInfo; -static int s_wm_kmselectlang = 0; // Windows message Keyman uses to change language -static int s_wm_kmkbchange = 0; -static bool s_fKeymanInitialized = false; // flag set when keyman has initialized -static bool s_fKeymanFailed = false; // flag set when keyman has failed to initialized -static VecKbdInfo s_vkiKeyboards; // Info about them. -const int knKeymanID = 1; // skKeymanID in Marc's code; param to PostMessage. -#define KEYMANID_NONKEYMAN 0xFFFFFFFF //Keyboard default (off) ID - -typedef DWORD (WINAPI *PGETACTIVEKEYMANIDFUNC)(); - -static PFNKeyman_BuildKeyboardList pKeyman_BuildKeyboardList = 0; -static PFNGetActiveKeymanID pGetActiveKeymanID = 0; -static PFNGetSystemStore pGetSystemStore = 0; -//:>******************************************************************************************** -//:> Local methods. -//:>******************************************************************************************** - -// Keyman is up and running if its window exists (even if not visible). -// Marc's sample code indicates this works for version 5 and 6 (and presumably will keep -// working :-). -bool KeymanOn() -{ - // Finding a window called Keyman50 is the recommended technique for detecting Keyman 5 - // AND ALSO Keyman 6. - if (::FindWindowA(NULL, "Keyman50") != 0) - return true; - // Keyman 7 can typically be found by this code: - //::FindWindowA(NULL, "Keyman") != 0); - // But Marc Durdin recommends this: - HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, false, L"KeymanEXE70"); - if (hMutex != 0) - { - // keyman is running - ::CloseHandle(hMutex); - return true; - } - return false; // Keyman is not running. -} - -//:>******************************************************************************************** -//:> Constructor/Destructor -//:>******************************************************************************************** - -LgKeymanHandler::LgKeymanHandler() -{ - m_cref = 1; - ModuleEntry::ModuleAddRef(); -} - -LgKeymanHandler::~LgKeymanHandler() -{ - Close(); - ModuleEntry::ModuleRelease(); -} - -//:>******************************************************************************************** -//:> Generic factory stuff to allow creating an instance with CoCreateInstance. -//:>******************************************************************************************** -static GenericFactory g_fact( - L"SIL.Language1.LgKeymanHandler", - &CLSID_LgKeymanHandler, - _T("SIL Keyman Handler"), - _T("Apartment"), - &LgKeymanHandler::CreateCom); - - -void LgKeymanHandler::CreateCom(IUnknown *punkCtl, REFIID riid, void ** ppv) -{ - AssertPtr(ppv); - Assert(!*ppv); - if (punkCtl) - ThrowHr(WarnHr(CLASS_E_NOAGGREGATION)); - - ComSmartPtr qlkh; - qlkh.Attach(NewObj LgKeymanHandler()); // ref count initialy 1 - CheckHr(qlkh->QueryInterface(riid, ppv)); -} - -//:>******************************************************************************************** -//:> IUnknown Methods -//:>******************************************************************************************** -STDMETHODIMP LgKeymanHandler::QueryInterface(REFIID riid, void **ppv) -{ - AssertPtr(ppv); - if (!ppv) - return WarnHr(E_POINTER); - *ppv = NULL; - - if (riid == IID_IUnknown) - *ppv = static_cast(this); - else if (riid == IID_ILgKeymanHandler) - *ppv = static_cast(this); - else if (riid == IID_ISupportErrorInfo) - { - *ppv = NewObj CSupportErrorInfo(static_cast(this), - IID_ILgKeymanHandler); - return S_OK; - } - else - return E_NOINTERFACE; - - AddRef(); - return NOERROR; -} - -//:>******************************************************************************************** -//:> Error Handling Methods -//:>******************************************************************************************** -/*---------------------------------------------------------------------------------------------- - Creates an error object and then sets a description from a resource id. Also sets a full - help URL as required by HtmlHelp. Uses ierr as an index for both resource id and help URL. - @param ierr Index to a set of htm help files (second part of full help URL) and matching - resource strings for Message Box text. - @param pei [out] Error info object -----------------------------------------------------------------------------------------------*/ -void LgKeymanHandler::ThrowErrorWithInfo(HRESULT hrErr, int stidDescription) -{ - IErrorInfoPtr qei; - ICreateErrorInfoPtr qcei; - - // Create error info object. - CheckHr(CreateErrorInfo(&qcei)); - - StrUni stu(stidDescription); - CheckHr(qcei->SetDescription((wchar *)stu.Chars())); - - // Now get the IErrorInfo interface of the error object and set it for the current thread. - CheckHr(qcei->QueryInterface(IID_IErrorInfo, (void **)&qei)); - SetErrorInfo(0, qei); - - ThrowHr(hrErr, stu.Chars(), -1, qei); // An error object exists. -} - -//:>******************************************************************************************** -//:> Interface Methods -//:>******************************************************************************************** - -/*---------------------------------------------------------------------------------------------- - Initialize the Keyboard handler. Set fForce to re-initialize even if already - initialized, for example, if a keyboard has been added or removed. - - Load the Keyman library, initialize address pointers and messages, and load keyboards into - memory. - - If Keyman isn't installed or isn't registered or isn't running, we just return S_OK. - FieldWorks does not require Keyman except where a writing system indicates it is used. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgKeymanHandler::Init(ComBool fForce) -{ - BEGIN_COM_METHOD - - if (fForce) - s_fKeymanInitialized = false; - // If not forcing, and already initialized, done. - if (s_fKeymanInitialized) - return S_OK; - - // TE-5637, 27 JUL 2007: Moved this line up from below to prevent crash - // Get rid of any info from previous Init calls. - s_vkiKeyboards.Clear(); - - // Keyman must be running - but don't start it here to avoid possible conflicts - if (!KeymanOn()) - return S_OK; - - if (!s_wm_kmselectlang) - s_wm_kmselectlang = ::RegisterWindowMessageW(L"WM_KMSELECTLANG"); - - // This really only needs to be done once, even if fForce is true; - if (!pGetActiveKeymanID) - { - // Load the Keyman library and initialize needed function pointers. - // This correctly handles keyman 5-8. Perhaps 9-10? - // Review: for 7, might be good enough to test as far as keyman engine, leave off 7.0. That should - // verify AT LEAST keyman 7. - // Note: try 7 first. This works better if more than one is installed, or if registry keys - // got left behind. - RegKey rk; - rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman engine\\10.0")); // Anticipate 9/10 even though it may be years away. - if (rk == 0) - rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman engine\\9.0")); - if (rk == 0) - rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman engine\\8.0")); - if (rk == 0) - rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman engine\\7.0")); - if (rk == 0) - rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman\\6.0")); - if (rk == 0) - rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman\\5.0")); - if (rk == 0) - ThrowErrorWithInfo(E_UNEXPECTED, kstidKeymanNotRegisteredMsg); - - wchar rgch[MAX_PATH]; - DWORD cb = isizeof(rgch); - DWORD dwT; - LONG lRet = ::RegQueryValueExW(rk, L"root path", NULL, &dwT, (BYTE *)rgch, &cb); - if (lRet != ERROR_SUCCESS) - ThrowErrorWithInfo(WarnHr(E_UNEXPECTED), kstidKeymanRootNotRegisteredMsg); - Assert(dwT == REG_SZ); - StrUni stuKeymanDllPath; - stuKeymanDllPath.Assign(rgch); - if (stuKeymanDllPath.Chars()[stuKeymanDllPath.Length() - 1] != '\\') - stuKeymanDllPath.Append(L"\\"); - stuKeymanDllPath.Append(L"Keyman32.dll"); - HMODULE hm = ::LoadLibraryW(stuKeymanDllPath.Chars()); - if (hm == NULL) - ThrowErrorWithInfo(WarnHr(E_UNEXPECTED), kstidKeymanDllLoadFailureMsg); - /* - From Marc Durdin: - - Keyman doesn't initialize for a given process until after the first - POSTED message is received. This is due to the way that Windows handles - hookprocs... the DLL does not get loaded for the process until it is - needed. It is possible to force Keyman to initialize early by posting a - thread message and then handling it immediately with GetMessage, something - like this (you may need to add a dose of error checking of course...): - */ - MSG msg; - while (!::PostThreadMessage(::GetCurrentThreadId(), WM_NULL, 0, 0) && - ::GetLastError() == ERROR_INVALID_THREAD_ID) - { - ::Sleep(0); - } - ::GetMessage(&msg, NULL, WM_NULL, WM_NULL); - - pKeyman_BuildKeyboardList = (PFNKeyman_BuildKeyboardList) - ::GetProcAddress(hm, "Keyman_BuildKeyboardList"); - pGetActiveKeymanID = (PFNGetActiveKeymanID) - ::GetProcAddress(hm, "GetActiveKeymanID"); - pGetSystemStore = (PFNGetSystemStore) - ::GetProcAddress(hm, "GetSystemStore"); - } - -//- // Register Keyman message. May as well use A version to save memory on constant. -//- s_wm_kmselectlang = ::RegisterWindowMessageA("WM_KMSELECTLANG"); - - Vector vkbi; - int nKeyboards = 0; - (*pKeyman_BuildKeyboardList)(NULL, &nKeyboards); - if (nKeyboards == 0) - return S_OK; // no keyboards installed. - vkbi.Resize(nKeyboards); - (*pKeyman_BuildKeyboardList)(vkbi.Begin(), &nKeyboards); - - // TE-5637, 27 JUL 2007: Removed this line and moved it up to prevent crash - // Get rid of any info from previous Init calls. - //s_vkiKeyboards.Clear(); - - // Get actual keyboard name where possible - for (int ikbd = 0; ikbd < nKeyboards; ++ikbd) - { - KEYBOARDINFO & kbi = vkbi[ikbd]; - // From comments in Marc's code, it seems if this is 0 it isn't a valid, - // useable keyboard. Ignore it. - if (kbi.pKeyboard == 0) - continue; - - KbdInfo ki; - ki.m_stuName = (*pGetSystemStore)(kbi.pKeyboard, TSS_NAME); - ki.m_id = kbi.KeymanID; - s_vkiKeyboards.Push(ki); - } - - s_fKeymanInitialized = true; - END_COM_METHOD(g_fact, IID_ILgKeymanHandler); -} - -/*---------------------------------------------------------------------------------------------- - Gracefully shut down the keyboard handler. We need this for calling from .NET so that we - don't rely on garbage collection. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgKeymanHandler::Close() -{ - BEGIN_COM_METHOD - - END_COM_METHOD(g_fact, IID_ILgKeymanHandler); -} - -/*---------------------------------------------------------------------------------------------- - Initialize the Keyboard handler if not already initialized. - If Keyman couldn't be initialized, we just return false. - FieldWorks does not require Keyman except where a writing system indicates it is used. -----------------------------------------------------------------------------------------------*/ -bool LgKeymanHandler::InitInternal() -{ - if (s_fKeymanInitialized) - return true; - if (s_fKeymanFailed) - { - Warn("Skipping Keyman initialization due to previous failure."); - return false; - } - StrUni stuCaption(kstidKeymanInitFailedCaption); - StrUni stuMsg; - try - { - if (!s_fKeymanInitialized) - { - HRESULT hr = Init(false); - if (SUCCEEDED(hr)) - return true; - IErrorInfo * pIErrorInfo = NULL; - ::GetErrorInfo(0, &pIErrorInfo); - BSTR bstrDescription; - pIErrorInfo->GetDescription(&bstrDescription); - stuMsg.Assign(bstrDescription); - } - } - catch (Throwable error) - { - stuMsg.Load(kstidKeymanInitUnexpectedFailMsg); - } - s_fKeymanFailed = true; - ::MessageBox(NULL, stuMsg.Chars(), stuCaption.Chars(), MB_OK | MB_ICONINFORMATION); - - return s_fKeymanInitialized; -} - -/*---------------------------------------------------------------------------------------------- - Obtain the number of keyboard layouts currently avaiable. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgKeymanHandler::get_NLayout(int * pclayout) -{ - BEGIN_COM_METHOD - ChkComOutPtr(pclayout); - if (!s_fKeymanInitialized) - CheckHr(Init(false)); - *pclayout = s_vkiKeyboards.Size(); - END_COM_METHOD(g_fact, IID_ILgKeymanHandler); -} - -/*---------------------------------------------------------------------------------------------- - Obtain the ith layout name. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgKeymanHandler::get_Name(int ilayout, BSTR * pbstrName) -{ - BEGIN_COM_METHOD - if (!s_fKeymanInitialized) - CheckHr(Init(false)); - if (!s_fKeymanInitialized) - return E_UNEXPECTED; - if ((uint)ilayout >= (uint)(s_vkiKeyboards.Size())) - ThrowHr(WarnHr(E_INVALIDARG)); - s_vkiKeyboards[ilayout].m_stuName.GetBstr(pbstrName); - - END_COM_METHOD(g_fact, IID_ILgKeymanHandler); -} - -/*---------------------------------------------------------------------------------------------- - Get the active keyboard. Returns NULL if Keyman is not running or otherwise can't be - initialized; "(None)" if no keyman keyboard active. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgKeymanHandler::get_ActiveKeyboardName(BSTR * pbstrName) -{ - BEGIN_COM_METHOD - ChkComOutPtr(pbstrName); - if (!InitInternal()) - return S_OK; - - //int nActiveKeymanId = (*pGetActiveKeymanID)(); - HMODULE hKeyman = GetModuleHandleA("keyman32.dll"); - if(hKeyman == 0) - return S_OK; // leave name null - - PGETACTIVEKEYMANIDFUNC pGetActiveKeymanID = - (PGETACTIVEKEYMANIDFUNC) GetProcAddress(hKeyman, "GetActiveKeymanID"); - if(!pGetActiveKeymanID) - return S_OK; // leave name null - - int nActiveKeymanId = (*pGetActiveKeymanID)(); - - if (nActiveKeymanId == -1) - { - *pbstrName = ::SysAllocString(L"(None)"); // Todo JohnT: localize? -#ifdef TRACING_KEYMAN - StrAnsi staMsg; - staMsg.Format("Keyman active ID is %d name is %S\n", nActiveKeymanId, *pbstrName); - OutputDebugStringA(staMsg.Chars()); -#endif - return S_OK; - } - for (int iki = 0; iki < s_vkiKeyboards.Size(); ++iki) - { - if (s_vkiKeyboards[iki].m_id == nActiveKeymanId) - { - s_vkiKeyboards[iki].m_stuName.GetBstr(pbstrName); -#ifdef TRACING_KEYMAN - StrAnsi staMsg; - staMsg.Format("Keyman active ID is %d name is %S\n", nActiveKeymanId, *pbstrName); - OutputDebugStringA(staMsg.Chars()); -#endif - return S_OK; - } - } - Assert(false); // Keyman gave us an ID, but it didn't match! - return E_UNEXPECTED; - END_COM_METHOD(g_fact, IID_ILgKeymanHandler); -} - -/*---------------------------------------------------------------------------------------------- - Set the active keyboard. (Pass null or empty string to disable Keyman). -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgKeymanHandler::put_ActiveKeyboardName(BSTR bstrName) -{ - BEGIN_COM_METHOD - ChkComBstrArgN(bstrName); - if (!InitInternal() || !s_wm_kmselectlang) - return S_OK; - - if (BstrLen(bstrName) != 0) - { - for (int iki = 0; iki < s_vkiKeyboards.Size(); ++iki) - { - if (wcscmp(s_vkiKeyboards[iki].m_stuName.Chars(), bstrName) == 0) - { -#ifdef TRACING_KEYMAN - StrAnsi staMsg; - staMsg.Format("Setting keyman keyboard to %d for %B\n", - s_vkiKeyboards[iki].m_id, bstrName); - ::OutputDebugStringA(staMsg.Chars()); -#endif - ::PostMessage(::GetFocus(), s_wm_kmselectlang, knKeymanID, - s_vkiKeyboards[iki].m_id); - return S_OK; - } - } - // It's an error if it's an invalid name; but disable Keyman anyway. -#ifdef TRACING_KEYMAN - StrAnsi staMsg; - staMsg.Format("Disabling keyman...name (%B) not recognized\n", bstrName); - ::OutputDebugStringA(staMsg.Chars()); -#endif - // Posting a message saying there is no keyman keyboard active runs code in - // SimpleRootSite.OnKeymanKeyboardChange which tries to set the active writing system - // to one which requires no keyman keyboard. This is an unfortunate thing to do - // as a side effect of trying to set an unavailable keyboard for a particular WS. LS-12471. - //::PostMessage(::GetFocus(), s_wm_kmselectlang, knKeymanID, KEYMANID_NONKEYMAN); - // This can happen if people have been renaming/removing Keyman keyboards, so don't - // generate a useless (and expensive time-wise) stack trace. - ReturnHr(E_INVALIDARG); - } - else - { -#ifdef TRACING_KEYMAN - OutputDebugStringA("Disabling keyman...name is null\n"); -#endif - ::PostMessage(::GetFocus(), s_wm_kmselectlang, knKeymanID, KEYMANID_NONKEYMAN); - } - END_COM_METHOD(g_fact, IID_ILgKeymanHandler); -} - -/*---------------------------------------------------------------------------------------------- - Return the windows message (obtained from RegisterWindowsMessage("WM_KMKBCHANGE"). -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgKeymanHandler::get_KeymanWindowsMessage(int * pwm) -{ - BEGIN_COM_METHOD - ChkComOutPtr(pwm); - - if (!s_wm_kmkbchange) - s_wm_kmkbchange = ::RegisterWindowMessageW(L"WM_KMKBCHANGE"); - *pwm = s_wm_kmkbchange; - - END_COM_METHOD(g_fact, IID_ILgKeymanHandler); -} - - -// Explicit instantiation. -#include "Vector_i.cpp" -template class Vector; -template class Vector; // VecKbdInfo; -#endif \ No newline at end of file diff --git a/Src/Language/LgKeymanHandler.h b/Src/Language/LgKeymanHandler.h deleted file mode 100644 index 0a6658eefd..0000000000 --- a/Src/Language/LgKeymanHandler.h +++ /dev/null @@ -1,73 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 1999, 2001 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgKeymanHandler.h -Responsibility: John Thomson -Last reviewed: Not yet. - -Description: - --------------------------------------------------------------------------------*//*:End Ignore*/ -#pragma once -#ifndef LgKeymanHandler_INCLUDED -#define LgKeymanHandler_INCLUDED - -#if WIN32 - -/*---------------------------------------------------------------------------------------------- -Class: LgKeymanHandler -Description: A class that manages Keyman, being able to invoke a keyboard, find out which - one is active, find out which keyboards are available, return the windows message that - Keyman sends when a keyboard is selected, and so forth. -Hungarian: lkh -----------------------------------------------------------------------------------------------*/ -class LgKeymanHandler : - public ILgKeymanHandler -{ -public: - - // Static methods - static void CreateCom(IUnknown *punkOuter, REFIID iid, void ** ppv); - - // Constructors/destructors/etc. - LgKeymanHandler(); - virtual ~LgKeymanHandler(); - - // IUnknown methods - STDMETHOD(QueryInterface)(REFIID iid, void ** ppv); - STDMETHOD_(UCOMINT32, AddRef)(void) - { - return InterlockedIncrement(&m_cref); - } - STDMETHOD_(UCOMINT32, Release)(void) - { - long cref = InterlockedDecrement(&m_cref); - if (cref == 0) { - m_cref = 1; - delete this; - } - return cref; - } - - STDMETHOD(Init)(ComBool fForce); - STDMETHOD(Close)(); - STDMETHOD(get_NLayout)(int * pclayout); - STDMETHOD(get_Name)(int ilayout, BSTR * pbstrName); - STDMETHOD(get_ActiveKeyboardName)(BSTR * pbstrName); - STDMETHOD(put_ActiveKeyboardName)(BSTR bstrName); - STDMETHOD(get_KeymanWindowsMessage)(int * pwm); - - // Other public methods -protected: - // Member variables - long m_cref; // standard COM ref count - - bool InitInternal(); - void ThrowErrorWithInfo(HRESULT hrErr, int stidDescription); - -}; -#endif // WIN32 -#endif //LgKeymanHandler_INCLUDED diff --git a/Src/Language/LgTextServices.cpp b/Src/Language/LgTextServices.cpp deleted file mode 100644 index 2affdc1a7a..0000000000 --- a/Src/Language/LgTextServices.cpp +++ /dev/null @@ -1,457 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 2004 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgTextServices.cpp -Responsibility: Steve McConnel -Last reviewed: Not yet. - -Description: - --------------------------------------------------------------------------------*//*:End Ignore*/ - -//:>******************************************************************************************** -//:> Include files -//:>******************************************************************************************** -#include "Main.h" -#pragma hdrstop -//:> Any other headers (not precompiled). - -#if WIN32 -DEFINE_COM_PTR(ITfInputProcessorProfiles); -DEFINE_COM_PTR(IEnumTfLanguageProfiles); - -#undef THIS_FILE -DEFINE_THIS_FILE - -// we use a managed implementation on Linux -#undef ENABLE_TSF -#define ENABLE_TSF - -#undef Tracing_KeybdSelection -//#define Tracing_KeybdSelection - -#undef TRACING_KEYMAN -//#define TRACING_KEYMAN - -//:>******************************************************************************************** -//:> Forward declarations. -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Local Constants and static variables. -//:>******************************************************************************************** - -//:>******************************************************************************************** -//:> Constructor/Destructor. -//:>******************************************************************************************** - - -//:>******************************************************************************************** -//:> Generic factory stuff to allow creating an instance with CoCreateInstance. -//:>******************************************************************************************** -// Generic factory used to create an instance of LgTextServices with CoCreateInstance. -static GenericFactory g_fact( - _T("SIL.Language1.TextServices"), - &CLSID_LgTextServices, - _T("SIL Text Services"), - _T("Apartment"), - &LgTextServices::CreateCom); - -/*---------------------------------------------------------------------------------------------- - Called by the GenericFactory to "create" an ILgTextServices; it just returns the global one. -----------------------------------------------------------------------------------------------*/ -void LgTextServices::CreateCom(IUnknown * punkCtl, REFIID riid, void ** ppv) -{ - AssertPtr(ppv); - Assert(!*ppv); - if (punkCtl) - ThrowHr(WarnHr(CLASS_E_NOAGGREGATION)); - - CheckHr(LanguageGlobals::g_lts.QueryInterface(riid, ppv)); -} - - -//:>******************************************************************************************** -//:> IUnknown Methods. -//:>******************************************************************************************** -// Get a pointer to the interface identified as iid. -STDMETHODIMP LgTextServices::QueryInterface(REFIID riid, void ** ppv) -{ - AssertPtr(ppv); - if (!ppv) - return WarnHr(E_POINTER); - *ppv = NULL; - - if (riid == IID_IUnknown) - *ppv = static_cast(static_cast(this)); - else if (riid == IID_ILgTextServices) - *ppv = static_cast(this); - else if (riid == IID_ISupportErrorInfo) - { - *ppv = NewObj CSupportErrorInfo(this,IID_ILgTextServices); - return S_OK; - } - else - return E_NOINTERFACE; - - reinterpret_cast(*ppv)->AddRef(); - return NOERROR; -} - - -//:>******************************************************************************************** -//:> ILgTextServices methods. -//:>******************************************************************************************** - -const CLSID kclsidKMTipTextService = { 0x7ba04432, 0x8609, 0x4fe6, {0xbf, - 0xf7, 0x97, 0x10, 0x91, 0xde, 0x09, 0x33} }; -static INT8 s_WinVersion = -1; - -/*---------------------------------------------------------------------------------------------- - Return true if we're running on Windows 2000 or newer; return false if we're running on - a Windows version older than Windows 2000 or on a different platform. -----------------------------------------------------------------------------------------------*/ -bool IsWin2kOrHigher() -{ - if (s_WinVersion < 0) - { - // Try calling GetVersionEx using the OSVERSIONINFOEX structure, - // If that fails, we're too old. - OSVERSIONINFOEX osvi; - ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - - if (::GetVersionEx((OSVERSIONINFO *) &osvi) && - osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) - { - Assert(osvi.dwMajorVersion < 128); - s_WinVersion = (INT8)osvi.dwMajorVersion; - } - else - s_WinVersion = 0; - } - - return s_WinVersion >= 5; -} - -/*---------------------------------------------------------------------------------------------- - Returns true if the current keyman/other keyboard is different from the desired - keyman/other keyboard. -----------------------------------------------------------------------------------------------*/ -bool IsKeyboardDifferent(BSTR bstrDesiredKeymanKbd, BSTR bstrActiveKeymanKbd) -{ - return wcscmp(bstrActiveKeymanKbd ? bstrActiveKeymanKbd : L"", - bstrDesiredKeymanKbd ? bstrDesiredKeymanKbd : L"") != 0; -} - -/*---------------------------------------------------------------------------------------------- - Turn off the keyman keyboard -----------------------------------------------------------------------------------------------*/ -void TurnOffKeymanKbd(BSTR * pbstrActiveOtherImKbd) -{ - // It seems sometimes to be necessary to explicitly turn Keyman off, though it's not - // supposed to be. One reason is that on loss of focus, C# code loses track of the - // current keyboard, so *pbstrActiveOtherImKbd cannot be relied on. - //if (BstrLen(*pbstrActiveOtherImKbd)) - ILgKeymanHandlerPtr qkh; - qkh.CreateInstance(CLSID_LgKeymanHandler); - CheckHr(qkh->put_ActiveKeyboardName(NULL)); - if (*pbstrActiveOtherImKbd) - ::SysFreeString(*pbstrActiveOtherImKbd); - *pbstrActiveOtherImKbd = NULL; -} - -/*---------------------------------------------------------------------------------------------- - Set the system keyboard (Windows API/X11 API way) -----------------------------------------------------------------------------------------------*/ -void SetKeyboard_System(int lcid) -{ -#ifdef Tracing_KeybdSelection - StrAnsi sta; - sta.Format("LgTextServices::SetKeyboard(%d) [not Keyman]%n", lcid); - ::OutputDebugStringA(sta.Chars()); -#endif - int nLangId = LANGIDFROMLCID(lcid); - if (nLangId == 0) - nLangId = ::GetSystemDefaultLangID(); - // JohnT: Damien made the change to the commented line below as an attempt to fix FWR-1939. - // However it appears to cause the worse problem noted in FWR_3308. - // Passing 0 as the high word selectst the default keyboard for the language. - // Windows 7 (at least) does a good job of remembering what keyboard the user last wanted - // for the language. The only problem would be if the user is using the same system language - // for two writing systems where he wants to use different keyboards. We can't support that yet. - //HKL hkl = (HKL)(nLangId << 16 | (nLangId & 0xffff)); - HKL hkl = (HKL)nLangId; - - // If we're not activating a Keyman keyboard, activate the appropriate OS IM. - // Microsoft says we should only do this if we were not able to do it using - // ActivateLanguageProfile (private communication to JohnT). -#ifdef Tracing_KeybdSelection - sta.Format("LgTextServices::SetKeyboard(%d) - " - "hkl = %x, ::GetKeyboardLayout() = %x%n", - lcid, hkl, ::GetKeyboardLayout(0)); - ::OutputDebugStringA(sta.Chars()); -#endif - if (hkl != ::GetKeyboardLayout(0)) - { - // We need to work out whether we're using at least W2000, because - // KLF_SETFORPROCESS is not supported before that. - UINT flags = 0; - if (IsWin2kOrHigher()) - { - //Windows 2000 or better, we can use KLF_SETFORPROCESS. - flags = KLF_SETFORPROCESS; - } -#ifdef Tracing_KeybdSelection - StrAnsi sta; - sta.Format("LgTextServices::SetKeyboard(%d) - " - "::ActivateKeyboardLayout(%x, %x) [nLangId = %d]\n", - lcid, hkl, flags, nLangId); - ::OutputDebugStringA(sta.Chars()); -#endif - ::ActivateKeyboardLayout(hkl, flags); - Assert(sizeof(int) >= sizeof(hkl)); - } -} - -#ifdef ENABLE_TSF -/*---------------------------------------------------------------------------------------------- - Set the keyboard through TSF -----------------------------------------------------------------------------------------------*/ -bool SetKeyboard_TSF(bool fDoingOtherIm, int lcid, int * pnActiveLangId) -{ -#ifdef Tracing_KeybdSelection - StrAnsi sta; - sta.Format("LgTextServices::SetKeyboard(%d) [making TSF calls]%n", lcid); - ::OutputDebugStringA(sta.Chars()); - sta.Format("LgTextServices::SetKeyboard(%d) - ::GetKeyboardLayout() = %x%n", - lcid, ::GetKeyboardLayout(0)); - ::OutputDebugStringA(sta.Chars()); -#endif - HRESULT hr = S_OK; - ITfInputProcessorProfilesPtr qtfipp; - int nLangId = LANGIDFROMLCID(lcid); - bool fSetInputLang = false; - // Don't check the HR or use CreateInstance; I (JohnT) think this may fail if TSF is not - // fully active. - ::CoCreateInstance(CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_ALL, - IID_ITfInputProcessorProfiles, (void **)&qtfipp); - if (!qtfipp) - { - Warn("Could not get ITfInputProcessorProfiles to set Keyman text service\n"); - } - else - { - // Have to make the language active before we can set the profile; - // and want to set the language even if we aren't doing Keyman. - if (*pnActiveLangId != (LANGID)nLangId) - { - // Do NOT do this if the right langID is already current. In some bizarre cases - // during WM_INPUTLANGCHANGED it can lead to a new input-lang-changed in a - // DIFFERENT language and an infinite loop. - *pnActiveLangId = (LANGID)nLangId; - IgnoreHr(hr = qtfipp->ChangeCurrentLanguage((LANGID)nLangId)); - } -#ifdef Tracing_KeybdSelection - sta.Format( - "LgTextServices::SetKeyboard(%d) [qtfipp->ChangeCL(%d) => hr = %x]%n", - lcid, nLangId, hr); - ::OutputDebugStringA(sta.Chars()); -#endif - if (FAILED(hr)) - { - Warn("failed to change language\n"); - } - else if (fDoingOtherIm) - { - // Make sure the Keyman text service is turned on. For some bizarre reason there is - // no API to just ask for the service to turn on for the langid, we have to do our - // own search for the profile that corresponds to this langid and text service. - IEnumTfLanguageProfilesPtr qenum; - #ifdef Tracing_KeybdSelection - sta.Format("LgTextServices::SetKeyboard(%d) [qtfipp->EnumLP(%d)]%n", - lcid, nLangId); - ::OutputDebugStringA(sta.Chars()); - sta.Format("LgTextServices::SetKeyboard(%d) - ::GetKeyboardLayout() = %x%n", - lcid, ::GetKeyboardLayout(0)); - ::OutputDebugStringA(sta.Chars()); - #endif - IgnoreHr(hr = qtfipp->EnumLanguageProfiles((LANGID)nLangId, &qenum)); - if (FAILED(hr)) - { - Warn("Could not get enumerator for language profiles\n"); - } - else - { - // If doing keyman try to turn on Keyman text service. - TF_LANGUAGEPROFILE profile; - for ( ; ; ) - { - ULONG cprofile; - IgnoreHr(hr = qenum->Next(1, &profile, &cprofile)); - if (FAILED(hr) || cprofile != 1) - { - Warn("failed to find language profiled for Keyman\n"); - break; - } - if (kclsidKMTipTextService == profile.clsid) - { - // got it at last! -#ifdef Tracing_KeybdSelection - StrAnsi sta; - sta.Format("LgTextServices::SetKeyboard(%d) - " - "qtfipp->ActivateLanguageProfile(nLangId = %d)\n", - lcid, nLangId); - ::OutputDebugStringA(sta.Chars()); -#endif - IgnoreHr(hr = qtfipp->ActivateLanguageProfile( - kclsidKMTipTextService, (LANGID)nLangId, profile.guidProfile)); - if (FAILED(hr)) - { - Warn("failed to activate language profile\n"); - } - else - { - fSetInputLang = true; - } - break; - } - } - } -#ifdef Tracing_KeybdSelection - sta.Format("LgTextServices::SetKeyboard(%d) [after qtfipp->ChangeCL(%d)]%n", - lcid, nLangId); - ::OutputDebugStringA(sta.Chars()); - sta.Format("LgTextServices::SetKeyboard(%d) - ::GetKeyboardLayout() = %x%n", - lcid, ::GetKeyboardLayout(0)); - ::OutputDebugStringA(sta.Chars()); -#endif - } - else - { - // this ensures that we switch to the correct keyboard (not Keyman addin) as well as - // the correct language - // TODO (DamienD): we could use the TSF interface ITfInputProcessorProfileMgr to change - // the keyboard, but it is only available on Vista and higher. Is there a benefit to - // using that interface? - SetKeyboard_System(lcid); - fSetInputLang = true; - } - } - return fSetInputLang; -} -#endif /*ENABLE_TSF*/ - -/*---------------------------------------------------------------------------------------------- - Set a keyman keyboard (or other input method) -----------------------------------------------------------------------------------------------*/ -HRESULT SetKeyboard_OtherIM(int lcid, BSTR bstrOtherImKbd, BSTR * pbstrActiveOtherImKbd, - ComBool * pfSelectLangPending) -{ -#ifdef Tracing_KeybdSelection - StrAnsi sta; - sta.Format("LgTextServices::SetKeyboard(%d) [setting Keyman kbd]%n", lcid); - ::OutputDebugStringA(sta.Chars()); -#endif - int nLangId = LANGIDFROMLCID(lcid); - HRESULT hr = S_OK; - ILgKeymanHandlerPtr qkh; - qkh.CreateInstance(CLSID_LgKeymanHandler); - // Tell Keyman about the particular keyboard (but only if it changed). - if (IsKeyboardDifferent(bstrOtherImKbd, *pbstrActiveOtherImKbd)) - { - // Activate the particular layout we want. - // John Durdin says this next step is necessary. - //::ActivateKeyboardLayout(::GetKeyboardLayout(0), 0); - // JohnT: discovered that if we've never set a keyboard before, the current one - // won't be right, but forcing the right langid into the low word seems to help. - // Keyman always uses the US English keyboard, which is the magic number we're - // stuffing into the high word. - HKL hklDesired = (HKL)(0x04090000 | (nLangId & 0xffff)); -#ifdef Tracing_KeybdSelection - StrAnsi sta; - sta.Format("LgTextServices::SetKeyboard(%d) - " - "::ActivateKeyboardLayout(%d [%x], 0) for keyman setup\n", - lcid, hklDesired, hklDesired); - ::OutputDebugStringA(sta.Chars()); -#endif - ::ActivateKeyboardLayout(hklDesired, 0); - - try - { - CheckHr(qkh->put_ActiveKeyboardName(bstrOtherImKbd)); -#ifdef TRACING_KEYMAN - StrUni stuMsg; - stuMsg.Format(L"%b is now the active Keyman keyboard.\n", - bstrOtherImKbd); - ::OutputDebugStringW(stuMsg.Chars()); -#endif - if (*pbstrActiveOtherImKbd) - ::SysFreeString(*pbstrActiveOtherImKbd); - CopyBstr(pbstrActiveOtherImKbd, bstrOtherImKbd); - *pfSelectLangPending = true; - } - catch (Throwable& thr) - { - hr = thr.Result(); -#ifdef TRACING_KEYMAN - StrAnsi staMsg; - staMsg.Format("Cannot make %B the active Keyman keyboard!?\n", - bstrOtherImKbd); - ::OutputDebugStringA(staMsg.Chars()); -#endif - if (BstrLen(*pbstrActiveOtherImKbd)) - { - // We failed, so ensure it's turned off. - TurnOffKeymanKbd(pbstrActiveOtherImKbd); - *pfSelectLangPending = true; - } - } - } - return hr; -} - -/*---------------------------------------------------------------------------------------------- - Set the system keyboard and TSF language. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP LgTextServices::SetKeyboard(int lcid, BSTR bstrOtherImKbd, int * pnActiveLangId, - BSTR * pbstrActiveOtherImKbd, ComBool * pfSelectLangPending) -{ - BEGIN_COM_METHOD; - ChkComBstrArgN(bstrOtherImKbd); - ChkComArgPtr(pnActiveLangId); - ChkComArgPtr(pbstrActiveOtherImKbd); - ChkComArgPtr(pfSelectLangPending); - - HRESULT hr; - int nLangId = LANGIDFROMLCID(lcid); - - bool fDoingOtherIm = BstrLen(bstrOtherImKbd) > 0; - bool fSetInputLang = false; -#ifdef ENABLE_TSF - if (IsKeyboardDifferent(bstrOtherImKbd, *pbstrActiveOtherImKbd) || - (LANGID)nLangId != (LANGID)*pnActiveLangId) - { - fSetInputLang = SetKeyboard_TSF(fDoingOtherIm, lcid, pnActiveLangId); - } -#endif /*ENABLE_TSF*/ - - if (fDoingOtherIm) - { - hr = SetKeyboard_OtherIM(lcid, bstrOtherImKbd, pbstrActiveOtherImKbd, pfSelectLangPending); - } - else // no keyman keyboard wanted. - { - if (!fSetInputLang) - SetKeyboard_System(lcid); - - TurnOffKeymanKbd(pbstrActiveOtherImKbd); - *pfSelectLangPending = true; - } - - END_COM_METHOD(g_fact, IID_ILgTextServices); -} -#endif // WIN32 diff --git a/Src/Language/LgTextServices.h b/Src/Language/LgTextServices.h deleted file mode 100644 index ea9ad023a5..0000000000 --- a/Src/Language/LgTextServices.h +++ /dev/null @@ -1,72 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 2004 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: LgTextServices.h -Responsibility: Steve McConnel -Last reviewed: Not yet. --------------------------------------------------------------------------------*//*:End Ignore*/ -#pragma once -#ifndef LgTextServices_H -#define LgTextServices_H - -#ifdef WIN32 -/*---------------------------------------------------------------------------------------------- - Provide access to TSF functionality wrapped in easy-to-call methods. - - @h3{Hungarian: lts} -----------------------------------------------------------------------------------------------*/ -class LgTextServices : public ILgTextServices -{ -public: - static void CreateCom(IUnknown *punkCtl, REFIID riid, void ** ppv); - - //:>**************************************************************************************** - //:> IUnknown methods. - //:>**************************************************************************************** - // Get a pointer to the interface identified as iid. - STDMETHOD(QueryInterface)(REFIID iid, void ** ppv); - - // Add a reference by calling addref on the module, since this is a singleton. - STDMETHOD_(UCOMINT32, AddRef)(void) - { - return ModuleEntry::ModuleAddRef(); - } - // Release a reference by calling release on the module, since this is a singleton. - STDMETHOD_(UCOMINT32, Release)(void) - { - return ModuleEntry::ModuleRelease(); - } - - //:>**************************************************************************************** - //:> ILgTextServices methods. - //:>**************************************************************************************** - STDMETHOD(SetKeyboard)(int lcid, BSTR bstrKeymanKbd, int * pnActiveLangId, - BSTR * pbstrActiveKeymanKbd, ComBool * pfSelectLangPending); - -#ifdef DEBUG - // Check to make certain we have a valid internal state for debugging purposes. - bool AssertValid(void) - { - AssertPtr(this); - return true; - } -#endif // DEBUG - -protected: - /*------------------------------------------------------------------------------------------ - This generic constructor does nothing. - ------------------------------------------------------------------------------------------*/ - LgTextServices(void) - { - } - - friend class LanguageGlobals; -}; - -DEFINE_COM_PTR(LgTextServices); -#endif // WIN32 - -#endif //!LgTextServices_H diff --git a/Src/Language/Main.h b/Src/Language/Main.h index b8c6b877f6..6b0df6f341 100644 --- a/Src/Language/Main.h +++ b/Src/Language/Main.h @@ -109,8 +109,6 @@ using namespace fwutil; // Rect and Point classes #include "LgWordBreakSpaceSpec.h" #endif // LANG_MODEL -#include "LanguageGlobals.h" - // these are a gray area, including aspects of both model and engine // Todo JohnT: These structs are part of an obsolete approach to overriding character properties. // Get rid of them and whatever uses them. (Taken from OldLgWritingSystem file.) @@ -182,9 +180,7 @@ DEFINE_COM_PTR(UniscribeEngine); #include "RomRenderSegment.h" #include "RomRenderEngine.h" #include "LgSimpleEngines.h" -#include "LgCPWordTokenizer.h" #include "LgNumericEngine.h" -#include "LgInputMethodEditor.h" #if !WIN32 #include "UniscribeLinux.h" #endif @@ -192,15 +188,11 @@ DEFINE_COM_PTR(UniscribeEngine); #include "UniscribeEngine.h" // Other tools -#include "LgFontManager.h" #include "FwStyledText.h" #include "StringToNumHelpers.h" #include "WriteXml.h" // From AppCore. #include "xmlparse.h" -#include "LgKeymanHandler.h" -#include "LgCodePageEnumerator.h" #include "LgIcuWrappers.h" -#include "LgTextServices.h" #include "RegexMatcherWrapper.h" diff --git a/Src/Language/Makefile b/Src/Language/Makefile index 649b821dc6..6e9e817d27 100644 --- a/Src/Language/Makefile +++ b/Src/Language/Makefile @@ -80,46 +80,12 @@ LINK_LIBS := \ OBJ_LANGSERV = -# not currently used -OBJ_LANMODEL = \ - $(INT_DIR)/LgCharOverride.o \ - $(INT_DIR)/LgCharPropSpec.o \ - $(INT_DIR)/LgCharSpec.o \ - $(INT_DIR)/LgCollaterSpec.o \ - $(INT_DIR)/LgComponent.o \ - $(INT_DIR)/LgConverterSpec.o \ - $(INT_DIR)/LgConvertStringSpec.o \ - $(INT_DIR)/LgExternalSpecComponent.o \ - $(INT_DIR)/LgLineBreakSpaceSpec.o \ - $(INT_DIR)/LgLineBreakSpec.o \ - $(INT_DIR)/LgOwnedSpecComponent.o \ - $(INT_DIR)/LgNumericConverterSpec.o \ - $(INT_DIR)/LgRenderSpec.o \ - $(INT_DIR)/LgRomanRendererSpec.o \ - $(INT_DIR)/LgSpec.o \ - $(INT_DIR)/LgSpellCheckSpec.o \ - $(INT_DIR)/LgSysCollaterSpec.o \ - $(INT_DIR)/LgTokenizerSpec.o \ - $(INT_DIR)/LgUnicodeCollaterSpec.o \ - $(INT_DIR)/LgUserClassSpec.o \ - $(INT_DIR)/LgWfiCheckerSpec.o \ - $(INT_DIR)/LgWinRendSpec.o \ - $(INT_DIR)/LgWordBreakSpaceSpec.o \ - $(INT_DIR)/LgCPWordTokenizer.o \ - $(INT_DIR)/LgNumericEngine.o \ - $(INT_DIR)/TsStringPlus.o \ - $(INT_DIR)/FwXml.o \ - OBJ_LANG = \ - $(INT_DIR)/LanguageGlobals.o \ $(INT_DIR)/LgIcuWrappers.o \ $(INT_DIR)/LgSimpleEngines.o \ $(INT_DIR)/LgIcuCharPropEngine.o \ - $(INT_DIR)/LgFontManager.o \ $(INT_DIR)/LgUnicodeCollater.o \ - $(INT_DIR)/LgInputMethodEditor.o \ $(INT_DIR)/LocaleIndex.o \ - $(INT_DIR)/LgCodePageEnumerator.o \ $(INT_DIR)/FwXml.o \ $(INT_DIR)/WriteXml.o \ $(INT_DIR)/FwStyledText.o \ @@ -130,38 +96,6 @@ OBJ_LANG = \ $(INT_DIR)/RomRenderSegment.o \ -# LgCodePageEnumerator.o \ # This is used only in FwCoreDlgs (written in C#) - Need by FwCoreDlgs as loaded as a COM object -# LgKeymanHandler.o \ -# UniscribeEngine.o \ -# UniscribeSegment.o \ - -# Not used -XMO_LANGSERV = \ - $(COM_INT_DIR)/LgCharOverride.xmo \ - $(COM_INT_DIR)/LgCharPropSpec.xmo \ - $(COM_INT_DIR)/LgCharSpec.xmo \ - $(COM_INT_DIR)/LgCollaterSpec.xmo \ - $(COM_INT_DIR)/LgComponent.xmo \ - $(COM_INT_DIR)/LgConverterSpec.xmo \ - $(COM_INT_DIR)/LgConvertStringSpec.xmo \ - $(COM_INT_DIR)/LgWritingSystemModel.xmo \ - $(COM_INT_DIR)/LgExternalSpecComponent.xmo \ - $(COM_INT_DIR)/LgLineBreakSpaceSpec.xmo \ - $(COM_INT_DIR)/LgLineBreakSpec.xmo \ - $(COM_INT_DIR)/LgOwnedSpecComponent.xmo \ - $(COM_INT_DIR)/LgNumericConverterSpec.xmo \ - $(COM_INT_DIR)/LgRenderSpec.xmo \ - $(COM_INT_DIR)/LgRomanRendererSpec.xmo \ - $(COM_INT_DIR)/LgSpec.xmo \ - $(COM_INT_DIR)/LgSpellCheckSpec.xmo \ - $(COM_INT_DIR)/LgSysCollaterSpec.xmo \ - $(COM_INT_DIR)/LgTokenizerSpec.xmo \ - $(COM_INT_DIR)/LgUnicodeCollaterSpec.xmo \ - $(COM_INT_DIR)/LgUserClassSpec.xmo \ - $(COM_INT_DIR)/LgWfiCheckerSpec.xmo \ - $(COM_INT_DIR)/LgWinRendSpec.xmo \ - $(COM_INT_DIR)/LgWordBreakSpaceSpec.xmo \ - OBJ_OTHER = \ $(INT_DIR)/ModuleEntry.o \ $(INT_DIR)/TextProps1.o \ diff --git a/Src/Language/Test/Makefile b/Src/Language/Test/Makefile index 4cd6cbb2d3..a04ea63651 100644 --- a/Src/Language/Test/Makefile +++ b/Src/Language/Test/Makefile @@ -82,10 +82,7 @@ FWLANG_OBJ := \ $(LANGUAGE_OBJ)/RomRenderSegment.o \ $(LANGUAGE_OBJ)/LgSimpleEngines.o \ $(LANGUAGE_OBJ)/LgIcuCharPropEngine.o \ - $(LANGUAGE_OBJ)/LgFontManager.o \ - $(LANGUAGE_OBJ)/LgInputMethodEditor.o \ $(LANGUAGE_OBJ)/LocaleIndex.o \ - $(LANGUAGE_OBJ)/LanguageGlobals.o \ $(GENERIC_OBJ)/TextProps1.o \ $(GR_LIB_OBJ)/GrUtil.o \ $(LANGUAGE_OBJ)/FwXml.o \ @@ -121,7 +118,6 @@ $(INT_DIR)/Collection.cpp: testLanguage.h \ MockLgWritingSystem.h \ TestLgCollatingEngine.h \ TestLgIcuCharPropEngine.h \ - TestLgFontManager.h \ TestRomRenderEngine.h \ RenderEngineTestBase.h @echo Collecting tests for testLanguage diff --git a/Src/Language/Test/TestLanguage.vcxproj b/Src/Language/Test/TestLanguage.vcxproj index 15074776b0..7c54622b6c 100644 --- a/Src/Language/Test/TestLanguage.vcxproj +++ b/Src/Language/Test/TestLanguage.vcxproj @@ -75,13 +75,13 @@ - + diff --git a/Src/Language/Test/TestLanguage.vcxproj.filters b/Src/Language/Test/TestLanguage.vcxproj.filters index 6bdca65973..6643abcf5b 100644 --- a/Src/Language/Test/TestLanguage.vcxproj.filters +++ b/Src/Language/Test/TestLanguage.vcxproj.filters @@ -32,9 +32,6 @@ Header Files - - Header Files - Header Files @@ -50,5 +47,6 @@ + \ No newline at end of file diff --git a/Src/Language/Test/TestLgFontManager.h b/Src/Language/Test/TestLgFontManager.h deleted file mode 100644 index 20cfa0c092..0000000000 --- a/Src/Language/Test/TestLgFontManager.h +++ /dev/null @@ -1,77 +0,0 @@ -/*--------------------------------------------------------------------*//*:Ignore this sentence. -Copyright (C) 2003 SIL International. All rights reserved. - -Distributable under the terms of either the Common Public License or the -GNU Lesser General Public License, as specified in the LICENSING.txt file. - -File: TestLgFontManager.h -Responsibility: -Last reviewed: - - Unit tests for the LgFontManager class. --------------------------------------------------------------------------------*//*:End Ignore*/ -#ifndef TESTLGFONTMANAGER_H_INCLUDED -#define TESTLGFONTMANAGER_H_INCLUDED - -#pragma once - -#include "testLanguage.h" - -namespace TestLanguage -{ - /******************************************************************************************* - Tests for LgFontManager - ******************************************************************************************/ - class TestLgFontManager : public unitpp::suite - { - ILgFontManagerPtr m_qfm0; - - void testNullArgs() - { - unitpp::assert_true("m_qfm0", m_qfm0.Ptr()); - HRESULT hr; - try{ - CheckHr(hr = m_qfm0->IsFontAvailable(NULL, NULL)); - unitpp::assert_eq("IsFontAvailable(NULL, NULL) HRESULT", E_INVALIDARG, hr); - } - catch(Throwable& thr) - { - unitpp::assert_eq("IsFontAvailable(NULL, NULL) HRESULT", E_INVALIDARG, thr.Result()); - } - try{ - CheckHr(hr = m_qfm0->IsFontAvailableRgch(0, NULL, NULL)); - unitpp::assert_eq("IsFontAvailableRgch(0, NULL, NULL) HRESULT", E_INVALIDARG, hr); - } - catch(Throwable& thr) - { - unitpp::assert_eq("IsFontAvailableRgch(0, NULL, NULL) HRESULT", E_INVALIDARG, thr.Result()); - } - try{ - CheckHr(hr = m_qfm0->AvailableFonts(NULL)); - unitpp::assert_eq("AvailableFonts(NULL) HRESULT", E_POINTER, hr); - } - catch(Throwable& thr) - { - unitpp::assert_eq("AvailableFonts(NULL) HRESULT", E_POINTER, thr.Result()); - } - } - - public: - TestLgFontManager(); - virtual void SuiteSetup() - { - LgFontManager::CreateCom(NULL, IID_ILgFontManager, (void **)&m_qfm0); - } - virtual void SuiteTeardown() - { - m_qfm0.Clear(); - } - }; -} - -#endif /*TESTLGFONTMANAGER_H_INCLUDED*/ - -// Local Variables: -// mode:C++ -// compile-command:"cmd.exe /e:4096 /c c:\\FW\\Bin\\mklg-tst.bat" -// End: (These 4 lines are useful to Steve McConnel.) diff --git a/Src/Language/Test/testLanguage.mak b/Src/Language/Test/testLanguage.mak index c086c8d523..f87aa39b28 100644 --- a/Src/Language/Test/testLanguage.mak +++ b/Src/Language/Test/testLanguage.mak @@ -56,15 +56,11 @@ OBJ_LANGUAGETESTSUITE=\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\RomRenderSegment.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LgSimpleEngines.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LgIcuCharPropEngine.obj\ - $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LgFontManager.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LgUnicodeCollater.obj\ - $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LgInputMethodEditor.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\FwStyledText.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\WriteXml.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\usepch\TextProps1.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\FwXml.obj\ - $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LanguageGlobals.obj\ - $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LgTextServices.obj\ OBJ_GRUTIL=\ $(INT_DIR)\autopch\GrUtil.obj\ @@ -101,7 +97,6 @@ $(LANGUAGETEST_SRC)\Collection.cpp: $(LANGUAGETEST_SRC)\testLanguage.h\ $(LANGUAGETEST_SRC)\TestRegexMatcher.h\ $(LANGUAGETEST_SRC)\TestLgCollatingEngine.h\ $(LANGUAGETEST_SRC)\TestLgIcuCharPropEngine.h\ - $(LANGUAGETEST_SRC)\TestLgFontManager.h\ $(LANGUAGETEST_SRC)\TestUniscribeEngine.h\ $(LANGUAGETEST_SRC)\TestRomRenderEngine.h\ $(LANGUAGETEST_SRC)\RenderEngineTestBase.h diff --git a/Src/TeDll/TeMainWnd.cs b/Src/TeDll/TeMainWnd.cs index e7cd3c6017..53456d3c80 100644 --- a/Src/TeDll/TeMainWnd.cs +++ b/Src/TeDll/TeMainWnd.cs @@ -5459,7 +5459,7 @@ protected bool OnUnsQuestions(object args) m_StyleSheet.GetUiFontForWritingSystem(Cache.DefaultVernWs, 0), vernWs.IcuLocale, vernWs.RightToLeftScript, Path.Combine(ScrTextCollection.SettingsDirectory ?? @"c:\My Paratext Projects", "cms"), ccSettings, App.ApplicationName, start, end, - vern => KeyboardController.SetKeyboard(vern ? vernWs.LCID : defaultWs.LCID, vern ? vernWs.Keyboard : defaultWs.Keyboard), + vern => KeyboardController.SetKeyboard(vern ? vernWs : defaultWs), () => ShowHelp.ShowHelpTopic(m_app, "khtpNoHelpTopic"), LookupTerm); // TODO: Come up with a Help topic diff --git a/Src/views/Views.idh b/Src/views/Views.idh index 427897f936..89ba279dcf 100644 --- a/Src/views/Views.idh +++ b/Src/views/Views.idh @@ -1664,7 +1664,7 @@ Last reviewed: @H3{Hungarian: rootb} *******************************************************************************************/ - DeclareInterface(VwRootBox, VwNotifyChange, 85DB7D7D-D47B-440e-A213-F62D5224C982) + DeclareInterface(VwRootBox, VwNotifyChange, A8944421-3A75-4DD5-A469-2EE251228A26) { //:> Initialization @@ -2342,18 +2342,6 @@ Last reviewed: [in] int ysTop, [in] int dysHeight); - // Set the proper keyboard for the given writing system. - // The reason this method belongs in this interface is that it may use the selection - // location to place an IME composition window, and most callers know the rootbox - // explicitly, but not the selection. - HRESULT SetKeyboardForWs( - [in] ILgWritingSystem * pws, - [in, out] BSTR * pbstrActiveKeymanKbd, - [in, out] int * pnActiveLangId, - [in, out] int * phklActive, - [in, out] ComBool * pfSelectLangPending); - - // Get/set the the maximum number of paragraphs to scan looking for editable text. If // we can't find anything editable in this many paragraphs, we'll assume the whole text // is read-only. (This affects cursor movement, which likes to find the editable text diff --git a/Src/views/Views_GUIDs.cpp b/Src/views/Views_GUIDs.cpp index 627e8c28b0..b0b6013b5f 100644 --- a/Src/views/Views_GUIDs.cpp +++ b/Src/views/Views_GUIDs.cpp @@ -12,7 +12,7 @@ DEFINE_UUIDOF(IVwRootSite, 0xC999413C, 0x28C8, 0x481c, 0x95, 0x43, 0xB0, 0x6C, 0 DEFINE_UUIDOF(ISilDataAccess, 0x26E6E70E, 0x53EB, 0x4372, 0x96, 0xF1, 0x0F, 0x47, 0x07, 0xCC, 0xD1, 0xEB); DEFINE_UUIDOF(IStructuredTextDataAccess, 0xA2A4F9FA, 0xD4E8, 0x4bfb, 0xB6, 0xB7, 0x5F, 0x45, 0xDA, 0xF2, 0xDC, 0x0C); DEFINE_UUIDOF(IVwCacheDa, 0xB9ADC49A, 0xE28B, 0x4858, 0x8C, 0x04, 0x53, 0xE0, 0xD2, 0xE5, 0xA7, 0x6F); -DEFINE_UUIDOF(IVwRootBox, 0x85DB7D7D, 0xD47B, 0x440e, 0xA2, 0x13, 0xF6, 0x2D, 0x52, 0x24, 0xC9, 0x82); +DEFINE_UUIDOF(IVwRootBox, 0xA8944421, 0x3A75, 0x4DD5, 0xA4, 0x69, 0x2E, 0xE2, 0x51, 0x22, 0x8A, 0x26); DEFINE_UUIDOF(IVwPropertyStore, 0x3D4847FE, 0xEA2D, 0x4255, 0xA4, 0x96, 0x77, 0x00, 0x59, 0xA1, 0x34, 0xCC); DEFINE_UUIDOF(IVwOverlay, 0x7D9089C1, 0x3BB9, 0x11d4, 0x80, 0x78, 0x00, 0x00, 0xC0, 0xFB, 0x81, 0xB5); DEFINE_UUIDOF(IVwPrintContext, 0xFF2E1DC2, 0x95A8, 0x41c6, 0x85, 0xF4, 0xFF, 0xCA, 0x3A, 0x64, 0x21, 0x6A); diff --git a/Src/views/VwRootBox.cpp b/Src/views/VwRootBox.cpp index 60bf5e62cd..6d89f08907 100644 --- a/Src/views/VwRootBox.cpp +++ b/Src/views/VwRootBox.cpp @@ -2919,68 +2919,6 @@ STDMETHODIMP VwRootBox::DrawRoot2(IVwGraphics * pvg, RECT rcSrcRoot1, RECT rcDst END_COM_METHOD(g_fact, IID_IVwRootBox); } -/*---------------------------------------------------------------------------------------------- - Set the active keyboard appropriately for the given writing system. This method doesn't - really belong necessarily on IVwRootBox, but it fits there as well as anywhere. - - @param pws - points to ILgWritingSystem object. - @param pbstrActiveKeymanKbd - name of the current (active) Keyman keyboard, if any. - @param pnActiveLangId - lang id of the current (active) keyboard. - @param phklActive - HKL of the current (active) keyboard/language - @param pfSelectLangPending - set true as appropriate. -----------------------------------------------------------------------------------------------*/ -STDMETHODIMP VwRootBox::SetKeyboardForWs(ILgWritingSystem * pws, BSTR * pbstrActiveKeymanKbd, - int * pnActiveLangId, int * phklActive, ComBool * pfSelectLangPending) -{ - BEGIN_COM_METHOD; - ChkComArgPtr(pws); - ChkComArgPtr(pbstrActiveKeymanKbd); - ChkComArgPtr(pnActiveLangId); - ChkComArgPtr(phklActive); - ChkComArgPtr(pfSelectLangPending); - - int nLangId; - int nLocale; - CheckHr(pws->get_LCID(&nLocale)); - CheckHr(pws->get_CurrentLCID(&nLangId)); - int ws; - CheckHr(pws->get_Handle(&ws)); -#ifdef Tracing_KeybdSelection - StrAnsi sta; - sta.Format("VwRootBox::SetKeyboardForWs(%d) [new langid %d from old hkl %d]%n", - ws, nLangId, *pnActiveLangId); - ::OutputDebugStringA(sta.Chars()); -#endif - - // We possibly set a Keyman keyboard, more precisely than the langid can do. Only attempt - // this if we are using the default langid for the ws. - SmartBstr sbstrKeymanKbd; - if (nLangId == LANGIDFROMLCID(nLocale)) - CheckHr(pws->get_Keyboard(&sbstrKeymanKbd)); - // else let it seem we don't have one, even if we do. -#ifdef TRACING_KEYMAN - StrAnsi sta; - sta.Format("Adjusting keyboard for ws %d, keyman keyboard should be %S\n", - ws, sbstrKeymanKbd.Chars()); - OutputDebugStringA(sta.Chars()); -#endif - ILgTextServicesPtr qlts; -#ifdef WIN32 - qlts.CreateInstance(CLSID_LgTextServices); -#else - CheckHr(m_qvim->QueryInterface(IID_ILgTextServices, (void **) &qlts)); -#endif - CheckHr(qlts->SetKeyboard(nLangId, sbstrKeymanKbd, pnActiveLangId, pbstrActiveKeymanKbd, - pfSelectLangPending)); -#if ENABLE_INPUT_METHODS - HKL hkl = ::GetKeyboardLayout(0); - *phklActive = (int)hkl; - SetImeWindowLocation(hkl); -#endif - - END_COM_METHOD(g_fact, IID_IVwRootBox); -} - /*---------------------------------------------------------------------------------------------- Lay the box out in the available width. Must be called before Draw, Height, or Width ----------------------------------------------------------------------------------------------*/ @@ -4358,66 +4296,6 @@ void VwRootBox::SetSelection(VwSelection * pvwsel, bool fUpdateRootSite) return; } -#if ENABLE_INPUT_METHODS -/*---------------------------------------------------------------------------------------------- - If the current keyboard and window is associated with an IME, then set the IME composition - window's location to (approximately) follow the screen location of the selection. -----------------------------------------------------------------------------------------------*/ -void VwRootBox::SetImeWindowLocation(HKL hkl) -{ - if (!::ImmIsIME(hkl)) - return; - HWND hwnd = NULL; - m_qvrs->get_Hwnd((DWORD *)&hwnd); - if (hwnd == NULL) - return; - HIMC himc = ::ImmGetContext(hwnd); - if (himc == NULL) - return; - if (m_qvwsel.Ptr() == NULL) - return; - - COMPOSITIONFORM comp; - if (::ImmGetCompositionWindow(himc, &comp)) - { -#ifdef Tracing_KeybdSelection - StrAnsi staStyle; - switch (comp.dwStyle) - { - case CFS_DEFAULT: staStyle = "CFS_DEFAULT"; break; - case CFS_FORCE_POSITION: staStyle = "CFS_FORCE_POSITION"; break; - case CFS_POINT: staStyle = "CFS_POINT"; break; - case CFS_RECT: staStyle = "CFS_RECT"; break; - default: staStyle.Format("0x%x", (int)comp.dwStyle); break; - } - StrAnsi staMsg; - staMsg.Format("VwRootBox::SetImeWindowLocation(hkl = %d) - " - "::ImmGetCompositionWindow() => %s, {X=%d,Y=%d}, {L=%d,T=%d,R=%d,B=%d}%n", - (int)hkl, staStyle.Chars(), (int)comp.ptCurrentPos.x, (int)comp.ptCurrentPos.y, - (int)comp.rcArea.left, (int)comp.rcArea.top, (int)comp.rcArea.right, - (int)comp.rcArea.bottom); - ::OutputDebugStringA(staMsg.Chars()); -#endif - HoldGraphics hg(this); - Rect rdPrimary, rdSec; - ComBool fSplit, fEndBeforeAnchor; - CheckHr(m_qvwsel->Location(hg.m_qvg, hg.m_rcSrcRoot, hg.m_rcDstRoot, &rdPrimary, - &rdSec, &fSplit, &fEndBeforeAnchor)); -#ifdef Tracing_KeybdSelection - staMsg.Format("VwRootBox::SetImeWindowLocation(hkl = %d) - " - "m_qvwsel->Location() => rdPrimary = {L=%d,T=%d,R=%d,B=%d}%n", - (int)hkl, rdPrimary.left, rdPrimary.top, rdPrimary.right, rdPrimary.bottom); - ::OutputDebugStringA(staMsg.Chars()); -#endif - comp.dwStyle = CFS_POINT; - comp.ptCurrentPos.x = rdPrimary.left; - comp.ptCurrentPos.y = rdPrimary.top; - ::ImmSetCompositionWindow(himc, &comp); - } -} -#endif //ENABLE_INPUT_METHODS - - //:>******************************************************************************************** //:> Notifier-related methods //:>******************************************************************************************** diff --git a/Src/views/VwRootBox.h b/Src/views/VwRootBox.h index 11ab0782bb..eec2de5123 100644 --- a/Src/views/VwRootBox.h +++ b/Src/views/VwRootBox.h @@ -189,8 +189,6 @@ class VwRootBox : public IVwRootBox, public IServiceProvider, public VwDivBox IVwViewConstructor ** ppvwvc, int * pfrag, IVwStylesheet ** ppss); STDMETHOD(DrawRoot2)(IVwGraphics * pvg, RECT rcSrcRoot1, RECT rcDstRoot1, ComBool fDrawSel, int ysTop, int dysHeight); - STDMETHOD(SetKeyboardForWs)(ILgWritingSystem * pws, BSTR * pbstrActiveKeymanKbd, - int * pnActiveLangId, int * phklActive, ComBool * pfSelectLangPending); STDMETHOD(get_MaxParasToScan)(int * pcParas); STDMETHOD(put_MaxParasToScan)(int cParas); STDMETHOD(DoSpellCheckStep)(ComBool * pfComplete); @@ -475,7 +473,6 @@ class VwRootBox : public IVwRootBox, public IServiceProvider, public VwDivBox virtual void FixSync(VwSynchronizer *psync, VwRootBox * prootb){} VwNotifier * NotifierForObjPropIndex(HVO hvoContext, int tag, int iprop); - void SetImeWindowLocation(HKL hkl); VwBox * FindClosestBox(IVwGraphics * pvg, int xd, int yd, Rect rcSrc, Rect rcDst, Rect * prcSrc, Rect * prcDst); bool EnsureConstructed(bool fDoLayout = false); From 3421a5721aacdf96a87c03c6daa2dc52391b3016 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Fri, 16 Aug 2013 22:27:37 +0200 Subject: [PATCH 10/15] Fix weird problem with manifest file This change fixes a problem that suddently appeared on my machine: when starting FW in VS FieldWorks.exe gets recompiled which caused the manifest file to rebuild. For whatever reason registering Language.dll failed which caused all comClass entries to be removed from the manifest file, preventing FW from starting. This change modifies the behavior of the RegFree.targets file that gets included in the FieldWorks.csproj file: the manifest file gets only rebuild if any of the unmanaged dlls changed. Change-Id: I75ff9250794691bc4155e24e3221afceec8fa71f --- Build/RegFree.targets | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Build/RegFree.targets b/Build/RegFree.targets index ae43830879..88ee3c37c1 100644 --- a/Build/RegFree.targets +++ b/Build/RegFree.targets @@ -15,9 +15,13 @@ - + + + + + From e89abaa46e1d8ae7fe858487daf01add665dd657 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Mon, 26 Aug 2013 15:19:51 +0200 Subject: [PATCH 11/15] FWNX-1122, FLEx side of moving Keyboarding to Palaso This change deletes large chunks of FLEx code that have been more-or-less moved to Palaso, replacing it with generally smaller chunks which delegate to the Palaso objects. JohnT: I'm most dubious about removing the LinuxKeyboardHelper class. Essentially I have inlined many of its methods to the ViewInputManager class, which is only instantiated for Linux. In many cases, ViewInputManager delegated to a KeyboardHelper method that did nothing, or something very trivial. I have removed the keyboard helper and made the ViewInputManager methods do the corresponding thing. This allowed getting rid of the Keyboarding Assembly altogether, since all its other functionality moved to Palaso. (The little piece in the ViewInputManager/KeyboardHelper files was for TSF support that is quite specific to Views, and thus does not seem to me appropriate to move to Palaso.) It also seemed to simplify things. This change integrates a temporary change to get the Palaso DLLs from Jenkins (which in turn contains a better way of organizing the downloads). Change-Id: I0c7e973a6cbf7869e63ddd271990bba27355d0f3 --- Build/Linux.targets | 8 + Build/mkall.targets | 84 +- Lib/linux/Common/FwKernelTlb.h | 135 +- Lib/linux/Common/FwKernelTlb.idl | 41 +- Lib/linux/Common/FwKernelTlb.tlb | Bin 94624 -> 95140 bytes Lib/linux/Common/LanguageTlb.h | 135 +- Lib/linux/Common/LanguageTlb.idl | 41 +- Lib/linux/Common/LanguageTlb.tlb | Bin 94632 -> 95148 bytes Lib/linux/Common/ViewsTlb.h | 2 +- Lib/linux/Common/ViewsTlb.tlb | Bin 83976 -> 83976 bytes Lib/linux/Common/idhfiles.MD5 | 2 +- Lib/linux/Debug/ibusdotnet.dll | Bin 20992 -> 0 bytes Lib/linux/Release/ibusdotnet.dll | Bin 20480 -> 20480 bytes Src/Common/Controls/Widgets/Widgets.csproj | 4 +- .../XMLViewsTests/XMLViewsTests.csproj | 16 +- .../XMLViewsTests/XmlBrowseViewBaseTests.cs | 6 - Src/Common/CoreImpl/CoreImpl.csproj | 3 +- .../CoreImpl/GlobalFileWritingSystemStore.cs | 55 +- Src/Common/CoreImpl/KeyboardHelper.cs | 164 + .../CoreImpl/LocalFileWritingSystemStore.cs | 8 +- Src/Common/CoreImpl/PalasoWritingSystem.cs | 3 + .../CoreImpl/PalasoWritingSystemManager.cs | 17 +- .../CoreImpl/Properties/Settings.Designer.cs | 17 +- .../CoreImpl/Properties/Settings.settings | 5 +- Src/Common/CoreImpl/app.config | 3 + Src/Common/FieldWorks/FieldWorks.cs | 4 + Src/Common/FieldWorks/FieldWorks.csproj | 12 +- Src/Common/Framework/Framework.csproj | 12 +- Src/Common/Framework/FwMainWnd.cs | 9 +- Src/Common/KeyboardSwitcher/AssemblyInfo.cs | 17 - .../KeyboardSwitcher/BuildInclude.targets | 20 - .../GlobalCachedInputContext.cs | 35 - .../KeyboardSwitcher/KeyboardSwitcher.cs | 152 - .../KeyboardSwitcher/KeyboardSwitcher.csproj | 118 - .../KeyboardSwitcherTests/IBusDotNetTests.cs | 62 - .../KeyboardSwitcherTests.cs | 209 - .../KeyboardSwitcherTests.csproj | 104 - .../gendarme-KeyboardSwitcherTests.ignore | 7 - Src/Common/Keyboarding/AssemblyInfo.cs | 17 - Src/Common/Keyboarding/BuildInclude.targets | 10 - .../Interfaces/IKeyboardCallback.cs | 25 - .../Interfaces/IKeyboardDescription.cs | 65 - .../Interfaces/IKeyboardErrorDescription.cs | 30 - .../Interfaces/IKeyboardEventHandler.cs | 102 - .../Interfaces/IKeyboardMethods.cs | 49 - .../InternalInterfaces/IKeyboardAdaptor.cs | 48 - .../InternalInterfaces/IKeyboardController.cs | 86 - Src/Common/Keyboarding/KeyboardController.cs | 381 - Src/Common/Keyboarding/KeyboardDescription.cs | 136 - .../Keyboarding/KeyboardDescriptionNull.cs | 85 - .../Keyboarding/KeyboardDescriptionWrapper.cs | 115 - .../Keyboarding/KeyboardErrorDescription.cs | 32 - Src/Common/Keyboarding/Keyboarding.csproj | 144 - Src/Common/Keyboarding/Keyboarding.dll.config | 4 - .../Keyboarding/KeyboardingTests/App.config | 22 - .../FakeKeyboardController.cs | 179 - .../KeyboardingTests/KeyboardingTests.csproj | 112 - .../XkbKeyboardAdapterTests.cs | 300 - .../KeyboardingTests/XklEngineTests.cs | 70 - .../Keyboarding/Linux/IbusKeyboardAdaptor.cs | 108 - Src/Common/Keyboarding/Linux/IcuLocale.cs | 66 - .../Keyboarding/Linux/LinuxKeyboardHelper.cs | 148 - Src/Common/Keyboarding/Linux/X11.cs | 28 - .../Keyboarding/Linux/XkbKeyboardAdaptor.cs | 169 - .../Linux/XkbKeyboardDescription.cs | 41 - .../Keyboarding/Linux/XklConfigRegistry.cs | 276 - Src/Common/Keyboarding/Linux/XklEngine.cs | 218 - Src/Common/Keyboarding/Types/MouseEvent.cs | 30 - .../Keyboarding/Windows/WinKeyboardAdaptor.cs | 335 - .../Keyboarding/gendarme-Keyboarding.ignore | 14 - .../PublicationControlTests.cs | 5 - Src/Common/RootSite/RootSite.cs | 9 + Src/Common/RootSite/RootSite.csproj | 2 +- Src/Common/SimpleRootSite/EditingHelper.cs | 16 +- Src/Common/SimpleRootSite/IBusCommunicator.cs | 6 +- Src/Common/SimpleRootSite/SimpleRootSite.cs | 211 +- .../SimpleRootSite/SimpleRootSite.csproj | 16 +- .../InputBusControllerTests.cs | 6 - Src/Common/SimpleRootSite/ViewInputManager.cs | 41 +- .../Infrastructure/Impl/FDOBackendProvider.cs | 2 + .../FwCoreDlgControls.csproj | 681 +- .../FwCoreDlgControlsTests.csproj | 19 +- .../KeyboardControlTests.cs | 486 -- .../FwCoreDlgControls/KeyboardControl.cs | 280 - .../FwCoreDlgControls/KeyboardControl.resx | 257 - Src/FwCoreDlgs/FwCoreDlgs.csproj | 9 +- .../FwCoreDlgsTests/FwCoreDlgsTests.csproj | 32 +- .../WritingSystemPropertiesDialogTests.cs | 4 +- Src/FwCoreDlgs/ValidCharactersDlg.cs | 10 +- .../WritingSystemPropertiesDialog.cs | 247 +- .../WritingSystemPropertiesDialog.resx | 7541 ++++++++--------- Src/Kernel/FwKernel_GUIDs.cpp | 2 + Src/Language/Language.idh | 39 + Src/Language/Language.mak | 1 + Src/Language/Language.vcxproj | 4 +- Src/Language/LanguageExtra_GUIDs.cpp | 1 - Src/Language/Language_GUIDs.cpp | 2 + Src/Language/LgKeymanHandler.cpp | 456 + Src/Language/LgKeymanHandler.h | 65 + Src/Language/Main.h | 1 + Src/Language/Makefile | 1 + Src/Language/Test/Makefile | 1 + Src/Language/Test/testLanguage.mak | 1 + Src/TeDll/TeDll.csproj | 48 +- Src/TeDll/TeMainWnd.cs | 4 +- Src/views/VwTextStore.cpp | 13 +- 106 files changed, 5218 insertions(+), 10256 deletions(-) delete mode 100755 Lib/linux/Debug/ibusdotnet.dll create mode 100644 Src/Common/CoreImpl/KeyboardHelper.cs delete mode 100644 Src/Common/KeyboardSwitcher/AssemblyInfo.cs delete mode 100644 Src/Common/KeyboardSwitcher/BuildInclude.targets delete mode 100644 Src/Common/KeyboardSwitcher/GlobalCachedInputContext.cs delete mode 100644 Src/Common/KeyboardSwitcher/KeyboardSwitcher.cs delete mode 100644 Src/Common/KeyboardSwitcher/KeyboardSwitcher.csproj delete mode 100644 Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/IBusDotNetTests.cs delete mode 100644 Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/KeyboardSwitcherTests.cs delete mode 100644 Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/KeyboardSwitcherTests.csproj delete mode 100644 Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/gendarme-KeyboardSwitcherTests.ignore delete mode 100644 Src/Common/Keyboarding/AssemblyInfo.cs delete mode 100644 Src/Common/Keyboarding/BuildInclude.targets delete mode 100644 Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs delete mode 100644 Src/Common/Keyboarding/Interfaces/IKeyboardDescription.cs delete mode 100644 Src/Common/Keyboarding/Interfaces/IKeyboardErrorDescription.cs delete mode 100644 Src/Common/Keyboarding/Interfaces/IKeyboardEventHandler.cs delete mode 100644 Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs delete mode 100644 Src/Common/Keyboarding/InternalInterfaces/IKeyboardAdaptor.cs delete mode 100644 Src/Common/Keyboarding/InternalInterfaces/IKeyboardController.cs delete mode 100644 Src/Common/Keyboarding/KeyboardController.cs delete mode 100644 Src/Common/Keyboarding/KeyboardDescription.cs delete mode 100644 Src/Common/Keyboarding/KeyboardDescriptionNull.cs delete mode 100644 Src/Common/Keyboarding/KeyboardDescriptionWrapper.cs delete mode 100644 Src/Common/Keyboarding/KeyboardErrorDescription.cs delete mode 100644 Src/Common/Keyboarding/Keyboarding.csproj delete mode 100644 Src/Common/Keyboarding/Keyboarding.dll.config delete mode 100644 Src/Common/Keyboarding/KeyboardingTests/App.config delete mode 100644 Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs delete mode 100644 Src/Common/Keyboarding/KeyboardingTests/KeyboardingTests.csproj delete mode 100644 Src/Common/Keyboarding/KeyboardingTests/XkbKeyboardAdapterTests.cs delete mode 100644 Src/Common/Keyboarding/KeyboardingTests/XklEngineTests.cs delete mode 100644 Src/Common/Keyboarding/Linux/IbusKeyboardAdaptor.cs delete mode 100644 Src/Common/Keyboarding/Linux/IcuLocale.cs delete mode 100644 Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs delete mode 100644 Src/Common/Keyboarding/Linux/X11.cs delete mode 100644 Src/Common/Keyboarding/Linux/XkbKeyboardAdaptor.cs delete mode 100644 Src/Common/Keyboarding/Linux/XkbKeyboardDescription.cs delete mode 100644 Src/Common/Keyboarding/Linux/XklConfigRegistry.cs delete mode 100644 Src/Common/Keyboarding/Linux/XklEngine.cs delete mode 100644 Src/Common/Keyboarding/Types/MouseEvent.cs delete mode 100644 Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs delete mode 100644 Src/Common/Keyboarding/gendarme-Keyboarding.ignore delete mode 100644 Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/KeyboardControlTests.cs delete mode 100644 Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs delete mode 100644 Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.resx create mode 100644 Src/Language/LgKeymanHandler.cpp create mode 100644 Src/Language/LgKeymanHandler.h diff --git a/Build/Linux.targets b/Build/Linux.targets index f12cd7937e..568f025ffb 100644 --- a/Build/Linux.targets +++ b/Build/Linux.targets @@ -76,6 +76,14 @@ + + + + + diff --git a/Build/mkall.targets b/Build/mkall.targets index 8d62cd99c2..bc3da2cecd 100644 --- a/Build/mkall.targets +++ b/Build/mkall.targets @@ -207,7 +207,7 @@ - + - - - - + + + + - + @@ -403,47 +403,45 @@ SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true"/> - - + + + http://build.palaso.org/guestAuth/repository/download/bt228/.lastSuccessful + + http://build.palaso.org/guestAuth/repository/download/bt267/.lastSuccessful + + https://jenkins.lsdev.sil.org/userContent/artifacts/Palaso-Win-any-KeyboardingV2-debug/lastSuccessful + https://jenkins.lsdev.sil.org/userContent/artifacts/Palaso-Linux-any-KeyboardingV2-debug/lastSuccessful + + http://build.palaso.org/guestAuth/repository/download/bt278/.lastSuccessful + http://build.palaso.org/guestAuth/repository/download/bt279/.lastSuccessful + mdb + pdb + + + - - - - - - - - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/Lib/linux/Common/FwKernelTlb.h b/Lib/linux/Common/FwKernelTlb.h index 04ff7deb2f..b65ed24ef3 100644 --- a/Lib/linux/Common/FwKernelTlb.h +++ b/Lib/linux/Common/FwKernelTlb.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Mon Aug 26 09:34:18 2013 +/* at Mon Aug 26 13:18:10 2013 */ /* Compiler settings for d:\fwrepo\fw\Output\Common\FwKernelTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 @@ -419,6 +419,12 @@ typedef interface ILgNumericEngine ILgNumericEngine; #endif /* __ILgNumericEngine_FWD_DEFINED__ */ +#ifndef __ILgKeymanHandler_FWD_DEFINED__ +#define __ILgKeymanHandler_FWD_DEFINED__ +typedef interface ILgKeymanHandler ILgKeymanHandler; +#endif /* __ILgKeymanHandler_FWD_DEFINED__ */ + + #ifndef __ILgIcuConverterEnumerator_FWD_DEFINED__ #define __ILgIcuConverterEnumerator_FWD_DEFINED__ typedef interface ILgIcuConverterEnumerator ILgIcuConverterEnumerator; @@ -545,6 +551,18 @@ typedef struct LgNumericEngine LgNumericEngine; #endif /* __LgNumericEngine_FWD_DEFINED__ */ +#ifndef __LgKeymanHandler_FWD_DEFINED__ +#define __LgKeymanHandler_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class LgKeymanHandler LgKeymanHandler; +#else +typedef struct LgKeymanHandler LgKeymanHandler; +#endif /* __cplusplus */ + +#endif /* __LgKeymanHandler_FWD_DEFINED__ */ + + #ifndef __LgIcuConverterEnumerator_FWD_DEFINED__ #define __LgIcuConverterEnumerator_FWD_DEFINED__ @@ -1487,6 +1505,11 @@ ILgWritingSystemFactory 22376578-BFEB-4c46-8D72-C9154890DD16 ); GENERIC_DECLARE_SMART_INTERFACE_PTR( +ILgKeymanHandler +, +3F42144B-509F-4def-8DD3-6D8D26677001 +); +GENERIC_DECLARE_SMART_INTERFACE_PTR( ILgIcuConverterEnumerator , 8E6D558E-8755-4EA1-9FF6-039D375312E9 @@ -1552,6 +1575,11 @@ FF22A7AB-223E-4D04-B648-0AE40588261D LgNumericEngine ); ATTACH_GUID_TO_CLASS(class, +69ACA99C-F852-4C2C-9B5F-FF83238A17A5 +, +LgKeymanHandler +); +ATTACH_GUID_TO_CLASS(class, 9E729461-F80D-4796-BA17-086BC61907F1 , LgIcuConverterEnumerator @@ -10408,6 +10436,103 @@ FwGraphiteProcess; #endif /* __ILgNumericEngine_INTERFACE_DEFINED__ */ +#ifndef __ILgKeymanHandler_INTERFACE_DEFINED__ +#define __ILgKeymanHandler_INTERFACE_DEFINED__ + +/* interface ILgKeymanHandler */ +/* [unique][object][uuid] */ + + +#define IID_ILgKeymanHandler __uuidof(ILgKeymanHandler) + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("3F42144B-509F-4def-8DD3-6D8D26677001") + ILgKeymanHandler : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Init( + /* [in] */ ComBool fForce) = 0; + + virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; + + virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ActiveKeyboardName( + /* [retval][out] */ BSTR *pbstrName) = 0; + + }; + +#else /* C style interface */ + + typedef struct ILgKeymanHandlerVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ILgKeymanHandler * This, + /* [in] */ REFIID riid, + /* [annotation][iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + ILgKeymanHandler * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + ILgKeymanHandler * This); + + HRESULT ( STDMETHODCALLTYPE *Init )( + ILgKeymanHandler * This, + /* [in] */ ComBool fForce); + + HRESULT ( STDMETHODCALLTYPE *Close )( + ILgKeymanHandler * This); + + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ActiveKeyboardName )( + ILgKeymanHandler * This, + /* [retval][out] */ BSTR *pbstrName); + + END_INTERFACE + } ILgKeymanHandlerVtbl; + + interface ILgKeymanHandler + { + CONST_VTBL struct ILgKeymanHandlerVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ILgKeymanHandler_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ILgKeymanHandler_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ILgKeymanHandler_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define ILgKeymanHandler_Init(This,fForce) \ + ( (This)->lpVtbl -> Init(This,fForce) ) + +#define ILgKeymanHandler_Close(This) \ + ( (This)->lpVtbl -> Close(This) ) + +#define ILgKeymanHandler_get_ActiveKeyboardName(This,pbstrName) \ + ( (This)->lpVtbl -> get_ActiveKeyboardName(This,pbstrName) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __ILgKeymanHandler_INTERFACE_DEFINED__ */ + + #ifndef __ILgIcuConverterEnumerator_INTERFACE_DEFINED__ #define __ILgIcuConverterEnumerator_INTERFACE_DEFINED__ @@ -11121,6 +11246,14 @@ class DECLSPEC_UUID("FF22A7AB-223E-4D04-B648-0AE40588261D") LgNumericEngine; #endif +#define CLSID_LgKeymanHandler __uuidof(LgKeymanHandler) + +#ifdef __cplusplus + +class DECLSPEC_UUID("69ACA99C-F852-4C2C-9B5F-FF83238A17A5") +LgKeymanHandler; +#endif + #define CLSID_LgIcuConverterEnumerator __uuidof(LgIcuConverterEnumerator) #ifdef __cplusplus diff --git a/Lib/linux/Common/FwKernelTlb.idl b/Lib/linux/Common/FwKernelTlb.idl index d1e5dfcfe6..7e8fe25695 100644 --- a/Lib/linux/Common/FwKernelTlb.idl +++ b/Lib/linux/Common/FwKernelTlb.idl @@ -5149,6 +5149,41 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 +cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgKeymanHandler") cpp_quote(",") cpp_quote("3F42144B-509F-4def-8DD3-6D8D26677001") cpp_quote(");") [ uuid("3F42144B-509F-4def-8DD3-6D8D26677001"), object, pointer_default(unique) ] interface ILgKeymanHandler : IUnknown +{ + + + + + + + HRESULT Init( + [in] ComBool fForce); + + + + HRESULT Close(); + + + [propget] HRESULT ActiveKeyboardName( + [out, retval] BSTR * pbstrName); +}; + + + + + + + + + + + + + + + + cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgIcuConverterEnumerator") cpp_quote(",") cpp_quote("8E6D558E-8755-4EA1-9FF6-039D375312E9") cpp_quote(");") [ uuid("8E6D558E-8755-4EA1-9FF6-039D375312E9"), object, pointer_default(unique) ] interface ILgIcuConverterEnumerator : IUnknown { @@ -5413,6 +5448,10 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IRegexMatcher") cpp interface ILgNumericEngine; }; + cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("69ACA99C-F852-4C2C-9B5F-FF83238A17A5") cpp_quote(",") cpp_quote("LgKeymanHandler") cpp_quote(");") [ uuid(69ACA99C-F852-4C2C-9B5F-FF83238A17A5) ] coclass LgKeymanHandler + { + interface ILgKeymanHandler; + }; cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("9E729461-F80D-4796-BA17-086BC61907F1") cpp_quote(",") cpp_quote("LgIcuConverterEnumerator") cpp_quote(");") [ uuid(9E729461-F80D-4796-BA17-086BC61907F1) ] coclass LgIcuConverterEnumerator { interface ILgIcuConverterEnumerator; @@ -5429,7 +5468,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IRegexMatcher") cpp { interface ILgIcuLocaleEnumerator; }; -#line 1800 "d:\\fwrepo\\fw\\src\\Language\\Language.idh" +#line 1839 "d:\\fwrepo\\fw\\src\\Language\\Language.idh" #line 25 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" }; diff --git a/Lib/linux/Common/FwKernelTlb.tlb b/Lib/linux/Common/FwKernelTlb.tlb index 307b7f82b3bde2fd54bf244fbe72ac728950be3a..c919b14415ed957e36496bb0c1d0116af87dfc95 100644 GIT binary patch delta 4024 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 EA0ASJH2?qr diff --git a/Lib/linux/Common/LanguageTlb.h b/Lib/linux/Common/LanguageTlb.h index 1cf40d7cd1..0959f142b3 100644 --- a/Lib/linux/Common/LanguageTlb.h +++ b/Lib/linux/Common/LanguageTlb.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Mon Aug 26 09:34:17 2013 +/* at Mon Aug 26 13:18:09 2013 */ /* Compiler settings for d:\fwrepo\fw\Output\Common\LanguageTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 @@ -419,6 +419,12 @@ typedef interface ILgNumericEngine ILgNumericEngine; #endif /* __ILgNumericEngine_FWD_DEFINED__ */ +#ifndef __ILgKeymanHandler_FWD_DEFINED__ +#define __ILgKeymanHandler_FWD_DEFINED__ +typedef interface ILgKeymanHandler ILgKeymanHandler; +#endif /* __ILgKeymanHandler_FWD_DEFINED__ */ + + #ifndef __ILgIcuConverterEnumerator_FWD_DEFINED__ #define __ILgIcuConverterEnumerator_FWD_DEFINED__ typedef interface ILgIcuConverterEnumerator ILgIcuConverterEnumerator; @@ -545,6 +551,18 @@ typedef struct LgNumericEngine LgNumericEngine; #endif /* __LgNumericEngine_FWD_DEFINED__ */ +#ifndef __LgKeymanHandler_FWD_DEFINED__ +#define __LgKeymanHandler_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class LgKeymanHandler LgKeymanHandler; +#else +typedef struct LgKeymanHandler LgKeymanHandler; +#endif /* __cplusplus */ + +#endif /* __LgKeymanHandler_FWD_DEFINED__ */ + + #ifndef __LgIcuConverterEnumerator_FWD_DEFINED__ #define __LgIcuConverterEnumerator_FWD_DEFINED__ @@ -1488,6 +1506,11 @@ ILgWritingSystemFactory 22376578-BFEB-4c46-8D72-C9154890DD16 ); GENERIC_DECLARE_SMART_INTERFACE_PTR( +ILgKeymanHandler +, +3F42144B-509F-4def-8DD3-6D8D26677001 +); +GENERIC_DECLARE_SMART_INTERFACE_PTR( ILgIcuConverterEnumerator , 8E6D558E-8755-4EA1-9FF6-039D375312E9 @@ -1553,6 +1576,11 @@ FF22A7AB-223E-4D04-B648-0AE40588261D LgNumericEngine ); ATTACH_GUID_TO_CLASS(class, +69ACA99C-F852-4C2C-9B5F-FF83238A17A5 +, +LgKeymanHandler +); +ATTACH_GUID_TO_CLASS(class, 9E729461-F80D-4796-BA17-086BC61907F1 , LgIcuConverterEnumerator @@ -10409,6 +10437,103 @@ FwGraphiteProcess; #endif /* __ILgNumericEngine_INTERFACE_DEFINED__ */ +#ifndef __ILgKeymanHandler_INTERFACE_DEFINED__ +#define __ILgKeymanHandler_INTERFACE_DEFINED__ + +/* interface ILgKeymanHandler */ +/* [unique][object][uuid] */ + + +#define IID_ILgKeymanHandler __uuidof(ILgKeymanHandler) + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("3F42144B-509F-4def-8DD3-6D8D26677001") + ILgKeymanHandler : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Init( + /* [in] */ ComBool fForce) = 0; + + virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; + + virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ActiveKeyboardName( + /* [retval][out] */ BSTR *pbstrName) = 0; + + }; + +#else /* C style interface */ + + typedef struct ILgKeymanHandlerVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + ILgKeymanHandler * This, + /* [in] */ REFIID riid, + /* [annotation][iid_is][out] */ + __RPC__deref_out void **ppvObject); + + ULONG ( STDMETHODCALLTYPE *AddRef )( + ILgKeymanHandler * This); + + ULONG ( STDMETHODCALLTYPE *Release )( + ILgKeymanHandler * This); + + HRESULT ( STDMETHODCALLTYPE *Init )( + ILgKeymanHandler * This, + /* [in] */ ComBool fForce); + + HRESULT ( STDMETHODCALLTYPE *Close )( + ILgKeymanHandler * This); + + /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ActiveKeyboardName )( + ILgKeymanHandler * This, + /* [retval][out] */ BSTR *pbstrName); + + END_INTERFACE + } ILgKeymanHandlerVtbl; + + interface ILgKeymanHandler + { + CONST_VTBL struct ILgKeymanHandlerVtbl *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define ILgKeymanHandler_QueryInterface(This,riid,ppvObject) \ + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + +#define ILgKeymanHandler_AddRef(This) \ + ( (This)->lpVtbl -> AddRef(This) ) + +#define ILgKeymanHandler_Release(This) \ + ( (This)->lpVtbl -> Release(This) ) + + +#define ILgKeymanHandler_Init(This,fForce) \ + ( (This)->lpVtbl -> Init(This,fForce) ) + +#define ILgKeymanHandler_Close(This) \ + ( (This)->lpVtbl -> Close(This) ) + +#define ILgKeymanHandler_get_ActiveKeyboardName(This,pbstrName) \ + ( (This)->lpVtbl -> get_ActiveKeyboardName(This,pbstrName) ) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + + +#endif /* __ILgKeymanHandler_INTERFACE_DEFINED__ */ + + #ifndef __ILgIcuConverterEnumerator_INTERFACE_DEFINED__ #define __ILgIcuConverterEnumerator_INTERFACE_DEFINED__ @@ -11122,6 +11247,14 @@ class DECLSPEC_UUID("FF22A7AB-223E-4D04-B648-0AE40588261D") LgNumericEngine; #endif +#define CLSID_LgKeymanHandler __uuidof(LgKeymanHandler) + +#ifdef __cplusplus + +class DECLSPEC_UUID("69ACA99C-F852-4C2C-9B5F-FF83238A17A5") +LgKeymanHandler; +#endif + #define CLSID_LgIcuConverterEnumerator __uuidof(LgIcuConverterEnumerator) #ifdef __cplusplus diff --git a/Lib/linux/Common/LanguageTlb.idl b/Lib/linux/Common/LanguageTlb.idl index d1a7f5210e..f05a20c3e3 100644 --- a/Lib/linux/Common/LanguageTlb.idl +++ b/Lib/linux/Common/LanguageTlb.idl @@ -5158,6 +5158,41 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 +cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgKeymanHandler") cpp_quote(",") cpp_quote("3F42144B-509F-4def-8DD3-6D8D26677001") cpp_quote(");") [ uuid("3F42144B-509F-4def-8DD3-6D8D26677001"), object, pointer_default(unique) ] interface ILgKeymanHandler : IUnknown +{ + + + + + + + HRESULT Init( + [in] ComBool fForce); + + + + HRESULT Close(); + + + [propget] HRESULT ActiveKeyboardName( + [out, retval] BSTR * pbstrName); +}; + + + + + + + + + + + + + + + + cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("ILgIcuConverterEnumerator") cpp_quote(",") cpp_quote("8E6D558E-8755-4EA1-9FF6-039D375312E9") cpp_quote(");") [ uuid("8E6D558E-8755-4EA1-9FF6-039D375312E9"), object, pointer_default(unique) ] interface ILgIcuConverterEnumerator : IUnknown { @@ -5422,6 +5457,10 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IRegexMatcher") cpp interface ILgNumericEngine; }; + cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("69ACA99C-F852-4C2C-9B5F-FF83238A17A5") cpp_quote(",") cpp_quote("LgKeymanHandler") cpp_quote(");") [ uuid(69ACA99C-F852-4C2C-9B5F-FF83238A17A5) ] coclass LgKeymanHandler + { + interface ILgKeymanHandler; + }; cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("9E729461-F80D-4796-BA17-086BC61907F1") cpp_quote(",") cpp_quote("LgIcuConverterEnumerator") cpp_quote(");") [ uuid(9E729461-F80D-4796-BA17-086BC61907F1) ] coclass LgIcuConverterEnumerator { interface ILgIcuConverterEnumerator; @@ -5438,7 +5477,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IRegexMatcher") cpp { interface ILgIcuLocaleEnumerator; }; -#line 1800 "d:\\fwrepo\\fw\\src\\language\\Language.idh" +#line 1839 "d:\\fwrepo\\fw\\src\\language\\Language.idh" #line 34 "d:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" }; diff --git a/Lib/linux/Common/LanguageTlb.tlb b/Lib/linux/Common/LanguageTlb.tlb index 6828b35cf53547630ab537b82f90529edaa4cec2..48339f7ef1466e38d362fe1dad6466fece3335a8 100644 GIT binary patch delta 4044 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 J2*)iP{|7e5kw5?d diff --git a/Lib/linux/Common/ViewsTlb.h b/Lib/linux/Common/ViewsTlb.h index 45d4186e59..8b9acaef75 100644 --- a/Lib/linux/Common/ViewsTlb.h +++ b/Lib/linux/Common/ViewsTlb.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Mon Aug 26 09:34:19 2013 +/* at Mon Aug 26 13:18:11 2013 */ /* Compiler settings for d:\fwrepo\fw\Output\Common\ViewsTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 diff --git a/Lib/linux/Common/ViewsTlb.tlb b/Lib/linux/Common/ViewsTlb.tlb index cc4db2acbf1418546b69e25840d0598190448be4..f025abc5890d463477af55d147796f2a6d44bda2 100644 GIT binary patch delta 33 pcmeB}z}hi^b%WeWAwy#;LklZILj@xPLt`#shGNUj1}ksO0|2IE3K#$Y delta 33 pcmeB}z}hi^b%WeWAp=V*V-qVwO9dkXLt`#shTklk4OZTm2LP$33U&Yh diff --git a/Lib/linux/Common/idhfiles.MD5 b/Lib/linux/Common/idhfiles.MD5 index 72f133ed78..f1bd02def2 100644 --- a/Lib/linux/Common/idhfiles.MD5 +++ b/Lib/linux/Common/idhfiles.MD5 @@ -1 +1 @@ -9d206b6199ab8159212c752102d25684 \ No newline at end of file +d2bce991e392bd6fa9079452c1831cf5 \ No newline at end of file diff --git a/Lib/linux/Debug/ibusdotnet.dll b/Lib/linux/Debug/ibusdotnet.dll deleted file mode 100755 index 2e61791681c81f85432c0e52ff0d522432b3d0c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20992 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 O6+8BSUw?Hq@P7bu_e$UZ diff --git a/Lib/linux/Release/ibusdotnet.dll b/Lib/linux/Release/ibusdotnet.dll index a4bfd676d07c6f309f312551fe5e2d98e87d54bd..2520da84bbdfd9177d556b8a3f950fd129e8b769 100755 GIT binary patch delta 832 zcmXZXTS$~a6bJA#b7t4|w%=YNm)4bFy`dCjQdmBiN`@;2N){p5YT!dROrs!e*EBPb zMf;Kv5d@>cm$Hwf9^HfEQX1Ij!}Q zbDB;l51AF zXhtKh!P8i>U2*L;R?{})LJ_qW{)ikBc+%P~e?b7~5pjqPIZvV-ghJIX#`$Jq&|n_f-w`7QgN z{mg!6H`p`Q3}u7UAdUX)b|J^=3{TF()P(prWw*OpUEvvH`sjvm0`^aBt}RE)##e56 iYZnS5hO@F*==Sm(=95VIKM|h?`Lqh)pwVA(4*vtUN4=#0 delta 828 zcmXZXT}TvB6bJBg@42(PV(rZCN^Py{L#w-@6sS>21*W3nhLMs%NVp{g6)l?vKB&8* ziBgI-8mT=9RzeRd4M<2xVTFAN1)&vDhKW%|4;Fnvb?2-M{O11e`Okrg4YAk|>uwj9 zKV3c8bMYIS(VN*l&YNun|~#Z9NlC**VTE|~W(>HLmdB3H;& z@&F{|%Tk1yRTr)El0Gtn+)nNxOUQCEBo%PRxyeX#)h4h*dVjL#cn!`$L#q5cXtNzw zPvShZ#uL=2E|`bjcyha;Ue2DbHAmDazJeE&TI8%(rj@nXoH~H7Aw4a=b5R}8H+ma$ zM{oi1{N`P=>`&r*sG{U>ciB^L5ww6g>w%DVPo{-*GwINw&FQn=e#Z0@DIu>SmZ2`w zoV3XuHTV(6f;={1&8epsUy#5VZD0#f8VrHQ1A^pHL>lg#0JWoI`p7X?tjBcc$3 z{EBFmUKjVJW8wpu%7XlkKrG-7g-_~G_9+!SO9_$JHU#+>A>2X!+bs&^%c}S>8*?!a z%Ww!E;T!y=*9L~8RR|DO!_o>%t8}wADy?^{69A258+nNwB!|hH False - ..\..\..\..\Output\Debug\Palaso.dll + ..\..\..\..\Downloads\Palaso.dll False - ..\..\..\..\Output\Debug\Palaso.Media.dll + ..\..\..\..\Downloads\Palaso.Media.dll False diff --git a/Src/Common/Controls/XMLViews/XMLViewsTests/XMLViewsTests.csproj b/Src/Common/Controls/XMLViews/XMLViewsTests/XMLViewsTests.csproj index e845e8ca36..9d846c768b 100644 --- a/Src/Common/Controls/XMLViews/XMLViewsTests/XMLViewsTests.csproj +++ b/Src/Common/Controls/XMLViews/XMLViewsTests/XMLViewsTests.csproj @@ -198,12 +198,6 @@ - - ..\..\..\..\..\Output\Debug\Keyboarding.dll - - - ..\..\..\..\..\Output\Debug\KeyboardingTests.dll - @@ -236,12 +230,8 @@ - - UserControl - - - UserControl - + + @@ -283,4 +273,4 @@ - + \ No newline at end of file diff --git a/Src/Common/Controls/XMLViews/XMLViewsTests/XmlBrowseViewBaseTests.cs b/Src/Common/Controls/XMLViews/XMLViewsTests/XmlBrowseViewBaseTests.cs index 6de60dc27e..58f6963d81 100644 --- a/Src/Common/Controls/XMLViews/XMLViewsTests/XmlBrowseViewBaseTests.cs +++ b/Src/Common/Controls/XMLViews/XMLViewsTests/XmlBrowseViewBaseTests.cs @@ -470,12 +470,6 @@ public void DrawRoot2(IVwGraphics _vg, Rect rcSrc, Rect rcDst, bool fDrawSel, in throw new NotImplementedException(); } - ///

- public void SetKeyboardForWs(ILgWritingSystem _ws, ref string _bstrActiveKeymanKbd, ref int _nActiveLangId, ref int _hklActive, ref bool _fSelectLangPending) - { - throw new NotImplementedException(); - } - /// public bool DoSpellCheckStep() { diff --git a/Src/Common/CoreImpl/CoreImpl.csproj b/Src/Common/CoreImpl/CoreImpl.csproj index 3f05456d23..cd51efad72 100644 --- a/Src/Common/CoreImpl/CoreImpl.csproj +++ b/Src/Common/CoreImpl/CoreImpl.csproj @@ -112,6 +112,7 @@ + @@ -182,4 +183,4 @@ ../../../DistFiles - + \ No newline at end of file diff --git a/Src/Common/CoreImpl/GlobalFileWritingSystemStore.cs b/Src/Common/CoreImpl/GlobalFileWritingSystemStore.cs index 4cf9a2dae7..914349f7ea 100644 --- a/Src/Common/CoreImpl/GlobalFileWritingSystemStore.cs +++ b/Src/Common/CoreImpl/GlobalFileWritingSystemStore.cs @@ -42,7 +42,7 @@ public GlobalFileWritingSystemStore(string path) /// an already-existing writing system. Set should be called when there is a change /// that updates the RFC5646 information. /// - public void Set(WritingSystemDefinition ws) + public void Set(IWritingSystemDefinition ws) { m_mutex.WaitOne(); MemoryStream oldData = null; @@ -87,7 +87,7 @@ public void Set(WritingSystemDefinition ws) // configuration of the package which allows group access. using (new FileModeOverride()) { - adaptor.Write(writingSystemFilePath, ws, oldData); + adaptor.Write(writingSystemFilePath, (WritingSystemDefinition)ws, oldData); } } catch (UnauthorizedAccessException) @@ -110,7 +110,7 @@ public void Set(WritingSystemDefinition ws) /// /// Returns true if a call to Set should succeed, false if a call to Set would throw /// - public bool CanSet(WritingSystemDefinition ws) + public bool CanSet(IWritingSystemDefinition ws) { return true; } @@ -118,7 +118,7 @@ public bool CanSet(WritingSystemDefinition ws) /// /// Gets the writing system object for the given Store ID /// - public WritingSystemDefinition Get(string identifier) + public IWritingSystemDefinition Get(string identifier) { m_mutex.WaitOne(); try @@ -138,7 +138,7 @@ public WritingSystemDefinition Get(string identifier) /// If the given writing system were passed to Set, this function returns the /// new StoreID that would be assigned. /// - public string GetNewStoreIDWhenSet(WritingSystemDefinition ws) + public string GetNewStoreIDWhenSet(IWritingSystemDefinition ws) { if (ws == null) throw new ArgumentNullException("ws"); @@ -182,6 +182,20 @@ public IEnumerable FilterForTextIds(IEnumerable idsToFilter) return TextWritingSystems.Where(ws => idsToFilter.Contains(ws.Id)).Select(ws => ws.Id); } + /// + /// Only needed in local store + /// + /// + /// + /// + /// + /// + public IWritingSystemDefinition GetWsForInputLanguage(string layoutName, CultureInfo cultureInfo, + IWritingSystemDefinition wsCurrent, IWritingSystemDefinition[] candidates) + { + throw new NotImplementedException(); + } + /// /// Gives the total number of writing systems in the store /// @@ -205,7 +219,7 @@ public int Count /// Creates a new writing system object and returns it. Set will need to be called /// once identifying information has been changed in order to save it in the store. ///
- public WritingSystemDefinition CreateNew() + public IWritingSystemDefinition CreateNew() { return new PalasoWritingSystem(); } @@ -241,7 +255,7 @@ public void Remove(string identifier) /// /// Returns a list of all writing system definitions in the store. /// - public IEnumerable AllWritingSystems + public IEnumerable AllWritingSystems { get { @@ -260,7 +274,7 @@ public IEnumerable AllWritingSystems /// /// Added to satisfy definition of IWritingSystemRepository...implementation adapted from WritingSystemRepositoryBase /// - public IEnumerable TextWritingSystems + public IEnumerable TextWritingSystems { get { return AllWritingSystems.Where(ws => !ws.IsVoice); } } @@ -268,7 +282,7 @@ public IEnumerable TextWritingSystems /// /// Added to satisfy definition of IWritingSystemRepository...implementation adapted from WritingSystemRepositoryBase /// - public IEnumerable VoiceWritingSystems + public IEnumerable VoiceWritingSystems { get { return AllWritingSystems.Where(ws => ws.IsVoice); } } @@ -290,7 +304,7 @@ public IEnumerable VoiceWritingSystems /// /// Returns a list of all writing system definitions in the store. (Obsolete) /// - public IEnumerable WritingSystemDefinitions + public IEnumerable WritingSystemDefinitions { get { return AllWritingSystems; } } @@ -300,7 +314,7 @@ public IEnumerable WritingSystemDefinitions /// to be called with this new duplicate once identifying information has been changed /// in order to place the new definition in the store. ///
- public WritingSystemDefinition MakeDuplicate(WritingSystemDefinition definition) + public IWritingSystemDefinition MakeDuplicate(IWritingSystemDefinition definition) { return definition.Clone(); } @@ -354,7 +368,7 @@ public bool CanSave(WritingSystemDefinition ws, out string path) /// Returns a list of writing systems from rhs which are newer than ones in the store. ///
// TODO: Maybe this should be IEnumerable .... which returns the identifiers. - public IEnumerable WritingSystemsNewerIn(IEnumerable rhs) + public IEnumerable WritingSystemsNewerIn(IEnumerable rhs) { throw new NotImplementedException(); } @@ -362,7 +376,7 @@ public IEnumerable WritingSystemsNewerIn(IEnumerable /// Added to satisfy definition of IWritingSystemRepository...do we need to do anything? ///
- public void OnWritingSystemIDChange(WritingSystemDefinition ws, string oldId) + public void OnWritingSystemIDChange(IWritingSystemDefinition ws, string oldId) { } @@ -372,7 +386,7 @@ public void OnWritingSystemIDChange(WritingSystemDefinition ws, string oldId) /// The identifier. /// The writing system. /// - public bool TryGet(string identifier, out WritingSystemDefinition ws) + public bool TryGet(string identifier, out IWritingSystemDefinition ws) { m_mutex.WaitOne(); try @@ -392,11 +406,11 @@ public bool TryGet(string identifier, out WritingSystemDefinition ws) } } - private WritingSystemDefinition GetFromFilePath(string filePath) + private IWritingSystemDefinition GetFromFilePath(string filePath) { try { - WritingSystemDefinition ws = CreateNew(); + var ws = (WritingSystemDefinition)CreateNew(); var adaptor = new FwLdmlAdaptor(); adaptor.Read(filePath, ws); ws.StoreID = ((PalasoWritingSystem)ws).RFC5646; @@ -409,7 +423,7 @@ private WritingSystemDefinition GetFromFilePath(string filePath) } } - private string GetFilePath(WritingSystemDefinition ws) + private string GetFilePath(IWritingSystemDefinition ws) { return Path.Combine(m_path, GetFileName(ws)); } @@ -419,7 +433,7 @@ private string GetFilePath(string identifier) return Path.Combine(m_path, GetFileName(identifier)); } - private static string GetFileName(WritingSystemDefinition ws) + private static string GetFileName(IWritingSystemDefinition ws) { if (string.IsNullOrEmpty(ws.Language)) return ""; @@ -440,5 +454,10 @@ public WritingSystemCompatibility CompatibilityMode { get { return WritingSystemCompatibility.Strict; } } + + /// + /// Only used in local store. + /// + public string LocalKeyboardSettings { get; set; } } } diff --git a/Src/Common/CoreImpl/KeyboardHelper.cs b/Src/Common/CoreImpl/KeyboardHelper.cs new file mode 100644 index 0000000000..f9ff7b0e05 --- /dev/null +++ b/Src/Common/CoreImpl/KeyboardHelper.cs @@ -0,0 +1,164 @@ +// -------------------------------------------------------------------------------------------- +#region // Copyright (c) 2009, SIL International. All Rights Reserved. +// +// Copyright (c) 2009, SIL International. All Rights Reserved. +// +#endregion +// +// File: KeyboardHelper.cs +// Responsibility: TE Team +// +// +// Implementation of KeyboardHelper. The class contains static methods for switching keyboards. +// +// -------------------------------------------------------------------------------------------- +#define DEBUGGINGDISPOSE +using System; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using SIL.FieldWorks.Common.COMInterfaces; +using SIL.Utils; + +namespace SIL.CoreImpl +{ + /// ---------------------------------------------------------------------------------------- + /// + /// This is an almost-obsolete class with one function left. There is still one place where + /// we need to know a Keyman keyboard is active. + /// + /// ---------------------------------------------------------------------------------------- + public static class KeyboardHelper + { + #region Implementation of KeyboardHelper + /// + /// Keyboard helper implementation. We provide a separate non-static implementation so + /// that we can explicitly dispose of it when running tests. + /// + private sealed class KeyboardHelperImpl: IDisposable + { + private readonly ILgKeymanHandler m_keymanHandler; + + #region Constructor + + public KeyboardHelperImpl() + { + m_keymanHandler = LgKeymanHandlerClass.Create(); + } + + #endregion + + #region Disposable stuff +#if DEBUGGINGDISPOSE + // NOTE: KeyboardHelperImpl is implemented as a singleton. It is usually ok that + // this finalizer is called in production code. However, in tests we might get + // hangs if we don't properly dispose. Ideally we would also dispose in production + // code, but for now we're doing it the pragmatic way... + // This finalizer is here only for tracking down dispose issues in tests. It will + // cause the "Missing Dispose()" message to be written out. + // If you're running the application and getting this message you should comment + // the #define DEBUGGINGDISPOSE above. + ~KeyboardHelperImpl() + { + Dispose(false); + } +#endif + + /// + public bool IsDisposed { get; private set; } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + private void Dispose(bool fDisposing) + { + // If you get this message see note above ~KeyboardHelperImpl + System.Diagnostics.Debug.WriteLineIf(!fDisposing, "****** Missing Dispose() call for " + GetType() + ". ****** "); + if (fDisposing && !IsDisposed) + { + // dispose managed and unmanaged objects + if (m_keymanHandler != null) + m_keymanHandler.Close(); + } + if (m_keymanHandler != null && Marshal.IsComObject(m_keymanHandler)) + Marshal.ReleaseComObject(m_keymanHandler); + IsDisposed = true; + } + #endregion + + /// ------------------------------------------------------------------------------------ + /// + /// Gets the active Keyman keyboard or an empty string if there is no active Keyman + /// keyboard + /// + /// ------------------------------------------------------------------------------------ + public string ActiveKeymanKeyboard + { + get + { + if (MiscUtils.IsUnix) + return ""; + string sKeymanKbd = m_keymanHandler.ActiveKeyboardName; + + // This constant '(None)' can not be localized until the C++ version is localized. + // Even then they should use the same resource. + if (sKeymanKbd == null || sKeymanKbd == "(None)") + sKeymanKbd = string.Empty; + return sKeymanKbd; + } + } + } + #endregion + + #region Member variables + private static KeyboardHelperImpl s_keyboardHelper; + private static readonly object s_syncRoot = new object(); + #endregion + + private static KeyboardHelperImpl KeyboardHelperObject + { + get + { + if (s_keyboardHelper == null) + { + lock (s_syncRoot) + { + if (s_keyboardHelper == null) + s_keyboardHelper = new KeyboardHelperImpl(); + } + } + return s_keyboardHelper; + } + } + + /// + /// Release the KeyboardHelper singleton object + /// + public static void Release() + { + lock (s_syncRoot) + { + if (s_keyboardHelper != null) + { + s_keyboardHelper.Dispose(); + s_keyboardHelper = null; + } + } + } + + /// ------------------------------------------------------------------------------------ + /// + /// Gets the active Keyman keyboard or an empty string if there is no active Keyman + /// keyboard + /// + /// ------------------------------------------------------------------------------------ + public static string ActiveKeymanKeyboard + { + get { return KeyboardHelperObject.ActiveKeymanKeyboard; } + } + } +} diff --git a/Src/Common/CoreImpl/LocalFileWritingSystemStore.cs b/Src/Common/CoreImpl/LocalFileWritingSystemStore.cs index b661c8189d..bc4443d620 100644 --- a/Src/Common/CoreImpl/LocalFileWritingSystemStore.cs +++ b/Src/Common/CoreImpl/LocalFileWritingSystemStore.cs @@ -39,7 +39,7 @@ public LocalFileWritingSystemStore(string path, IFwWritingSystemStore globalStor /// Creates a new writing system definition. /// /// - public override WritingSystemDefinition CreateNew() + public override IWritingSystemDefinition CreateNew() { return new PalasoWritingSystem(); } @@ -95,7 +95,7 @@ public override void Save() /// The identifier. /// The writing system. /// - public bool TryGet(string identifier, out WritingSystemDefinition ws) + public bool TryGet(string identifier, out IWritingSystemDefinition ws) { if (Contains(identifier)) { @@ -168,13 +168,13 @@ public bool CanSave(WritingSystemDefinition ws, out string filePath) /// /// /// The ws. - protected override void OnChangeNotifySharedStore(WritingSystemDefinition ws) + protected override void OnChangeNotifySharedStore(IWritingSystemDefinition ws) { base.OnChangeNotifySharedStore(ws); if (m_globalStore != null) { - WritingSystemDefinition globalWs; + IWritingSystemDefinition globalWs; if (m_globalStore.TryGet(ws.Id, out globalWs)) { if (ws.DateModified > globalWs.DateModified) diff --git a/Src/Common/CoreImpl/PalasoWritingSystem.cs b/Src/Common/CoreImpl/PalasoWritingSystem.cs index 8eff8d72bc..a23560464a 100644 --- a/Src/Common/CoreImpl/PalasoWritingSystem.cs +++ b/Src/Common/CoreImpl/PalasoWritingSystem.cs @@ -1152,6 +1152,9 @@ public void Copy(IWritingSystem source) defFontFeats = pws.DefaultFontFeatures; defFont = pws.DefaultFontName; keyboard = pws.Keyboard; + // This will put the keyboard actually selected into the permanent WS's list. + // We don't need to remember any others that got temporarily added to KnownKeyboards for testing. + LocalKeyboard = pws.LocalKeyboard; // IWritingSystem properties abbr = pws.Abbreviation; diff --git a/Src/Common/CoreImpl/PalasoWritingSystemManager.cs b/Src/Common/CoreImpl/PalasoWritingSystemManager.cs index e3b4a56c67..0116b78f5f 100644 --- a/Src/Common/CoreImpl/PalasoWritingSystemManager.cs +++ b/Src/Common/CoreImpl/PalasoWritingSystemManager.cs @@ -10,6 +10,7 @@ using System.Xml; using System.Collections.Generic; using Palaso.WritingSystems; +using SIL.CoreImpl.Properties; using SIL.FieldWorks.Common.COMInterfaces; using SIL.Utils; @@ -255,7 +256,7 @@ public IWritingSystem Create(string identifier) { if (m_globalStore != null) { - WritingSystemDefinition globalWs; + IWritingSystemDefinition globalWs; if (m_globalStore.TryGet(identifier, out globalWs)) return (PalasoWritingSystem) m_globalStore.MakeDuplicate(globalWs); } @@ -413,7 +414,7 @@ public IWritingSystem Get(string identifier) { lock (m_syncRoot) { - WritingSystemDefinition wrsys; + IWritingSystemDefinition wrsys; if (!m_localStore.TryGet(identifier, out wrsys)) { if (identifier.StartsWith("cmn")) @@ -667,6 +668,8 @@ public void Save() } } m_localStore.Save(); + Settings.Default.LocalKeyboards = m_localStore.LocalKeyboardSettings; + Settings.Default.Save(); } } @@ -928,7 +931,7 @@ public interface IFwWritingSystemStore : IWritingSystemRepository /// The identifier. /// The writing system. /// - bool TryGet(string identifier, out WritingSystemDefinition ws); + bool TryGet(string identifier, out IWritingSystemDefinition ws); /// /// True if it is capable of saving changes to the specified WS. @@ -955,7 +958,7 @@ public MemoryWritingSystemStore() : /// Creates a new writing system definition. /// /// - public override WritingSystemDefinition CreateNew() + public override IWritingSystemDefinition CreateNew() { return new PalasoWritingSystem(); } @@ -999,7 +1002,7 @@ where ws.MarkedForDeletion foreach (string id in idsToRemove) Remove(id); - List allDefs = (from ws in AllWritingSystems + var allDefs = (from ws in AllWritingSystems where CanSet(ws) select ws).ToList(); foreach (WritingSystemDefinition ws in allDefs) @@ -1025,7 +1028,7 @@ public bool CanSave(WritingSystemDefinition ws, out string path) /// The identifier. /// The writing system. /// - public bool TryGet(string identifier, out WritingSystemDefinition ws) + public bool TryGet(string identifier, out IWritingSystemDefinition ws) { if (Contains(identifier)) { @@ -1060,7 +1063,7 @@ public LocalMemoryWritingSystemStore(IFwWritingSystemStore globalStore) /// /// /// The ws. - protected override void OnChangeNotifySharedStore(WritingSystemDefinition ws) + protected override void OnChangeNotifySharedStore(IWritingSystemDefinition ws) { base.OnChangeNotifySharedStore(ws); diff --git a/Src/Common/CoreImpl/Properties/Settings.Designer.cs b/Src/Common/CoreImpl/Properties/Settings.Designer.cs index 426f9a82d8..5c5314446f 100644 --- a/Src/Common/CoreImpl/Properties/Settings.Designer.cs +++ b/Src/Common/CoreImpl/Properties/Settings.Designer.cs @@ -96,5 +96,20 @@ public bool IsBTE { this["IsBTE"] = value; } } - } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string LocalKeyboards + { + get + { + return ((string)(this["LocalKeyboards"])); + } + set + { + this["LocalKeyboards"] = value; + } + } + } } diff --git a/Src/Common/CoreImpl/Properties/Settings.settings b/Src/Common/CoreImpl/Properties/Settings.settings index d021604b32..2e2898c949 100644 --- a/Src/Common/CoreImpl/Properties/Settings.settings +++ b/Src/Common/CoreImpl/Properties/Settings.settings @@ -17,5 +17,8 @@ True + + + - + \ No newline at end of file diff --git a/Src/Common/CoreImpl/app.config b/Src/Common/CoreImpl/app.config index da08ee1cc6..59d6d4736e 100644 --- a/Src/Common/CoreImpl/app.config +++ b/Src/Common/CoreImpl/app.config @@ -19,6 +19,9 @@ True + + + diff --git a/Src/Common/FieldWorks/FieldWorks.cs b/Src/Common/FieldWorks/FieldWorks.cs index 49b0fc7c7d..6d51f49adf 100644 --- a/Src/Common/FieldWorks/FieldWorks.cs +++ b/Src/Common/FieldWorks/FieldWorks.cs @@ -32,6 +32,7 @@ using System.Windows.Forms; using Microsoft.Win32; using Palaso.Reporting; +using Palaso.UI.WindowsForms.Keyboarding; using SIL.FieldWorks.Common.COMInterfaces; using SIL.FieldWorks.Common.Controls; using SIL.FieldWorks.Common.Framework; @@ -232,6 +233,9 @@ static int Main(string[] rgArgs) // initialize ICU Icu.InitIcuDataDir(); + // initialize Palaso keyboarding + KeyboardController.Initialize(); + FwAppArgs appArgs = new FwAppArgs(rgArgs); s_noUserInterface = appArgs.NoUserInterface; s_appServerMode = appArgs.AppServerMode; diff --git a/Src/Common/FieldWorks/FieldWorks.csproj b/Src/Common/FieldWorks/FieldWorks.csproj index cb09c4a0e8..65ae5049c2 100644 --- a/Src/Common/FieldWorks/FieldWorks.csproj +++ b/Src/Common/FieldWorks/FieldWorks.csproj @@ -1,4 +1,4 @@ - + Debug @@ -123,6 +123,10 @@ False ..\..\..\Downloads\Palaso.dll + + False + ..\..\..\Downloads\PalasoUIWindowsForms.dll + False ..\..\..\DistFiles\PaToFdoInterfaces.dll @@ -176,10 +180,10 @@ \usr\lib\cli\geckofx-14.0.1\geckofx-core-14.dll - + \usr\lib\cli\geckofx-14.0.1\Geckofx-Winforms-14.dll - + PreserveNewest @@ -313,4 +317,4 @@ --> - + \ No newline at end of file diff --git a/Src/Common/Framework/Framework.csproj b/Src/Common/Framework/Framework.csproj index 85f3846540..1bd34cd8b7 100644 --- a/Src/Common/Framework/Framework.csproj +++ b/Src/Common/Framework/Framework.csproj @@ -146,10 +146,6 @@ ..\..\..\Bin\Interop.IWshRuntimeLibrary.dll False - - False - ..\..\..\Output\Debug\Keyboarding.dll - False ..\..\..\DistFiles\Microsoft.Practices.ServiceLocation.dll @@ -157,6 +153,10 @@ False + + False + ..\..\..\Downloads\Palaso.dll + ..\..\..\Output\Debug\Reporting.dll False @@ -244,9 +244,7 @@ Code - - UserControl - + diff --git a/Src/Common/Framework/FwMainWnd.cs b/Src/Common/Framework/FwMainWnd.cs index e75756280e..d436194b8e 100644 --- a/Src/Common/Framework/FwMainWnd.cs +++ b/Src/Common/Framework/FwMainWnd.cs @@ -19,6 +19,7 @@ using System.Linq; using System.Windows.Forms; using Microsoft.Win32; +using Palaso.WritingSystems; using SIL.CoreImpl; using SIL.FieldWorks.Common.COMInterfaces; using SIL.FieldWorks.Common.Controls; @@ -32,7 +33,6 @@ using SIL.FieldWorks.Resources; using SIL.Utils; using XCore; -using SIL.FieldWorks.Common.Keyboarding; namespace SIL.FieldWorks.Common.Framework { @@ -2826,8 +2826,8 @@ protected virtual bool OnFileProjectProperties(object args) // so we manually switch to the default keyboard here so that the Project Properties // dialog displays the default keyboard. When we're all done we switch back to the // keyboard we had recently. (TE-4683) - var keyboard = KeyboardController.ActiveKeyboard; - + var oldWsd = Keyboard.Controller.ActiveKeyboard; + Keyboard.Controller.ActivateDefaultKeyboard(); // Disable windows on cache to prevent painting when fonts for writing system are changed m_app.EnableMainWindows(false); bool fDbRenamed = false; @@ -2879,7 +2879,8 @@ protected virtual bool OnFileProjectProperties(object args) if (!IsDisposed) { // Restore the previous keyboard - KeyboardController.SetKeyboard(keyboard); + if (oldWsd != null) + oldWsd.Activate(); } } } diff --git a/Src/Common/KeyboardSwitcher/AssemblyInfo.cs b/Src/Common/KeyboardSwitcher/AssemblyInfo.cs deleted file mode 100644 index 53dc64e4fc..0000000000 --- a/Src/Common/KeyboardSwitcher/AssemblyInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -// -------------------------------------------------------------------------------------------- -#region // Copyright © 2002, SIL International. All Rights Reserved. -// -// Copyright © 2002, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -#endregion -// -------------------------------------------------------------------------------------------- -using System.Reflection; -using System.Runtime.CompilerServices; - -[assembly: AssemblyTitle("KeyboardSwitcher")] - -[assembly: System.Runtime.InteropServices.ComVisible(false)] -[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("KeyboardSwitcherTests")] diff --git a/Src/Common/KeyboardSwitcher/BuildInclude.targets b/Src/Common/KeyboardSwitcher/BuildInclude.targets deleted file mode 100644 index 640e792b9e..0000000000 --- a/Src/Common/KeyboardSwitcher/BuildInclude.targets +++ /dev/null @@ -1,20 +0,0 @@ - - - - - ../../../Lib/linux/$(Configuration) - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Src/Common/KeyboardSwitcher/GlobalCachedInputContext.cs b/Src/Common/KeyboardSwitcher/GlobalCachedInputContext.cs deleted file mode 100644 index f093224d36..0000000000 --- a/Src/Common/KeyboardSwitcher/GlobalCachedInputContext.cs +++ /dev/null @@ -1,35 +0,0 @@ -#if __MonoCS__ -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using SIL.FieldWorks.Common.COMInterfaces; -using IBusDotNet; -using NDesk.DBus; - -namespace SIL.FieldWorks.Views -{ - /// - /// a global cache used only to reduce traffic with ibus via dbus. - /// - public static class GlobalCachedInputContext - { - /// - /// Caches the current InputContext. - /// - public static InputContext InputContext { get; set; } - /// - /// Cache the keyboard name of the InputContext. - /// - public static string KeyboardName { get; set; } - - /// - /// Clear the cached InputContext details. - /// - public static void Clear() - { - KeyboardName = String.Empty; - InputContext = null; - } - } -} -#endif \ No newline at end of file diff --git a/Src/Common/KeyboardSwitcher/KeyboardSwitcher.cs b/Src/Common/KeyboardSwitcher/KeyboardSwitcher.cs deleted file mode 100644 index ca327f7ce0..0000000000 --- a/Src/Common/KeyboardSwitcher/KeyboardSwitcher.cs +++ /dev/null @@ -1,152 +0,0 @@ -#if __MonoCS__ -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using IBusDotNet; -using SIL.FieldWorks.Common.COMInterfaces; -using SIL.FieldWorks.Resources; - -namespace SIL.FieldWorks.Views -{ - /// - /// This class allows COM clients to switch IME keyboards - /// - [Guid("4ED1E8bC-DAdE-11DE-B350-0019DBf4566E")] - public class KeyboardSwitcher : IDisposable - { - private IBusConnection Connection = IBusConnectionFactory.Create(); - - #region IDisposable implementation -#if DEBUG - ~KeyboardSwitcher() - { - Dispose(false); - } -#endif - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool fDisposing) - { - System.Diagnostics.Debug.WriteLineIf(!fDisposing, "****** Missing Dispose() call for " + GetType().Name + ". ****** "); - if (fDisposing) - { - if (Connection != null) - Connection.Dispose(); - } - Connection = null; - } - #endregion - - #region IIMEKeyboardSwitcher implementation - - /// - /// get/set the keyboard of the current focused inputContext - /// get returns String.Empty if not connected to ibus - /// - public string IMEKeyboard - { - get - { - if (Connection == null || GlobalCachedInputContext.InputContext == null) - return String.Empty; - - InputContext context = GlobalCachedInputContext.InputContext; - - object engine = context.GetEngine(); - IBusEngineDesc engineDesc = IBusEngineDesc.GetEngineDesc(engine); - return engineDesc.LongName; - } - - set - { - try - { - if (Connection == null || GlobalCachedInputContext.InputContext == null) - return; - - // check our cached value - if (GlobalCachedInputContext.KeyboardName == value) - return; - - InputContext context = GlobalCachedInputContext.InputContext; - - if (String.IsNullOrEmpty(value) || value == ResourceHelper.GetResourceString("kstidKeyboardNone")) - { - context.Reset(); - GlobalCachedInputContext.KeyboardName = value; - context.Disable(); - return; - } - - var ibusWrapper = new IBusDotNet.InputBusWrapper(Connection); - object[] engines = ibusWrapper.InputBus.ListActiveEngines(); - - foreach (object engine in engines) - { - IBusEngineDesc engineDesc = IBusEngineDesc.GetEngineDesc(engine); - if (value == FormatKeyboardIdentifier(engineDesc)) - { - context.SetEngine(engineDesc.LongName); - break; - } - } - - GlobalCachedInputContext.KeyboardName = value; - } - catch (Exception e) - { - Debug.WriteLine(String.Format("KeyboardSwitcher changing keyboard failed, is kfml/ibus running? {0}", e)); - } - } - } - - /// Get Ibus keyboard at given index - public string GetKeyboardName(int index) - { - if (Connection == null) - return String.Empty; - var ibusWrapper = new IBusDotNet.InputBusWrapper(Connection); - object[] engines = ibusWrapper.InputBus.ListActiveEngines(); - IBusEngineDesc engineDesc = IBusEngineDesc.GetEngineDesc(engines[index]); - - return FormatKeyboardIdentifier(engineDesc); - } - - /// - /// Produce IBus keyboard identifier which is simular to the actual ibus switcher menu. - /// - internal string FormatKeyboardIdentifier(IBusEngineDesc engineDesc) - { - string id = engineDesc.Language; - string languageName = string.IsNullOrEmpty(id) ? ResourceHelper.GetResourceString("kstidOtherLanguage") : Icu.GetDisplayName(id); - return String.Format("{0} - {1}", languageName, engineDesc.Name); - } - - /// number of ibus keyboards - public int IMEKeyboardsCount - { - get - { - if (Connection == null) - return 0; - - var ibusWrapper = new IBusDotNet.InputBusWrapper(Connection); - object[] engines = ibusWrapper.InputBus.ListActiveEngines(); - return engines.Length; - } - } - - /// - public void Close() - { - Dispose(); - } - #endregion - } -} -#endif diff --git a/Src/Common/KeyboardSwitcher/KeyboardSwitcher.csproj b/Src/Common/KeyboardSwitcher/KeyboardSwitcher.csproj deleted file mode 100644 index 586a337b0b..0000000000 --- a/Src/Common/KeyboardSwitcher/KeyboardSwitcher.csproj +++ /dev/null @@ -1,118 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {21FC0FD4-E1FD-434F-A954-D10A5E9EEFE5} - Library - KeyboardSwitcher - - - 3.5 - - - false - KeyboardSwitcher - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - True - full - False - 168,169,219,414,649,1635,1702,1701 - ..\..\..\Output\Debug - DEBUG - prompt - 4 - AllRules.ruleset - x86 - - - none - False - 168,169,219,414,649,1635,1702,1701 - ..\..\..\Output\Release - prompt - 4 - AllRules.ruleset - x86 - - - - - - CommonAssemblyInfo.cs - - - - - - - - - - ..\..\..\Output\Debug\NDesk.DBus.dll - - - ..\..\..\Output\Debug\FwResources.dll - - - ..\..\..\Output\Debug\ibusdotnet.dll - - - ..\..\..\Output\Debug\BasicUtils.dll - - - ..\..\..\Output\Debug\COMInterfaces.dll - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - - - false - - - False - - - false - - - False - - - false - - - False - .NET Framework 3.5 SP1 - false - - - - - - - diff --git a/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/IBusDotNetTests.cs b/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/IBusDotNetTests.cs deleted file mode 100644 index 3b61674db5..0000000000 --- a/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/IBusDotNetTests.cs +++ /dev/null @@ -1,62 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -#if __MonoCS__ -using System; -using NUnit.Framework; -using IBusDotNet; - -namespace KeyboardSwitcherTests -{ - /// - /// Tests for ibusdotnet. These tests really belong to ibusdotnet, but they are here so that - /// we run them regularly in order to identify problems with updated ibus libraries (which - /// might change the API) - /// - [TestFixture] - public class IBusDotNetTests // can't derive from BaseTest because of circular dependency - { - private IBusConnection Connection; - - /// - /// Close connection to ibus - /// - [TearDown] - public void TearDown() - { - if (Connection != null) - Connection.Dispose(); - Connection = null; - } - - /// - /// Tests that we can get the ibus engine. This will fail if the ibus API changed. - /// - [Test] - public void CanGetEngineDesc() - { - Connection = IBusConnectionFactory.Create(); - if (Connection == null) - { - Assert.Ignore("Can't run this test without ibus running."); - return; - } - - var ibusWrapper = new IBusDotNet.InputBusWrapper(Connection); - object[] engines = ibusWrapper.InputBus.ListActiveEngines(); - if (engines.Length == 0) - { - Assert.Ignore("Can't run this test without any ibus keyboards installed."); - return; - } - - Assert.IsNotNull(IBusEngineDesc.GetEngineDesc(engines[0])); - } - } -} -#endif diff --git a/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/KeyboardSwitcherTests.cs b/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/KeyboardSwitcherTests.cs deleted file mode 100644 index c7a862dec3..0000000000 --- a/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/KeyboardSwitcherTests.cs +++ /dev/null @@ -1,209 +0,0 @@ -#if __MonoCS__ -using System; -using IBusDotNet; -using NUnit.Framework; -using SIL.FieldWorks.Views; -using SIL.Utils; - -namespace KeyboardSwitcherTests -{ - [TestFixture] - public class KeyboardSwitcherTests - { - /// FWNX-442: Keyboard not turning off when it should - [Test] - public void IMEKeyboard_SetNoKeyboard_DisablesKeyboard() - { - using (var switcher = new KeyboardSwitcher()) - { - // Create an input context - using (var controller = new DummyInputBusController()) - { - controller.Focus(); - var context = GlobalCachedInputContext.InputContext; - - // Set input method using the first available keyboard - if (switcher.IMEKeyboardsCount <= 0) - { - Console.WriteLine("Warning: Test IMEKeyboard_SetNoKeyboard_DisablesKeyboard unable to run since no iBus keyboards available or no iBus running."); - return; // Can't test without an iBus engine to use. - } - switcher.IMEKeyboard = switcher.GetKeyboardName(0); - Assert.That(context.IsEnabled(), Is.True, "Keyboard input method should be enabled when set"); - - // Turn off input method - switcher.IMEKeyboard = null; - Assert.That(context.IsEnabled(), Is.False, "Should have disabled keyboard input method"); - } - } - } - } - - class DummyInputBusController: IDisposable - { - protected IBusConnection m_connection; - protected InputContext m_inputContext; - protected IBusDotNet.InputBusWrapper m_ibus; - - /// - public DummyInputBusController() - { - m_connection = IBusConnectionFactory.Create(); - - if (m_connection == null) - return; - - m_ibus = new IBusDotNet.InputBusWrapper(m_connection); - m_inputContext = m_ibus.InputBus.CreateInputContext("UnitTest"); - m_inputContext.SetCapabilities(Capabilities.Focus | Capabilities.PreeditText); - } - - #region Disposable stuff - #if DEBUG - /// - ~DummyInputBusController() - { - Dispose(false); - } - #endif - - /// - public bool IsDisposed - { - get; - private set; - } - - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - protected virtual void Dispose(bool fDisposing) - { - System.Diagnostics.Debug.WriteLineIf(!fDisposing, "****** Missing Dispose() call for " + GetType().Name + ". ****** "); - if (fDisposing && !IsDisposed) - { - // dispose managed and unmanaged objects - if (m_connection != null) - m_connection.Dispose(); - } - m_connection = null; - IsDisposed = true; - } - #endregion - - /// Focus the input context - public void Focus() - { - if (m_connection == null) - return; - - if (m_inputContext != null) - m_inputContext.FocusIn(); - - SIL.FieldWorks.Views.GlobalCachedInputContext.InputContext = m_inputContext; - } - } - - class DummyIConvertible : IConvertible - { - object m_result; - - public DummyIConvertible(object result) - { - m_result = result; - } - - #region IConvertible implementation - public TypeCode GetTypeCode() - { - throw new NotImplementedException(); - } - - public bool ToBoolean(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public byte ToByte(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public char ToChar(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public DateTime ToDateTime(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public decimal ToDecimal(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public double ToDouble(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public short ToInt16(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public int ToInt32(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public long ToInt64(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public sbyte ToSByte(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public float ToSingle(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public string ToString(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public object ToType(Type conversionType, IFormatProvider provider) - { - return m_result; - } - - public ushort ToUInt16(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public uint ToUInt32(IFormatProvider provider) - { - throw new NotImplementedException(); - } - - public ulong ToUInt64(IFormatProvider provider) - { - throw new NotImplementedException(); - } - #endregion - } -} -#endif diff --git a/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/KeyboardSwitcherTests.csproj b/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/KeyboardSwitcherTests.csproj deleted file mode 100644 index a76181814d..0000000000 --- a/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/KeyboardSwitcherTests.csproj +++ /dev/null @@ -1,104 +0,0 @@ - - - - Debug - AnyCPU - 9.0.21022 - 2.0 - {6CE0EFE2-D885-4744-A91A-100B00DD8DC6} - Library - KeyboardSwitcherTests - KeyboardSwitcherTests - v4.0 - - - 3.5 - - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - true - full - false - ..\..\..\..\Output\Debug\ - DEBUG - prompt - 4 - false - AllRules.ruleset - x86 - - - none - false - ..\..\..\..\Output\Release\ - prompt - 4 - false - AllRules.ruleset - x86 - - - - False - ..\..\..\..\Output\Debug\BasicUtilsTests.dll - - - False - ..\..\..\..\Output\Debug\COMInterfacesTests.dll - - - False - ..\..\..\..\Bin\NUnit\bin\nunit.framework.dll - - - - False - ..\..\..\..\Output\Debug\KeyboardSwitcher.dll - - - ..\..\..\..\Output\Debug\ibusdotnet.dll - - - - - - AssemblyInfoForTests.cs - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - \ No newline at end of file diff --git a/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/gendarme-KeyboardSwitcherTests.ignore b/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/gendarme-KeyboardSwitcherTests.ignore deleted file mode 100644 index e0edcd58ad..0000000000 --- a/Src/Common/KeyboardSwitcher/KeyboardSwitcherTests/gendarme-KeyboardSwitcherTests.ignore +++ /dev/null @@ -1,7 +0,0 @@ -# Gendarme filter file to suppress reporting of defects - -#----------------------------------------------------------------------------------------------- -R: Gendarme.Rules.Design.TypesWithDisposableFieldsShouldBeDisposableRule - -# Disposed in Teardown method -T: KeyboardSwitcherTests.IBusDotNetTests \ No newline at end of file diff --git a/Src/Common/Keyboarding/AssemblyInfo.cs b/Src/Common/Keyboarding/AssemblyInfo.cs deleted file mode 100644 index be6bfcf8b8..0000000000 --- a/Src/Common/Keyboarding/AssemblyInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System.Reflection; -using System.Runtime.CompilerServices; - -[assembly: AssemblyTitle("Keyboarding")] - -[assembly: System.Runtime.InteropServices.ComVisible(false)] - -[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("KeyboardingTests")] -[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("FwCoreDlgControlsTests")] diff --git a/Src/Common/Keyboarding/BuildInclude.targets b/Src/Common/Keyboarding/BuildInclude.targets deleted file mode 100644 index df0ddc9f5e..0000000000 --- a/Src/Common/Keyboarding/BuildInclude.targets +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs deleted file mode 100644 index d9e252c429..0000000000 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardCallback.cs +++ /dev/null @@ -1,25 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; - -namespace SIL.FieldWorks.Common.Keyboarding.Interfaces -{ - /// - /// Interface that needs to be implemented by the view/document. This interface allows the - /// keyboard controller to get the correct keyboard based on the current position in the - /// document/the current selection in the view. - /// - public interface IKeyboardCallback - { - /// - /// Gets the keyboard associated with the current selection. - /// - IKeyboardDescription Keyboard { get; } - } -} diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardDescription.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardDescription.cs deleted file mode 100644 index dadef64b8d..0000000000 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardDescription.cs +++ /dev/null @@ -1,65 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; - -namespace SIL.FieldWorks.Common.Keyboarding.Interfaces -{ - /// - /// The different keyboard types we're supporting. - /// - public enum KeyboardType - { - /// - /// System keyboard like Windows API or xkb - /// - System, - /// - /// Other input method like Keyman, InKey or ibus - /// - OtherIm - } - - /// - /// Represents an installed keyboard layout/language - /// - public interface IKeyboardDescription - { - /// - /// Gets an identifier of the language/keyboard layout - /// - string Id { get; } - - /// - /// Gets the type of this keyboard (system or other) - /// - KeyboardType Type { get; } - - /// - /// Gets a human-readable name of the input language. - /// - string Name { get; } - - /// - /// The Locale of the keyboard in the format languagecode2-country/regioncode2. - /// This is mainly significant on Windows, which distinguishes (for example) - /// a German keyboard used in Germany, Switzerland, and Holland. - /// - string Locale { get; } - - /// - /// Activate this keyboard layout. - /// - void Activate(); - - /// - /// Deactivate this keyboard layout. - /// - void Deactivate(); - } -} diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardErrorDescription.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardErrorDescription.cs deleted file mode 100644 index 5b91ef6d0b..0000000000 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardErrorDescription.cs +++ /dev/null @@ -1,30 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; - -namespace SIL.FieldWorks.Common.Keyboarding.Interfaces -{ - /// - /// Describes a keyboard layout that either gave an exception or other error trying to - /// get more information. We don't have enough information for these keyboard layouts - /// to include them in the list of installed keyboards. - /// - public interface IKeyboardErrorDescription - { - /// - /// Gets the type of this keyboard (system or other) - /// - KeyboardType Type { get; } - - /// - /// Gets the details about the error, e.g. layout name. - /// - object Details { get; } - } -} diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardEventHandler.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardEventHandler.cs deleted file mode 100644 index 31ff43907f..0000000000 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardEventHandler.cs +++ /dev/null @@ -1,102 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; -using System.Drawing; -using System.Windows.Forms; - -namespace SIL.FieldWorks.Common.Keyboarding.Interfaces -{ - /// - /// The different types of a selection change - /// - public enum SelChangeType - { - /// Selection did not change - NoChange = -1, - /// Selection changed but stayed in same paragraph - SamePara = 1, - /// Selection moved to a different paragraph - DiffPara = 2, - /// Selection changed, it is not known whether it moved paragraph... maybe no - /// previous sel. - Unknown = 3, - /// Selection removed altogether, there is now no current selection. - Deleted = 4, - } - - // TODO EberhardB: address JohnT's review comments on - // https://gerrit.lsdev.sil.org/#/c/1241/8/Src/Common/Keyboarding/Interfaces/IKeyboardEventHandler.cs - - /// - /// Event handler that the keyboard controller or the keyboard implements to get notified - /// about changes and events in the view/document. - /// - /// The keyboard controller creates an object that implements IKeyboardEventHandler. - /// If different keyboard types on a system require different treatment of events, an - /// event handler on each keyboard type should be implemented together with a wrapper class - /// that calls the handler on the keyboard. If all keyboard types can use the same event - /// handling code, only one class needs to be implemented. The reason it is done this way is - /// that in the second case we save some time if we don't have to determine the current - /// keyboard based on the current selection in the text. - public interface IKeyboardEventHandler - { - /// - /// Called before a property gets updated. - /// - /// Returns true if the property should be updated without normalization - /// (i.e. not updated in the database) in order to avoid messing up compositions; - /// false if property can be processed regularly. - /// The event handler should do what was done in C++ with the following two - /// lines and return the value of ptxs->IsCompositionActive: - /// if (ptxs->IsCompositionActive()) - /// ptxs->NoteCommitDuringComposition(); - /// - bool OnUpdateProp(IKeyboardCallback callback); - - /// - /// Called when a mouse event happened. - /// - /// Returns true if the mouse event was handled, otherwise false. - /// - /// Corresponding C++ method is VwTextStore::MouseEvent. - bool OnMouseEvent(IKeyboardCallback callback, int xd, int yd, Rectangle rcSrc, - Rectangle rcDst, MouseEvent mouseEvent); - - /// - /// Called when the layout of the view changes. - /// - void OnLayoutChange(IKeyboardCallback callback); - - /// - /// Called when the selection changes. - /// - /// Corresponding C++ method is VwTextStore::OnSelChange. - void OnSelectionChange(IKeyboardCallback callback, SelChangeType how); - - /// - /// Called when the text changes. - /// - /// Corresponding C++ method is VwTextStore::OnDocChange. - void OnTextChange(IKeyboardCallback callback); - - /// - /// Called when the control receives focus - /// - /// The keyboard active for the control - /// The control that receives focus - void OnSetFocus(IKeyboardDescription keyboard, Control control); - - /// - /// Called when the control loses focus - /// - /// The keyboard active for the control - /// The control that loses focus - void OnKillFocus(IKeyboardDescription keyboard, Control control); - } -} diff --git a/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs b/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs deleted file mode 100644 index e07fb24da2..0000000000 --- a/Src/Common/Keyboarding/Interfaces/IKeyboardMethods.cs +++ /dev/null @@ -1,49 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; - -namespace SIL.FieldWorks.Common.Keyboarding.Interfaces -{ - /// - /// This interface provides additional methods for keyboards - /// - public interface IKeyboardMethods - { - /// - /// End all active compositions. - /// - void TerminateAllCompositions(IKeyboardCallback callback); - - /// - /// Gets a value indicating whether a composition window is active. - /// - bool IsCompositionActive(IKeyboardCallback callback); - - /// - /// Gets a value indicating if the input method is in the process of closing a composition - /// window. - /// - /// Corresponding C++ method is VwTextStore::IsDoingRecommit. - bool IsEndingComposition(IKeyboardCallback callback); - - /// - /// Enables the input method. This gets called as part of VwRootBox::HandleActivate when - /// enabling a selection. - /// - /// Corresponding C++ method is VwTextStore::SetFocus. - void EnableInput(IKeyboardCallback callback); - - /// - /// Disables the input method. This gets called as part of VwRootBox::HandleActivate when - /// disabling a selection. - /// - /// Corresponding C++ method is VwTextStore::OnLoseFocus. - void DisableInput(IKeyboardCallback callback); - } -} diff --git a/Src/Common/Keyboarding/InternalInterfaces/IKeyboardAdaptor.cs b/Src/Common/Keyboarding/InternalInterfaces/IKeyboardAdaptor.cs deleted file mode 100644 index 7f026e33aa..0000000000 --- a/Src/Common/Keyboarding/InternalInterfaces/IKeyboardAdaptor.cs +++ /dev/null @@ -1,48 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; -using System.Collections.Generic; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; - -namespace SIL.FieldWorks.Common.Keyboarding.InternalInterfaces -{ - /// - /// Methods and properties for dealing with keyboards - /// - internal interface IKeyboardAdaptor - { - /// - /// Initialize the installed keyboards - /// - void Initialize(); - - /// - void Close(); - - /// - /// List of keyboard layouts that either gave an exception or other error trying to - /// get more information. We don't have enough information for these keyboard layouts - /// to include them in the list of installed keyboards. - /// - /// List of IKeyboardErrorDescription objects, or an empty list. - List ErrorKeyboards { get; } - - /// - /// Activates the keyboard - /// - /// The keyboard to activate - void ActivateKeyboard(IKeyboardDescription keyboard); - - /// - /// Deactivates the keyboard - /// - /// The keyboard to deactivate - void DeactivateKeyboard(IKeyboardDescription keyboard); - } -} diff --git a/Src/Common/Keyboarding/InternalInterfaces/IKeyboardController.cs b/Src/Common/Keyboarding/InternalInterfaces/IKeyboardController.cs deleted file mode 100644 index e8197ddb06..0000000000 --- a/Src/Common/Keyboarding/InternalInterfaces/IKeyboardController.cs +++ /dev/null @@ -1,86 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2012, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; -using System.Collections.Generic; -using SIL.CoreImpl; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.Types; - -namespace SIL.FieldWorks.Common.Keyboarding.InternalInterfaces -{ - /// - /// Internal interface for the implementation of the keyboard controller. Implement this - /// interface if you want to provide a double for unit testing. Otherwise the default - /// implementation is sufficient. - /// - internal interface IKeyboardController: IDisposable - { - /// - /// Tries to get the keyboard with the specified . - /// - /// - /// Returns KeyboardDescription.Zero if no keyboard can be found. - /// - IKeyboardDescription GetKeyboard(string layoutName); - - IKeyboardDescription GetKeyboard(string layoutName, string locale); - - /// - /// Tries to get the keyboard for the specified . - /// - /// - /// Returns KeyboardDescription.Zero if no keyboard can be found. - /// - IKeyboardDescription GetKeyboard(IWritingSystem writingSystem); - - /// - /// Sets the keyboard - /// - void SetKeyboard(IKeyboardDescription keyboard); - - void SetKeyboard(string layoutName); - - void SetKeyboard(string layoutName, string locale); - - // TODO: Change param type to IWritingSystemDefinition - void SetKeyboard(IWritingSystem writingSystem); - - /// - /// Gets the installed keyboard layouts/languages. - /// - List InstalledKeyboards { get; } - - /// - /// List of keyboard layouts that either gave an exception or other error trying to - /// get more information. We don't have enough information for these keyboard layouts - /// to include them in the list of installed keyboards. - /// - List ErrorKeyboards { get; } - - /// - /// Gets the available keyboards - /// - KeyboardCollection Keyboards { get; } - /// - /// Gets or sets the implementation of the internal event handlers. Can be set - /// in unit tests to replace parts of the implementation. - /// - IKeyboardEventHandler InternalEventHandler { get; set; } - /// - /// Gets or sets the implementation of the internal methods. Can be set - /// in unit tests to replace parts of the implementation. - /// - IKeyboardMethods InternalMethods { get; set; } - - /// - /// Gets or sets the currently active keyboard - /// - IKeyboardDescription ActiveKeyboard { get; set; } - } -} diff --git a/Src/Common/Keyboarding/KeyboardController.cs b/Src/Common/Keyboarding/KeyboardController.cs deleted file mode 100644 index 86ca515617..0000000000 --- a/Src/Common/Keyboarding/KeyboardController.cs +++ /dev/null @@ -1,381 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using SIL.CoreImpl; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; -using SIL.Utils; -#if __MonoCS__ -using SIL.FieldWorks.Views; -using SIL.FieldWorks.Common.Keyboarding.Linux; -#else -using SIL.FieldWorks.Common.Keyboarding.Windows; -#endif -using SIL.FieldWorks.Common.Keyboarding.Types; - -namespace SIL.FieldWorks.Common.Keyboarding -{ - /// - /// Singleton class with methods for registering different keyboarding engines (e.g. Windows - /// system, Keyman, XKB, IBus keyboards), and activating keyboards. - /// - public static class KeyboardController - { - #region Nested Manager class - /// - /// Allows setting different keyboard adapters which is needed for tests. Also allows - /// registering keyboard layouts. - /// - public static class Manager - { - /// - /// Sets the available keyboard adaptors - /// - internal static void SetKeyboardAdaptors(IKeyboardAdaptor[] adaptors) - { - if (SingletonsContainer.Contains()) - { - // we're modifying an existent KeyboardController. - Instance.Keyboards.Clear(); - - if (Adaptors != null) - { - foreach (var adaptor in Adaptors) - adaptor.Close(); - } - - Adaptors = adaptors; - - InitializeAdaptors(); - } - else - { - // KeyboardController doesn't exist yet. We'll initialize the adaptors - // when the KeyboardController gets created - Adaptors = adaptors; - } - } - - /// - /// Resets the keyboard adaptors to the default ones. - /// - public static void Reset() - { - SetKeyboardAdaptors(new IKeyboardAdaptor[] { -#if __MonoCS__ - new XkbKeyboardAdaptor(), new IbusKeyboardAdaptor() -#else - new WinKeyboardAdaptor() -#endif - }); - } - - internal static void InitializeAdaptors() - { - // this will also populate m_keyboards - foreach (var adaptor in Adaptors) - adaptor.Initialize(); - } - - /// - /// Adds a keyboard to the list of installed keyboards - /// - /// Keyboard description object - public static void RegisterKeyboard(IKeyboardDescription description) - { - if (!Instance.Keyboards.Contains(description)) - Instance.Keyboards.Add(description); - } - } - #endregion - - #region Class KeyboardControllerImpl - private sealed class KeyboardControllerImpl: IKeyboardController, IDisposable - { - public KeyboardCollection Keyboards { get; private set; } - public IKeyboardEventHandler InternalEventHandler { get; set; } - public IKeyboardMethods InternalMethods { get; set; } - - public KeyboardControllerImpl() - { - Keyboards = new KeyboardCollection(); - ActiveKeyboard = new KeyboardDescriptionNull(); - } - - #region Disposable stuff -#if DEBUG - /// - ~KeyboardControllerImpl() - { - Dispose(false); - } -#endif - - /// - public bool IsDisposed { get; private set; } - - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - private void Dispose(bool fDisposing) - { - System.Diagnostics.Debug.WriteLineIf(!fDisposing, - "****** Missing Dispose() call for " + GetType() + ". *******"); - if (fDisposing && !IsDisposed) - { - // dispose managed and unmanaged objects - if (Adaptors != null) - { - foreach (var adaptor in Adaptors) - adaptor.Close(); - Adaptors = null; - } - } - IsDisposed = true; - } - #endregion - - public IKeyboardDescription GetKeyboard(string layoutNameWithLocale) - { - if (string.IsNullOrEmpty(layoutNameWithLocale)) - return KeyboardDescription.Zero; - - return Keyboards.Contains(layoutNameWithLocale) ? - Keyboards[layoutNameWithLocale] : KeyboardDescription.Zero; - } - - public IKeyboardDescription GetKeyboard(string layoutName, string locale) - { - if (string.IsNullOrEmpty(layoutName) && string.IsNullOrEmpty(locale)) - return KeyboardDescription.Zero; - - return Keyboards.Contains(layoutName, locale) ? - Keyboards[layoutName, locale] : KeyboardDescription.Zero; - } - - /// - /// Tries to get the keyboard for the specified . - /// - /// - /// Returns KeyboardDescription.Zero if no keyboard can be found. - /// - public IKeyboardDescription GetKeyboard(IWritingSystem writingSystem) - { - // TODO: use writingSystem.LocalKeyboard - if (writingSystem == null) - return KeyboardDescription.Zero; - return GetKeyboard(writingSystem.Keyboard); - } - - /// - /// Sets the keyboard. - /// - /// Keyboard layout name - public void SetKeyboard(string layoutName) - { - SetKeyboard(GetKeyboard(layoutName)); - } - - public void SetKeyboard(string layoutName, string locale) - { - SetKeyboard(GetKeyboard(layoutName, locale)); - } - - public void SetKeyboard(IWritingSystem writingSystem) - { - // TODO: use writingSystem.LocalKeyboard - SetKeyboard(writingSystem.Keyboard); - } - - public void SetKeyboard(IKeyboardDescription keyboard) - { - if (ActiveKeyboard.Id != keyboard.Id) - { - ActiveKeyboard.Deactivate(); - keyboard.Activate(); - } - } - - /// - /// Gets the installed keyboard layouts/languages. - /// - public List InstalledKeyboards - { - get - { - return Keyboards.ToList(); - } - } - - /// - /// List of keyboard layouts that either gave an exception or other error trying to - /// get more information. We don't have enough information for these keyboard layouts - /// to include them in the list of installed keyboards. - /// - public List ErrorKeyboards - { - get - { - if (Adaptors == null) - Manager.Reset(); - - return Adaptors.SelectMany(adaptor => adaptor.ErrorKeyboards).ToList(); - } - } - - /// - /// Gets or sets the currently active keyboard - /// - public IKeyboardDescription ActiveKeyboard { get; set; } - } - #endregion - - #region Static methods and properties - /// - /// Create an instance of IKeyboardController. This gets called if SingletonsContainer - /// doesn't already contain one. - /// - private static IKeyboardController Create() - { - var controller = new KeyboardControllerImpl(); - if (Adaptors == null) - Manager.Reset(); - -#if __MonoCS__ - var keyboardHelper = new LinuxKeyboardHelper(); - controller.InternalEventHandler = keyboardHelper; - controller.InternalMethods = keyboardHelper; -#else - // On Windows the Views code implements unmanaged VwTextSource - // so that we don't need the InternalEventHandler/InternalMethods. - // It is implemented in unmanaged code for performance reasons - // because it interacts with TSF. -#endif - - return controller; - } - - /// - /// Gets the current keyboard controller singleton. - /// - private static IKeyboardController Instance - { - get - { - return SingletonsContainer.Get(() => Create(), - () => Manager.InitializeAdaptors()); - } - } - - /// - /// Gets the event handler that processes events that are forwarded to the keyboard. - /// - public static IKeyboardEventHandler EventHandler - { - get - { - return Instance.InternalEventHandler; - } - } - - /// - /// Gets the object that implements additional methods. - /// - public static IKeyboardMethods Methods - { - get - { - return Instance.InternalMethods; - } - } - - /// - /// Gets the installed keyboard layouts/languages. - /// - public static List InstalledKeyboards - { - get - { - return Instance.InstalledKeyboards; - } - } - - /// - /// List of keyboard layouts that either gave an exception or other error trying to - /// get more information. We don't have enough information for these keyboard layouts - /// to include them in the list of installed keyboards. - /// - public static List ErrorKeyboards - { - get - { - return Instance.ErrorKeyboards; - } - } - - /// - /// Tries to get the keyboard specified by . - /// Returns KeyboardDescription.Zero if no keyboard can be found. - /// - public static IKeyboardDescription GetKeyboard(string layoutName) - { - return Instance.GetKeyboard(layoutName); - } - - public static IKeyboardDescription GetKeyboard(string layoutName, string locale) - { - return Instance.GetKeyboard(layoutName, locale); - } - - public static IKeyboardDescription GetKeyboard(IWritingSystem writingSystem) - { - return Instance.GetKeyboard(writingSystem); - } - - public static void SetKeyboard(IKeyboardDescription keyboard) - { - Instance.SetKeyboard(keyboard); - } - - public static void SetKeyboard(string layoutName) - { - Instance.SetKeyboard(layoutName); - } - - public static void SetKeyboard(IWritingSystem writingSystem) - { - Instance.SetKeyboard(writingSystem); - } - - /// - /// Gets or sets the available keyboard adaptors. - /// - internal static IKeyboardAdaptor[] Adaptors { get; private set; } - - /// - /// Gets the active keyboard - /// - public static IKeyboardDescription ActiveKeyboard - { - get { return Instance.ActiveKeyboard; } - internal set { Instance.ActiveKeyboard = value; } - } - - #endregion - - } -} diff --git a/Src/Common/Keyboarding/KeyboardDescription.cs b/Src/Common/Keyboarding/KeyboardDescription.cs deleted file mode 100644 index 5695654cef..0000000000 --- a/Src/Common/Keyboarding/KeyboardDescription.cs +++ /dev/null @@ -1,136 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; - -namespace SIL.FieldWorks.Common.Keyboarding -{ - /// - /// Default implementation for a keyboard layout/language description. - /// - public class KeyboardDescription: IKeyboardDescription - { - /// - /// The null keyboard description - /// - public static IKeyboardDescription Zero = new KeyboardDescriptionNull(); - - /// - /// Initializes a new instance of the - /// class. - /// - internal KeyboardDescription(string name, string locale, IKeyboardAdaptor engine) - : this(name, locale, engine, KeyboardType.System) - { - } - - /// - /// Initializes a new instance of the - /// class. - /// - internal KeyboardDescription(string name, string locale, - IKeyboardAdaptor engine, KeyboardType type) - { - Name = name; - Locale = locale; - Engine = engine; - Type = type; - } - - /// - /// Gets an identifier of the language/keyboard layout. - /// - public string Id - { - get - { - return GetId(Locale, Name); - } - } - - /// - /// Gets the identifier for the keyboard based on the provided locale and layout. - /// - public static string GetId(string locale, string layout) - { - return string.Format("{0}_{1}", locale, layout); - } - - /// - /// Gets the type of this keyboard (system or other) - /// - public KeyboardType Type { get; private set;} - - /// - /// Gets a human-readable name of the language. - /// - public string Name { get; private set; } - - /// - /// The Locale of the keyboard in the format languagecode2-country/regioncode2. - /// This is mainly significant on Windows, which distinguishes (for example) - /// a German keyboard used in Germany, Switzerland, and Holland. - /// - public string Locale { get; private set; } - - /// - /// Gets the keyboard adaptor that handles this keyboard. - /// - internal IKeyboardAdaptor Engine { get; private set; } - - /// - /// Activate this keyboard. - /// - public void Activate() - { - if (Engine != null) - Engine.ActivateKeyboard(this); - } - - /// - /// Deactivate this keyboard. - /// - public void Deactivate() - { - if (Engine != null) - Engine.DeactivateKeyboard(this); - } - - /// - /// Returns a that represents the current - /// . - /// - public override string ToString() - { - return Name; - } - - /// - /// Determines whether the specified is equal to the current - /// . - /// - public override bool Equals(object obj) - { - if (obj == null || !(obj is IKeyboardDescription)) - return false; - var other = (IKeyboardDescription)obj; - return other.Name == Name && other.Locale == Locale; - } - - /// - /// Serves as a hash function for a - /// object. - /// - public override int GetHashCode() - { - return Name.GetHashCode() ^ Locale.GetHashCode(); - } - } -} diff --git a/Src/Common/Keyboarding/KeyboardDescriptionNull.cs b/Src/Common/Keyboarding/KeyboardDescriptionNull.cs deleted file mode 100644 index fc13141d8c..0000000000 --- a/Src/Common/Keyboarding/KeyboardDescriptionNull.cs +++ /dev/null @@ -1,85 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; - -namespace SIL.FieldWorks.Common.Keyboarding -{ - /// - /// This implements a no-op keyboard that can be used where we don't know what keyboard to use - /// - internal class KeyboardDescriptionNull: IKeyboardDescription - { - #region IKeyboardDescription implementation - public void Activate() - { - } - - public void Deactivate() - { - } - - public string Id - { - get { return string.Empty; } - } - - public KeyboardType Type - { - get { return KeyboardType.System; } - } - - public string Name - { - get { return string.Empty; } - } - - public string Locale - { - get { return string.Empty; } - } - - public IKeyboardAdaptor Engine - { - get - { - throw new NotImplementedException(); - } - } - #endregion - - /// - /// Returns a that represents the current - /// . - /// - public override string ToString() - { - return ""; - } - - /// - /// Determines whether the specified is equal to the current - /// . - /// - public override bool Equals(object obj) - { - return obj is KeyboardDescriptionNull; - } - - /// - /// Serves as a hash function for a - /// object. - /// - public override int GetHashCode() - { - return 0; - } - } -} diff --git a/Src/Common/Keyboarding/KeyboardDescriptionWrapper.cs b/Src/Common/Keyboarding/KeyboardDescriptionWrapper.cs deleted file mode 100644 index 03337d20b5..0000000000 --- a/Src/Common/Keyboarding/KeyboardDescriptionWrapper.cs +++ /dev/null @@ -1,115 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; - -namespace SIL.FieldWorks.Common.Keyboarding -{ - /// - /// Wraps one or two keyboard descriptions. This allows to have a OtherIM type keyboard that - /// on activation also activates the system keyboard. The current implementation gives - /// precedence to the other keyboard; it's up to the respective keyboard adapter to deal with - /// the second keyboard (e.g. on Windows we might simply ignore it). - /// - /// It would be possible to implement this by adding an extra property on - /// IKeyboardDescription, but that seems wrong because the association between the two - /// keyboards gets set each time we access the keyboard. - internal class KeyboardDescriptionWrapper: IKeyboardDescription - { - private IKeyboardDescription m_SystemKeyboard; - private IKeyboardDescription m_OtherImKeyboard; - - public KeyboardDescriptionWrapper(IKeyboardDescription systemKeyboard, - IKeyboardDescription otherImKeyboard) - { - m_SystemKeyboard = systemKeyboard; - m_OtherImKeyboard = otherImKeyboard; - } - - private IKeyboardDescription PrimaryKeyboard - { - get { return m_OtherImKeyboard ?? m_SystemKeyboard; } - } - - #region IKeyboardDescription implementation - public void Activate() - { - throw new NotImplementedException("TODO: remove this class. It's no longer needed"); - //Engine.ActivateKeyboard(PrimaryKeyboard, m_SystemKeyboard); - } - - public void Deactivate() - { - Engine.DeactivateKeyboard(PrimaryKeyboard); - } - - public string Id - { - get { return PrimaryKeyboard.Id; } - } - - public KeyboardType Type - { - get { return PrimaryKeyboard.Type; } - } - - public string Name - { - get { return PrimaryKeyboard.Name; } - } - - public string Locale - { - get { return PrimaryKeyboard.Locale; } - } - - public IKeyboardAdaptor Engine - { - get - { - var keyboard = PrimaryKeyboard as KeyboardDescription; - if (keyboard == null) - return null; - return keyboard.Engine; - } - } - #endregion - - /// - /// Returns a that represents the current - /// . - /// - public override string ToString() - { - return string.Format("{0} ({1})", PrimaryKeyboard.Name, m_SystemKeyboard.Name); - } - - /// - /// Determines whether the specified is equal to the current - /// . - /// - public override bool Equals(object obj) - { - if (obj == null || !(obj is KeyboardDescriptionWrapper)) - return false; - var other = (KeyboardDescriptionWrapper)obj; - return other.m_OtherImKeyboard == m_OtherImKeyboard && other.m_SystemKeyboard == m_SystemKeyboard; - } - - /// - /// Serves as a hash function for a - /// object. - /// - public override int GetHashCode() - { - return Id.GetHashCode() ^ Name.GetHashCode() ^ m_SystemKeyboard.GetHashCode() ^ base.GetHashCode(); - } - } -} diff --git a/Src/Common/Keyboarding/KeyboardErrorDescription.cs b/Src/Common/Keyboarding/KeyboardErrorDescription.cs deleted file mode 100644 index d6fa36351a..0000000000 --- a/Src/Common/Keyboarding/KeyboardErrorDescription.cs +++ /dev/null @@ -1,32 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; - -namespace SIL.FieldWorks.Common.Keyboarding -{ - internal class KeyboardErrorDescription: IKeyboardErrorDescription - { - public KeyboardErrorDescription(object details): this(KeyboardType.System, details) - { - } - - public KeyboardErrorDescription(KeyboardType type, object details) - { - Type = type; - Details = details; - } - - #region IKeyboardErrorDescription implementation - public KeyboardType Type { get; private set; } - - public object Details { get; private set; } - #endregion - } -} diff --git a/Src/Common/Keyboarding/Keyboarding.csproj b/Src/Common/Keyboarding/Keyboarding.csproj deleted file mode 100644 index f5b0452cec..0000000000 --- a/Src/Common/Keyboarding/Keyboarding.csproj +++ /dev/null @@ -1,144 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {3365F220-B39D-423D-8A99-FDD0588970CE} - Library - SIL.FieldWorks.Common.Keyboarding - Keyboarding - v4.0 - - - 3.5 - - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - - - - - - - - true - full - false - ..\..\..\Output\Debug - DEBUG - prompt - 4 - false - true - true - AllRules.ruleset - x86 - - - none - false - ..\..\..\Output\Release - prompt - 4 - false - AllRules.ruleset - x86 - - - - False - ..\..\..\Output\Debug\BasicUtils.dll - - - False - ..\..\..\Output\Debug\CoreImpl.dll - - - False - ..\..\..\Output\Debug\KeyboardSwitcher.dll - - - - False - ..\..\..\Output\Debug\COMInterfaces.dll - - - ..\..\..\Output\Debug\SilUtils.dll - - - - - - - - - - CommonAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - \ No newline at end of file diff --git a/Src/Common/Keyboarding/Keyboarding.dll.config b/Src/Common/Keyboarding/Keyboarding.dll.config deleted file mode 100644 index 9e0af794a3..0000000000 --- a/Src/Common/Keyboarding/Keyboarding.dll.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Src/Common/Keyboarding/KeyboardingTests/App.config b/Src/Common/Keyboarding/KeyboardingTests/App.config deleted file mode 100644 index 8d329647ba..0000000000 --- a/Src/Common/Keyboarding/KeyboardingTests/App.config +++ /dev/null @@ -1,22 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - - diff --git a/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs b/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs deleted file mode 100644 index 9a4e3398d8..0000000000 --- a/Src/Common/Keyboarding/KeyboardingTests/FakeKeyboardController.cs +++ /dev/null @@ -1,179 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2012, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Drawing; -using System.Windows.Forms; -using SIL.CoreImpl; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; -using SIL.FieldWorks.Common.Keyboarding.Types; -using SIL.Utils; - -namespace SIL.FieldWorks.Common.Keyboarding -{ - /// - /// Implements a fake do-nothing keyboard controller. - /// - internal sealed class FakeKeyboardController: IKeyboardController, IKeyboardEventHandler, IKeyboardMethods - { - /// - /// Installs this fake keyboard controller instead of the real one - /// - [SuppressMessage("Gendarme.Rules.Correctness", "EnsureLocalDisposalRule", - Justification="FakeKeboardController is a Singleton")] - public static void Install() - { - SingletonsContainer.Add(typeof(IKeyboardController).FullName, new FakeKeyboardController()); - } - - public FakeKeyboardController() - { - ActiveKeyboard = new KeyboardDescriptionNull(); - } - - #region IDisposable implementation - public void Dispose() - { - } - #endregion - - #region IKeyboardController implementation - public IKeyboardDescription GetKeyboard(string layoutName) - { - return null; - } - - public IKeyboardDescription GetKeyboard(string layoutName, string locale) - { - return null; - } - - public IKeyboardDescription GetKeyboard(IWritingSystem writingSystem) - { - return null; - } - - - public void SetKeyboard(string layoutName) - { - } - - public void SetKeyboard(string layoutName, string locale) - { - } - - public void SetKeyboard(IKeyboardDescription keyboard) - { - } - - public void SetKeyboard(IWritingSystem writingSystem) - { - } - - public List InstalledKeyboards - { - get - { - return new List(); - } - } - - public List ErrorKeyboards - { - get - { - return new List(); - } - } - - public KeyboardCollection Keyboards - { - get - { - return new KeyboardCollection(); - } - } - - public IKeyboardEventHandler InternalEventHandler - { - get { return this; } - set { } - } - - public IKeyboardMethods InternalMethods - { - get { return this; } - set { } - } - #endregion - - #region IKeyboardEventHandler implementation - public bool OnUpdateProp(IKeyboardCallback callback) - { - return false; - } - - public bool OnMouseEvent(IKeyboardCallback callback, int xd, int yd, Rectangle rcSrc, - Rectangle rcDst, MouseEvent mouseEvent) - { - return false; - } - - public void OnLayoutChange(IKeyboardCallback callback) - { - } - - public void OnSelectionChange(IKeyboardCallback callback, SelChangeType how) - { - } - - public void OnTextChange(IKeyboardCallback callback) - { - } - - public void OnSetFocus(IKeyboardDescription keyboard, Control control) - { - } - - public void OnKillFocus(IKeyboardDescription keyboard, Control control) - { - } - - #endregion - - #region IKeyboardMethods implementation - public void TerminateAllCompositions(IKeyboardCallback callback) - { - } - - public bool IsCompositionActive(IKeyboardCallback callback) - { - return false; - } - - public bool IsEndingComposition(IKeyboardCallback callback) - { - return false; - } - - public void EnableInput(IKeyboardCallback callback) - { - } - - public void DisableInput(IKeyboardCallback callback) - { - } - - public IKeyboardDescription ActiveKeyboard { get; set; } - - #endregion - } -} diff --git a/Src/Common/Keyboarding/KeyboardingTests/KeyboardingTests.csproj b/Src/Common/Keyboarding/KeyboardingTests/KeyboardingTests.csproj deleted file mode 100644 index a133c30591..0000000000 --- a/Src/Common/Keyboarding/KeyboardingTests/KeyboardingTests.csproj +++ /dev/null @@ -1,112 +0,0 @@ - - - - Debug - AnyCPU - 9.0.21022 - 2.0 - {4CF2E2E8-FD6B-4FFC-80C9-ACDDA6E7C768} - Library - SIL.FieldWorks.Common.Keyboarding - KeyboardingTests - - - 3.5 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - true - full - false - ..\..\..\..\Output\Debug - DEBUG - prompt - 4 - false - AllRules.ruleset - x86 - - - none - false - ..\..\..\..\Output\Release - prompt - 4 - false - AllRules.ruleset - x86 - - - - False - ..\..\..\..\Output\Debug\BasicUtilsTests.dll - - - False - ..\..\..\..\Output\Debug\COMInterfaces.dll - - - - ..\..\..\..\Bin\NUnit\bin\nunit.framework.dll - - - ..\..\..\..\Output\Debug\Keyboarding.dll - - - ..\..\..\..\Output\Debug\BasicUtils.dll - - - - ..\..\..\..\Output\Debug\CoreImpl.dll - - - - False - ..\..\..\..\Output\Debug\TestUtils.dll - - - - - AssemblyInfoForTests.cs - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - \ No newline at end of file diff --git a/Src/Common/Keyboarding/KeyboardingTests/XkbKeyboardAdapterTests.cs b/Src/Common/Keyboarding/KeyboardingTests/XkbKeyboardAdapterTests.cs deleted file mode 100644 index b9832350f4..0000000000 --- a/Src/Common/Keyboarding/KeyboardingTests/XkbKeyboardAdapterTests.cs +++ /dev/null @@ -1,300 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -#if __MonoCS__ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.InteropServices; -using NUnit.Framework; -using SIL.FieldWorks.Common.Keyboarding; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.Linux; -using SIL.FieldWorks.Test.TestUtils; -using X11.XKlavier; - -namespace SIL.FieldWorks.Common.Keyboarding -{ - [TestFixture] - [Platform(Include="Linux", Reason="Linux specific tests")] - [SetUICulture("en-US")] - public class XkbKeyboardAdapterTests: BaseTest - { - /// - /// Fakes the installed keyboards - /// - private class XklEngineResponder: XklEngine - { - public static string[] SetGroupNames { set; private get; } - - public override string[] GroupNames { get { return SetGroupNames; } } - - } - - [DllImportAttribute("libgtk-x11-2.0")] - [return: MarshalAs(UnmanagedType.I4)] - private static extern bool gtk_init_check(ref int argc, ref IntPtr argv) ; - - private string KeyboardUSA { get { return KeyboardNames[0]; } } - private string KeyboardGermany { get { return KeyboardNames[1]; } } - private string KeyboardFranceEliminateDeadKeys { get { return KeyboardNames[2]; } } - private string KeyboardUK { get { return KeyboardNames[3]; } } - private string KeyboardBelgium { get { return KeyboardNames[4]; } } - private string KeyboardFinlandNorthernSaami { get { return KeyboardNames[5]; } } - - private string[] KeyboardNames; - private string[] OldKeyboardNames = new string[] { "USA", "Germany", - "France - Eliminate dead keys", "United Kingdom", "Belgium", - "Finland - Northern Saami" }; - private string[] NewKeyboardNames = new string[] { "English (US)", "German", - "French - French (eliminate dead keys)", "English (UK)", "Belgian", - "Finnish - Northern Saami (Finland)" }; - - private string ExpectedKeyboardUSA { get { return ExpectedKeyboardNames[0]; } } - private string ExpectedKeyboardGermany { get { return ExpectedKeyboardNames[1]; } } - private string ExpectedKeyboardFranceEliminateDeadKeys { get { return ExpectedKeyboardNames[2]; } } - private string ExpectedKeyboardUK { get { return ExpectedKeyboardNames[3]; } } - //private string ExpectedKeyboardBelgium { get { return ExpectedKeyboardNames[4]; } } - private string ExpectedKeyboardFinlandNorthernSaami { get { return ExpectedKeyboardNames[5]; } } - - private string[] ExpectedKeyboardNames; - private string[] OldExpectedKeyboardNames = new string[] { "English (United States)", - "German (Germany)", "French (France) - Eliminate dead keys", - "English (United Kingdom)", "", "Northern Sami (Finland) - Northern Saami" }; - private string[] NewExpectedKeyboardNames = new string[] { "English (United States)", - "German (Germany)", "French (France) - French (eliminate dead keys)", - "English (United Kingdom)", "", "Northern Sami (Finland) - Northern Saami (Finland)" }; - - private static bool IsNewEvdevNames - { - get - { - // Debian/Ubuntu version 2.2.1 of xkeyboard-config changed the way keyboard names - // are stored in evdev.xml: previously it the country name was used ("Belgium"), now - // they use the adjective ("Belgian"). We detect this by greping evdev.xml and then - // use the appropriate names - using (var process = new Process()) - { - process.StartInfo.FileName = "/bin/grep"; - process.StartInfo.Arguments = "Belgian /usr/share/X11/xkb/rules/evdev.xml"; - process.Start(); - process.WaitForExit(); - return process.ExitCode == 0; - } - } - } - - public override void FixtureSetup() - { - base.FixtureSetup(); - - // We're using GTK functions, so we need to intialize when we run in - // nunit-console. I'm doing it through p/invoke rather than gtk-sharp (Application.Init()) - // so that we don't need to reference gtk-sharp (which might cause - // problems on Windows) - int argc = 0; - IntPtr argv = IntPtr.Zero; - Assert.IsTrue(gtk_init_check(ref argc, ref argv)); - if (IsNewEvdevNames) - { - KeyboardNames = NewKeyboardNames; - ExpectedKeyboardNames = NewExpectedKeyboardNames; - } - else - { - KeyboardNames = OldKeyboardNames; - ExpectedKeyboardNames = OldExpectedKeyboardNames; - } - } - - /// - /// Tests converting the keyboard layouts that XKB reports to LCIDs with the help of ICU - /// and list of available layouts. - /// - [Test] - public void InstalledKeyboards_USA() - { - XklEngineResponder.SetGroupNames = new string[] { KeyboardUSA }; - - XkbKeyboardAdaptor.SetXklEngineType(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); - var keyboards = KeyboardController.InstalledKeyboards; - Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual("en-US_English (United States)", keyboards[0].Id); - Assert.AreEqual(ExpectedKeyboardUSA, keyboards[0].Name); - Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); - } - - [Test] - public void InstalledKeyboards_Germany() - { - XklEngineResponder.SetGroupNames = new string[] { KeyboardGermany }; - - XkbKeyboardAdaptor.SetXklEngineType(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); - var keyboards = KeyboardController.InstalledKeyboards; - Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual("de-DE_German (Germany)", keyboards[0].Id); - Assert.AreEqual(ExpectedKeyboardGermany, keyboards[0].Name); - Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); - } - - [Test] - public void InstalledKeyboards_FrenchWithVariant() - { - XklEngineResponder.SetGroupNames = new string[] { KeyboardFranceEliminateDeadKeys }; - - XkbKeyboardAdaptor.SetXklEngineType(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); - var keyboards = KeyboardController.InstalledKeyboards; - Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual("fr-FR_French (France) - French (eliminate dead keys)", keyboards[0].Id); - Assert.AreEqual(ExpectedKeyboardFranceEliminateDeadKeys, keyboards[0].Name); - Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); - } - - [Test] - public void InstalledKeyboards_GB() - { - XklEngineResponder.SetGroupNames = new string[] { KeyboardUK }; - - XkbKeyboardAdaptor.SetXklEngineType(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); - var keyboards = KeyboardController.InstalledKeyboards; - Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual("en-GB_English (United Kingdom)", keyboards[0].Id); - Assert.AreEqual(ExpectedKeyboardUK, keyboards[0].Name); - Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); - } - - [Test] - public void InstalledKeyboards_Belgium() - { - XklEngineResponder.SetGroupNames = new string[] { KeyboardBelgium }; - - XkbKeyboardAdaptor.SetXklEngineType(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); - var keyboards = KeyboardController.InstalledKeyboards; - // It seems that Dutch (Belgium) got added recently, so some machines are missing - // this. - Assert.That(keyboards.Count == 3 || keyboards.Count == 2); - keyboards.Sort((x, y) => { - return x.Id.CompareTo(y.Id); }); - var expectedKeyboards = new List() - { new KeyboardDescription("German (Belgium)", "de-BE", null) }; - expectedKeyboards.Add(new KeyboardDescription("French (Belgium)", "fr-BE", null)); - - if (keyboards.Count > 2) - expectedKeyboards.Add(new KeyboardDescription("Dutch (Belgium)", "nl-BE", null)); - - CollectionAssert.AreEquivalent(expectedKeyboards, keyboards); - Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); - } - - [Test] - public void InstalledKeyboards_Multiple() - { - XklEngineResponder.SetGroupNames = new string[] { KeyboardUSA, KeyboardGermany }; - - XkbKeyboardAdaptor.SetXklEngineType(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); - var keyboards = KeyboardController.InstalledKeyboards; - Assert.AreEqual(2, keyboards.Count); - Assert.AreEqual("en-US_English (United States)", keyboards[0].Id); - Assert.AreEqual(ExpectedKeyboardUSA, keyboards[0].Name); - Assert.AreEqual("de-DE_German (Germany)", keyboards[1].Id); - Assert.AreEqual(ExpectedKeyboardGermany, keyboards[1].Name); - Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); - } - - /// - /// Tests the values returned by InstalledKeyboards if the UICulture is set to German - /// - [Test] - [SetUICulture("de-DE")] - public void InstalledKeyboards_Germany_GermanCulture() - { - XklEngineResponder.SetGroupNames = new string[] { KeyboardGermany }; - - XkbKeyboardAdaptor.SetXklEngineType(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); - var keyboards = KeyboardController.InstalledKeyboards; - Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual("de-DE_Deutsch (Deutschland)", keyboards[0].Id); - Assert.AreEqual("Deutsch (Deutschland)", keyboards[0].Name); - Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); - } - - /// - /// Tests InstalledKeyboards property. "Finland - Northern Saami" gives us two - /// layouts (smi_FIN and sme_FIN), but ICU returns a LCID only for one of them. - /// - [Test] - public void InstalledKeyboards_NorthernSami() - { - XklEngineResponder.SetGroupNames = new string[] { KeyboardFinlandNorthernSaami }; - - XkbKeyboardAdaptor.SetXklEngineType(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); - var keyboards = KeyboardController.InstalledKeyboards; - Assert.AreEqual(1, keyboards.Count); - Assert.AreEqual("se-FI_Northern Sami (Finland) - Northern Saami (Finland)", keyboards[0].Id); - Assert.AreEqual(ExpectedKeyboardFinlandNorthernSaami, keyboards[0].Name); - Assert.AreEqual(0, KeyboardController.ErrorKeyboards.Count); - } - - [Test] - public void ErrorKeyboards() - { - XklEngineResponder.SetGroupNames = new string[] { "Fake" }; - - XkbKeyboardAdaptor.SetXklEngineType(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new XkbKeyboardAdaptor() }); - var keyboards = KeyboardController.InstalledKeyboards; - Assert.AreEqual(0, keyboards.Count); - Assert.AreEqual(1, KeyboardController.ErrorKeyboards.Count); - Assert.AreEqual("Fake", KeyboardController.ErrorKeyboards[0].Details); - } - - /// - [Test] - public void ActivateKeyboard_FirstTime_NotCrash() - { - XklEngineResponder.SetGroupNames = new string[] { KeyboardUSA }; - - XkbKeyboardAdaptor.SetXklEngineType(); - var adaptor = new XkbKeyboardAdaptor(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { adaptor }); - - var keyboards = KeyboardController.InstalledKeyboards; - - adaptor.ActivateKeyboard(keyboards[0]); - } - - /// - /// FWNX-895 - /// - [Test] - public void ActivateKeyboard_SecondTime_NotCrash() - { - XklEngineResponder.SetGroupNames = new string[] { KeyboardUSA }; - XkbKeyboardAdaptor.SetXklEngineType(); - - var adaptor = new XkbKeyboardAdaptor(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { adaptor }); - var keyboards = KeyboardController.InstalledKeyboards; - adaptor.ActivateKeyboard(keyboards[0]); - - adaptor = new XkbKeyboardAdaptor(); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { adaptor }); - keyboards = KeyboardController.InstalledKeyboards; - adaptor.ActivateKeyboard(keyboards[0]); - } - } -} -#endif diff --git a/Src/Common/Keyboarding/KeyboardingTests/XklEngineTests.cs b/Src/Common/Keyboarding/KeyboardingTests/XklEngineTests.cs deleted file mode 100644 index 5f76f145e2..0000000000 --- a/Src/Common/Keyboarding/KeyboardingTests/XklEngineTests.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2013, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// Original author: MarkS 2013-01-04 XklEngineTests.cs - -#if __MonoCS__ -using System; -using NUnit.Framework; -using SIL.FieldWorks.Common.Keyboarding.Linux; -using SIL.FieldWorks.Test.TestUtils; -using X11.XKlavier; - -namespace SIL.FieldWorks.Common.Keyboarding -{ - [TestFixture] - [Platform(Include="Linux", Reason="Linux specific tests")] - [SetUICulture("en-US")] - public class XklEngineTests: BaseTest - { - /// - /// Can be created and closed. Doesn't crash. - /// - [Test] - public void Basic() - { - var engine = new XklEngine(); - engine.Close(); - } - - /// - [Test] - public void UseAfterClose_NotCrash() - { - var engine = new XklEngine(); - engine.Close(); - engine.SetGroup(0); - } - - /// - [Test] - public void MultipleEngines_ClosedInReverseOrder_NotCrash() - { - var engine1 = new XklEngine(); - var engine2 = new XklEngine(); - engine2.Close(); - engine1.Close(); - } - - /// - [Test] - public void MultipleEngines_ClosedInOpenOrder_NotCrash() - { - var engine1 = new XklEngine(); - var engine2 = new XklEngine(); - engine1.Close(); - engine2.Close(); - } - - /// - [Test] - public void GetDisplayConnection() - { - var displayConnection = XklEngine.GetDisplayConnection(); - Assert.That(displayConnection, Is.Not.EqualTo(IntPtr.Zero), "Expected display connection"); - } - } -} -#endif diff --git a/Src/Common/Keyboarding/Linux/IbusKeyboardAdaptor.cs b/Src/Common/Keyboarding/Linux/IbusKeyboardAdaptor.cs deleted file mode 100644 index 477d498457..0000000000 --- a/Src/Common/Keyboarding/Linux/IbusKeyboardAdaptor.cs +++ /dev/null @@ -1,108 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -#if __MonoCS__ -using System; -using System.Collections.Generic; -using SIL.FieldWorks.Common.Keyboarding; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; -using SIL.FieldWorks.Views; - -namespace SIL.FieldWorks.Common.Keyboarding.Linux -{ - /// - /// Class for handling ibus keyboards on Linux. Currently just a wrapper for KeyboardSwitcher. - /// - /// TODO: Move functionality from KeyboardSwitcher to here. - public class IbusKeyboardAdaptor: IKeyboardAdaptor - { - private KeyboardSwitcher m_KeyboardSwitcher; - - /// - /// Initializes a new instance of the - /// class. - /// - public IbusKeyboardAdaptor() - { - } - - private void InitKeyboards() - { - var nKeyboards = m_KeyboardSwitcher.IMEKeyboardsCount; - for (int i = 0; i < nKeyboards; i++) - { - var name = m_KeyboardSwitcher.GetKeyboardName(i); - // REVIEW: what value should we pass as the locale name? - var keyboard = new KeyboardDescription(name, string.Empty, this, KeyboardType.OtherIm); - KeyboardController.Manager.RegisterKeyboard(keyboard); - } - } - - #region IKeyboardAdaptor implementation - /// - /// Initialize the installed keyboards - /// - public void Initialize() - { - m_KeyboardSwitcher = new KeyboardSwitcher(); - InitKeyboards(); - } - - /// - public void Close() - { - if (m_KeyboardSwitcher == null) - return; - - m_KeyboardSwitcher.Dispose(); - m_KeyboardSwitcher = null; - } - - public void ActivateKeyboard(IKeyboardDescription keyboard) - { - // TODO: implement - } - - /// - /// Activates the keyboard - /// - public void ActivateKeyboard(IKeyboardDescription keyboard, - IKeyboardDescription systemKeyboard) - { - // TODO: Remove once the other overload is implemented - m_KeyboardSwitcher.IMEKeyboard = keyboard.Name; - - if (systemKeyboard != null) - systemKeyboard.Activate(); - } - - /// - /// Deactivates the specified keyboard. - /// - public void DeactivateKeyboard(IKeyboardDescription keyboard) - { - m_KeyboardSwitcher.IMEKeyboard = null; - } - - /// - /// List of keyboard layouts that either gave an exception or other error trying to - /// get more information. We don't have enough information for these keyboard layouts - /// to include them in the list of installed keyboards. - /// - public List ErrorKeyboards - { - get - { - return new List(); - } - } - #endregion - } -} -#endif diff --git a/Src/Common/Keyboarding/Linux/IcuLocale.cs b/Src/Common/Keyboarding/Linux/IcuLocale.cs deleted file mode 100644 index 87a566ab8f..0000000000 --- a/Src/Common/Keyboarding/Linux/IcuLocale.cs +++ /dev/null @@ -1,66 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -#if __MonoCS__ -using System; -using SIL.FieldWorks.Common.COMInterfaces; - -namespace SIL.FieldWorks.Common.Keyboarding.Linux -{ - /// - /// This class represents an ICU locale. - /// - public class IcuLocale - { - /// - /// Gets or sets the identifier of the ICU locale. - /// - public string Id { get; private set; } - - /// - /// Gets the 3-letter ISO country code - /// - public string CountryCode { get; private set; } - - /// - /// Gets the 3-letter ISO 639-3 language code - /// - public string LanguageCode { get; private set; } - - /// - /// Gets the Windows locale identifier, or 0 if none defined. - /// - public int LCID { get; private set; } - - /// - /// Gets the country and language codes concatenated so that they can be used as a key. - /// - public string LanguageCountry - { - get - { - if (string.IsNullOrEmpty(CountryCode) && string.IsNullOrEmpty(LanguageCode)) - return string.Empty; - return LanguageCode + "_" + CountryCode; - } - } - - /// - /// Initializes a new instance of the - /// class. - /// - public IcuLocale(string localeId) - { - Id = localeId; - CountryCode = Icu.GetISO3Country(localeId); - LanguageCode = Icu.GetISO3Language(localeId); - LCID = Icu.GetLCID(localeId); - } - } -} -#endif diff --git a/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs b/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs deleted file mode 100644 index 74c717d9b8..0000000000 --- a/Src/Common/Keyboarding/Linux/LinuxKeyboardHelper.cs +++ /dev/null @@ -1,148 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -#if __MonoCS__ -using System; -using System.Drawing; -using System.Windows.Forms; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; - -namespace SIL.FieldWorks.Common.Keyboarding.Linux -{ - /// - /// Common keyboard event handling class for Linux (xkb and ibus) keyboards. - /// - public class LinuxKeyboardHelper: IKeyboardEventHandler, IKeyboardMethods - { - public LinuxKeyboardHelper() - { - } - - private void ActivateKeyboard(IKeyboardDescription keyboard) - { - keyboard.Activate(); - KeyboardController.ActiveKeyboard = keyboard; - } - -#region IKeyboardEventHandler implementation - /// - /// Called before a property gets updated. - /// - public bool OnUpdateProp(IKeyboardCallback callback) - { - return false; - } - - /// - /// Called when a mouse event happened. - /// - /// Returns true if the mouse event was handled, otherwise false. - /// - public bool OnMouseEvent(IKeyboardCallback callback, int xd, int yd, Rectangle rcSrc, - Rectangle rcDst, MouseEvent mouseEvent) - { - if (mouseEvent == MouseEvent.kmeDown) - ActivateKeyboard(callback.Keyboard); - return false; - } - - /// - /// Called when the layout of the view changes. - /// - public void OnLayoutChange(IKeyboardCallback callback) - { - } - - /// - /// Called when the selection changes. - /// - /// Corresponding C++ method is VwTextStore::OnSelChange. - public void OnSelectionChange(IKeyboardCallback callback, SelChangeType how) - { - } - - /// - /// Called when the text changes. - /// - /// Corresponding C++ method is VwTextStore::OnDocChange. - public void OnTextChange(IKeyboardCallback callback) - { - } - - /// - /// Activate the input method - /// - public void OnSetFocus(IKeyboardDescription keyboard, Control control) - { - ActivateKeyboard(keyboard); - } - - /// - /// Deactivate the input method - /// - public void OnKillFocus(IKeyboardDescription keyboard, Control control) - { - if (KeyboardController.ActiveKeyboard != null) - { - // REVIEW (JohnT): Are you sure this is enough not to disrupt other programs that - // may not attempt keyboard manipulation? I have a vague recollection of SimpleRootSite - // trying to keep track of the IME that is active for other programs and restore it. - KeyboardController.ActiveKeyboard.Deactivate(); - KeyboardController.ActiveKeyboard = new KeyboardDescriptionNull(); - } - } - -#endregion // IKeyboardEventHandler - -#region IKeyboardMethods implementation - /// - /// End all active compositions. - /// - public void TerminateAllCompositions(IKeyboardCallback callback) - { - } - - /// - /// Enables the input method. This gets called as part of VwRootBox::HandleActivate when - /// enabling a selection. - /// - public void EnableInput(IKeyboardCallback callback) - { - } - - /// - /// Disables the input method. This gets called as part of VwRootBox::HandleActivate when - /// disabling a selection. - /// - public void DisableInput(IKeyboardCallback callback) - { - } - - /// - /// Gets a value indicating whether a composition window is active. - /// - public bool IsCompositionActive(IKeyboardCallback callback) - { - return false; - } - - /// - /// Gets a value indicating if the input method is in the process of closing a composition - /// window. - /// - /// Corresponding C++ method is VwTextStore::IsDoingRecommit. - public bool IsEndingComposition(IKeyboardCallback callback) - { - return false; - } - -#endregion - } -} -#endif diff --git a/Src/Common/Keyboarding/Linux/X11.cs b/Src/Common/Keyboarding/Linux/X11.cs deleted file mode 100644 index c8068067b1..0000000000 --- a/Src/Common/Keyboarding/Linux/X11.cs +++ /dev/null @@ -1,28 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -#if __MonoCS__ -using System; -using System.Runtime.InteropServices; - -namespace X11 -{ - /// - /// Declarations of unmanaged X11 functions - /// - public static class Unmanaged - { - /// - [DllImport("libX11", EntryPoint="XOpenDisplay")] - public extern static IntPtr XOpenDisplay(IntPtr display); - /// - [DllImport("libX11", EntryPoint="XCloseDisplay")] - public extern static int XCloseDisplay(IntPtr display); - } -} -#endif diff --git a/Src/Common/Keyboarding/Linux/XkbKeyboardAdaptor.cs b/Src/Common/Keyboarding/Linux/XkbKeyboardAdaptor.cs deleted file mode 100644 index 95fae8b4b3..0000000000 --- a/Src/Common/Keyboarding/Linux/XkbKeyboardAdaptor.cs +++ /dev/null @@ -1,169 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -#if __MonoCS__ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using X11.XKlavier; -using SIL.FieldWorks.Common.COMInterfaces; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; - -namespace SIL.FieldWorks.Common.Keyboarding.Linux -{ - /// - /// Class for handling xkb keyboards on Linux - /// - internal class XkbKeyboardAdaptor: IKeyboardAdaptor - { - private static Type XklEngineType = typeof(XklEngine); - - private List m_BadLocales; - private XklEngine m_engine; - - /// - /// Sets the type of the XklEngine. This is useful for unit tests. - /// - internal static void SetXklEngineType() where T: XklEngine - { - XklEngineType = typeof(T); - } - - public XkbKeyboardAdaptor() - { - m_engine = Activator.CreateInstance(XklEngineType) as XklEngine; - } - - /// - /// Gets the IcuLocales by language and country. The 3-letter language and country codes - /// are concatenated with an underscore in between, e.g. fra_BEL - /// - private Dictionary IcuLocalesByLanguageCountry - { - get - { - var localesByLanguageCountry = new Dictionary(); - for (int i = 0; i < Icu.CountAvailableLocales(); i++) - { - var localeId = string.Copy(Icu.GetAvailableLocale(i)); - var icuLocale = new IcuLocale(localeId); - if (string.IsNullOrEmpty(icuLocale.LanguageCountry) || - localesByLanguageCountry.ContainsKey(icuLocale.LanguageCountry)) - { - continue; - } - localesByLanguageCountry[icuLocale.LanguageCountry] = icuLocale; - } - return localesByLanguageCountry; - } - } - - private void InitLocales() - { - if (m_BadLocales != null) - return; - - m_BadLocales = new List(); - - var configRegistry = XklConfigRegistry.Create(m_engine); - var layouts = configRegistry.Layouts; - //var icuLocales = IcuLocalesByLanguageCountry; - - for (int iGroup = 0; iGroup < m_engine.GroupNames.Length; iGroup++) - { - // a group in a xkb keyboard is a keyboard layout. This can be used with - // multiple languages - which language is ambigious. Here we just add all - // of them. - var groupName = m_engine.GroupNames[iGroup]; - List layoutList; - if (!layouts.TryGetValue(groupName, out layoutList)) - { - // No language in layouts uses the groupName keyboard layout. - m_BadLocales.Add(new KeyboardErrorDescription(groupName)); - continue; - } - - string unrecognizedLayout = null; - for (int iLayout = 0; iLayout < layoutList.Count; iLayout++) - { - var layout = layoutList[iLayout]; - string description; - if (string.IsNullOrEmpty(layout.LayoutVariant)) - description = string.Format("{0} ({1})", layout.Language, layout.Country); - else - { - description = string.Format("{0} ({1}) - {2}", layout.Language, - layout.Country, layout.LayoutVariant); - } - - // TODO: fix implementation without LCID - //IcuLocale icuLocale; - //int lcid; - //if (icuLocales.TryGetValue(layout.Locale, out icuLocale)) - // lcid = icuLocale.LCID; - //else - // lcid = Icu.GetLCID(layout.Locale); - - //if (lcid <= 0) - //{ - // if (iLayout == 0) - // unrecognizedLayout = groupName; - //} - //else - { - //// if we find the LCID for at least one layout, we don't report - //// the other failing variations of this layout as error. - unrecognizedLayout = null; - var keyboard = new XkbKeyboardDescription(description, layout.Locale, this, iGroup); - KeyboardController.Manager.RegisterKeyboard(keyboard); - } - } - if (unrecognizedLayout != null) - m_BadLocales.Add(new KeyboardErrorDescription(unrecognizedLayout)); - } - } - - public List ErrorKeyboards - { - get - { - InitLocales(); - return m_BadLocales; - } - } - - public void Initialize() - { - InitLocales(); - } - - public void Close() - { - m_engine.Close(); - m_engine = null; - } - - public void ActivateKeyboard(IKeyboardDescription keyboard) - { - Debug.Assert(keyboard is KeyboardDescription); - Debug.Assert(((KeyboardDescription)keyboard).Engine == this); - Debug.Assert(keyboard is XkbKeyboardDescription); - var xkbKeyboard = keyboard as XkbKeyboardDescription; - if (xkbKeyboard == null) - throw new ArgumentException(); - - m_engine.SetGroup(xkbKeyboard.GroupIndex); - } - - public void DeactivateKeyboard(IKeyboardDescription keyboard) - { - } - } -} -#endif diff --git a/Src/Common/Keyboarding/Linux/XkbKeyboardDescription.cs b/Src/Common/Keyboarding/Linux/XkbKeyboardDescription.cs deleted file mode 100644 index 39a5d8d4bc..0000000000 --- a/Src/Common/Keyboarding/Linux/XkbKeyboardDescription.cs +++ /dev/null @@ -1,41 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -#if __MonoCS__ -using System; -using SIL.FieldWorks.Common.Keyboarding; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; - -namespace SIL.FieldWorks.Common.Keyboarding.Linux -{ - /// - /// Keyboard description for a XKB keyboard layout. - /// - public class XkbKeyboardDescription: KeyboardDescription - { - /// - /// Initializes a new instance of the - /// class. - /// - /// Name of the keyboard layout - /// The locale of the keyboard - /// The keyboard adaptor that will handle this keyboard - /// The group index of this xkb keyboard - internal XkbKeyboardDescription(string name, string locale, IKeyboardAdaptor engine, - int groupIndex): base(name, locale, engine) - { - GroupIndex = groupIndex; - } - - /// - /// Gets the group index of this keyboard. - /// - public int GroupIndex { get; private set; } - } -} -#endif diff --git a/Src/Common/Keyboarding/Linux/XklConfigRegistry.cs b/Src/Common/Keyboarding/Linux/XklConfigRegistry.cs deleted file mode 100644 index 8363b7af37..0000000000 --- a/Src/Common/Keyboarding/Linux/XklConfigRegistry.cs +++ /dev/null @@ -1,276 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -#if __MonoCS__ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Runtime.InteropServices; -using SIL.FieldWorks.Common.COMInterfaces; - -namespace X11.XKlavier -{ - /// - /// Provides access to the xklavier XKB config registry methods which provide access to - /// the keyboard layouts. - /// - internal class XklConfigRegistry - { - #region struct LayoutDescription - /// - /// XKB keyboard layout description - /// - public struct LayoutDescription - { - /// - /// Gets or sets the layout identifier. - /// - /// The layout identifier consists of the layout name and variant, separated - /// by a tab character. Example: "us\tintl". - public string LayoutId { get; internal set; } - - /// - /// Gets or sets the description of the layout as found in XklConfigItem. It consists - /// of the country and the variant, separated by a hyphen. - /// Example:"USA - International". - /// - public string Description { get; internal set; } - - /// - /// Gets or sets the keyboard layout variant, e.g. "International". - /// - public string LayoutVariant { get; internal set; } - - /// - /// Gets the locale for the current layout. Language and country code are - /// separated by '-'. - /// - /// The ICU documentation says that the components should be separated by - /// an underscore, but that contradicts the way Windows does it. And ICU seems - /// to understand the '-' as well. - public string Locale - { - get { return LanguageCode + "-" + CountryCode; } - } - - - /// - /// Gets or sets the 2-letter language abbreviation (mostly ISO 639-1). - /// - public string LanguageCode { get; internal set;} - - /// - /// Gets the language name in the culture of the current thread - /// - public string Language - { - get - { - string language; - Icu.UErrorCode err; - Icu.GetDisplayLanguage(Locale, CultureInfo.CurrentUICulture.Name, - out language, out err); - return language; - } - } - - /// - /// Gets or sets the country code (mostly 2-letter codes). - /// - public string CountryCode { get; internal set; } - - /// - /// Gets the country name in the culture of the current thread - /// - public string Country - { - get - { - string country; - Icu.UErrorCode err; - Icu.GetDisplayCountry(Locale, CultureInfo.CurrentUICulture.Name, - out country, out err); - return country; - } - } - - public override string ToString() - { - return string.Format("[LayoutDescription: LayoutId={0}, Description={1}, " + - "LayoutVariant={2}, Locale={3}, LanguageCode={4}, Language={5}, " + - "CountryCode={6}, Country={7}]", LayoutId, Description, LayoutVariant, - Locale, LanguageCode, Language, CountryCode, Country); - } - } - #endregion - - #region Alternative language codes - // ICU uses the ISO 639-3 language codes; xkb has at least some ISO 639-2/B codes. - // According to http://en.wikipedia.org/wiki/ISO_639-2#B_and_T_codes there are 20 languages - // that have both B and T codes, so we need to translate those. - private static Dictionary s_AlternateLanguageCodes; - - private Dictionary AlternateLanguageCodes - { - get - { - if (s_AlternateLanguageCodes == null) - { - s_AlternateLanguageCodes = new Dictionary(); - s_AlternateLanguageCodes["alb"] = "sqi"; // Albanian - s_AlternateLanguageCodes["arm"] = "hye"; // Armenian - s_AlternateLanguageCodes["baq"] = "eus"; // Basque - s_AlternateLanguageCodes["bur"] = "mya"; // Burmese - s_AlternateLanguageCodes["chi"] = "zho"; // Chinese - s_AlternateLanguageCodes["cze"] = "ces"; // Czech - s_AlternateLanguageCodes["dut"] = "nld"; // Dutch, Flemish - s_AlternateLanguageCodes["fre"] = "fra"; // French - s_AlternateLanguageCodes["geo"] = "kat"; // Georgian - s_AlternateLanguageCodes["ger"] = "deu"; // German - s_AlternateLanguageCodes["gre"] = "ell"; // Modern Greek (1453–) - s_AlternateLanguageCodes["ice"] = "isl"; // Icelandic - s_AlternateLanguageCodes["mac"] = "mkd"; // Macedonian - s_AlternateLanguageCodes["mao"] = "mri"; // Maori - s_AlternateLanguageCodes["may"] = "msa"; // Malay - s_AlternateLanguageCodes["per"] = "fas"; // Persian - s_AlternateLanguageCodes["rum"] = "ron"; // Romanian - s_AlternateLanguageCodes["slo"] = "slk"; // Slovak - s_AlternateLanguageCodes["tib"] = "bod"; // Tibetan - s_AlternateLanguageCodes["wel"] = "cym"; // Welsh - } - return s_AlternateLanguageCodes; - } - } - #endregion - - private Dictionary> m_Layouts; - - public static XklConfigRegistry Create(XklEngine engine) - { - var configRegistry = xkl_config_registry_get_instance(engine.Engine); - if (!xkl_config_registry_load(configRegistry, true)) - throw new ApplicationException("Got error trying to load config registry: " + engine.LastError); - return new XklConfigRegistry(configRegistry); - } - - internal IntPtr ConfigRegistry { get; private set; } - - private XklConfigRegistry(IntPtr configRegistry) - { - ConfigRegistry = configRegistry; - } - - /// - /// Gets all possible keyboard layouts defined in the system (though not necessarily - /// installed). - /// - public Dictionary> Layouts - { - get - { - if (m_Layouts == null) - { - m_Layouts = new Dictionary>(); - xkl_config_registry_foreach_language(ConfigRegistry, - ProcessLanguage, IntPtr.Zero); - } - return m_Layouts; - } - } - - private string Get2LetterLanguageCode(string langCode3letter) - { - string newLangCode; - if (AlternateLanguageCodes.TryGetValue(langCode3letter, out newLangCode)) - langCode3letter = newLangCode; - return Icu.GetLanguageCode(langCode3letter); - } - - private void ProcessLanguage(IntPtr configRegistry, ref XklConfigItem item, IntPtr unused) - { - IntPtr dataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(item)); - Marshal.StructureToPtr(item, dataPtr, false); - xkl_config_registry_foreach_language_variant(configRegistry, item.Name, - ProcessOneLayoutForLanguage, dataPtr); - Marshal.FreeHGlobal(dataPtr); - } - - private void ProcessOneLayoutForLanguage(IntPtr configRegistry, ref XklConfigItem item, - ref XklConfigItem subitem, IntPtr data) - { - var subitemIsNull = subitem.Parent.RefCount == IntPtr.Zero; - XklConfigItem language = (XklConfigItem)Marshal.PtrToStructure(data, typeof(XklConfigItem)); - var description = subitemIsNull ? item.Description : - item.Description + " - " + subitem.Description; - List layouts; - if (m_Layouts.ContainsKey(description)) - layouts = m_Layouts[description]; - else - { - layouts = new List(); - m_Layouts[description] = layouts; - } - - var newLayout = new LayoutDescription { - LayoutId = subitemIsNull ? item.Name : item.Name + "\t" + subitem.Name, - Description = description, - LayoutVariant = subitemIsNull ? string.Empty : subitem.Description, - LanguageCode = Get2LetterLanguageCode(language.Name), - CountryCode = item.Name.ToUpper() - }; - layouts.Add(newLayout); - } - - #region p/invoke related - [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] - private struct XklConfigItem - { - private const int XKL_MAX_CI_NAME_LENGTH = 32; - private const int XKL_MAX_CI_SHORT_DESC_LENGTH = 10; - private const int XKL_MAX_CI_DESC_LENGTH = 192; - - [StructLayout(LayoutKind.Sequential)] - public struct GObject - { - public IntPtr Class; - public IntPtr RefCount; - public IntPtr Data; - } - - public GObject Parent; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst=XKL_MAX_CI_NAME_LENGTH)] - public string Name; - // Setting the length to XKL_MAX_CI_DESC_LENGTH looks like a bug in the header file - // (/usr/include/libxklavier/xkl_config_item.h) - [MarshalAs(UnmanagedType.ByValTStr, SizeConst=XKL_MAX_CI_DESC_LENGTH)] - public string Short_Description; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst=XKL_MAX_CI_DESC_LENGTH)] - public string Description; - } - - private delegate void ConfigItemProcessFunc(IntPtr configRegistry, ref XklConfigItem item, IntPtr data); - private delegate void TwoConfigItemsProcessFunc(IntPtr configRegistry, - ref XklConfigItem item, ref XklConfigItem subitem, IntPtr data); - - [DllImport("libxklavier")] - private extern static IntPtr xkl_config_registry_get_instance(IntPtr engine); - - [DllImport("libxklavier")] - private extern static bool xkl_config_registry_load(IntPtr configRegistry, bool fExtrasNeeded); - - [DllImport("libxklavier")] - private extern static void xkl_config_registry_foreach_language(IntPtr configRegistry, - ConfigItemProcessFunc func, IntPtr data); - - [DllImport("libxklavier")] - private extern static void xkl_config_registry_foreach_language_variant(IntPtr configRegistry, - string languageCode, TwoConfigItemsProcessFunc func, IntPtr data); - #endregion - } -} -#endif diff --git a/Src/Common/Keyboarding/Linux/XklEngine.cs b/Src/Common/Keyboarding/Linux/XklEngine.cs deleted file mode 100644 index 2909762e91..0000000000 --- a/Src/Common/Keyboarding/Linux/XklEngine.cs +++ /dev/null @@ -1,218 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- - -#if __MonoCS__ -using System; -using System.Diagnostics; -using System.Reflection; -using System.Runtime.InteropServices; -using SIL.Utils; - -namespace X11.XKlavier -{ - /// - /// Provides access to the xklavier XKB keyboarding engine methods. - /// - internal class XklEngine - { - private struct XklState - { - public int Group; - public int Indicators; - } - - private string[] m_GroupNames; - - public XklEngine() - { - var display = GetDisplayConnection(); - Engine = xkl_engine_get_instance(display); - } - - public XklEngine(IntPtr display) - { - Engine = xkl_engine_get_instance(display); - } - - /// - /// Gets the X11 display connection that Mono already has open, rather than - /// carefully opening and closing it on our own in a way that doesnt crash (FWNX-895). - /// - internal static IntPtr GetDisplayConnection() - { - // When running views tests that get to this code from C++ through libcom, using - // reflection to load the SWF assembly has trouble finding it unless first access - // SWF without reflection or load it from a more specific path. - - // DisplayHandle is a static field but won't be initialized until a XplatUIX11 is constructed. - // Although a XplatUIX11 is already constructed when - // running Flex, it is not already constructed when running unit tests. So make sure - // it is constructed before requesting DisplayHandle so DisplayHandle is initialized. - var swfAssembly = Assembly.GetAssembly(typeof(System.Windows.Forms.Form)); - var xplatuix11Type = swfAssembly.GetType("System.Windows.Forms.XplatUIX11"); - xplatuix11Type.GetMethod("GetInstance", BindingFlags.Static | BindingFlags.Public).Invoke(null, null); - - var displayHandleField = xplatuix11Type.GetField("DisplayHandle", BindingFlags.Static | BindingFlags.NonPublic); - var displayHandleValue = displayHandleField.GetValue(null); - var displayConnection = (IntPtr)displayHandleValue; - - Debug.Assert(displayConnection != IntPtr.Zero, "Expected to have a handle on X11 display connection."); - return displayConnection; - } - - public void Close() - { - } - - internal IntPtr Engine { get; private set; } - - public string Name - { - get - { - var name = xkl_engine_get_backend_name(Engine); - return Marshal.PtrToStringAuto(name); - } - } - - public int NumGroups - { - get { return xkl_engine_get_num_groups(Engine); } - } - - public virtual string[] GroupNames - { - get - { - if (m_GroupNames == null) - { - int count = NumGroups; - var names = xkl_engine_get_groups_names(Engine); - var namePtrs = new IntPtr[count]; - Marshal.Copy(names, namePtrs, 0, count); - m_GroupNames = new string[count]; - for (int i = 0; i < count; i++) - { - m_GroupNames[i] = Marshal.PtrToStringAuto(namePtrs[i]); - } - } - return m_GroupNames; - } - } - - public int NextGroup - { - get { return xkl_engine_get_next_group(Engine); } - } - - public int PrevGroup - { - get { return xkl_engine_get_prev_group(Engine); } - } - - public int CurrentWindowGroup - { - get { return xkl_engine_get_current_window_group(Engine); } - } - - public int DefaultGroup - { - get { return xkl_engine_get_default_group(Engine); } - set { xkl_engine_set_default_group(Engine, value); } - } - - public void SetGroup(int grp) - { - xkl_engine_lock_group(Engine, grp); - } - - public void SetToplevelWindowGroup(bool fGlobal) - { - xkl_engine_set_group_per_toplevel_window(Engine, fGlobal); - } - - public bool IsToplevelWindowGroup - { - get { return xkl_engine_is_group_per_toplevel_window(Engine); } - } - - public int CurrentState - { - get - { - var statePtr = xkl_engine_get_current_state(Engine); - var state = (XklState)Marshal.PtrToStructure(statePtr, typeof(XklState)); - return state.Group; - } - } - - public int CurrentWindowState - { - get - { - var window = xkl_engine_get_current_window(Engine); - IntPtr statePtr; - if (xkl_engine_get_state(Engine, window, statePtr)) - { - var state = (XklState)Marshal.PtrToStructure(statePtr, typeof(XklState)); - return state.Group; - } - return -1; - } - } - - public string LastError - { - get - { - var error = xkl_get_last_error(); - return Marshal.PtrToStringAuto(error); - } - } - - // from libXKlavier - [DllImport("libxklavier")] - private extern static IntPtr xkl_engine_get_instance(IntPtr display); - - [DllImport("libxklavier")] - private extern static IntPtr xkl_engine_get_backend_name(IntPtr engine); - - [DllImport("libxklavier")] - private extern static int xkl_engine_get_num_groups(IntPtr engine); - - [DllImport("libxklavier")] - private extern static IntPtr xkl_engine_get_groups_names(IntPtr engine); - - [DllImport("libxklavier")] - private extern static int xkl_engine_get_next_group(IntPtr engine); - [DllImport("libxklavier")] - private extern static int xkl_engine_get_prev_group(IntPtr engine); - [DllImport("libxklavier")] - private extern static int xkl_engine_get_current_window_group(IntPtr engine); - [DllImport("libxklavier")] - private extern static void xkl_engine_lock_group(IntPtr engine, int grp); - [DllImport("libxklavier")] - private extern static int xkl_engine_get_default_group(IntPtr engine); - [DllImport("libxklavier")] - private extern static void xkl_engine_set_default_group(IntPtr engine, int grp); - [DllImport("libxklavier")] - private extern static void xkl_engine_set_group_per_toplevel_window(IntPtr engine, bool isGlobal); - [DllImport("libxklavier")] - private extern static bool xkl_engine_is_group_per_toplevel_window(IntPtr engine); - [DllImport("libxklavier")] - private extern static IntPtr xkl_engine_get_current_state(IntPtr engine); - [DllImport("libxklavier")] - private extern static IntPtr xkl_engine_get_current_window(IntPtr engine); - [DllImport("libxklavier")] - private extern static bool xkl_engine_get_state(IntPtr engine, IntPtr win, IntPtr state_out); - [DllImport("libxklavier")] - private extern static IntPtr xkl_get_last_error(); - } -} -#endif diff --git a/Src/Common/Keyboarding/Types/MouseEvent.cs b/Src/Common/Keyboarding/Types/MouseEvent.cs deleted file mode 100644 index be9d014bbd..0000000000 --- a/Src/Common/Keyboarding/Types/MouseEvent.cs +++ /dev/null @@ -1,30 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2012, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -using System; - -namespace SIL.FieldWorks.Common.Keyboarding -{ - /// - /// Mouse event type - /// - /// Keep in sync with VwMouseEvent - public enum MouseEvent - { - /// - kmeDown, - /// - kmeDblClick, - /// - kmeMoveDrag, - /// - kmeExtend, - /// - kmeUp - } -} diff --git a/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs b/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs deleted file mode 100644 index e48fa393dc..0000000000 --- a/Src/Common/Keyboarding/Windows/WinKeyboardAdaptor.cs +++ /dev/null @@ -1,335 +0,0 @@ -// -------------------------------------------------------------------------------------------- -// -// Copyright (c) 2011, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// -------------------------------------------------------------------------------------------- -#if !__MonoCS__ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Linq; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using Microsoft.Win32; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; -using SIL.Utils; - -namespace SIL.FieldWorks.Common.Keyboarding.Windows -{ - /// - /// Class for handling Windows system keyboards - /// - [SuppressMessage("Gendarme.Rules.Design", "TypesWithDisposableFieldsShouldBeDisposableRule", - Justification = "m_Timer gets disposed in Close() which gets called from KeyboardControllerImpl.Dispose")] - internal class WinKeyboardAdaptor: IKeyboardAdaptor - { - private List m_BadLocales; - private Timer m_Timer; - private InputLanguage m_ExpectedInputLanguage; - private WinKeyboardDescription m_ExpectedKeyboard; - private bool m_fSwitchedLanguages; - - private void GetLocales() - { - m_BadLocales = new List(); - // ENHANCE: For "Chinese (Simplified, PRC)" we always get back - // "Chinese (Simplified) - US Keyboard" no matter what IME the - // user added in the system settings. And it's reported only once - // even when the user adds multiple IMEs. - foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages) - { - // NOTE: InputLanguage.LayoutName has a bug in that it always returns the name - // of the first layout even when a culture has multiple layouts assigned. - // Therefore we use GetLayoutNameEx to retrieve the information from the registry. - var layoutName = GetLayoutNameEx(lang.Handle); - //var cultureId = string.Format("{0:X4}", (int)(lang.Handle) & 0xFFFF); - string displayName; - string locale; - try - { - displayName = lang.Culture.DisplayName; - locale = lang.Culture.Name; - } - catch (CultureNotFoundException) - { - // we get an exception for non-supported cultures, probably because of a - // badly applied .NET patch. - // http://www.ironspeed.com/Designer/3.2.4/WebHelp/Part_VI/Culture_ID__XXX__is_not_a_supported_culture.htm and others - displayName = "[Unknown Language]"; - locale = "en-US"; - } - KeyboardController.Manager.RegisterKeyboard(new WinKeyboardDescription( - GetDisplayName(displayName, layoutName), locale, this, - (int)lang.Handle)); - } - } - - private static string GetDisplayName(string cultureName, string layoutName) - { - return string.Format("{1} - {0}", cultureName, layoutName); - } - - private string GetLayoutNameEx(IntPtr handle) - { - // InputLanguage.LayoutName is not to be trusted, especially where there are mutiple - // layouts (input methods) associated with a language. This function also provides - // the additional benefit that it does not matter whether a user switches from using - // InKey in Portable mode to using it in Installed mode (perhaps as the project is - // moved from one computer to another), as this function will identify the correct - // input language regardless, rather than (unhelpfully ) calling an InKey layout in - // portable mode the "US" layout. The layout is identified soley by the high-word of - // the HKL (a.k.a. InputLanguage.Handle). (The low word of the HKL identifies the - // language.) - // This function determines an HKL's LayoutName based on the following order of - // precedence: - // - Look up HKL in HKCU\\Software\\InKey\\SubstituteLayoutNames - // - Look up basic (non-extended) layout in HKLM\\SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts - // -Scan for ID of extended layout in HKLM\\SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts - var hkl = string.Format("{0:X8}", (int)handle); - var layoutName = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Software\InKey\SubstituteLayoutNames", hkl, null); - if (!string.IsNullOrEmpty(layoutName)) - return layoutName; - - layoutName = (string)Registry.GetValue(string.Concat(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\0000", - hkl.Substring(0, 4)), "Layout Text", null); - - if (!string.IsNullOrEmpty(layoutName)) - return layoutName; - - using (var regKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Keyboard Layouts")) - { - string layoutId = "0" + hkl.Substring(1, 3); - foreach (string subKeyName in regKey.GetSubKeyNames().Reverse()) // Scan in reverse order for efficiency, as the extended layouts are at the end. - { - using (var klid = regKey.OpenSubKey(subKeyName)) - { - if (((string)klid.GetValue("Layout ID")).Equals(layoutId, StringComparison.InvariantCultureIgnoreCase)) - return (string)klid.GetValue("Layout Text"); - } - } - } - - return null; - } - - /// - /// Gets the InputLanguage that has the same layout as . - /// - private InputLanguage GetInputLanguage(IKeyboardDescription keyboardDescription) - { - InputLanguage sameLayout = null; - InputLanguage sameCulture = null; - foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages) - { - // TODO: write some tests - try - { - if (GetLayoutNameEx(lang.Handle) == keyboardDescription.Name) - { - if (keyboardDescription.Locale == lang.Culture.Name) - return lang; - if (sameLayout == null) - sameLayout = lang; - } - else if (keyboardDescription.Locale == lang.Culture.Name && sameCulture == null) - sameCulture = lang; - } - catch (CultureNotFoundException) - { - // we get an exception for non-supported cultures, probably because of a - // badly applied .NET patch. - // http://www.ironspeed.com/Designer/3.2.4/WebHelp/Part_VI/Culture_ID__XXX__is_not_a_supported_culture.htm and others - } - } - return sameLayout ?? sameCulture; - } - - /// - /// Gets the keyboard description for the layout of . - /// - private WinKeyboardDescription GetKeyboardDescription(InputLanguage inputLanguage) - { - WinKeyboardDescription sameLayout = null; - WinKeyboardDescription sameCulture = null; - // TODO: write some tests - foreach (WinKeyboardDescription keyboardDescription in KeyboardController.InstalledKeyboards) - { - try - { - if (GetLayoutNameEx(inputLanguage.Handle) == keyboardDescription.Name) - { - if (keyboardDescription.Locale == inputLanguage.Culture.Name) - return keyboardDescription; - if (sameLayout == null) - sameLayout = keyboardDescription; - } - else if (keyboardDescription.Locale == inputLanguage.Culture.Name && sameCulture == null) - sameCulture = keyboardDescription; - } - catch (CultureNotFoundException) - { - // we get an exception for non-supported cultures, probably because of a - // badly applied .NET patch. - // http://www.ironspeed.com/Designer/3.2.4/WebHelp/Part_VI/Culture_ID__XXX__is_not_a_supported_culture.htm and others - } - } - return sameLayout ?? sameCulture; - } - - private void OnTimerTick(object sender, EventArgs eventArgs) - { - if (m_ExpectedInputLanguage == null || m_ExpectedKeyboard == null) - return; - - if (!m_fSwitchedLanguages) - { - m_Timer.Enabled = false; - return; - } - - if (InputLanguage.CurrentInputLanguage.Handle == m_ExpectedInputLanguage.Handle) - { - m_ExpectedInputLanguage = null; - m_ExpectedKeyboard = null; - m_fSwitchedLanguages = false; - return; - } - - SwitchKeyboard(m_ExpectedKeyboard, m_ExpectedInputLanguage); - } - - private void SwitchKeyboard(WinKeyboardDescription winKeyboard, InputLanguage inputLanguage) - { - m_ExpectedKeyboard = winKeyboard; - m_ExpectedInputLanguage = inputLanguage; - try - { - InputLanguage.CurrentInputLanguage = inputLanguage; - } - catch (ArgumentException) - { - // throws exception for non-supported culture, though seems to set it OK. - } - - KeyboardController.ActiveKeyboard = winKeyboard; - - // The following two lines help to work around a Windows bug (happens at least on - // XP-SP3): When you set the current input language (by any method), if there is more - // than one loaded input language associated with that same culture, Windows may - // initially go along with your request, and even respond to an immediate query of - // the current input language with the answer you expect. However, within a fraction - // of a second, it often takes the initiative to again change the input language to - // the _other_ input language having that same culture. We check that the proper - // input language gets set by enabling a timer so that we can re-set the input - // language if necessary. - m_fSwitchedLanguages = true; - // stop timer first so that the 0.5s interval restarts. - m_Timer.Stop(); - m_Timer.Start(); - } - - #region IKeyboardAdaptor Members - [SuppressMessage("Gendarme.Rules.Correctness", "EnsureLocalDisposalRule", - Justification = "m_Timer gets disposed in Close() which gets called from KeyboardControllerImpl.Dispose")] - public void Initialize() - { - m_Timer = new Timer { Interval = 500 }; - m_Timer.Tick += OnTimerTick; - - GetLocales(); - - // Form.ActiveForm can be null when running unit tests - if (Form.ActiveForm != null) - Form.ActiveForm.InputLanguageChanged += ActiveFormOnInputLanguageChanged; - } - - /// - /// Save the state of the conversion and sentence mode for the current IME - /// so that we can restore it later. - /// - private void SaveImeConversionStatus(WinKeyboardDescription winKeyboard) - { - if (winKeyboard == null) - return; - - var windowHandle = new HandleRef(this, - winKeyboard.WindowHandle != IntPtr.Zero ? winKeyboard.WindowHandle : Win32.GetFocus()); - var contextPtr = Win32.ImmGetContext(windowHandle); - if (contextPtr == IntPtr.Zero) - return; - - var contextHandle = new HandleRef(this, contextPtr); - int conversionMode; - int sentenceMode; - Win32.ImmGetConversionStatus(contextHandle, out conversionMode, out sentenceMode); - winKeyboard.ConversionMode = conversionMode; - winKeyboard.SentenceMode = sentenceMode; - Win32.ImmReleaseContext(windowHandle, contextHandle); - } - - /// - /// Restore the conversion and sentence mode to the states they had last time - /// we activated this keyboard (unless we never activated this keyboard since the app - /// got started, in which case we use sensible default values). - /// - private void RestoreImeConversionStatus(WinKeyboardDescription winKeyboard) - { - if (winKeyboard == null) - return; - - // Restore the state of the new keyboard to the previous value. If we don't do - // that e.g. in Chinese IME the input mode will toggle between English and - // Chinese (LT-7487 et al). - var windowPtr = winKeyboard.WindowHandle != IntPtr.Zero ? winKeyboard.WindowHandle : Win32.GetFocus(); - var windowHandle = new HandleRef(this, windowPtr); - var contextPtr = Win32.ImmGetContext(windowHandle); - if (contextPtr == IntPtr.Zero) - return; - - var contextHandle = new HandleRef(this, contextPtr); - Win32.ImmSetConversionStatus(contextHandle, winKeyboard.ConversionMode, winKeyboard.SentenceMode); - Win32.ImmReleaseContext(windowHandle, contextHandle); - winKeyboard.WindowHandle = windowPtr; - } - - private void ActiveFormOnInputLanguageChanged(object sender, InputLanguageChangedEventArgs inputLanguageChangedEventArgs) - { - RestoreImeConversionStatus(GetKeyboardDescription(inputLanguageChangedEventArgs.InputLanguage)); - } - - public void Close() - { - if (m_Timer != null) - { - m_Timer.Dispose(); - m_Timer = null; - } - } - - public List ErrorKeyboards - { - get { return m_BadLocales; } - } - - public void ActivateKeyboard(IKeyboardDescription keyboard) - { - SwitchKeyboard(keyboard as WinKeyboardDescription, GetInputLanguage(keyboard)); - } - - public void DeactivateKeyboard(IKeyboardDescription keyboard) - { - var winKeyboard = keyboard as WinKeyboardDescription; - Debug.Assert(winKeyboard != null); - - SaveImeConversionStatus(winKeyboard); - } - #endregion - } -} -#endif diff --git a/Src/Common/Keyboarding/gendarme-Keyboarding.ignore b/Src/Common/Keyboarding/gendarme-Keyboarding.ignore deleted file mode 100644 index a0410c1407..0000000000 --- a/Src/Common/Keyboarding/gendarme-Keyboarding.ignore +++ /dev/null @@ -1,14 +0,0 @@ -# Gendarme filter file to suppress reporting of defects - -#----------------------------------------------------------------------------------------------- -R: Gendarme.Rules.Design.TypesWithDisposableFieldsShouldBeDisposableRule - -# m_KeyboadSwitcher gets disposed in Close() which in turn gets called from KeyboardControllerImpl.Dispose -T: SIL.FieldWorks.Common.Keyboarding.Linux.IbusKeyboardAdaptor - -#----------------------------------------------------------------------------------------------- -R: Gendarme.Rules.Design.TypesWithNativeFieldsShouldBeDisposableRule - -# No need to release XklConfigRegistry or XklEngine -T: X11.XKlavier.XklConfigRegistry -T: X11.XKlavier.XklEngine diff --git a/Src/Common/PrintLayout/PrintLayoutTests/PublicationControlTests.cs b/Src/Common/PrintLayout/PrintLayoutTests/PublicationControlTests.cs index 2e9bd5aa5f..4dccaf7063 100644 --- a/Src/Common/PrintLayout/PrintLayoutTests/PublicationControlTests.cs +++ b/Src/Common/PrintLayout/PrintLayoutTests/PublicationControlTests.cs @@ -339,11 +339,6 @@ public void Serialize(System.Runtime.InteropServices.ComTypes.IStream _strm) throw new NotImplementedException("The method or operation is not implemented."); } - public void SetKeyboardForWs(ILgWritingSystem _ws, ref string _bstrActiveKeymanKbd, ref int _nActiveLangId, ref int _hklActive, ref bool _fSelectLangPending) - { - throw new NotImplementedException("The method or operation is not implemented."); - } - public void SetRootObject(int hvo, IVwViewConstructor _vwvc, int frag, IVwStylesheet _ss) { throw new NotImplementedException("The method or operation is not implemented."); diff --git a/Src/Common/RootSite/RootSite.cs b/Src/Common/RootSite/RootSite.cs index 8bbdb204f1..e59121fb64 100644 --- a/Src/Common/RootSite/RootSite.cs +++ b/Src/Common/RootSite/RootSite.cs @@ -33,6 +33,7 @@ using System.Runtime.InteropServices; using System.Windows.Automation.Provider; using System.Windows.Forms; +using Palaso.WritingSystems; using SIL.CoreImpl; using SIL.FieldWorks.Common.COMInterfaces; using SIL.FieldWorks.Common.FwUtils; @@ -237,6 +238,14 @@ public override bool InSelectionChanged set { s_fInSelectionChanged = value; } } + /// + /// With access to the cache, we can limit this to writing sytems the user might plausibly want for this project. + /// + protected override IWritingSystemDefinition[] PlausibleWritingSystems + { + get { return m_fdoCache.ServiceLocator.WritingSystems.AllWritingSystems.Cast().ToArray(); } + } + /// ------------------------------------------------------------------------------------ /// /// Creates a new RootSiteEditingHelper used for processing editing requests. diff --git a/Src/Common/RootSite/RootSite.csproj b/Src/Common/RootSite/RootSite.csproj index 8c57ed0f5f..dde1120a7e 100644 --- a/Src/Common/RootSite/RootSite.csproj +++ b/Src/Common/RootSite/RootSite.csproj @@ -142,7 +142,7 @@ False - ..\..\..\Output\Debug\Palaso.dll + ..\..\..\Downloads\Palaso.dll False diff --git a/Src/Common/SimpleRootSite/EditingHelper.cs b/Src/Common/SimpleRootSite/EditingHelper.cs index d842659a2f..208206ba8e 100644 --- a/Src/Common/SimpleRootSite/EditingHelper.cs +++ b/Src/Common/SimpleRootSite/EditingHelper.cs @@ -16,10 +16,10 @@ using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; +using Palaso.UI.WindowsForms.Keyboarding; +using Palaso.WritingSystems; using SIL.CoreImpl; using SIL.FieldWorks.Common.COMInterfaces; -using SIL.FieldWorks.Common.Keyboarding; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; using SIL.FieldWorks.Common.RootSites.Properties; using SIL.Utils; @@ -915,8 +915,7 @@ protected void CollectTypedInput(char chsFirst, StringBuilder buffer) // We need to disable type-ahead when using a Keyman keyboard since it can // mess with the keyboard functionality. (FWR-2205) - var keyboard = KeyboardController.ActiveKeyboard; - if (Control == null || (keyboard != null && keyboard.Type == KeyboardType.OtherIm)) + if (Control == null || KeyboardHelper.ActiveKeymanKeyboard != string.Empty) return; // Collect any characters that are currently in the message queue @@ -2934,7 +2933,9 @@ protected void SetKeyboardForWs(ILgWritingSystem ws) try { - KeyboardController.SetKeyboard(ws as IWritingSystem); + var palasoWs = ((IWritingSystemManager)WritingSystemFactory).Get(ws.Handle) as IWritingSystemDefinition; + if (palasoWs != null && palasoWs.LocalKeyboard != null) + palasoWs.LocalKeyboard.Activate(); } catch { @@ -2998,10 +2999,7 @@ public void SetKeyboardForSelection(IVwSelection vwsel) /// ------------------------------------------------------------------------------------ private void ActivateDefaultKeyboard() { - InputLanguage inputLng = InputLanguage.DefaultInputLanguage; - Debug.Assert(inputLng != null); - - KeyboardController.SetKeyboard(inputLng.LayoutName); + Keyboard.Controller.ActivateDefaultKeyboard(); } /// diff --git a/Src/Common/SimpleRootSite/IBusCommunicator.cs b/Src/Common/SimpleRootSite/IBusCommunicator.cs index e29570670d..21eea4f1cb 100644 --- a/Src/Common/SimpleRootSite/IBusCommunicator.cs +++ b/Src/Common/SimpleRootSite/IBusCommunicator.cs @@ -135,7 +135,8 @@ public void FocusIn() ProtectedIBusInvoke(() => m_inputContext.FocusIn()); // For performance reasons we store the active inputContext - SIL.FieldWorks.Views.GlobalCachedInputContext.InputContext = m_inputContext; + // TODO: re-enable + //SIL.FieldWorks.Views.GlobalCachedInputContext.InputContext = m_inputContext; } /// @@ -148,7 +149,8 @@ public void FocusOut() ProtectedIBusInvoke(() => m_inputContext.FocusOut()); - SIL.FieldWorks.Views.GlobalCachedInputContext.Clear(); + // TODO: re-enable + //SIL.FieldWorks.Views.GlobalCachedInputContext.Clear(); } /// diff --git a/Src/Common/SimpleRootSite/SimpleRootSite.cs b/Src/Common/SimpleRootSite/SimpleRootSite.cs index 3247473948..e9f70a404f 100644 --- a/Src/Common/SimpleRootSite/SimpleRootSite.cs +++ b/Src/Common/SimpleRootSite/SimpleRootSite.cs @@ -18,14 +18,15 @@ using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Drawing.Printing; +using System.Linq; using System.Runtime.InteropServices; using System.Windows.Forms; using System.Windows.Automation.Provider; using Accessibility; - +using Palaso.WritingSystems; +using Palaso.UI.WindowsForms.Keyboarding.Types; using SIL.CoreImpl; using SIL.FieldWorks.Common.COMInterfaces; -using SIL.FieldWorks.Common.Keyboarding; using SIL.Utils; using XCore; @@ -2001,7 +2002,7 @@ public bool AllowPainting if (m_nAllowPaint == 0 && Visible && IsHandleCreated) { #if !__MonoCS__ - Win32.SendMessage(Handle, (int)Win32.WinMsgs.WM_SETREDRAW, 1, 0); + Utils.Win32.SendMessage(Handle, (int)Utils.Win32.WinMsgs.WM_SETREDRAW, 1, 0); Update(); Invalidate(); #else @@ -2020,7 +2021,7 @@ public bool AllowPainting { // prevent painting if (m_nAllowPaint == 0 && Visible && IsHandleCreated) #if !__MonoCS__ - Win32.SendMessage(Handle, (int)Win32.WinMsgs.WM_SETREDRAW, 0, 0); + Utils.Win32.SendMessage(Handle, (int)Utils.Win32.WinMsgs.WM_SETREDRAW, 0, 0); #else this.SuspendLayout(); #endif @@ -3308,18 +3309,18 @@ protected void OnSetFocus(Message m) // we must not. // (Note: setting a WS by setting the Keyman keyboard is still not working, because // it seems .NET applications don't get the notification from Keyman.) -//#if !__MonoCS__ -// IntPtr hwndOld = m.WParam; -// int procIdOld, procIdThis; -// Win32.GetWindowThreadProcessId(hwndOld, out procIdOld); -// Win32.GetWindowThreadProcessId(Handle, out procIdThis); -// if (procIdOld == procIdThis && m_rootb != null && EditingHelper != null) -// EditingHelper.SetKeyboardForSelection(m_rootb.Selection); -//#else -// // REVIEW: do we have to compare the process the old and new window belongs to? -// if (m_rootb != null && EditingHelper != null) -// EditingHelper.SetKeyboardForSelection(m_rootb.Selection); -//#endif +#if !__MonoCS__ + IntPtr hwndOld = m.WParam; + int procIdOld, procIdThis; + Utils.Win32.GetWindowThreadProcessId(hwndOld, out procIdOld); + Utils.Win32.GetWindowThreadProcessId(Handle, out procIdThis); + if (procIdOld == procIdThis && m_rootb != null && EditingHelper != null) + EditingHelper.SetKeyboardForSelection(m_rootb.Selection); +#else + // REVIEW: do we have to compare the process the old and new window belongs to? + if (m_rootb != null && EditingHelper != null) + EditingHelper.SetKeyboardForSelection(m_rootb.Selection); +#endif // Start the blinking cursor timer here and stop it in the OnKillFocus handler later. if (m_Timer != null) @@ -4879,6 +4880,20 @@ protected virtual void CallMouseUp(Point pt, Rectangle rcSrcRoot, Rectangle rcDs #endregion // Methods that delegate events to the rootbox + /// + /// Writing systems the user might reasonably choose. Overridden in RootSite to limit it to the ones active in this project. + /// + protected virtual IWritingSystemDefinition[] PlausibleWritingSystems + { + get + { + var manager = (WritingSystemFactory as PalasoWritingSystemManager); + if (manager == null) + return new IWritingSystemDefinition[0]; + return manager.LocalWritingSystemStore.AllWritingSystems.ToArray(); + } + } + /// ----------------------------------------------------------------------------------- /// /// The system keyboard has changed. Determine the corresponding codepage to use when @@ -4894,6 +4909,9 @@ protected virtual void OnInputLangChanged(object sender, InputLanguageChangedEve if (IsDisposed || m_rootb == null || DataUpdateMonitor.IsUpdateInProgress()) return; + var manager = WritingSystemFactory as PalasoWritingSystemManager; + if (manager == null) + return; //Debug.WriteLine(string.Format("OnInputLangChanged: Handle={2}, g_focusRootSite={0}, culture={1}", // g_focusRootSite.Target, e.InputLanguage.Culture.ToString(), Handle)); // JT: apparently this comes to all the views, but only the active keyboard @@ -4902,26 +4920,22 @@ protected virtual void OnInputLangChanged(object sender, InputLanguageChangedEve // Responding before that causes a nasty bug in language/keyboard selection. // SMc: also, we trust the lcid derived from vwsel more than we trust the one // passed in as e.CultureInfo.LCID. - if (this.Focused && g_focusRootSite.Target == this) + var wsRepo = manager.LocalWritingSystemStore; + if (this.Focused && g_focusRootSite.Target == this && wsRepo != null) { // If possible, adjust the language of the selection to be one that matches // the keyboard just selected. - IVwSelection vwsel = m_rootb.Selection; - int lcid = LcidHelper.LangIdFromLCID(e.Culture.LCID); - // Since we're being told it changed, assume this really is current, as opposed - // to whatever we last set it to. - if (m_fHandlingOnGotFocus) - { - int wsSel = SelectionHelper.GetFirstWsOfSelection(vwsel); - if (wsSel != 0) - { - ILgWritingSystem qws = WritingSystemFactory.get_EngineOrNull(wsSel); - if (qws != null) - lcid = qws.LCID; - } - } - HandleKeyboardChange(vwsel, (short)lcid); + IVwSelection vwsel = m_rootb.Selection; // may be null + int wsSel = SelectionHelper.GetFirstWsOfSelection(vwsel); // may be zero + IWritingSystemDefinition wsSelDefn = null; + if (wsSel != 0) + wsSelDefn = manager.Get(wsSel) as IWritingSystemDefinition; + var wsNewDefn = wsRepo.GetWsForInputLanguage(e.InputLanguage.LayoutName, e.InputLanguage.Culture, wsSelDefn, PlausibleWritingSystems); + if (wsNewDefn == null || wsNewDefn.Equals(wsSelDefn)) + return; + + HandleKeyboardChange(vwsel, ((PalasoWritingSystem)wsNewDefn).Handle); // The following line is needed to get Chinese IMEs to fully initialize. // This causes Text Services to set its focus, which is the crucial bit @@ -4945,114 +4959,15 @@ protected virtual void OnInputLangChanged(object sender, InputLanguageChangedEve /// the selection to something that matches, if possible. /// /// Selection - /// Language identification + /// Writing system determined from keyboard change /// ----------------------------------------------------------------------------------- - public virtual void HandleKeyboardChange(IVwSelection vwsel, short nLangId) + public virtual void HandleKeyboardChange(IVwSelection vwsel, int wsMatch) { CheckDisposed(); // Get the writing system factory associated with the root box. if (m_rootb == null || !GotCacheOrWs) return; // For paranoia. - // Debug.WriteLine("HandleKeyboardChange nLangId=" + nLangId + "; " + Name + - // "/" + this); - - ILgWritingSystemFactory wsf = WritingSystemFactory; - - int cws = wsf.NumberOfWs; - if (cws < 2) - return; // no writing systems to work with - - var vwsTemp = GetPossibleWritingSystemsToSelectByInputLanguage(wsf); - - // resize the array leaving slot 0 empty - int[] vws = new int[++cws]; - Array.Copy(vwsTemp, 0, vws, 1, vwsTemp.Length); - - // Put the writing system of the selection first in the list, which gives it - // priority -- we'll find it first if it matches. - int wsSel = SelectionHelper.GetFirstWsOfSelection(vwsel); - vws[0] = wsSel != 0 ? wsSel : vws[1]; - - InputLanguage lngDefault = InputLanguage.DefaultInputLanguage; - short defaultLangId = LcidHelper.LangIdFromLCID(lngDefault.Culture.LCID); - int wsMatch = -1; - int wsDefault = -1; - int wsCurrentLang = -1; // used to note first ws whose CurrentInputLanguage matches. - for (int iws = 0; iws < cws; iws++) - { - if (vws[iws] == 0) - continue; - - ILgWritingSystem ws = wsf.get_EngineOrNull(vws[iws]); - if (ws == null) - continue; - - // REVIEW SteveMc, SharonC, KenZ, JohnT: nail down where the locale/langid belongs, in - // the writing system or in the old writing system. - int nLocale = ws.LCID; - int nLangIdWs = LcidHelper.LangIdFromLCID(nLocale); - - if (nLangIdWs != 0 && nLangIdWs == nLangId) - { - wsMatch = vws[iws]; - break; - } - if (iws == 0 && nLangIdWs == 0 && nLangId == defaultLangId) - { - // The writing system of the current selection doesn't have any keyboard specified, - // and we've set the keyboard to the default. This is acceptable; leave as is. - wsMatch = vws[iws]; - break; - } - if (nLangIdWs == 0 && nLangId == defaultLangId && wsDefault == -1) - { - // Use this old writing system as the default. - wsDefault = vws[iws]; - } - if (wsCurrentLang == -1) - { - int nLangIdCurrent = ws.CurrentLCID; - if (nLangId == nLangIdCurrent) - wsCurrentLang = vws[iws]; - } - } - - if (wsMatch == -1) - { - wsMatch = wsDefault; - } - m_wsPending = -1; - // Next, see if it is the current langid of any ws. This will leave it -1 if we didn't find such a match. - if (wsMatch == -1) - wsMatch = wsCurrentLang; - - if (wsMatch == -1) - { - // Nothing matched. - if (defaultLangId == nLangId) // We're trying to set to the default keyboard - { - // The default keyboard sets set for odd reasons. Just ignore it. - // Review: what if the HKL's are different versions of the same language, - // eg UK and US English? - } - else - { - // We will make this the current input language for the current writing system for the current session. - ILgWritingSystem wsCurrent = wsf.get_EngineOrNull(wsSel); - if (wsCurrent != null) - wsCurrent.CurrentLCID = nLangId; - } - return; - } - - // We are going to make wsMatch the current writing system. - // Make sure it is set to use the langid that the user just selected. - // (This cleans up any earlier overrides). - ILgWritingSystem wsMatchEng = wsf.get_EngineOrNull(wsMatch); - if (wsMatchEng != null) - wsMatchEng.CurrentLCID = nLangId; - if (vwsel == null) { // Delay handling it until we get a selection. @@ -6248,20 +6163,20 @@ public virtual void OriginalWndProc(ref Message msg) switch (msg.Msg) { #if __MonoCS__ - case (int)Win32.WinMsgs.WM_KEYDOWN: + case (int)Utils.Win32.WinMsgs.WM_KEYDOWN: if (m_inputBusController != null && m_inputBusController.NotifyKeyDown(msg, ModifierKeys)) return; break; - case (int)Win32.WinMsgs.WM_CHAR: + case (int)Utils.Win32.WinMsgs.WM_CHAR: if (m_inputBusController != null && m_inputBusController.NotifyKeyPress((uint)msg.WParam, (uint)msg.LParam, ModifierKeys)) return; break; - case (int)Win32.WinMsgs.WM_DESTROY: - if (m_inputBusController != null) - { - m_inputBusController.Dispose(); - m_inputBusController = null; - } + case (int)Utils.Win32.WinMsgs.WM_DESTROY: + if (m_inputBusController != null) + { + m_inputBusController.Dispose(); + m_inputBusController = null; + } break; #endif @@ -6303,7 +6218,7 @@ public virtual void OriginalWndProc(ref Message msg) OnKeyPress(new KeyPressEventArgs((char)msg.WParam)); return; } - case (int)Win32.WinMsgs.WM_SETFOCUS: + case (int)Utils.Win32.WinMsgs.WM_SETFOCUS: OnSetFocus(msg); #if __MonoCS__ // In Linux+Mono, if you .Focus() a SimpleRootSite, checking .Focused reports false unless @@ -6317,7 +6232,7 @@ public virtual void OriginalWndProc(ref Message msg) base.WndProc(ref msg); #endif // __MonoCS__ return; - case (int)Win32.WinMsgs.WM_KILLFOCUS: + case (int)Utils.Win32.WinMsgs.WM_KILLFOCUS: base.WndProc(ref msg); OnKillFocus(Control.FromHandle(msg.WParam), MiscUtils.IsChildWindowOfForm(ParentForm, msg.WParam)); @@ -6414,17 +6329,17 @@ public bool PreFilterMessage(ref Message m) switch (m.Msg) { - case (int)Win32.WinMsgs.WM_KEYUP: - case (int)Win32.WinMsgs.WM_LBUTTONUP: - case (int)Win32.WinMsgs.WM_KEYDOWN: + case (int)Utils.Win32.WinMsgs.WM_KEYUP: + case (int)Utils.Win32.WinMsgs.WM_LBUTTONUP: + case (int)Utils.Win32.WinMsgs.WM_KEYDOWN: // If user-initiated messages come (or our spurious one, which we check // for below), remove this filter. Application.RemoveMessageFilter(this); m_messageFilterInstalled = false; // Now check for the spurious CTRL-UP message - if (m.Msg == (int)Win32.WinMsgs.WM_KEYUP && - m.WParam.ToInt32() == (int)Win32.VirtualKeycodes.VK_CONTROL) + if (m.Msg == (int)Utils.Win32.WinMsgs.WM_KEYUP && + m.WParam.ToInt32() == (int)Utils.Win32.VirtualKeycodes.VK_CONTROL) { return true; // discard this message } diff --git a/Src/Common/SimpleRootSite/SimpleRootSite.csproj b/Src/Common/SimpleRootSite/SimpleRootSite.csproj index cd0ef32d1c..ed59415a4d 100644 --- a/Src/Common/SimpleRootSite/SimpleRootSite.csproj +++ b/Src/Common/SimpleRootSite/SimpleRootSite.csproj @@ -121,6 +121,14 @@ False ..\..\..\DistFiles\Microsoft.Practices.ServiceLocation.dll + + False + ..\..\..\Downloads\Palaso.dll + + + False + ..\..\..\Downloads\PalasoUIWindowsForms.dll + False ..\..\..\Output\Debug\Reporting.dll @@ -172,14 +180,6 @@ ..\..\..\Output\Debug\ibusdotnet.dll - - False - ..\..\..\Output\Debug\KeyboardSwitcher.dll - - - False - ..\..\..\Output\Debug\Keyboarding.dll - diff --git a/Src/Common/SimpleRootSite/SimpleRootSiteTests/InputBusControllerTests.cs b/Src/Common/SimpleRootSite/SimpleRootSiteTests/InputBusControllerTests.cs index b658d12331..1ddfccb8e4 100644 --- a/Src/Common/SimpleRootSite/SimpleRootSiteTests/InputBusControllerTests.cs +++ b/Src/Common/SimpleRootSite/SimpleRootSiteTests/InputBusControllerTests.cs @@ -1784,12 +1784,6 @@ public void DrawRoot2(IVwGraphics _vg, Utils.Rect rcSrc, Utils.Rect rcDst, bool throw new System.NotImplementedException(); } - public void SetKeyboardForWs(ILgWritingSystem _ws, ref string _bstrActiveKeymanKbd, - ref int _nActiveLangId, ref int _hklActive, ref bool _fSelectLangPending) - { - throw new System.NotImplementedException(); - } - public bool DoSpellCheckStep() { throw new System.NotImplementedException(); diff --git a/Src/Common/SimpleRootSite/ViewInputManager.cs b/Src/Common/SimpleRootSite/ViewInputManager.cs index b7192de9a6..f30d3d01de 100644 --- a/Src/Common/SimpleRootSite/ViewInputManager.cs +++ b/Src/Common/SimpleRootSite/ViewInputManager.cs @@ -9,20 +9,20 @@ using System; using System.Drawing; using System.Runtime.InteropServices; +using Palaso.UI.WindowsForms.Keyboarding; +using Palaso.WritingSystems; using SIL.CoreImpl; using SIL.FieldWorks.Common.COMInterfaces; -using SIL.FieldWorks.Common.Keyboarding; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; using SIL.Utils; namespace SIL.FieldWorks.Common.RootSites { /// - /// Connects a view (rootbox) with keyboards. This class gets created on Linux by the - /// VwRootBox. On Windows we use VwTextStore instead. + /// Connects a view (rootbox) with keyboards. This class gets created by the VwRootBox when ENABLE_TSF is not defined + /// and MANAGED_KEYBOARDING is, that is, on Mono but not on Windows. Thus, the code here is basically Mono/Linux-only. /// [Guid("830BAF1F-6F84-46EF-B63E-3C1BFDF9E83E")] - public class ViewInputManager: IKeyboardCallback, IViewInputMgr + public class ViewInputManager: IViewInputMgr { private IVwRootBox m_rootb; @@ -41,11 +41,10 @@ public void Close() } /// - /// End all active compositions. + /// End all active compositions. Not applicable on Mono. /// public void TerminateAllCompositions() { - KeyboardController.Methods.TerminateAllCompositions(this); } /// @@ -53,7 +52,6 @@ public void TerminateAllCompositions() /// public void SetFocus() { - KeyboardController.Methods.EnableInput(this); } /// @@ -61,7 +59,6 @@ public void SetFocus() /// public void KillFocus() { - KeyboardController.Methods.DisableInput(this); } /// @@ -69,7 +66,7 @@ public void KillFocus() /// public bool IsCompositionActive { - get { return KeyboardController.Methods.IsCompositionActive(this); } + get { return false; } } /// @@ -78,7 +75,7 @@ public bool IsCompositionActive /// public bool IsEndingComposition { - get { return KeyboardController.Methods.IsEndingComposition(this); } + get { return false; } } /// @@ -89,7 +86,7 @@ public bool IsEndingComposition /// false if property can be processed regularly. public bool OnUpdateProp() { - return KeyboardController.EventHandler.OnUpdateProp(this); + return false; } /// @@ -97,8 +94,13 @@ public bool OnUpdateProp() /// public bool OnMouseEvent(int xd, int yd, Rect rcSrc, Rect rcDst, VwMouseEvent me) { - return KeyboardController.EventHandler.OnMouseEvent(this, xd, yd, rcSrc, rcDst, - (MouseEvent)me); + var mouseEvent = (MouseEvent) me; + if (mouseEvent == MouseEvent.kmeDown) + { + Keyboard.Activate(); + return true; + } + return false; } /// @@ -106,7 +108,6 @@ public bool OnMouseEvent(int xd, int yd, Rect rcSrc, Rect rcDst, VwMouseEvent me /// public void OnLayoutChange() { - KeyboardController.EventHandler.OnLayoutChange(this); } /// @@ -114,7 +115,6 @@ public void OnLayoutChange() /// public void OnSelectionChange(int nHow) { - KeyboardController.EventHandler.OnSelectionChange(this, (SelChangeType)nHow); } /// @@ -122,7 +122,6 @@ public void OnSelectionChange(int nHow) /// public void OnTextChange() { - KeyboardController.EventHandler.OnTextChange(this); } #endregion /* IViewInputMgr */ @@ -143,23 +142,23 @@ private IWritingSystem CurrentWritingSystem } } - #region IKeyboardControllerCallback methods /// /// Gets the keyboard corresponding to the current selection. /// /// The keyboard, or KeyboardDescription.Zero if we can't detect the writing /// system based on the current selection (e.g. there is no selection). - public IKeyboardDescription Keyboard + public IKeyboardDefinition Keyboard { get { + var manager = m_rootb.DataAccess.WritingSystemFactory as PalasoWritingSystemManager; var ws = CurrentWritingSystem; if (ws == null) return KeyboardDescription.Zero; - return KeyboardController.GetKeyboard(ws); + var wsd = manager.Get(ws.Handle) as IWritingSystemDefinition; + return wsd.LocalKeyboard; } } - #endregion } } diff --git a/Src/FDO/Infrastructure/Impl/FDOBackendProvider.cs b/Src/FDO/Infrastructure/Impl/FDOBackendProvider.cs index 8cf2f35d87..0cbb56bdfa 100644 --- a/Src/FDO/Infrastructure/Impl/FDOBackendProvider.cs +++ b/Src/FDO/Infrastructure/Impl/FDOBackendProvider.cs @@ -16,6 +16,7 @@ using System.Text; using System.Threading; using SIL.CoreImpl; +using SIL.CoreImpl.Properties; using SIL.FieldWorks.Common.FwUtils; using SIL.FieldWorks.FDO.DomainServices; using SIL.FieldWorks.FDO.DomainServices.DataMigration; @@ -549,6 +550,7 @@ private void InitializeWritingSystemManager() var wsManager = (PalasoWritingSystemManager)m_cache.ServiceLocator.WritingSystemManager; wsManager.GlobalWritingSystemStore = globalStore; wsManager.LocalWritingSystemStore = new LocalFileWritingSystemStore(storePath, globalStore); + wsManager.LocalWritingSystemStore.LocalKeyboardSettings = Settings.Default.LocalKeyboards; wsManager.TemplateFolder = DirectoryFinder.TemplateDirectory; } diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControls.csproj b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControls.csproj index 7518c4bab9..59d899fffd 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControls.csproj +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControls.csproj @@ -1,364 +1,351 @@ - + - Local - 9.0.30729 - 2.0 - {D71043A0-1871-461E-875F-3CEF13929EB9} - - - - Debug - AnyCPU - - - - - FwCoreDlgControls - - - JScript - Grid - IE50 - false - Library - SIL.FieldWorks.FwCoreDlgControls - OnBuildSuccess - - - - - - - - - 3.5 - v4.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - + Local + 9.0.30729 + 2.0 + {D71043A0-1871-461E-875F-3CEF13929EB9} + + + + + + + Debug + AnyCPU + + + + + FwCoreDlgControls + + + JScript + Grid + IE50 + false + Library + SIL.FieldWorks.FwCoreDlgControls + OnBuildSuccess + + + + + + + + + 3.5 + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + - ..\..\..\Output\Debug\ - false - 285212672 - false - - - DEBUG;TRACE - ..\..\..\Output\Debug\FwCoreDlgControls.xml - true - 4096 - false - 168,169,219,414,649,1635,1702,1701 - false - false - false - true - 4 - full - prompt - AllRules.ruleset - x86 + ..\..\..\Output\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + ..\..\..\Output\Debug\FwCoreDlgControls.xml + true + 4096 + false + 168,169,219,414,649,1635,1702,1701 + false + false + false + true + 4 + full + prompt + AllRules.ruleset + x86 - ..\..\..\Output\Release\ - false - 285212672 - false - - - TRACE - - - true - 4096 - false - 168,169,219,414,649,1635,1702,1701 - true - false - false - false - 4 - full - prompt - AllRules.ruleset - x86 + ..\..\..\Output\Release\ + false + 285212672 + false + + + TRACE + + + true + 4096 + false + 168,169,219,414,649,1635,1702,1701 + true + false + false + false + 4 + full + prompt + AllRules.ruleset + x86 - - False - ..\..\..\Output\Debug\BasicUtils.dll - - - COMInterfaces - False - ..\..\..\Output\Debug\COMInterfaces.dll - - - False - ..\..\..\Output\Debug\CoreImpl.dll - - - FDO - False - ..\..\..\Output\Debug\FDO.dll - - - FwControls - False - ..\..\..\Output\Debug\FwControls.dll - - - FwResources - False - ..\..\..\Output\Debug\FwResources.dll - - - FwUtils - False - ..\..\..\Output\Debug\FwUtils.dll - - - False - ..\..\..\DistFiles\Microsoft.Practices.ServiceLocation.dll - - - False - ..\..\..\Downloads\Palaso.dll - - - False - ..\..\..\Output\Debug\RootSite.dll - - - False - ..\..\..\Output\Debug\SilUtils.dll - False - - - False - ..\..\..\Output\Debug\SimpleRootSite.dll - - - System - - - - System.Data - - - System.Drawing - - - System.Web - - - System.Windows.Forms - - - System.XML - - - False - ..\..\..\Output\Debug\xCoreInterfaces.dll - - - False - ..\..\..\Output\Debug\Keyboarding.dll - + + False + ..\..\..\Output\Debug\BasicUtils.dll + + + COMInterfaces + False + ..\..\..\Output\Debug\COMInterfaces.dll + + + False + ..\..\..\Output\Debug\CoreImpl.dll + + + FDO + False + ..\..\..\Output\Debug\FDO.dll + + + FwControls + False + ..\..\..\Output\Debug\FwControls.dll + + + FwResources + False + ..\..\..\Output\Debug\FwResources.dll + + + FwUtils + False + ..\..\..\Output\Debug\FwUtils.dll + + + False + ..\..\..\DistFiles\Microsoft.Practices.ServiceLocation.dll + + + False + ..\..\..\Downloads\Palaso.dll + + + False + ..\..\..\Output\Debug\RootSite.dll + + + False + ..\..\..\Output\Debug\SilUtils.dll + False + + + False + ..\..\..\Output\Debug\SimpleRootSite.dll + + + System + + + + System.Data + + + System.Drawing + + + System.Web + + + System.Windows.Forms + + + System.XML + + + False + ..\..\..\Output\Debug\xCoreInterfaces.dll + - - - CommonAssemblyInfo.cs - - - Component - - - BlueCircleButton.cs - - - UserControl - - - ConfigParentNode.cs - - - UserControl - - - ConfigSenseLayout.cs - - - UserControl - - - UserControl - - - FwFontAttributes.cs - - - UserControl - - - FwFontTab.cs - - - UserControl - - - FwGeneralTab.cs - - - Component - - - - - - - UserControl - - - Component - - - UserControl - - - FwBorderTab.cs - - - UserControl - - - FwBulletsTab.cs - - - True - True - FwCoreDlgControls.resx - - - UserControl - - - FwParagraphTab.cs - - - UserControl - - - Component - - - UserControl - - - - - - - Component - - - ConfigParentNode.cs - Designer - - - ConfigSenseLayout.cs - Designer - - - DefaultFontsControl.cs - Designer - - - FontFeaturesButton.cs - Designer - - - Designer - FwBorderTab.cs - - - Designer - FwBulletsTab.cs - - - ResXFileCodeGenerator - FwCoreDlgControls.Designer.cs - Designer - - - FwFontAttributes.cs - Designer - - - Designer - FwFontTab.cs - - - Designer - FwGeneralTab.cs - - - Designer - FwParagraphTab.cs - - - KeyboardControl.cs - Designer - - - LocaleMenuButton.cs - Designer - - - RegionVariantControl.cs - Designer - - - UpDownMeasureControl.cs - Designer - + + + CommonAssemblyInfo.cs + + + Component + + + BlueCircleButton.cs + + + UserControl + + + ConfigParentNode.cs + + + UserControl + + + ConfigSenseLayout.cs + + + + UserControl + + + FwFontAttributes.cs + + + UserControl + + + FwFontTab.cs + + + UserControl + + + FwGeneralTab.cs + + + + + + + + UserControl + + + Component + + + UserControl + + + FwBorderTab.cs + + + UserControl + + + FwBulletsTab.cs + + + True + True + FwCoreDlgControls.resx + + + UserControl + + + FwParagraphTab.cs + + + Component + + + UserControl + + + + + + + Component + + + ConfigParentNode.cs + Designer + + + ConfigSenseLayout.cs + Designer + + + DefaultFontsControl.cs + Designer + + + FontFeaturesButton.cs + Designer + + + Designer + FwBorderTab.cs + + + Designer + FwBulletsTab.cs + + + ResXFileCodeGenerator + FwCoreDlgControls.Designer.cs + Designer + + + FwFontAttributes.cs + Designer + + + Designer + FwFontTab.cs + + + Designer + FwGeneralTab.cs + + + Designer + FwParagraphTab.cs + + + LocaleMenuButton.cs + Designer + + + RegionVariantControl.cs + Designer + + + UpDownMeasureControl.cs + Designer + - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + - ../../../DistFiles - + \ No newline at end of file diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwCoreDlgControlsTests.csproj b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwCoreDlgControlsTests.csproj index 8599995da4..f58736ae39 100644 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwCoreDlgControlsTests.csproj +++ b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/FwCoreDlgControlsTests.csproj @@ -1,4 +1,4 @@ - + Local @@ -27,11 +27,14 @@ - - + + + + - + + 3.5 v4.0 @@ -187,10 +190,6 @@ ..\..\..\..\Output\Debug\TestUtils.dll - - False - ..\..\..\..\Output\Debug\Keyboarding.dll - False ..\..\..\..\Downloads\Palaso.dll @@ -212,7 +211,6 @@ - @@ -233,8 +231,7 @@ - ../../../../DistFiles - + \ No newline at end of file diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/KeyboardControlTests.cs b/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/KeyboardControlTests.cs deleted file mode 100644 index ff84124679..0000000000 --- a/Src/FwCoreDlgs/FwCoreDlgControls/FwCoreDlgControlsTests/KeyboardControlTests.cs +++ /dev/null @@ -1,486 +0,0 @@ -// Copyright (c) 2010, SIL International. All Rights Reserved. -// -// Distributable under the terms of either the Common Public License or the -// GNU Lesser General Public License, as specified in the LICENSING.txt file. -// -// Original author: MarkS 2010-11-22 KeyboardControlTests.cs -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using NUnit.Framework; -using SIL.FieldWorks.Common.COMInterfaces; -using SIL.FieldWorks.Common.Keyboarding; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.FieldWorks.Common.Keyboarding.InternalInterfaces; -using SIL.FieldWorks.FwCoreDlgControls; -using SIL.FieldWorks.Test.TestUtils; -using SIL.Utils; -using SIL.CoreImpl; - -namespace SIL.FieldWorks.FwCoreDlgControlsTests -{ - /// - [TestFixture] - [SetUICulture("en-US")] - public class KeyboardControlTests: BaseTest - { - /// - /// A message box stub that rembers the values that are passed in so that they can be - /// verified in tests. - /// - private class RememberingMessageBox: IMessageBox - { - /// Gets the text that was passed in last - public string Text { get; private set; } - /// Gets the caption that was passed in last - public string Caption { get; private set; } - /// Gets the buttons that were passed in last - public MessageBoxButtons Buttons { get; private set; } - /// Gets the icon that was passed in last - public MessageBoxIcon Icon { get; private set; } - /// Gets the number of times MessageBox.Show has been called - public int Count { get; private set; } - - - /// ------------------------------------------------------------------------------------ - /// - /// This implementation displays the message in the Console and returns the first - /// button as dialog result. - /// - /// ------------------------------------------------------------------------------------ - public DialogResult Show(IWin32Window owner, string text, string caption, - MessageBoxButtons buttons, MessageBoxIcon icon) - { - // When running tests, displaying a message box is usually not what we want so we - // just write to the Console. - // If we later change our mind we have to check Environment.UserInteractive. If it - // is false we have to use MessageBoxOptions.ServiceNotification or - // DefaultDesktopOnly so that it works when running from a service (build machine). - Console.WriteLine("**** {0}: {1}{3}{2}", caption, text, buttons, Environment.NewLine); - - Text = text; - Caption = caption; - Buttons = buttons; - Icon = icon; - Count++; - return TranslateButtons(buttons); - } - - /// ------------------------------------------------------------------------------------ - /// - /// This implementation displays the message in the Console and returns the first - /// button as dialog result. - /// - /// ------------------------------------------------------------------------------------ - public DialogResult Show(IWin32Window owner, string text, string caption, - MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, - MessageBoxOptions options, string helpFilePath, HelpNavigator navigator, object param) - { - return Show(owner, text, caption, buttons, icon); - } - - private static DialogResult TranslateButtons(MessageBoxButtons buttons) - { - switch (buttons) - { - case MessageBoxButtons.OK: - case MessageBoxButtons.OKCancel: - return DialogResult.OK; - case MessageBoxButtons.YesNo: - case MessageBoxButtons.YesNoCancel: - return DialogResult.Yes; - case MessageBoxButtons.RetryCancel: - return DialogResult.Retry; - case MessageBoxButtons.AbortRetryIgnore: - return DialogResult.Abort; - default: - return DialogResult.OK; - } - } - } - - #region DummyWritingSystem class - /// - /// Dummy writing system used for testing - /// - private class DummyWritingSystem : IWritingSystem - { - /// - public DummyWritingSystem(string identifier, int lcid) - { - Id = identifier; - LCID = CurrentLCID = lcid; - } - - #region IWritingSystem Members - - /// - public string Abbreviation - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public Palaso.WritingSystems.Collation.ICollator Collator - { - get { throw new NotImplementedException(); } - } - - /// - public void Copy(IWritingSystem source) - { - throw new NotImplementedException(); - } - - /// - public string DisplayLabel - { - get { throw new NotImplementedException(); } - } - - /// - public string IcuLocale - { - get { throw new NotImplementedException(); } - } - - /// - public bool IsGraphiteEnabled - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public LanguageSubtag LanguageSubtag - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public string LegacyMapping - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public bool MarkedForDeletion - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public string MatchedPairs - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public bool Modified - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public string PunctuationPatterns - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public string QuotationMarks - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public RegionSubtag RegionSubtag - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public ScriptSubtag ScriptSubtag - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public string SortRules - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public Palaso.WritingSystems.WritingSystemDefinition.SortRulesType SortUsing - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public string ValidChars - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public bool ValidateCollationRules(out string message) - { - throw new NotImplementedException(); - } - - /// - public VariantSubtag VariantSubtag - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public void WriteLdml(System.Xml.XmlWriter writer) - { - throw new NotImplementedException(); - } - - /// - public IWritingSystemManager WritingSystemManager - { - get { throw new NotImplementedException(); } - } - - #endregion - - #region ILgWritingSystem Members - - /// - public SIL.FieldWorks.Common.COMInterfaces.ILgCharacterPropertyEngine CharPropEngine - { - get { throw new NotImplementedException(); } - } - - /// - public int CurrentLCID { get; set; } - - /// - public string DefaultFontFeatures { get; set; } - - /// - public string DefaultFontName - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public int Handle - { - get { throw new NotImplementedException(); } - } - - /// - public string ISO3 - { - get { throw new NotImplementedException(); } - } - - /// - public string Id { get; private set; } - - /// - public void InterpretChrp(ref SIL.FieldWorks.Common.COMInterfaces.LgCharRenderProps _chrp) - { - throw new NotImplementedException(); - } - - /// - public string Keyboard { get; set; } - - /// - public int LCID { get; set; } - - /// - public string LanguageName { get; set; } - - /// - public bool RightToLeftScript - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public string SpellCheckingId - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - /// - public IRenderEngine get_Renderer(IVwGraphics vg) - { - throw new NotImplementedException(); - } - #endregion - } - #endregion - - #region DummyKeyboardAdaptor class - private class DummyKeyboardAdaptor: IKeyboardAdaptor - { - public DummyKeyboardAdaptor() - { - if (DummyInstalledKeyboards == null) - DummyInstalledKeyboards = new List(); - if (DummyErrorKeyboards == null) - DummyErrorKeyboards = new List(); - } - - public static void Reset() - { - DummyInstalledKeyboards = null; - DummyErrorKeyboards = null; - } - - public static List DummyInstalledKeyboards { get; set; } - public static List DummyErrorKeyboards { get; set; } - - public List ErrorKeyboards - { - get { return DummyErrorKeyboards; } - } - - public void ActivateKeyboard(IKeyboardDescription keyboard) - { - // do nothing - } - - public void DeactivateKeyboard(IKeyboardDescription keyboard) - { - } - - public void Initialize() - { - foreach (var keyboard in DummyInstalledKeyboards) - KeyboardController.Manager.RegisterKeyboard(keyboard); - } - - public void Close() - { - } - } - #endregion - - private RememberingMessageBox m_MsgBox; - - [SetUp] - public void Setup() - { - m_MsgBox = new RememberingMessageBox(); - MessageBoxUtils.Manager.SetMessageBoxAdapter(m_MsgBox); - KeyboardController.Manager.Reset(); - KeyboardControl.ResetErrorMessages(); - DummyKeyboardAdaptor.Reset(); - } - - /// - /// Get available keyboards/languages. Don't run automatically since the installed - /// keyboards/languages vary on different systems. - /// - [Test] - [Category("ByHand")] - [Platform(Exclude = "Linux", Reason = "Windows specific test")] - public void InitLanguageCombo() - { - using (var sut = new KeyboardControl()) - { - var ws = new DummyWritingSystem("en-US", 1033); - // this fills the combo boxes - sut.WritingSystem = ws; - - var combo = (ComboBox)sut.Controls["m_langIdComboBox"]; - bool found = false; - foreach (IKeyboardDescription item in combo.Items) - { - Console.WriteLine("{0}: {1} {2}", item.Id, item.Name, item.Locale); - if (item.Locale == "en-US") - found = true; - } - - Assert.IsTrue(found, - "keyboard layout combobox did not contain the 'English (United States)' keyboard"); - } - } - - /// - /// Get available keyboards/languages. - /// - [Test] - public void InitLanguageCombo_AllOk() - { - DummyKeyboardAdaptor.DummyInstalledKeyboards = new List(new [] - { - new KeyboardDescription("English (United States)", "en-US", null), - new KeyboardDescription("German (Germany)", "de-DE", null) - }); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new DummyKeyboardAdaptor() }); - - using (var sut = new KeyboardControl()) - { - var ws = new DummyWritingSystem("en-US", 1033); - // this fills the combo boxes - sut.WritingSystem = ws; - - var combo = (ComboBox)sut.Controls["m_langIdComboBox"]; - CollectionAssert.AreEqual(DummyKeyboardAdaptor.DummyInstalledKeyboards, combo.Items); - Assert.AreEqual(2, combo.Items.Count); - Assert.AreEqual(0, m_MsgBox.Count); - } - } - - /// - /// Get available keyboards/languages when we get some errors. - /// - [Test] - public void InitLanguageCombo_Errors() - { - DummyKeyboardAdaptor.DummyInstalledKeyboards = new List(new [] - { - new KeyboardDescription("English (United States)", "en-US", null), - new KeyboardDescription("German (Germany)", "de-DE", null) - }); - DummyKeyboardAdaptor.DummyErrorKeyboards = new List(new [] - { - new KeyboardErrorDescription(1111) - }); - KeyboardController.Manager.SetKeyboardAdaptors(new [] { new DummyKeyboardAdaptor() }); - using (var sut = new KeyboardControl()) - { - var ws = new DummyWritingSystem("en-US", 1033); - // this fills the combo boxes - sut.WritingSystem = ws; - - var combo = (ComboBox)sut.Controls["m_langIdComboBox"]; - CollectionAssert.AreEqual(DummyKeyboardAdaptor.DummyInstalledKeyboards, combo.Items); - Assert.AreEqual(2, combo.Items.Count); - - Assert.AreEqual(1, m_MsgBox.Count); - Assert.AreEqual("The following system locales are invalid, so will be omitted from " + - "the list of System Languages for keyboard input: 1111", m_MsgBox.Text); - Assert.AreEqual("Error", m_MsgBox.Caption); - } - } - } -} diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs b/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs deleted file mode 100644 index 9954512b29..0000000000 --- a/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.cs +++ /dev/null @@ -1,280 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Globalization; -using System.Linq; -using System.Runtime.InteropServices; -using System.Windows.Forms; - -using SIL.CoreImpl; -using SIL.FieldWorks.Common.COMInterfaces; -using SIL.FieldWorks.Common.Controls; -using SIL.FieldWorks.Common.Keyboarding; -using SIL.FieldWorks.Common.Keyboarding.Interfaces; -using SIL.Utils; - -namespace SIL.FieldWorks.FwCoreDlgControls -{ - /// - public class KeyboardControl : UserControl, IFWDisposable - { - private FwOverrideComboBox m_keyboardComboBox; - private FwOverrideComboBox m_langIdComboBox; - private bool m_fKeymanInitErrorReported; - private IWritingSystem m_ws; - private HelpProvider m_helpProvider; - - /// ------------------------------------------------------------------------------------ - /// - /// Initializes a new instance of the class. - /// - /// ------------------------------------------------------------------------------------ - public KeyboardControl() - { - // This call is required by the Windows.Forms Form Designer. - InitializeComponent(); - m_langIdComboBox.DropDown += m_langIdComboBox_DropDown; - } - - void m_langIdComboBox_DropDown(object sender, EventArgs e) - { - InitLanguageCombo(); - } - - /// - /// Check to see if the object has been disposed. - /// All public Properties and Methods should call this - /// before doing anything else. - /// - public void CheckDisposed() - { - if (IsDisposed) - throw new ObjectDisposedException(String.Format("'{0}' in use after being disposed.", GetType().Name)); - } - - /// - /// The larger component using this control must supply a writing system - /// which this control will help to edit. - /// - public IWritingSystem WritingSystem - { - get - { - CheckDisposed(); - return m_ws; - } - set - { - CheckDisposed(); - m_ws = value; - Reset(); - } - } - - /// ----------------------------------------------------------------------------------- - /// - /// Clean up any resources being used. - /// - /// true to release both managed and unmanaged - /// resources; false to release only unmanaged resources. - /// - /// ----------------------------------------------------------------------------------- - protected override void Dispose( bool disposing ) - { - System.Diagnostics.Debug.WriteLineIf(!disposing, "****** Missing Dispose() call for " + GetType().Name + ". ****** "); - // Must not be run more than once. - if (IsDisposed) - return; - - if( disposing ) - { - } - base.Dispose( disposing ); - } - - #region Component Designer generated code - /// ----------------------------------------------------------------------------------- - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - /// ----------------------------------------------------------------------------------- - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(KeyboardControl)); - System.Windows.Forms.Label m_langIdLabel; - System.Windows.Forms.Label m_keyboardLabel; - this.m_keyboardComboBox = new SIL.FieldWorks.Common.Controls.FwOverrideComboBox(); - this.m_langIdComboBox = new SIL.FieldWorks.Common.Controls.FwOverrideComboBox(); - this.m_helpProvider = new System.Windows.Forms.HelpProvider(); - m_langIdLabel = new System.Windows.Forms.Label(); - m_keyboardLabel = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // m_keyboardComboBox - // - this.m_keyboardComboBox.AllowSpaceInEditBox = false; - this.m_keyboardComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.m_helpProvider.SetHelpString(this.m_keyboardComboBox, resources.GetString("m_keyboardComboBox.HelpString")); - resources.ApplyResources(this.m_keyboardComboBox, "m_keyboardComboBox"); - this.m_keyboardComboBox.Name = "m_keyboardComboBox"; - this.m_helpProvider.SetShowHelp(this.m_keyboardComboBox, ((bool)(resources.GetObject("m_keyboardComboBox.ShowHelp")))); - this.m_keyboardComboBox.Sorted = true; - this.m_keyboardComboBox.SelectedIndexChanged += new System.EventHandler(this.m_cboKeyboard_SelectedIndexChanged); - // - // m_langIdComboBox - // - this.m_langIdComboBox.AllowSpaceInEditBox = false; - this.m_langIdComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.m_helpProvider.SetHelpString(this.m_langIdComboBox, resources.GetString("m_langIdComboBox.HelpString")); - resources.ApplyResources(this.m_langIdComboBox, "m_langIdComboBox"); - this.m_langIdComboBox.Name = "m_langIdComboBox"; - this.m_helpProvider.SetShowHelp(this.m_langIdComboBox, ((bool)(resources.GetObject("m_langIdComboBox.ShowHelp")))); - this.m_langIdComboBox.Sorted = true; - this.m_langIdComboBox.SelectedIndexChanged += new System.EventHandler(this.m_cbLangId_SelectedIndexChanged); - // - // m_langIdLabel - // - resources.ApplyResources(m_langIdLabel, "m_langIdLabel"); - m_langIdLabel.BackColor = System.Drawing.Color.Transparent; - m_langIdLabel.Name = "m_langIdLabel"; - // - // m_keyboardLabel - // - resources.ApplyResources(m_keyboardLabel, "m_keyboardLabel"); - m_keyboardLabel.BackColor = System.Drawing.Color.Transparent; - m_keyboardLabel.Name = "m_keyboardLabel"; - // - // KeyboardControl - // - this.Controls.Add(this.m_keyboardComboBox); - this.Controls.Add(this.m_langIdComboBox); - this.Controls.Add(m_keyboardLabel); - this.Controls.Add(m_langIdLabel); - this.Name = "KeyboardControl"; - resources.ApplyResources(this, "$this"); - this.ResumeLayout(false); - this.PerformLayout(); - - } - #endregion - - /// - /// Resets this instance. - /// - public void Reset() - { - if (m_ws == null) - return; - - InitLanguageCombo(); - } - - // Since InitLanguageCombo gets called from an OnGetFocus, and the message box causes a - // change in focus, we need to avoid an endless loop of error messages. - private static bool errorMessage1Out; - private static bool errorMessage2Out; - - /// - /// Resets the error messages. This is needed for unit tests. - /// - public static void ResetErrorMessages() - { - errorMessage1Out = false; - errorMessage2Out = false; - } - - /// ------------------------------------------------------------------------------------ - /// - /// Inits the language combo. - /// - /// ------------------------------------------------------------------------------------ - private void InitLanguageCombo() - { - CheckDisposed(); - - m_langIdComboBox.Items.Clear(); // Clear out any old items. - string selectedName = null; - int selectedId = m_ws.LCID; - foreach (var item in KeyboardController.InstalledKeyboards.Where( - keyboard => keyboard.Type == KeyboardType.System)) - { - try - { - m_langIdComboBox.Items.Add(item); - // The 'if' below should make a 'fr-CAN' language choose a french keyboard, if installed. - if (CultureInfo.CreateSpecificCulture(item.Locale).LCID == selectedId) - selectedName = item.Name; - } - catch - { - // Problem adding a language to the combo box. Notify user and continue. - if (errorMessage1Out == false) - { - errorMessage1Out = true; - MessageBoxUtils.Show(ParentForm, FwCoreDlgControls.kstidBadLanguageName, - FwCoreDlgControls.kstidError, MessageBoxButtons.OK, MessageBoxIcon.Information); - } - break; - } - } - - var badLocales = KeyboardController.ErrorKeyboards.Where( - keyboard => keyboard.Type == KeyboardType.System).ToList(); - if (badLocales.Count > 0 && errorMessage2Out == false) - { - errorMessage2Out = true; - string strBadLocales = badLocales.Aggregate("", (current, loc) => current + (loc.Details + ", ")); - strBadLocales = strBadLocales.Substring(0, strBadLocales.Length - 2); - string caption = FwCoreDlgControls.kstidError; - MessageBoxUtils.Show(ParentForm, String.Format(FwCoreDlgControls.kstidBadLocales, - strBadLocales), caption, MessageBoxButtons.OK, MessageBoxIcon.Information); - } - - if (selectedName == null) - { - try - { - // Try selecting the default language - selectedName = InputLanguage.DefaultInputLanguage.Culture.DisplayName; - } - catch - { - selectedName = FwCoreDlgControls.kstidInvalidKeyboard; - } - finally - { - // The DefaultInputLanguage should already be in the control - if (selectedName == FwCoreDlgControls.kstidInvalidKeyboard) - { - // TODO: add item for the invalid keyboard. Hopefully this control will be - // replaced by one from Palaso; otherwise we'll need to implement this. - //m_langIdComboBox.Items.Add(new KeyboardDescription(selectedId, selectedName, null)); - } - } - } - int idx = m_langIdComboBox.FindStringExact(selectedName, -1); - m_langIdComboBox.SelectedIndex = idx; - } - - private void m_cbLangId_SelectedIndexChanged(object sender, EventArgs e) - { - if (m_langIdComboBox.SelectedItem == null) - return; - var keyboard = m_langIdComboBox.SelectedItem as IKeyboardDescription; - m_ws.LCID = CultureInfo.CreateSpecificCulture(keyboard.Locale).LCID; - m_ws.Keyboard = keyboard.Name; - } - - private void m_cboKeyboard_SelectedIndexChanged(object sender, EventArgs e) - { - if (m_keyboardComboBox.SelectedIndex >= 0) - { - string str = m_keyboardComboBox.Text; - if (str == FwCoreDlgControls.kstid_None) - str = null; - m_ws.Keyboard = str; - } - } - } -} diff --git a/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.resx b/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.resx deleted file mode 100644 index 9d9180575a..0000000000 --- a/Src/FwCoreDlgs/FwCoreDlgControls/KeyboardControl.resx +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - Specifies the Keyman keyboard for typing this writing system. This lists currently installed Keyman keyboards. - - - - 0, 65 - - - - True - - - 280, 21 - - - 7 - - - m_keyboardComboBox - - - SIL.FieldWorks.Common.Controls.FwOverrideComboBox, FwControls, Version=7.0.6.21968, Culture=neutral, PublicKeyToken=null - - - $this - - - 0 - - - Specifies the system language which will provide a keyboard. You may need to install one. - - - 0, 16 - - - True - - - 280, 21 - - - 6 - - - m_langIdComboBox - - - SIL.FieldWorks.Common.Controls.FwOverrideComboBox, FwControls, Version=7.0.6.21968, Culture=neutral, PublicKeyToken=null - - - $this - - - 1 - - - False - - - True - - - 3, 0 - - - 183, 13 - - - 8 - - - System Language for keyboard input: - - - m_langIdLabel - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - False - - - True - - - 3, 49 - - - 95, 13 - - - 9 - - - Keyman keyboard: - - - m_keyboardLabel - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - True - - - 288, 88 - - - m_helpProvider - - - System.Windows.Forms.HelpProvider, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - KeyboardControl - - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Src/FwCoreDlgs/FwCoreDlgs.csproj b/Src/FwCoreDlgs/FwCoreDlgs.csproj index 9f15e4d14f..854398a800 100644 --- a/Src/FwCoreDlgs/FwCoreDlgs.csproj +++ b/Src/FwCoreDlgs/FwCoreDlgs.csproj @@ -155,16 +155,16 @@ False ..\..\Lib\debug\ICSharpCode.SharpZipLib.dll - - False - False ..\..\DistFiles\Microsoft.Practices.ServiceLocation.dll False - ..\..\Output\Debug\Palaso.dll + ..\..\Downloads\Palaso.dll + + + False False @@ -670,7 +670,6 @@ - ../../DistFiles diff --git a/Src/FwCoreDlgs/FwCoreDlgsTests/FwCoreDlgsTests.csproj b/Src/FwCoreDlgs/FwCoreDlgsTests/FwCoreDlgsTests.csproj index 2c901bb5b8..c029d0d817 100644 --- a/Src/FwCoreDlgs/FwCoreDlgsTests/FwCoreDlgsTests.csproj +++ b/Src/FwCoreDlgs/FwCoreDlgsTests/FwCoreDlgsTests.csproj @@ -1,4 +1,4 @@ - + Local @@ -188,6 +188,9 @@ False ..\..\..\Downloads\Palaso.dll + + False + False ..\..\..\Bin\Rhino\Rhino.Mocks.dll @@ -255,17 +258,29 @@ FwSetupFixtureClass.cs - + + Form + - + + Form + - - - + + Form + + + Form + + + Form + - + + Form + @@ -294,8 +309,7 @@ - ../../../DistFiles - + \ No newline at end of file diff --git a/Src/FwCoreDlgs/FwCoreDlgsTests/WritingSystemPropertiesDialogTests.cs b/Src/FwCoreDlgs/FwCoreDlgsTests/WritingSystemPropertiesDialogTests.cs index ea4c4e272b..5081c5befa 100644 --- a/Src/FwCoreDlgs/FwCoreDlgsTests/WritingSystemPropertiesDialogTests.cs +++ b/Src/FwCoreDlgs/FwCoreDlgsTests/WritingSystemPropertiesDialogTests.cs @@ -18,7 +18,7 @@ using System.Windows.Forms; using NUnit.Framework; - +using Palaso.WritingSystems; using SIL.FieldWorks.FDO; using SIL.FieldWorks.FDO.FDOTests; using SIL.CoreImpl; @@ -222,7 +222,7 @@ internal void ValidateFontsTab() internal void ValidateKeyboardTab() { - Assert.AreEqual(CurrentWritingSystem, m_KeyboardControl.WritingSystem); + Assert.AreEqual(((IWritingSystemDefinition)CurrentWritingSystem).Bcp47Tag, m_modelForKeyboard.CurrentRFC4646); } internal void ValidateConvertersTab() diff --git a/Src/FwCoreDlgs/ValidCharactersDlg.cs b/Src/FwCoreDlgs/ValidCharactersDlg.cs index 82b2fcb2da..857e9d1003 100644 --- a/Src/FwCoreDlgs/ValidCharactersDlg.cs +++ b/Src/FwCoreDlgs/ValidCharactersDlg.cs @@ -25,12 +25,11 @@ using System.Text; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; - +using Palaso.WritingSystems; using SIL.CoreImpl; using SIL.FieldWorks.Common.COMInterfaces; using SIL.FieldWorks.Common.Controls; using SIL.FieldWorks.Common.FwUtils; -using SIL.FieldWorks.Common.Keyboarding; using SIL.FieldWorks.Common.RootSites; using SIL.FieldWorks.Common.Widgets; using SIL.FieldWorks.FDO; @@ -1395,7 +1394,10 @@ private void tabControlAddFrom_SelectedIndexChanged(object sender, EventArgs e) case kiTabUnicode: break; } - KeyboardController.SetKeyboard(fUseWsKeyboard ? m_ws.Keyboard : null); + if (fUseWsKeyboard) + ((IWritingSystemDefinition)m_ws).LocalKeyboard.Activate(); + else + Keyboard.Controller.ActivateDefaultKeyboard(); } /// ------------------------------------------------------------------------------------ @@ -1732,7 +1734,7 @@ private void btnHelp_Click(object sender, EventArgs e) protected override void OnClosed(EventArgs e) { base.OnClosed(e); - KeyboardController.SetKeyboard(string.Empty); + Keyboard.Controller.ActivateDefaultKeyboard(); } #endregion diff --git a/Src/FwCoreDlgs/WritingSystemPropertiesDialog.cs b/Src/FwCoreDlgs/WritingSystemPropertiesDialog.cs index 9c8fb92d1e..88b6fe7bd0 100644 --- a/Src/FwCoreDlgs/WritingSystemPropertiesDialog.cs +++ b/Src/FwCoreDlgs/WritingSystemPropertiesDialog.cs @@ -29,10 +29,9 @@ using Microsoft.Win32; using System.Text; using System.Linq; - +using Palaso.UI.WindowsForms.WritingSystems; using Palaso.WritingSystems; using SIL.FieldWorks.Common.COMInterfaces; -using SIL.FieldWorks.Common.Keyboarding; using SIL.FieldWorks.Common.Widgets; using SIL.FieldWorks.FDO.DomainServices; using SIL.FieldWorks.FDO.Infrastructure; @@ -66,10 +65,14 @@ public class WritingSystemPropertiesDialog : Form, IFWDisposable public const int kWsConverters = 3; /// Index(4) of the tab for writing system sorting public const int kWsSorting = 4; + #endregion + + internal Palaso.UI.WindowsForms.WritingSystems.WSKeyboardControl m_keyboardControl; /// Index(5) of the tab for writing systems PUA characters public const int kWsPUACharacters = 5; - #endregion + internal WritingSystemSetupModel m_modelForKeyboard; + /// /// Shows the new writing system properties dialog. @@ -269,13 +272,6 @@ public static bool ShowModifyDialog(Form owner, IWritingSystem selectedWs, bool #region Keyboard Tab - private Label m_lblKeyboardInstruction; - /// - protected KeyboardControl m_KeyboardControl; - private LinkLabel m_linkWindowsKeyboard; - private Label m_lblKeyboardSetupInst; - private LinkLabel m_linkKeymanConfiguration; - private Label m_lblKeyboardTestInstr; #endregion Keyboard Tab @@ -317,7 +313,6 @@ public static bool ShowModifyDialog(Form owner, IWritingSystem selectedWs, bool private Label m_lblPunctuation; private Button btnPunctuation; - private FwTextBox m_fwTextBoxTestWs; private Label lblFullCode; private Label m_FullCode; private Label lblScriptRegionVariant; @@ -360,19 +355,10 @@ private WritingSystemPropertiesDialog() m_lblValidCharacters.Tag = m_lblValidCharacters.Text; m_lblPunctuation.Tag = m_lblPunctuation.Text; m_lblEncodingConverter.Tag = m_lblEncodingConverter.Text; - m_lblKeyboardInstruction.Tag = m_lblKeyboardInstruction.Text; - m_lblKeyboardTestInstr.Tag = m_lblKeyboardTestInstr.Text; m_tsf = TsStrFactoryClass.Create(); LoadSortUsingComboBox(); LoadSortLanguageComboBox(); - - // FWNX-498 Different UI for IBus in Linux - if (MiscUtils.IsUnix) - { - m_linkWindowsKeyboard.Text = FwCoreDlgs.kstidSetUpKeyboards; - m_linkKeymanConfiguration.Visible = false; - } } /// @@ -400,12 +386,6 @@ protected override void Dispose(bool disposing) if (disposable != null) disposable.Dispose(); } - if (m_fwTextBoxTestWs != null && m_fwTextBoxTestWs.WritingSystemFactory != null) - { - var disposable = m_fwTextBoxTestWs.WritingSystemFactory as IDisposable; - if (disposable != null) - disposable.Dispose(); - } } base.Dispose(disposing); } @@ -518,8 +498,6 @@ private void SetupDialogFromCurrentWritingSystem() m_defaultFontsControl.WritingSystem = ws; - m_KeyboardControl.WritingSystem = ws; - //Switch Encoding Converters to the one for the user selected writing system Select_cbEncodingConverter(); @@ -533,6 +511,8 @@ private void SetupDialogFromCurrentWritingSystem() { SetupSortTab(ws); } + m_modelForKeyboard = new WritingSystemSetupModel((WritingSystemDefinition) ws); + m_keyboardControl.BindToModel(m_modelForKeyboard); } private void SetupSortTab(IWritingSystem ws) @@ -844,13 +824,7 @@ private void InitializeComponent() this.tpFonts = new System.Windows.Forms.TabPage(); this.m_defaultFontsControl = new SIL.FieldWorks.FwCoreDlgControls.DefaultFontsControl(); this.tpKeyboard = new System.Windows.Forms.TabPage(); - this.m_fwTextBoxTestWs = new SIL.FieldWorks.Common.Widgets.FwTextBox(); - this.m_lblKeyboardTestInstr = new System.Windows.Forms.Label(); - this.m_linkKeymanConfiguration = new System.Windows.Forms.LinkLabel(); - this.m_linkWindowsKeyboard = new System.Windows.Forms.LinkLabel(); - this.m_lblKeyboardSetupInst = new System.Windows.Forms.Label(); - this.m_lblKeyboardInstruction = new System.Windows.Forms.Label(); - this.m_KeyboardControl = new SIL.FieldWorks.FwCoreDlgControls.KeyboardControl(); + this.m_keyboardControl = new Palaso.UI.WindowsForms.WritingSystems.WSKeyboardControl(); this.tpConverters = new System.Windows.Forms.TabPage(); this.btnEncodingConverter = new System.Windows.Forms.Button(); this.m_lblEncodingConverter = new System.Windows.Forms.Label(); @@ -897,7 +871,6 @@ private void InitializeComponent() this.gbDirection.SuspendLayout(); this.tpFonts.SuspendLayout(); this.tpKeyboard.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.m_fwTextBoxTestWs)).BeginInit(); this.tpConverters.SuspendLayout(); this.tpSorting.SuspendLayout(); this.m_sortRulesPanel.SuspendLayout(); @@ -922,8 +895,8 @@ private void InitializeComponent() this.tabControl.Name = "tabControl"; this.tabControl.SelectedIndex = 0; this.helpProvider.SetShowHelp(this.tabControl, ((bool)(resources.GetObject("tabControl.ShowHelp")))); - this.tabControl.Deselecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabControl_Deselecting); this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged); + this.tabControl.Deselecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabControl_Deselecting); // // tpGeneral // @@ -980,7 +953,13 @@ private void InitializeComponent() resources.ApplyResources(this.m_regionVariantControl, "m_regionVariantControl"); this.m_regionVariantControl.BackColor = System.Drawing.Color.Transparent; this.m_regionVariantControl.Name = "m_regionVariantControl"; + this.m_regionVariantControl.RegionName = global::SIL.FieldWorks.FwCoreDlgs.FwCoreDlgs.kstidOpen; + this.m_regionVariantControl.RegionSubtag = null; + this.m_regionVariantControl.ScriptName = global::SIL.FieldWorks.FwCoreDlgs.FwCoreDlgs.kstidOpen; + this.m_regionVariantControl.ScriptSubtag = null; this.helpProvider.SetShowHelp(this.m_regionVariantControl, ((bool)(resources.GetObject("m_regionVariantControl.ShowHelp")))); + this.m_regionVariantControl.VariantName = global::SIL.FieldWorks.FwCoreDlgs.FwCoreDlgs.kstidOpen; + this.m_regionVariantControl.VariantSubtag = null; this.m_regionVariantControl.WritingSystem = null; this.m_regionVariantControl.ScriptRegionVariantChanged += new System.EventHandler(this.m_regionVariantControl_ScriptRegionVariantChanged); // @@ -1043,72 +1022,16 @@ private void InitializeComponent() // // tpKeyboard // - this.tpKeyboard.Controls.Add(this.m_fwTextBoxTestWs); - this.tpKeyboard.Controls.Add(this.m_lblKeyboardTestInstr); - this.tpKeyboard.Controls.Add(this.m_linkKeymanConfiguration); - this.tpKeyboard.Controls.Add(this.m_linkWindowsKeyboard); - this.tpKeyboard.Controls.Add(this.m_lblKeyboardSetupInst); - this.tpKeyboard.Controls.Add(this.m_lblKeyboardInstruction); - this.tpKeyboard.Controls.Add(this.m_KeyboardControl); + this.tpKeyboard.Controls.Add(this.m_keyboardControl); resources.ApplyResources(this.tpKeyboard, "tpKeyboard"); this.tpKeyboard.Name = "tpKeyboard"; this.helpProvider.SetShowHelp(this.tpKeyboard, ((bool)(resources.GetObject("tpKeyboard.ShowHelp")))); this.tpKeyboard.UseVisualStyleBackColor = true; // - // m_fwTextBoxTestWs - // - this.m_fwTextBoxTestWs.AcceptsReturn = false; - this.m_fwTextBoxTestWs.AdjustStringHeight = true; - this.m_fwTextBoxTestWs.BackColor = System.Drawing.SystemColors.Window; - this.m_fwTextBoxTestWs.controlID = null; - resources.ApplyResources(this.m_fwTextBoxTestWs, "m_fwTextBoxTestWs"); - this.m_fwTextBoxTestWs.HasBorder = true; - this.m_fwTextBoxTestWs.Name = "m_fwTextBoxTestWs"; - this.helpProvider.SetShowHelp(this.m_fwTextBoxTestWs, ((bool)(resources.GetObject("m_fwTextBoxTestWs.ShowHelp")))); - this.m_fwTextBoxTestWs.SuppressEnter = false; - this.m_fwTextBoxTestWs.WordWrap = true; - this.m_fwTextBoxTestWs.Enter += new System.EventHandler(this.m_fwTextBoxTestWs_Enter); + // m_keyboardControl // - // m_lblKeyboardTestInstr - // - resources.ApplyResources(this.m_lblKeyboardTestInstr, "m_lblKeyboardTestInstr"); - this.m_lblKeyboardTestInstr.Name = "m_lblKeyboardTestInstr"; - this.helpProvider.SetShowHelp(this.m_lblKeyboardTestInstr, ((bool)(resources.GetObject("m_lblKeyboardTestInstr.ShowHelp")))); - // - // m_linkKeymanConfiguration - // - resources.ApplyResources(this.m_linkKeymanConfiguration, "m_linkKeymanConfiguration"); - this.m_linkKeymanConfiguration.Name = "m_linkKeymanConfiguration"; - this.helpProvider.SetShowHelp(this.m_linkKeymanConfiguration, ((bool)(resources.GetObject("m_linkKeymanConfiguration.ShowHelp")))); - this.m_linkKeymanConfiguration.TabStop = true; - this.m_linkKeymanConfiguration.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.m_linkKeymanConfiguration_LinkClicked); - // - // m_linkWindowsKeyboard - // - resources.ApplyResources(this.m_linkWindowsKeyboard, "m_linkWindowsKeyboard"); - this.m_linkWindowsKeyboard.Name = "m_linkWindowsKeyboard"; - this.helpProvider.SetShowHelp(this.m_linkWindowsKeyboard, ((bool)(resources.GetObject("m_linkWindowsKeyboard.ShowHelp")))); - this.m_linkWindowsKeyboard.TabStop = true; - this.m_linkWindowsKeyboard.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.m_linkWindowsKeyboard_LinkClicked); - // - // m_lblKeyboardSetupInst - // - resources.ApplyResources(this.m_lblKeyboardSetupInst, "m_lblKeyboardSetupInst"); - this.m_lblKeyboardSetupInst.Name = "m_lblKeyboardSetupInst"; - this.helpProvider.SetShowHelp(this.m_lblKeyboardSetupInst, ((bool)(resources.GetObject("m_lblKeyboardSetupInst.ShowHelp")))); - // - // m_lblKeyboardInstruction - // - resources.ApplyResources(this.m_lblKeyboardInstruction, "m_lblKeyboardInstruction"); - this.m_lblKeyboardInstruction.Name = "m_lblKeyboardInstruction"; - this.helpProvider.SetShowHelp(this.m_lblKeyboardInstruction, ((bool)(resources.GetObject("m_lblKeyboardInstruction.ShowHelp")))); - // - // m_KeyboardControl - // - resources.ApplyResources(this.m_KeyboardControl, "m_KeyboardControl"); - this.m_KeyboardControl.Name = "m_KeyboardControl"; - this.helpProvider.SetShowHelp(this.m_KeyboardControl, ((bool)(resources.GetObject("m_KeyboardControl.ShowHelp")))); - this.m_KeyboardControl.WritingSystem = null; + resources.ApplyResources(this.m_keyboardControl, "m_keyboardControl"); + this.m_keyboardControl.Name = "m_keyboardControl"; // // tpConverters // @@ -1459,15 +1382,12 @@ private void InitializeComponent() this.helpProvider.SetShowHelp(this, ((bool)(resources.GetObject("$this.ShowHelp")))); this.ShowIcon = false; this.ShowInTaskbar = false; - this.Activated += new System.EventHandler(this.WritingSystemPropertiesDialog_Activated); this.tabControl.ResumeLayout(false); this.tpGeneral.ResumeLayout(false); this.tpGeneral.PerformLayout(); this.gbDirection.ResumeLayout(false); this.tpFonts.ResumeLayout(false); this.tpKeyboard.ResumeLayout(false); - this.tpKeyboard.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.m_fwTextBoxTestWs)).EndInit(); this.tpConverters.ResumeLayout(false); this.tpConverters.PerformLayout(); this.tpSorting.ResumeLayout(false); @@ -1625,8 +1545,6 @@ private void SetFullNameLabels(string fullName) SetLabelParams(m_lblValidCharacters, fullName); SetLabelParams(m_lblPunctuation, fullName); SetLabelParams(m_lblEncodingConverter, fullName); - SetLabelParams(m_lblKeyboardInstruction, fullName); - SetLabelParams(m_lblKeyboardTestInstr, fullName); } private static void SetLabelParams(Label lbl, params string[] parms) @@ -2051,7 +1969,6 @@ protected void tabControl_SelectedIndexChanged(object sender, EventArgs e) break; case kWsKeyboard: - m_fwTextBoxTestWs.Text = ""; break; } } @@ -2081,109 +1998,6 @@ private void linkToEthnologue_LinkClicked(object sender, LinkLabelLinkClickedEve } } - private void m_linkWindowsKeyboard_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - string program; - string arguments = null; - - if (MiscUtils.IsUnix) - program = "ibus-setup"; - else - { - program = Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.System), "control.exe"); - arguments ="input.dll"; - } - var processInfo = new ProcessStartInfo(program, arguments); - using (Process.Start(processInfo)) - { - } - } - - private void m_linkKeymanConfiguration_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - int version = 0; - string keymanPath = GetKeymanRegistryValue("root path", ref version); - if (keymanPath != null) - { - string keyman = Path.Combine(keymanPath, "kmshell.exe"); - if (File.Exists(keyman)) - { - // From Marc Durdin (7/16/09): - // Re LT-9902, in Keyman 6, you could launch the configuration dialog reliably by running kmshell.exe. - // However, Keyman 7 works slightly differently. The recommended approach is to use the COM API: - // http://www.tavultesoft.com/keymandev/documentation/70/comapi_interface_IKeymanProduct_OpenConfiguration.html - // Sample code: - // dim kmcom, product - // Set kmcom = CreateObject("kmcomapi.TavultesoftKeyman") - // rem Pro = ProductID 1; Light = ProductID 8 - // rem Following line will raise exception if product is not installed, so try/catch it - // Set product = kmcom.Products.ItemsByProductID(1) - // Product.OpenConfiguration - // But if that is not going to be workable for you, then use the parameter "-c" to start configuration. - // Without a parameter, the action is to start Keyman Desktop itself; v7.0 would fire configuration if restarted, - // v7.1 just flags to the user that Keyman is running and where to find it. This change was due to feedback that - // users would repeatedly try to start Keyman when it was already running, and get confused when they got the - // Configuration dialog. Sorry for the unannounced change... 9 - // The -c parameter will not work with Keyman 6, so you would need to test for the specific version. For what it's worth, the - // COM API is static and should not change, while the command line parameters are not guaranteed to change from version to version. - string param = ""; - if (version > 6) - param = "-c"; - using (Process.Start(keyman, param)) - { - return; - } - } - } - MessageBox.Show("Keyman 5.0 or later is not Installed."); - } - - /// - /// This method returns the path to Keyman Configuration if it is installed. Otherwise it returns null. - /// It also sets the version of Keyman that it found. - /// - /// The key. - /// The version. - /// - private static string GetKeymanRegistryValue(string key, ref int version) - { - using (RegistryKey rkTavultesoft = Registry.LocalMachine.OpenSubKey("Software", false).OpenSubKey("Tavultesoft", false)) - { - if (rkTavultesoft == null) - return null; - - using (var rkKeyman = rkTavultesoft.OpenSubKey("Keyman", false)) - { - if (rkKeyman == null) - return null; - - //May 2008 version 7.0 is the lastest version. The others are here for - //future versions. - int[] versions = { 10, 9, 8, 7, 6, 5 }; - foreach (int vers in versions) - { - using (var rkApplication = rkKeyman.OpenSubKey(vers + ".0", false)) - { - if (rkApplication != null) - { - foreach (string sKey in rkApplication.GetValueNames()) - { - if (sKey == key) - { - version = vers; - return (string)rkApplication.GetValue(sKey); - } - } - } - } - } - } - - return null; - } - } - private void m_tbLanguageName_TextChanged(object sender, EventArgs e) { if (m_userChangedLanguageName) @@ -2342,21 +2156,6 @@ private void m_regionVariantControl_ScriptRegionVariantChanged(object sender, Ev PopulateRelatedWSsListBox(CurrentWritingSystem); } - private void m_fwTextBoxTestWs_Enter(object sender, EventArgs e) - { - IWritingSystem tempWs = CurrentWritingSystem; - IWritingSystem origWs = m_tempWritingSystems[tempWs]; - int height = m_stylesheet == null ? 10000 : FontHeightAdjuster.GetFontHeightForStyle("Normal", m_stylesheet, - origWs == null ? 0 : origWs.Handle, m_wsManager); - IWritingSystemManager wsManager = FwUtils.CreateWritingSystemManager(); - wsManager.Set(tempWs); - m_fwTextBoxTestWs.WritingSystemFactory = wsManager; - m_fwTextBoxTestWs.WritingSystemCode = tempWs.Handle; - var bldr = TsStringUtils.MakeTss(string.Empty, tempWs.Handle).GetBldr(); - bldr.SetIntPropValues(0, 0, (int)FwTextPropType.ktptFontSize, (int)FwTextPropVar.ktpvMilliPoint, height); - m_fwTextBoxTestWs.Tss = bldr.GetString(); - } - private void m_sortUsingComboBox_SelectedIndexChanged(object sender, EventArgs e) { IWritingSystem ws = CurrentWritingSystem; @@ -2377,12 +2176,6 @@ private void m_sortLanguageComboBox_SelectedIndexChanged(object sender, EventArg ws.SortRules = (string) m_sortLanguageComboBox.SelectedValue; } - private void WritingSystemPropertiesDialog_Activated(object sender, EventArgs e) - { - KeyboardController.Manager.Reset(); // we want to see any keyboards added while we were not active. - m_KeyboardControl.Reset(); - } - #endregion } } diff --git a/Src/FwCoreDlgs/WritingSystemPropertiesDialog.resx b/Src/FwCoreDlgs/WritingSystemPropertiesDialog.resx index 66d3556179..7476d646d4 100644 --- a/Src/FwCoreDlgs/WritingSystemPropertiesDialog.resx +++ b/Src/FwCoreDlgs/WritingSystemPropertiesDialog.resx @@ -1,5024 +1,4373 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - lblScriptRegionVariant - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpGeneral - - - 0 - - - m_FullCode - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpGeneral - - - 1 - - - lblFullCode - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpGeneral - - - 2 - - - lblSpellingDictionary - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpGeneral - - - 3 - - - cbDictionaries - - - SIL.FieldWorks.Common.Controls.FwOverrideComboBox, FwControls, Version=7.0.6.21968, Culture=neutral, PublicKeyToken=null - - - tpGeneral - - - 4 - - - m_regionVariantControl - - - SIL.FieldWorks.FwCoreDlgControls.RegionVariantControl, FwCoreDlgControls, Version=7.0.6.22066, Culture=neutral, PublicKeyToken=null - - - tpGeneral - - - 5 - - - gbDirection - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpGeneral - - - 6 - - - m_ShortWsName - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpGeneral - - - 7 - - - label5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpGeneral - - - 8 - - - - 4, 22 - - - - True - - - 435, 282 - - - 4 - - - General - - - tpGeneral - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl - - - 0 - - - m_defaultFontsControl - - - SIL.FieldWorks.FwCoreDlgControls.DefaultFontsControl, FwCoreDlgControls, Version=7.0.6.22066, Culture=neutral, PublicKeyToken=null - - - tpFonts - - - 0 - - - 4, 22 - - - - 3, 3, 3, 3 - - - True - - - 435, 282 - - - 5 - - - Font - - - tpFonts - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl - - - 1 - - - Microsoft Sans Serif, 100pt - - - 7, 223 - - - 17, 17 - - - True - - - 414, 52 - - - 12 - - - m_fwTextBoxTestWs - - - SIL.FieldWorks.Common.Widgets.FwTextBox, Widgets, Version=7.0.6.22051, Culture=neutral, PublicKeyToken=null - - - tpKeyboard - - - 0 - - - True - - - NoControl - - - 7, 207 - - - True - - - 134, 13 - - - 11 - - - Test the {0} writing system: - - - m_lblKeyboardTestInstr - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpKeyboard - - - 1 - - - True - - - NoControl - - - 244, 158 - - - True - - - 110, 13 - - - 9 - - - Keyman Configuration - - - m_linkKeymanConfiguration - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpKeyboard - - - 2 - - - True - - - NoControl - - - 36, 158 - - - True - - - 137, 13 - - - 8 - - - Windows keyboard settings - - - m_linkWindowsKeyboard - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpKeyboard - - - 3 - - - True - - - NoControl - - - 4, 134 - - - True - - - 398, 13 - - - 7 - - - If the keyboard you need is not listed, click the appropriate link(s) below to set it up. - - - m_lblKeyboardSetupInst - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpKeyboard - - - 4 - - - True - - - NoControl - - - 3, 9 - - - True - - - 290, 13 - - - 6 - - - Select the keyboard combination with which to type {0} text. - - - m_lblKeyboardInstruction - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpKeyboard - - - 5 - - - 6, 30 - - - False - - - 419, 96 - - - 0 - - - m_KeyboardControl - - - SIL.FieldWorks.FwCoreDlgControls.KeyboardControl, FwCoreDlgControls, Version=7.0.6.22066, Culture=neutral, PublicKeyToken=null - - - tpKeyboard - - - 6 - - - 4, 22 - - - True - - - 435, 282 - - - 6 - - - Keyboard - - - tpKeyboard - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl - - - 2 - - - btnEncodingConverter - - - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpConverters - - - 0 - - - m_lblEncodingConverter - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpConverters - - - 1 - - - cbEncodingConverter - - - SIL.FieldWorks.Common.Controls.FwOverrideComboBox, FwControls, Version=7.0.6.21968, Culture=neutral, PublicKeyToken=null - - - tpConverters - - - 2 - - - 4, 22 - - - True - - - 435, 282 - - - 7 - - - Converters - - - tpConverters - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl - - - 3 - - - m_sortUsingLabel - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpSorting - - - 0 - - - m_sortUsingComboBox - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpSorting - - - 1 - - - m_sortRulesPanel - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpSorting - - - 2 - - - m_sortLanguagePanel - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpSorting - - - 3 - - - 4, 22 - - - False - - - 435, 282 - - - 3 - - - Sorting - - - tpSorting - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl - - - 4 - - - m_lblPunctuation - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpPUACharacters - - - 0 - - - btnPunctuation - - - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpPUACharacters - - - 1 - - - m_lblValidCharacters - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpPUACharacters - - - 2 - - - btnValidChars - - - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpPUACharacters - - - 3 - - - 4, 22 - - - False - - - 435, 282 - - - 2 - - - Characters - - - tpPUACharacters - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl - - - 5 - - - 42, 18 - - - 208, 100 - - - True - - - 443, 308 - - - 0 - - - tabControl - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 10 - + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + - NoControl + NoControl + - 15, 35 + 15, 35 + + 17, 17 + + - False + False - 414, 33 + 414, 33 - 12 + 12 - Usually, you only need to use the following fields in order to distinguish writing systems for the same language. + Usually, you only need to use the following fields in order to distinguish writing systems for the same language. - lblScriptRegionVariant + lblScriptRegionVariant - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpGeneral + tpGeneral - 0 + 0 - True + True - NoControl + NoControl - 265, 258 + 265, 258 - True + True - 89, 13 + 89, 13 - 11 + 11 - CurrentFullLocale + CurrentFullLocale - m_FullCode + m_FullCode - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpGeneral + tpGeneral - 1 + 1 - True + True - NoControl + NoControl - 180, 258 + 180, 258 - True + True - 79, 13 + 79, 13 - 10 + 10 - Internal Code: + Internal Code: - lblFullCode + lblFullCode - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpGeneral + tpGeneral - 2 + 2 - True + True - NoControl + NoControl - 180, 209 + 180, 209 - True + True - 95, 13 + 95, 13 - 9 + 9 - Spelling dictionary: + Spelling dictionary: - lblSpellingDictionary + lblSpellingDictionary - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpGeneral + tpGeneral - 3 + 3 - 182, 230 + 182, 230 - True + True - 183, 21 + 183, 21 - 14 + 14 - cbDictionaries + cbDictionaries - SIL.FieldWorks.Common.Controls.FwOverrideComboBox, FwControls, Version=7.0.6.21968, Culture=neutral, PublicKeyToken=null + SIL.FieldWorks.Common.Controls.FwOverrideComboBox, FwControls, Version=8.0.4.24266, Culture=neutral, PublicKeyToken=null - tpGeneral + tpGeneral - 4 + 4 - Top, Left, Right + Top, Left, Right - 8, 72 + 8, 72 - False + False - 420, 136 + 420, 136 - 12 + 12 - m_regionVariantControl + m_regionVariantControl - SIL.FieldWorks.FwCoreDlgControls.RegionVariantControl, FwCoreDlgControls, Version=7.0.6.22066, Culture=neutral, PublicKeyToken=null + SIL.FieldWorks.FwCoreDlgControls.RegionVariantControl, FwCoreDlgControls, Version=8.0.4.24268, Culture=neutral, PublicKeyToken=null - tpGeneral + tpGeneral - 5 - - - rbLeftToRight - - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gbDirection - - - 0 - - - rbRightToLeft - - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gbDirection - - - 1 - - - 19, 210 - - - False - - - 146, 64 - - - 13 - - - Direction: - - - gbDirection - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpGeneral - - - 6 + 5 - Specifies the direction in which the writing system is written. + Specifies the direction in which the writing system is written. - NoControl + NoControl - 10, 14 + 10, 14 - True + True - 104, 19 + 104, 19 - 0 + 0 - Left-to-right + Left-to-right - rbLeftToRight + rbLeftToRight - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - gbDirection + gbDirection - 0 + 0 - Specifies the direction in which the writing system is written. + Specifies the direction in which the writing system is written. - NoControl + NoControl - 10, 34 + 10, 34 - True + True - 104, 24 + 104, 24 - 1 + 1 - Right-to-left + Right-to-left - rbRightToLeft + rbRightToLeft - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - gbDirection + gbDirection - 1 + 1 + + + 19, 210 + + + False + + + 146, 64 + + + 13 + + + Direction: + + + gbDirection + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tpGeneral + + + 6 - Specifies an abbreviation to identify the writing system. + Specifies an abbreviation to identify the writing system. - 93, 6 + 93, 6 - 25 + 25 - True + True - 100, 20 + 100, 20 - 11 + 11 - m_ShortWsName + m_ShortWsName - System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpGeneral + tpGeneral - 7 + 7 - True + True - NoControl + NoControl - 14, 10 + 14, 10 - False + False - 69, 13 + 69, 13 - 4 + 4 - &Abbreviation: + &Abbreviation: - label5 + label5 - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpGeneral + tpGeneral - 8 + 8 + + + 4, 22 + + + True + + + 435, 282 + + + 4 + + + General + + + tpGeneral + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 0 - Top, Left, Right + Top, Left, Right - Specifies a similar writing system in order to inherit sort order and keyboard properties. + Specifies a similar writing system in order to inherit sort order and keyboard properties. - 4, 18 + 4, 18 - True + True - 424, 159 + 424, 159 - 2 + 2 - m_defaultFontsControl + m_defaultFontsControl - SIL.FieldWorks.FwCoreDlgControls.DefaultFontsControl, FwCoreDlgControls, Version=7.0.6.22066, Culture=neutral, PublicKeyToken=null + SIL.FieldWorks.FwCoreDlgControls.DefaultFontsControl, FwCoreDlgControls, Version=8.0.4.24268, Culture=neutral, PublicKeyToken=null - tpFonts + tpFonts - 0 + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + True + + + 435, 282 + + + 5 + + + Font + + + tpFonts + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 1 + + + 2, 2 + + + 434, 277 + + + 0 + + + m_keyboardControl + + + Palaso.UI.WindowsForms.WritingSystems.WSKeyboardControl, PalasoUIWindowsForms, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + tpKeyboard + + + 0 + + + 4, 22 + + + True + + + 435, 282 + + + 6 + + + Keyboard + + + tpKeyboard + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 2 - Opens a dialog box for adding and testing encoding converters. + Opens a dialog box for adding and testing encoding converters. - NoControl + NoControl - 224, 66 + 224, 66 - True + True - 75, 23 + 75, 23 - 10 + 10 - &More... + &More... - btnEncodingConverter + btnEncodingConverter - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpConverters + tpConverters - 0 + 0 - True + True - NoControl + NoControl - 45, 33 + 45, 33 - False + False - 180, 13 + 180, 13 - 8 + 8 - &Encoding converter for importing {0}: + &Encoding converter for importing {0}: - m_lblEncodingConverter + m_lblEncodingConverter - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpConverters + tpConverters - 1 + 1 - Specifies the encoding converter for importing data which uses this writing system. + Specifies the encoding converter for importing data which uses this writing system. - 48, 67 + 48, 67 - True + True - 168, 21 + 168, 21 - 9 + 9 - cbEncodingConverter + cbEncodingConverter - SIL.FieldWorks.Common.Controls.FwOverrideComboBox, FwControls, Version=7.0.6.21968, Culture=neutral, PublicKeyToken=null + SIL.FieldWorks.Common.Controls.FwOverrideComboBox, FwControls, Version=8.0.4.24266, Culture=neutral, PublicKeyToken=null - tpConverters + tpConverters - 2 - - - True - - - 12, 12 - - - 67, 13 - - - 2 + 2 - - Sort method: - - - m_sortUsingLabel - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpSorting - - - 0 - - - 85, 9 - - - 195, 21 - - - 1 - - - m_sortUsingComboBox - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tpSorting - - - 1 - - - m_sortRulesLoadPanel - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - m_sortRulesPanel - - - 0 - - - m_sortRulesButtonPanel - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - m_sortRulesPanel - - - 1 - - - m_sortRulesTextBox - - - SIL.FieldWorks.Common.Widgets.FwTextBox, Widgets, Version=7.0.6.22051, Culture=neutral, PublicKeyToken=null - - - m_sortRulesPanel - - - 2 - - - m_sortingHelpLabel - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - m_sortRulesPanel + + 4, 22 - - 3 + + True - - 3, 36 + + 435, 282 - - True + + 7 - - 429, 244 + + Converters - - 0 + + tpConverters - - m_sortRulesPanel + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + tabControl - - tpSorting + + 3 - - 2 + + True - - m_sortRulesLoadLabel + + 12, 12 - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 67, 13 - - m_sortRulesLoadPanel + + 2 - - 0 + + Sort method: - - m_similarWsButton + + m_sortUsingLabel - - SIL.FieldWorks.FwCoreDlgControls.LocaleMenuButton, FwCoreDlgControls, Version=7.0.6.22066, Culture=neutral, PublicKeyToken=null + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - m_sortRulesLoadPanel + + tpSorting - - 1 + + 0 - - 4, 174 + + 85, 9 - - 203, 70 + + 195, 21 - - 16 + + 1 - - m_sortRulesLoadPanel + + m_sortUsingComboBox - - System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - m_sortRulesPanel + + tpSorting - - 0 + + 1 - NoControl + NoControl - 2, 2 + 2, 2 - True + True - 198, 41 + 198, 41 - 15 + 15 - Alternatively, you can load the sort specification of a similar writing system: + Alternatively, you can load the sort specification of a similar writing system: - m_sortRulesLoadLabel + m_sortRulesLoadLabel - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_sortRulesLoadPanel + m_sortRulesLoadPanel - 0 + 0 - - iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAADVJREFUKFNj+M9A - PIQrZWAAMnFgmHEo5mJTjGwvhiOQNaA7EKuLQRqw+YQE7wG9RHxY/GcAAJYYiXc60TkqAAAAAElFTkSu - QmCC + + iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAADVJREFUKFNj+M9A + PIQrZWAAMnFgmHEo5mJTjGwvhiOQNaA7EKuLQRqw+YQE7wG9RHxY/GcAAJYYiXc60TkqAAAAAElFTkSu + QmCC - MiddleRight + MiddleRight - NoControl + NoControl - 5, 46 + 5, 46 - True + True - 195, 22 + 195, 22 - 16 + 16 - &Load from + &Load from - TextBeforeImage + TextBeforeImage - m_similarWsButton + m_similarWsButton - SIL.FieldWorks.FwCoreDlgControls.LocaleMenuButton, FwCoreDlgControls, Version=7.0.6.22066, Culture=neutral, PublicKeyToken=null + SIL.FieldWorks.FwCoreDlgControls.LocaleMenuButton, FwCoreDlgControls, Version=8.0.4.24268, Culture=neutral, PublicKeyToken=null - m_sortRulesLoadPanel + m_sortRulesLoadPanel - 1 - - - m_angleBracketButton - - - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - m_sortRulesButtonPanel - - - 0 - - - m_ampersandButton + 1 - - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - m_sortRulesButtonPanel - - - 1 - - - 213, 213 + + 4, 174 - - 206, 28 + + 203, 70 - - 15 + + 16 - - m_sortRulesButtonPanel + + m_sortRulesLoadPanel - - System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - m_sortRulesPanel + + m_sortRulesPanel - - 1 + + 0 - NoControl + NoControl - 104, 3 + 104, 3 - True + True - 42, 22 + 42, 22 - 15 + 15 - < + < - m_angleBracketButton + m_angleBracketButton - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_sortRulesButtonPanel + m_sortRulesButtonPanel - 0 + 0 - NoControl + NoControl - 56, 3 + 56, 3 - True + True - 42, 22 + 42, 22 - 14 + 14 - & + & - m_ampersandButton + m_ampersandButton - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_sortRulesButtonPanel + m_sortRulesButtonPanel - 1 + 1 + + + 213, 213 + + + 206, 28 + + + 15 + + + m_sortRulesButtonPanel + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + m_sortRulesPanel + + + 1 - Top, Bottom, Left, Right + Top, Bottom, Left, Right - True + True - Microsoft Sans Serif, 100pt + Microsoft Sans Serif, 100pt - 213, 1 + 213, 1 - False + False - 206, 210 + 206, 210 - 10 + 10 - m_sortRulesTextBox + m_sortRulesTextBox - SIL.FieldWorks.Common.Widgets.FwTextBox, Widgets, Version=7.0.6.22051, Culture=neutral, PublicKeyToken=null + SIL.FieldWorks.Common.Widgets.FwTextBox, Widgets, Version=8.0.4.24269, Culture=neutral, PublicKeyToken=null - m_sortRulesPanel + m_sortRulesPanel - 2 + 2 - NoControl + NoControl - 9, 1 + 9, 1 - False + False - 188, 169 + 188, 169 - 9 + 9 - Sorting help goes here + Sorting help goes here - m_sortingHelpLabel + m_sortingHelpLabel - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_sortRulesPanel + m_sortRulesPanel - 3 - - - m_sortLanguageComboBox - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - m_sortLanguagePanel - - - 0 - - - m_sortLanguageLabel - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - m_sortLanguagePanel + 3 - - 1 + + 3, 36 - - 2, 36 + + True - - 435, 45 + + 429, 244 - - 18 + + 0 - - m_sortLanguagePanel + + m_sortRulesPanel - - System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tpSorting + + tpSorting - - 3 + + 2 - 83, 10 + 83, 10 - 195, 21 + 195, 21 - 3 + 3 - m_sortLanguageComboBox + m_sortLanguageComboBox - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_sortLanguagePanel + m_sortLanguagePanel - 0 + 0 - True + True - 10, 13 + 10, 13 - 58, 13 + 58, 13 - 17 + 17 - Language: + Language: - m_sortLanguageLabel + m_sortLanguageLabel - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_sortLanguagePanel + m_sortLanguagePanel - 1 + 1 + + + 2, 36 + + + 435, 45 + + + 18 + + + m_sortLanguagePanel + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tpSorting + + + 3 + + + 4, 22 + + + False + + + 435, 282 + + + 3 + + + Sorting + + + tpSorting + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 4 - True + True - NoControl + NoControl - 140, 62 + 140, 62 - True + True - 168, 13 + 168, 13 - 15 + 15 - Specify punctuation usage for {0}. + Specify punctuation usage for {0}. - m_lblPunctuation + m_lblPunctuation - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpPUACharacters + tpPUACharacters - 0 + 0 - Opens a dialog box for adding and testing encoding converters. + Opens a dialog box for adding and testing encoding converters. - NoControl + NoControl - 22, 56 + 22, 56 - True + True - 116, 22 + 116, 22 - 12 + 12 - &Punctuation Usage... + &Punctuation Usage... - btnPunctuation + btnPunctuation - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpPUACharacters + tpPUACharacters - 1 + 1 - True + True - NoControl + NoControl - 140, 34 + 140, 34 - True + True - 202, 13 + 202, 13 - 11 + 11 - Specify the set of valid characters for {0}. + Specify the set of valid characters for {0}. - m_lblValidCharacters + m_lblValidCharacters - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpPUACharacters + tpPUACharacters - 2 + 2 - Opens a dialog box for adding and testing encoding converters. + Opens a dialog box for adding and testing encoding converters. - NoControl + NoControl - 22, 28 + 22, 28 - True + True - 116, 22 + 116, 22 - 11 + 11 - &Valid Characters... + &Valid Characters... - btnValidChars + btnValidChars - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - tpPUACharacters + tpPUACharacters - 3 + 3 + + + 4, 22 + + + False + + + 435, 282 + + + 2 + + + Characters + + + tpPUACharacters + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 5 + + + 42, 18 + + + 208, 100 + + + True + + + 443, 308 + + + 0 + + + tabControl + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 - Modify the name of the language and/or find the Ethnologue code for the language. + Modify the name of the language and/or find the Ethnologue code for the language. - NoControl + NoControl - 446, 16 + 446, 16 - True + True - 89, 25 + 89, 25 - 9 + 9 - Change... + Change... - btnModifyEthnologueInfo + btnModifyEthnologueInfo - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 + groupBox2 - 0 + 0 - Bottom, Right + Bottom, Right - Displays more information to help you use this dialog box. + Displays more information to help you use this dialog box. - NoControl + NoControl - 555, 414 + 555, 414 - True + True - 75, 23 + 75, 23 - 3 + 3 - Help + Help - btnHelp + btnHelp - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + $this - 9 + 9 - Bottom, Right + Bottom, Right - Closes this dialog box without saving any changes you have made. + Closes this dialog box without saving any changes you have made. - NoControl + NoControl - 471, 414 + 471, 414 - True + True - 75, 23 + 75, 23 - 2 + 2 - Cancel + Cancel - btnCancel + btnCancel - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + $this - 8 + 8 - Bottom, Right + Bottom, Right - Applies and saves changes you have made and closes this dialog box. + Applies and saves changes you have made and closes this dialog box. - NoControl + NoControl - 387, 414 + 387, 414 - True + True - 75, 23 + 75, 23 - 1 + 1 - OK + OK - btnOk + btnOk - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + $this - 7 + 7 - 8, 134 + 8, 134 - True + True - 189, 238 + 189, 238 - 4 + 4 - m_listBoxRelatedWSs + m_listBoxRelatedWSs - System.Windows.Forms.ListBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + $this - 6 + 6 - - iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAADVJREFUKFNj+M9A - PIQrZWAAMnFgmHEo5mJTjGwvhiOQNaA7EKuLQRqw+YQE7wG9RHxY/GcAAJYYiXc60TkqAAAAAElFTkSu - QmCC + + iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAADVJREFUKFNj+M9A + PIQrZWAAMnFgmHEo5mJTjGwvhiOQNaA7EKuLQRqw+YQE7wG9RHxY/GcAAJYYiXc60TkqAAAAAElFTkSu + QmCC - MiddleRight + MiddleRight - NoControl + NoControl - 8, 380 + 8, 380 - True + True - 61, 22 + 61, 22 - 5 + 5 - &Add + &Add - TextBeforeImage + TextBeforeImage - btnAdd + btnAdd - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + $this - 5 + 5 - NoControl + NoControl - 75, 380 + 75, 380 - True + True - 59, 22 + 59, 22 - 6 + 6 - &Copy + &Copy - btnCopy + btnCopy - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + $this - 4 + 4 - NoControl + NoControl - 140, 379 + 140, 379 - True + True - 57, 23 + 57, 23 - 7 + 7 - &Delete + &Delete - m_deleteButton + m_deleteButton - System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + $this - 3 - - - m_linkToEthnologue - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - m_LanguageCode - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 3 - - - m_tbLanguageName - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 4 - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 5 - - - 4, 10 - - - True - - - 645, 76 - - - 10 - - - Language: - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 + 3 - True + True - NoControl + NoControl - 446, 50 + 446, 50 - True + True - 148, 13 + 148, 13 - 10 + 10 - View Ethnologue entry for byk + View Ethnologue entry for byk - m_linkToEthnologue + m_linkToEthnologue - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 + groupBox2 - 1 + 1 - Microsoft Sans Serif, 8.25pt, style=Bold + Microsoft Sans Serif, 8.25pt, style=Bold - NoControl + NoControl - 357, 20 + 357, 20 - True + True - 83, 20 + 83, 20 - 5 + 5 - ### + ### - m_LanguageCode + m_LanguageCode - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 + groupBox2 - 2 + 2 - True + True - NoControl + NoControl - 260, 20 + 260, 20 - True + True - 91, 13 + 91, 13 - 4 + 4 - Ethnologue code: + Ethnologue code: - label3 + label3 - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 + groupBox2 - 3 + 3 - 7, 44 + 7, 44 - True + True - 244, 20 + 244, 20 - 8 + 8 - m_tbLanguageName + m_tbLanguageName - System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 + groupBox2 - 4 + 4 - True + True - NoControl + NoControl - 4, 20 + 4, 20 - True + True - 38, 13 + 38, 13 - 0 + 0 - Name: + Name: - label1 + label1 - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 + groupBox2 - 5 + 5 + + + 4, 10 + + + True + + + 645, 76 + + + 10 + + + Language: + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 - NoControl + NoControl - 8, 97 + 8, 97 - True + True - 192, 17 + 192, 17 - 11 + 11 - Writing Systems: + Writing Systems: - m_writingSystemsFor + m_writingSystemsFor - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + $this - 1 + 1 - True + True - Microsoft Sans Serif, 8.25pt, style=Italic + Microsoft Sans Serif, 8.25pt, style=Italic - NoControl + NoControl - 8, 114 + 8, 114 - True + True - 175, 13 + 175, 13 - 12 + 12 - Hidden writing systems are italicized + Hidden writing systems are italicized - lblHiddenWss + lblHiddenWss - System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - $this + $this - 0 + 0 - - True + + True - - 50 + + 50 - 6, 13 + 6, 13 - 652, 446 + 652, 446 - - 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 - AAAfAAAAAAAAAAAAFwADAAAAAAAABgMAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAGQAAAAAAAAAA - AAAAAAAAHwAAAAAAAAAAAAEAHgAAAAAAAB8AGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAA - AAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA - AAAAAAAAAAAAAAAAAAAfAAAAAAAAAAARAAcAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - FgAGAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAABwASAAAAAAAAAAAFABwAAAAAAAAAAAAAAAAAAAAAAAAL - AQAAAAAOAAAAAAAEBAAAAAAAAAAAAB8AAAAAAAAAAAEAGAAAAAAAAAAACAARAAAAAAAAAAAAAAAAAAAA - ABIAAAQZAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAABABsAAAAAAAAAAAcACgAAAAAAAAAAAAAA - AAAAAAAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAABQAZAAAAAAAAAAAEAAcAAAAAAAAA - AAAAAAAAAAAPAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAABAAEgAAAAAAAAAAAAAJAAAA - AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAUAAAAAAAAAAAAA - DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAEAAAAAAAAA - AAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAbABEA - AAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAA - AAoAAAAAAAAAAQADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAA - AAAAAAAACAEAAAAAGAAAHwAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAATABMAAAAADgAAAAAAAQAACRMOAQAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAFAAAADwAAAAAACwABAAAAAAAdAQAAAAIAAAAAAAAAAAAAAAAAAAAAHwAA - AAAAHAAAAAAAAAAAAAAAAAAAAAAHAAAEAAAAAAAAAAAAHQAAAAAAAAAHAAAOABkAAAAAAAAAAAQAAAAA - AAcAAAAAAAcABAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAS - GAAQAAABCgAAABEAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA - AAAAAAUAAAAPAAMAAAAAAB0AAAAAAAAAAAAAAAAIBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAJ - AAAAAAAAAAAAGhMfAAAAHhMTHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAIAAcAAAAAAAAAAAAA - AAAPAAsAAAAIGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAUAAAAAAQAAgUGAAAA - AAAAAAAAABUAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAAAHAAAAAAAAAAAAAwAA - AgAAAAAAAAAAAAANBQAcEhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwAXAAAFAAAAFwAAAAAA - DgAHAAAAHwAFAAAAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAGAAAA - AAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAA - AAAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAQAAEWABsFAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAABsAAAAAHgAAGgAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbHwAAAAAAABMAAA8AAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAMAAAAAAAAAAAAAAAA - AAAZAQAAAAETAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAFgAADwAAAAAAAAAA - AAAAAAACBB0AAAALAAYAAAAAAAAAAAAAAAAAAAAABwAAAAEAAAAWAAAAAAAAAAAAAAAAAAAAABYAAAAA - AAAAAAAAAAAADQAAAAAAAAcAFwAAAAAAAAAAAAAAAAAABgAAFgAAAgAAAQAAFgAAAAAAAAAAAAAAAAAf - AAAAAAAAAAAAAAAAAAAAAAAAAAAeAAMAAAAAAAAAAAAAAAAAHAAAHwAAAAACAAAPABQAAAAAAAAAAAAA - AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQACQAAAAAABAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA - AAAAAAAAAAAAAAAAAAAFCAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAADAAAAAAAAAAAAAAAAAAATAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAoAHgAAAAAAAAAAAAAAAAAAAwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAdBQAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAA - AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAEbAAAAAAAAAAAAAAAAAAAAAAACDwAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAA0WAAAUAQAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAA - AAAAAAAAAAAGAAAAAAAAABMAAAYAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAFxIABwIAAAAA - AAAAAAAAAAAAAAAAHQAAAAAAAAADBQAAAAAAAAAAAAAAAAAQAQAAAAAKAAAAAAAAAAAAAAAAAAAAAAAA - AgAAAAAAAAAAAAAAAAAAAAAEDwAAAAAAAB0JAAAAAAAAAAAAAAAAABEAAAAAAAALAAAAAAAAAAAAAAAA - AAAAAwAfAAAAAAAAAAAAAAAAAAAAAAAAAAAABQQAFwAaAAAAAAAfAAAACQAAAAAAAAAAAAAAAAAAAAAJ - ABQAAAAAAAkAFwAAAAAAAAAAAAAAAAAAAAAAAhQaBAYAAAAADAAAAAAAAQAAFgAFAAAAAAAADQAMAAAA - AAAAAAABAAAAAAAFABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCwAAAAAAAAAAAB8A - AAAAAAAAAAANAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAACgAAAAAA - AAAAAAAcAAAAAAAAABIAAQ0LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABgAA - AAAAAAAAAAEBEAAAAAAAAAAAABsSExwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// - ///////////////////////////////////////H/4P//////8f/Cf///g//x/48///95//H/H5///vz - /8f8fj////P/x/z/P///5//H+P8////H/8f4/x//+A+fx/j/H//g/5/H+P8f/+P/n8f4/x//x/+fx/j/ - H//P/5/H/P8f/8//n8f8/x//z/+fx/x+P//P/5/H/n4//8//n8f/PD4Hz/+fz/+MfAHP/5/P/+D4+c// - j4//w/j+x/uPj/+P+f/n+Qcf/z/5/+f8EB/+f/n/4/44f/7+eP/xz////vw8H/gP///+eH4f+R////4w - fHH7/////wH88f//n///7/zx//+f/////Pn//5/////8+f//n/////wj5/+f/////gPD/5//////z8P/ - n///////w/+QH//9///D/4OP//Bx/+P/j8f/4bD/4/+fx//D0v/n/5/n/8fH//f/n+f/z8f/9/+f5//P - 5//z/5/H/8/n/+v/n8f/z+f/6f+fz//P5//s/5+f/8/j/8z/mD//z8P/3n+ZP//Pw/+ef5+f/+fD/58/ - n4//95H3Pz+Pj//4OfY/H8+P////8H8fx5/////wf4/gP/////j/j/h///////////////////////// - /////////////////////////////ygAAAAwAAAAYAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHR0dACEhIQAlJSUAKSkpAC0tLQAyMjIANjY2ADk5 - OQA9PT0AQkJCAEZGRgBISEgATU1NAFFRUQBWVlYAWVlZAF1dXQBgYGAAZWVlAGlpaQBubm4AcXFxAHV1 - dQB5eXkAfHx8AAAAAAAALC8AAEtQAABocAAAhpAAAKWwAADDzwAA4fAAEe//ADHx/wBR8/8AcfX/AJH3 - /wCx+f8A0fv/AP///wAAAAAAAC8hAABQNwAAcEwAAJBjAACweQAAz48AAPCmABH/tAAx/74AUf/IAHH/ - 0wCR/9wAsf/lANH/8AD///8AAAAAAAAvDgAAUBgAAHAiAACQLAAAsDYAAM9AAADwSgAR/1sAMf9xAFH/ - hwBx/50Akf+yALH/yQDR/98A////AAAAAAACLwAABFAAAAZwAAAIkAAACrAAAAvPAAAO8AAAIP8SAD3/ - MQBb/1EAef9xAJj/kQC1/7EA1P/RAP///wAAAAAAFC8AACJQAAAwcAAAPZAAAEywAABZzwAAZ/AAAHj/ - EQCK/zEAnP9RAK7/cQDA/5EA0v+xAOT/0QD///8AAAAAACYvAABAUAAAWnAAAHSQAACOsAAAqc8AAMLw - AADR/xEA2P8xAN7/UQDj/3EA6f+RAO//sQD2/9EA////AAAAAAAvJgAAUEEAAHBbAACQdAAAsI4AAM+p - AADwwwAA/9IRAP/YMQD/3VEA/+RxAP/qkQD/8LEA//bRAP///wAAAAAALxQAAFAiAABwMAAAkD4AALBN - AADPWwAA8GkAAP95EQD/ijEA/51RAP+vcQD/wZEA/9KxAP/l0QD///8AAAAAAC8DAABQBAAAcAYAAJAJ - AACwCgAAzwwAAPAOAAD/IBIA/z4xAP9cUQD/enEA/5eRAP+2sQD/1NEA////AAAAAAAvAA4AUAAXAHAA - IQCQACsAsAA2AM8AQADwAEkA/xFaAP8xcAD/UYYA/3GcAP+RsgD/scgA/9HfAP///wAAAAAALwAgAFAA - NgBwAEwAkABiALAAeADPAI4A8ACkAP8RswD/Mb4A/1HHAP9x0QD/kdwA/7HlAP/R8AD///8AAAAAACwA - LwBLAFAAaQBwAIcAkAClALAAxADPAOEA8ADwEf8A8jH/APRR/wD2cf8A95H/APmx/wD70f8A////AAAA - AAAbAC8ALQBQAD8AcABSAJAAYwCwAHYAzwCIAPAAmRH/AKYx/wC0Uf8AwnH/AM+R/wDcsf8A69H/AP// - /wAAAAAACAAvAA4AUAAVAHAAGwCQACEAsAAmAM8ALADwAD4R/wBYMf8AcVH/AIxx/wCmkf8Av7H/ANrR - /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAHAIECAoAAAAAAAAAAAAAAAAAAAAAAAAfCwoYAAAAAAAAAAAA - ABIAAAAAAAAAAAAXABwAAAADAAAAAAAAAAAAAAAAAAAAABcTAAALCgAAAAAAAAAAABIAAAAAAAAAAAAA - EgAAAAAWCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAABEAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAIEAAAAAAAAABMAAAAAAAAAAAAAAAAAAAAA - AAAGDgAAAAAAAAAAABIAAAAAAAAAAAAOAAAAAAAABAUAAAAAAAAAAAAAAAAAFwMAAQQXAAAAAAMZAAAA - ABIAAAAAAAAAAAATAAAAAAAABgAAAAAAAAAAAAAAAAANABMAAAAAAAAAAAAYAAAAABIAAAAAAAAAAAAT - AAAAAAAAAwAAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAYAAAAABIAAAAAAAAAAAIMAAAAAAAAAAAAAAAA - AAAAAAAAAB0AAAAAAAAAAAAAAAAYAAAAABIAAAAAAAAAABIBAAAAAAAAAAEAAAAAAAAAAAAAABQAAAAA - AAAAAAAAAAAYAAAAABIAAAAAAAAAAAABAAAAAAAAAAwAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAYAAAA - ABIAAAAAAAAAAAAcAgAAAAAJAAAAAAAAAB8AAAAAABEAAAAAAAAAAAAAAAAYAAAAABEAAAAAAAAAAAAA - GwUAAAAACgAAAAADAAEBAR4AABYAAAAAAAAAAAAAAAAYAAAAAA8AAAAAAAAAAAAAAAAJBwAJAAAAAAMB - AAAAAAkAAB8AAAAAAAAAAAAAAAAXAAAAAAcAAAAAAAAAAAAAABIAAhwAAAAAAAAZAAAAAAAXAAAAAAAA - AAAAABkAHAAEAAAAAAAGAAAAAAAAAAAACAQfAAAAAAAAHwAAAAAAAAAAAAAEDAAAAAAAAA4YAwASAxcY - AwIAAAAAAAAAAAAZCwAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAYDwAAABIOGQAAAAAAAAAAAAAG - AAAAAAAFAQAAAAMEAAAAAAAAAAAAEwEAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAoAAAAAAAAG - AAAAAAAAAAAAAAYJBQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAaBwAACwAAGgAAAAACCwAAHgUAAAAAABAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgMAAQsAAAAAAA8AAAAACQAAAAAAAAAAAAAAAAAAAAAdAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAADwAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC - AxYVAxQAAAAIBQAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwcHGgAAAAAAAAAA - AAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbHwgD - BRQAAAAAAAAAAAAAAAAAABgZAAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAABEgAAAAgDAAAAAAAAAAAA - AAAAAAENBwAABgAZAAAAAAAAAAAEAAAAAAAAAAAAAAAVAAAAAAAAGQAAAAAAAAAAAAACAQAAAAsAAAAZ - AAAAAAAAAAAWAgAAAAAAAAAAAAAdAAAAAAABCwAAAAAAAAAAAB8AGQAAAAABAgAAAAAAAAAAAAAABgAA - AAAAAAAAAAAdAAAAAAACCQAAAAAAAAAAAA8AAAAAAAAADAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAdAAAA - AAABEAAAAAAAAAAAAAgAAAAAAAAFEgAAAAAAAAAAAAAAGRAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAA - AAkCAAAAAAAGBQAAAAAAAAAAAAAMAAoAAAAAAAAAAAAdAAAAAAsPAAAAAAAAAAAAABEBAAAAAAACAAAA - AAAAAAAAAAAKAAAJAAAAAAAAAAAdAAkVDxoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgbAAAE - AAAAAAAAAAAdAAwZBR0AAAAAAAAAAAAAAAACAAAAAB0HARgAAAAAAAAAAAEAAAAaBAAAAAAAAAAcAAAA - AAAAAAAAAAAAAAAAAAAeDwAAAAQADAkAAAAAAAAAFAcAAAAAABwAAAAAAAAVAAAAAAATAAAAAAAAAAAA - AAAAFhIAChMAGgEAAAAADQAAAB8AAAAACAMAAAAAAAgDAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAkBBAAAAAAAGQAAAAAAAAACDgAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAAA - AAAPAAAAAAAAEAMBCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////////////////////////n - ///8H//4f+f///jv//M/5///+ef//7/n///z9///v+f///Pz//8/5///8/P/4Hnn///z8//H+ef///Pz - /8/55///8/P/n/nn///z8/+f+ef///vz/5/55///+efvn/nn///854Gf+ef///8PPZ/55////h8+39Hn - ///8fn/PwA////n/P+/nH///++c/5n/////7x4/wf/////mHmff//////B85//n//////zn/+f////// - Pf/5//////+Bz/n//////8PP+f///////8/4D////89/z/jn////hj/P+fP///86v8/58////jz/7/nz - ///+fP/v+fP///58/+f59////nz/1/nn///+fP/b+Q////98/5v5D////3h/ufnv////On88+ef///+S - ezz55//////4fPzP//////j+fh///////f//////////////////////////////////////KAAAACAA - AABAAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUACgoKAA0NDQAQEBAAFRUVABkZ - GQAdHR0AISEhACUlJQAoKCgALi4uADExMQA1NTUAOTk5AD09PQBAQEAARUVFAEpKSgBNTU0AUVFRAFZW - VgBYWFgAXV1dAGFhYQBmZmYAampqAGxsbABycnIAdnZ2AHp6egB+fn4AAAAAAAAsLwAAS1AAAGhwAACG - kAAApbAAAMPPAADh8AAR7/8AMfH/AFHz/wBx9f8Akff/ALH5/wDR+/8A////AAAAAAAALyEAAFA3AABw - TAAAkGMAALB5AADPjwAA8KYAEf+0ADH/vgBR/8gAcf/TAJH/3ACx/+UA0f/wAP///wAAAAAAAC8OAABQ - GAAAcCIAAJAsAACwNgAAz0AAAPBKABH/WwAx/3EAUf+HAHH/nQCR/7IAsf/JANH/3wD///8AAAAAAAIv - AAAEUAAABnAAAAiQAAAKsAAAC88AAA7wAAAg/xIAPf8xAFv/UQB5/3EAmP+RALX/sQDU/9EA////AAAA - AAAULwAAIlAAADBwAAA9kAAATLAAAFnPAABn8AAAeP8RAIr/MQCc/1EArv9xAMD/kQDS/7EA5P/RAP// - /wAAAAAAJi8AAEBQAABacAAAdJAAAI6wAACpzwAAwvAAANH/EQDY/zEA3v9RAOP/cQDp/5EA7/+xAPb/ - 0QD///8AAAAAAC8mAABQQQAAcFsAAJB0AACwjgAAz6kAAPDDAAD/0hEA/9gxAP/dUQD/5HEA/+qRAP/w - sQD/9tEA////AAAAAAAvFAAAUCIAAHAwAACQPgAAsE0AAM9bAADwaQAA/3kRAP+KMQD/nVEA/69xAP/B - kQD/0rEA/+XRAP///wAAAAAALwMAAFAEAABwBgAAkAkAALAKAADPDAAA8A4AAP8gEgD/PjEA/1xRAP96 - cQD/l5EA/7axAP/U0QD///8AAAAAAC8ADgBQABcAcAAhAJAAKwCwADYAzwBAAPAASQD/EVoA/zFwAP9R - hgD/cZwA/5GyAP+xyAD/0d8A////AAAAAAAvACAAUAA2AHAATACQAGIAsAB4AM8AjgDwAKQA/xGzAP8x - vgD/UccA/3HRAP+R3AD/seUA/9HwAP///wAAAAAALAAvAEsAUABpAHAAhwCQAKUAsADEAM8A4QDwAPAR - /wDyMf8A9FH/APZx/wD3kf8A+bH/APvR/wD///8AAAAAABsALwAtAFAAPwBwAFIAkABjALAAdgDPAIgA - 8ACZEf8ApjH/ALRR/wDCcf8Az5H/ANyx/wDr0f8A////AAAAAAAIAC8ADgBQABUAcAAbAJAAIQCwACYA - zwAsAPAAPhH/AFgx/wBxUf8AjHH/AKaR/wC/sf8A2tH/AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAABQAADgAAAAAAAAAAAAAAEQAPAAAAAAAAAAAAAAAAAAYAAAAAFgAAAAAA - AAAAAAAAAAAMAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAAAAAAAAGRkAAAAAAAAAAAAAAAAKAAAAAAMA - AAAAAAAAAAALBxMAAAAXEQAAAAAAAAAAAA0AAAAAAwAAAAAAAAAADhgAAAAAABYQAAAAAAAAAAAABgAA - AAAAAAAAAAAAAAAAAAAAAAAAFhAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAWEAAAAAAAAAAA - AAAMAAAUCAAAABgVAAAAAAAAAAAAABYQAAAAAAAAAAAAAAARFQQAAAABHAAWAAAAAAAAAAAAFhAAAAAA - AAAAAAAAAAMXAAAAGBQAAAAAAAwAAAAAAAAOAgAAFQoAAAAAAAAQAAAAAAAXFgAAAAAAAA0AAAAAFgwA - FgoUAAAAAAAAGAAAAAwNAAADHwAAAAAAGA8ZCQAAAAAAAAAAAAAAAAAAGwARAB4AABEMAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAERQAAAAAAAAABhcAAAAAAAAAABwTAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAA - AAAAAAAAHBMAAAAAAAAAAAAAAAAAAAAAABcFDwgAABUTAAAAAAAcEwAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAACQcAAAAAABwSABcbAAAAAAAAAAAAGhAAAB0AAAAAAAAOCQAAAAAAHAQAAAADAAAAAAAAABcIAAAA - BBkAAAAAAAASAAAAAAAcEwAAABEeAAAAAAAAAQAAAAYXAAAAAAAAABYAAAAAABwTAAAAFBwAAAAAAAAA - AAAAFgAAAAAAAAAADQAAAAAAHBMAAAAKAAAAAAAAAAEAAAAYFQAAAAAAABsAFwAAAAAcEwAAABUAAAAA - AAAAAQAAAA0GAAAAAAAAEgARAAAAABwTAA4KAAAAAAAAAAAXAAAACQIAAAAAAB8AAAAOAAAAHRIAABwW - AAAAAAAAAAATABEADwAAAAAABAAAAAQAAAAABQAAAA0AAAAAAAAAAAAAAAAAAAAAAwMaAAAAExMAAAAX - EAAKAAAAAAAAAAAAAAAAAAAAAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AHFxcRsbGwAAAAgICEdHRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAABsbGwAAABUVFXFxcQAAADs7OwICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwYGBhsbGwICAgUFBQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAABkZGQAAADMzMwAAAAAAAAAAAAAAAF9fXwEBAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBQAAAAAA - AAAAAAAAABsbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+ - fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxcXAAAAA4ODgAAAAAAAAAAAAAAAAAAAAAAABgYGA0N - DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AHx8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAHp6egAAAAAAAAAAAAAA - AAAAAAAAAHx8fAAAAG1tbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlZWQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AEdHRwAAABwcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWAAAABsb - GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAB0dHQAAAElJSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWFgAAAHJycgAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsLAQEBAAAAAAA - AAAAAAAAADs7OwAAAAAAAAAAAAAAAAAAABAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+ - fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHBwAAAGNjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEh - IQAAAEVFRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtLSwAA - AAAAABISEmZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAG5ubgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAB4eHgAAACoqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAFlZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWFgAAAGdnZwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAB8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAD09PQAAACoqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AEJCQgAAAEtLSwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgAAACUlJQAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAABYWFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6OgAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+ - fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAGJiYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9vbwAAAEVFRQAAAAAAAAAAAAAA - AAAAAAAAAFBQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkpKQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAA0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAACIiIgQEBAAAAAAAAAAAAAAAAGJiYgAAAAAAAH19fQAAAAAAAAAAAAAAAAAAADExMQAA - AAAAAAAAAAAAAA8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5OTgAAAE9PTwAAAAAAAAEBAQAAADo6OgAAAAAAAAAAAAAA - AAAAAAcHBwAAAAAAACYmJk9PTzo6OgYGBgAAAGlpaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUVFQAAAAAAAAAAAD8/PwAA - AAAAAAAAAAAAAAAAAC4uLgAAAAQEBAAAAAAAAAAAAAAAAAAAAHZ2dgQEBAAAAAAAAAAAAAgICAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH19fQAAAAAAAAAAAAAAAAAA - AHFxcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4eHgAAAAAA - AA8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZ2dgAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHwAA - AAAAADo6OgAAAGdnZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAB8fHwAA - AAAAAAAAAAAAAAAAAB4eHgAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEBAQAAABcXFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAElJSWNjYwAAAEFB - QQAAAAAAAAcHBysrKwAAAAAAAAAAAEdHRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAEBARAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAABQUFAAAAAAAAAAAAD09PQAAAA0NDQAAAAAAAAAAAAAAAAICAnR0dAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAACEhIRcXFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHV1dQAAACQkJAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAGtra0xMTH5+fgAAAAAAAAAAAHt7e09PT09PT3h4eAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBQAA - AAAAAAAAAAAAAAAAACEhIQAAAB8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/ - PwAAAC0tLQAAAAAAAAAAACMjI2pqagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAwMDAAAAAAAAFJSUgAAAAAAAAAAAAAAABAQEAAAAAgICBcXFxgYGAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAFdXVwAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAVRU - VAAAAAAAAAAAAAAAAB0dHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAgICAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2NhYWFgAAAHFxcUpKSkBAQAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAE9PTwAAAF1dXQAAAAAAABYWFgAAAAAAAAAAAFxcXAAAAAAAAAAAAAAAAAAAADg4OAAAAB0d - HQAAAAAAAAAAAH5+fgAAABQUFAAAAAAAAAAAAAAAAAAAAAAAAE1NTQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUAEBAQAAAAAAAAAAAAAAABsbGwAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt7ewAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAUFBSwsLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAMD - A1hYWAAAAG5ubhcXFwAAAAAAAAAAAAAAAAAAAAAAAAYGBgEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAEpKSgAAAAAAAAAAAAAAAAEBAWxsbAAAAAAAAAAAAAAAAHt7ewAAAAAAAGtrawAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5ubn9/fwAAAAAAAAAAAAAAAAAAAAAAAE5OTgAAAAAA - AD8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAERERAAAAAAAADAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRk - ZAYGBgAAAAAAAAAAAAMDA0xMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAHZ2dgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAFtbWwAAAAAAAD09PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAsLCw8PD3V1dQAAAAAAAAAAAC8vLwAAABgYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0dHQAAAAAAAAAAAAQEBAAAAAAAAAAAAFhYWAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtbWwAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAADQ0NAAAAAAAAAAAAAAAAAAAAAAAABwcHAAAAF5eXgAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsbGwAAAAAAAFlZWQAAAAAAAAkJCQAAAAAAAAMD - AwAAAAEBAVtbWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eAAAAA0N - DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcAAAAAAAAH5+fgAAAAAAAAAA - AAAAAAkJCQAAAAAAAD4+PgAAAFFRUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8PDwAAACUl - JQAAAAAAAAAAAAAAAAAAABAQEAUFBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRUVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWFiEhIQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHR0dAAAABwcHAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4O - DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5OTgAAABMTEwAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgAAAHp6 - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4eHgAAAAAAAAAAACoqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAHFxcQAAAAAAAAAAAAAAAAAAAAAAAAAAAEtLSwAAAAQEBDQ0NC4uLgEBAQICAgAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAABsbGwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAQEBAQEBEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxsbEhISE1NTXNz - cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////// - /8f/g///////x/8J///+D//H/jz///3n/8f8fn//+/P/x/x+P///8//H/P8////n/8f4/z///8f/x/j/ - H//4D5/H+P8f/+D/n8f4/x//4/+fx/j/H//H/5/H+P8f/8//n8f8/x//z/+fx/z/H//P/5/H/H4//8// - n8f+fj//z/+fx/88PgfP/5/P/4x8Ac//n8//4Pj5z/+Pj//D+P7H+4+P/4/5/+f5Bx//P/n/5/wQH/5/ - +f/j/jh//v54//HP///+/Dwf+A////54fh/5H////jB8cfv/////Afzx//+f///v/PH//5/////8+f// - n/////z5//+f/////CPn/5/////+A8P/n//////Pw/+f///////D/5Af//3//8P/g4//8HH/4/+Px//h - sP/j/5/H/8PS/+f/n+f/x8f/9/+f5//Px//3/5/n/8/n//P/n8f/z+f/6/+fx//P5//p/5/P/8/n/+z/ - n5//z+P/zP+YP//Pw//ef5k//8/D/55/n5//58P/nz+fj//3kfc/P4+P//g59j8fz4/////wfx/Hn/// - //B/j+A/////+P+P+H//////////////////////////////////////////////////////KAAAADAA - AABgAAAAAQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhISAEB - AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcAgICBMTEyIiIikpKQAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt7ey0tLSgoKGJiYgAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAEhISAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF1dXQEBAXNzcwAA - AAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5e - Xk1NTQAAAAAAAC8vLyoqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhISAEBAQAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEBAUlJSQAAAAAAAAAAAAAAAFlZWSoqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAEhISAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAEZGRgEBAQAAAAAAAAAAAAAAAAAAAAAAAAEB - AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhISAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAoK - ChAQEAAAAAAAAAAAAAAAAAAAAAAAAAICAk9PTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhISAEB - AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBATs7OwAAAAAAAAAAAAAAAAAAAAAAABISEhYWFgAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxcXA8PDwEBAQYGBhISEl5eXgAAAAAAAAAAAAAA - AAwMDGdnZwAAAAAAAAAAAAAAAEhISAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAU9PTwAAAAAAAAAA - AAAAAAAAAAAAABkZGQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADc3NwEBAUxM - TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAWBgYAAAAAAAAAAAAAAAAEhISAEBAQAAAAAAAAAAAAAA - AAAAAAAAAAAAAAEBAU9PTwAAAAAAAAAAAAAAAAAAAAAAAA4ODgEBAQAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAEBAUhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAWBgYAAAAAAA - AAAAAAAAAEhISAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCTIyMgAAAAAAAAAAAAAAAAAAAAAAAAEB - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAEBAT8/PwAAAAAAAAAAAAAAAAAAAAAAAENDQwwMDAYGBiQkJAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAHl5eQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// - ////////////////////5////B//+H/n///47//zP+f///nn//+/5///8/f//7/n///z8///P+f///Pz - /+B55///8/P/x/nn///z8//P+ef///Pz/5/55///8/P/n/nn///78/+f+ef///nn75/55////OeBn/nn - ////Dz2f+ef///4fPt/R5////H5/z8AP///5/z/v5x////vnP+Z/////+8eP8H/////5h5n3//////wf - Of/5//////85//n//////z3/+f//////gc/5///////Dz/n////////P+A/////Pf8/45////4Y/z/nz - ////Or/P+fP///48/+/58////nz/7/nz///+fP/n+ff///58/9f55////nz/2/kP////fP+b+Q////94 - f7n57////zp/PPnn////kns8+ef/////+Hz8z//////4/n4f//////3///////////////////////// - /////////////ygAAAAgAAAAQAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBQAAAAAAAA7 - OzsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEREQAAAA+Pj4AAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAAAAAAAAAAAAABYWFgAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH - BwcAAAAAAAAAAAAAAAAFBQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmZmZmZmYA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArKysAAAAAAAAAAAAAAAAODg4AAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAuLi4fHx9OTk4AAAAAAAAAAABeXl5GRkYAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAA1NTUAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODhgYGAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAowAAAKMAAACjAAAAowAA - AKMAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABWAAAArAAA - AOYAAAD/AAAA/wAAAP4AAADgAAAAoQAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAABPAAAA3QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - ALwAAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAHAAAAC5AAAA6wAAAP0AAAD6AAAA5QAAALIAAABoAAAACwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAlgAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAPgAAADiAAAA+AAAAP8AAAD/AAAA/wAAAPgAAABhAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAGwAAADzAAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADsAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABAAAAK8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAK8AAAA/AAAABQAAAAAAAAADAAAARAAA - AM4AAAD/AAAA/wAAAP8AAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAACLAAAA/wAAAP8AAAD/AAAA/wAAAOoAAADGAAAAzwAAAPoAAAD/AAAA/wAA - AP8AAAD/AAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAA/wAAAP8AAAD/AAAA/wAA - APUAAABVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAALAAAAD/AAAA/wAAAP4AAABlAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgAAAP8AAAD/AAAA/gAA - AKYAAAA4AAAAAQAAAAAAAAAAAAAAEgAAAJcAAAD/AAAA/wAAAP8AAAD/AAAASQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAYAAAAP8AAAD/AAAA/wAAAP8AAAD5AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABAAAAMwAAAD/AAAA/wAAAPkAAAAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAMAAADWAAAA/wAAAO4AAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AJMAAAD/AAAA/wAAAP8AAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAADtAAAA/wAAAP8AAAD/AAAA/wAA - AHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPoAAAD/AAAA/wAA - AMwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAP8AAADzAAAAMAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAO4AAAD/AAAA/wAAAP8AAAAlAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAjwAAAP8AAAD/AAAA/wAAAP8AAADKAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAApQAAAP8AAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAGAAAA2gAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAArAAAAP8AAAD/AAAA/wAAAEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAAAD2AAAA/wAAAP8AAAD/AAAA/wAA - AEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAA/wAA - AP8AAAD/AAAA4QAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChAAAA/wAAAP8AAAD/AAAAVwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAcgAAAP8AAAD/AAAA/wAAAP8AAADTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAA/wAAAP8AAAD/AAAAYQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAANIAAAD/AAAA/wAAAP8AAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJAAAA/wAAAP8AAAD/AAAA/wAA - AHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AJAAAAD/AAAA/wAAAP8AAADHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AAAA/wAAAP8AAAD/AAAA/AAA - ABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAFwAAAP4AAAD/AAAA/wAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATgAAAP8AAAD/AAAA/wAAAP8AAAApAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABAAAAMsAAAD/AAAA/wAAAP8AAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAA/wAAAP8AAAD/AAAA/wAA - AOIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAjAAAA/wAAAP8AAAD/AAAA/wAAAHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAACvAAAA/wAAAP8AAAD/AAAA/gAA - AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAIwAAAD/AAAA/wAAAP8AAAD/AAAArQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAD2AAAA/wAAAP8AAAD/AAAAxAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAA - ACwAAAB2AAAA4QAAAP8AAAD/AAAA/wAAAP8AAACVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtgAAAP8AAAD/AAAA/wAA - AP8AAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAANoAAAD/AAAA/wAAAP8AAAD4AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJwAA - AIUAAADJAAAA8QAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAlwAA - AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiwAAAN8AAADfAAAA3wAAAN8AAADfAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAADUAAAA/wAAAP8AAAD/AAAA/wAAAF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzQAAAP8AAAD/AAAA/wAA - AP8AAAA2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAKcAAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAAyQAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACeAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAD/AAAA/wAA - AP8AAAD/AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAADAAAAA/wAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADiAAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAADiAAAAzgAAAMAAAACnAAAAdgAAACwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAA9wAAAP8AAAD/AAAA/wAAAP8AAAAxAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALoAAAD/AAAA/wAA - AP8AAAD/AAAAhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAGAAAA0wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAALgAAABYAAAAEQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAngAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AAAA/wAA - AP8AAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAP8AAAD/AAAA/wAAAP8AAACkAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAANEAAAA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeAAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQAAAD/AAAA/wAAAP8AAAD/AAAAIQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAA/wAA - AP8AAAD/AAAA/wAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAKAAAA7QAAAP8AAAD/AAAA/wAAAP8AAAC+AAAACwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4gAA - AP8AAAD/AAAA/wAAAP8AAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANcAAAD/AAAA/wAAAP8AAAD/AAAAwAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAA - AP8AAAD/AAAA6AAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAngAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAAA/wAAAP8AAAD/AAAA/wAAADkAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5wAA - AP8AAAD/AAAA/wAAAP8AAADDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAArQAAAP8AAAD/AAAA/wAAAP8AAABuAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAACeAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AJgAAAD/AAAA/wAAAP8AAAD/AAAAUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAD6AAAA/wAAAP8AAAD/AAAA/wAAALwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAADxAAAA/wAA - AP8AAAD/AAAA+AAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAP8AAAD/AAAA/wAAAP8AAACBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAJwAAAP8AAAD/AAAA/wAAAP8AAAC7AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAngAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAbAAAA/gAAAP8AAAD/AAAA/wAAALIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACZAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVAAAA/wAA - AP8AAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeAAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFAAAA/wAAAP8AAAD/AAAA8wAA - AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AG4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIAAAD/AAAA/wAAAP8AAAD/AAAAVAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAGQAAAD/AAAA/wAAAP8AAAD/AAAATQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAVQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjQAA - AP8AAAD/AAAA/wAAAP8AAAA3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAngAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAOgAAAD/AAAA/wAA - AP8AAAC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAADhAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbAAAA/wAAAP8AAAD/AAAA/wAAACEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAbQAAAP8AAAD/AAAA/wAAAP4AAAAzAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA4gAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AKMAAAD/AAAA/wAAAP8AAAD/AAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA0QAA - AP8AAAD/AAAA/wAAALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACLAAAA/wAAAP8AAAD/AAAA/wAAAP8AAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAAP8AAAD/AAAA/wAAAP8AAAAWAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAngAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAA+AAAAP8AAAD/AAAA/wAAAGcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAOgAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - ADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACiAAAA/wAAAP8AAAD/AAAA/wAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACeAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABkAAAA/wAAAP8AAAD/AAAA+AAAAD0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABpAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAGcAAACSAAAArQAAALoAAAC5AAAApQAAAHcAAAAtAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJwAAAD/AAAA/wAAAP8AAAD/AAAAIAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkAAAD/AAAA/wAA - AP8AAAD/AAAA/gAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA/wAAAP8AAAD/AAAA7wAA - ADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAZQAAANUAAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADEAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAjAAAAP8AAAD/AAAA/wAAAP8AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAngAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAnwAAAP8AAAD/AAAA/wAAAP8AAAD4AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAB6AAAA/gAAAP8AAAD/AAAA9QAAAFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACNAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAHwAAAMsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD8AAAAggAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAA/wAAAP8AAAD/AAAA/wAA - AEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeAAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAA/wAA - AP8AAAD/AAAA/wAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAA8QAA - AP8AAAD/AAAA/wAAAKwAAAAfAAAAAAAAAAAAAAAAAAAAZQAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA5QAA - ABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAADkAAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAArAAAAAUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAF4AAAD/AAAA/wAAAP8AAAD/AAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAD/AAAA/wAAAP8AAAD/AAAA2wAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAtgAAAP8AAAD/AAAA/wAAAPkAAACbAAAANQAA - AIAAAAD9AAAA/wAAAP8AAAD/AAAA/wAAAPgAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAFAAAAxgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANoAAACMAAAAZwAAAF0AAABzAAAAowAA - AOcAAAD/AAAA/wAAAP8AAAD/AAAAqAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAOgAAAP8AAAD/AAAA/wAA - AP8AAACGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAngAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1wAA - AP8AAAD/AAAA/wAAAP8AAADCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAARgAAAMMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADyAAAARAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGcAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - APIAAABgAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEoAAADFAAAA/wAAAP8AAAD/AAAAdAAA - AAAAAAAAAAAAAAAAAAAAAAAUAAAA/wAAAP8AAAD/AAAA/wAAAK0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAACeAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAD4AAAA/wAAAP8AAAD/AAAA/wAAAJwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAKwAAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA3QAAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAADAAAA3wAAAP8AAAD/AAAA/wAAAP8AAADwAAAALgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAABhAAAA8AAAAP8AAAD3AAAAKQAAAAAAAAAAAAAAAAAAAAAAAADhAAAA/wAA - AP8AAAD/AAAA3gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAEkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAAZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAADgAAAJAAAAD3AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAJsAAAANAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnAAAA2QAA - AP8AAADIAAAAAwAAAAAAAAAAAAAAAAAAAK0AAAD/AAAA/wAAAP8AAAD+AAAAEgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeAAAA8QAA - AAcAAAAAAAAAAAAAAAAAAAAAAAAApgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAiAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAA/wAAAP8AAAD/AAAA/wAAAP4AAAAhAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAADlAAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAMUAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAegAAAP8AAAD/AAAA/wAAAP8AAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAxwAAAPMAAAAgAAAAAAAAAAAAAAAAAAAAawAA - AP8AAAD/AAAA/wAAAP8AAABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAD/AAAATAAAAAAAAAAAAAAAAAAAAAAAAADMAAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD6AAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAA - APUAAAD/AAAA/wAAAP8AAAD/AAAAwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABxAAAA/AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMUAAABJAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfAAAA/wAAAP8AAAD/AAAA/wAA - AIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAMAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAA/wAAAP8AAAD/AAAA/wAAAJUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqwAA - AP8AAADDAAAAAgAAAAAAAAAAAAAAKQAAAP0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAAYAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAADTAAAA/wAAAP8AAAD/AAAA/wAAAP8AAABBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+wAA - AKkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAALEAAAD/AAAA/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAADKAAAA/wAAAP8AAAD/AAAA6QAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAA/QAAAP8AAACrAAAAMQAAAEAAAADTAAAA/wAA - AP8AAAD/AAAA/wAAAP8AAADlAAAA/wAAAP8AAAD/AAAAzwAAAHEAAAA7AAAAJgAAADwAAAB/AAAA8gAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AE8AAAD+AAAA/wAAAP8AAAD/AAAA+gAAAJUAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAAP8AAAD/AAAA/wAA - AP8AAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAAAP8AAAD/AAAAUgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAABgAAADfAAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAKwAAAAFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAA6gAAAP8AAAD/AAAA/wAAAMIAAAAnAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAACwAAAA/wAAAP8AAAD/AAAA/wAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAACQAAAOcAAAD/AAAA/wAAAP8AAADQAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAPMAAAA8AAAAAAAAAB4AAADOAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAPoAAAB/AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AIkAAAD/AAAA/wAAAP8AAACPAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4AAAD/AAAA/wAA - AP8AAAD/AAAAqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAagAAAP8AAAD/AAAA/wAA - AP8AAAB1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAMAAAB6AAAA8QAAAP8AAAD/AAAA/wAAAP8AAADVAAAAOAAAAAAAAAAAAAAAAAAA - AAcAAAByAAAA4gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOsAAACWAAAAIgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAA8gAAAP8AAAD/AAAApQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAACnAAAAzAAAAIUAAAAHAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAP8AAAD/AAAA/wAAAP8AAAD2AAAADwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAvwAAAP8AAAD/AAAA/wAAAPoAAABPAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAUAAA - AG4AAABhAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAALgAAAFgAAABtAAAAawAA - AFkAAAAvAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AEkAAAD/AAAA/wAAAPgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAA2AAAA7QAAAP8AAAD/AAAA/wAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAA9AAA - AP8AAAD/AAAA/wAAAP8AAACFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAA5QAA - AP8AAAD/AAAA/wAAAPkAAABTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAApgAAAM4AAACbAAAAEAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAP8AAAD/AAAAzgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAOwAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - ADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHAAAA/wAAAP8AAAD/AAAA/wAAAP0AAAB5AAAABAAA - AAAAAAARAAAATgAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAA7QAAAP8AAAD/AAAA/wAAAP4AAACZAAAAOAAA - ABAAAAAYAAAAZQAAAPEAAAD/AAAA/wAAAP8AAACqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACTAAAA/wAAAP8AAACyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAsAAADSAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAgAAADNAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADhAAAArQAAAPUAAAD/AAAAqAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAsAAAA2wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - APwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAD/AAAA/wAAAMYAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAArgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAADBAAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD5AAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAvAAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAbAAAAP8AAAD/AAAA+gAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AI0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+AAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAIAAABmAAAA4QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAbAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAE0AAAD+AAAA/wAAAP8AAADRAAAAzgAAAPsAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAACXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAA/gAAAP8AAAD/AAAAngAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAACNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkAAADuAAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA4gAAAAIAAAAAAAAAAAAAAA8AAACFAAAAsQAAAH8AAAAKAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA3AAAAP8AAAD/AAAAqgAA - AAUAAAAAAAAACQAAADgAAABdAAAAewAAAH8AAAB+AAAAVwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAACzAAAA/wAAAP8AAAD/AAAAkgAAAAsAAAAAAAAAAAAAAAAAAAAVAAAApwAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAwwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAABBAAAA+QAAAP8AAAD/AAAA/wAAAP8AAAC7AAAAhwAAAKcAAAA0AAAAAAAA - AAAAAAAAAAAAvwAAAP8AAAD/AAAA/wAAAK8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABgAAADpAAAA/wAAAN8AAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAADvAAAA/wAA - AP8AAAD/AAAA7AAAAKcAAACSAAAAsgAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - ALwAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAOMAAAD/AAAA/wAA - AP8AAAD/AAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - ADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADFAAAAagAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAH8AAAB/AAAAfwAAAH8AAABkAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAAB/AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAABtAAAA/wAAAP8AAAD/AAAA/wAAANgAAAADAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAjQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAA - AP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AB0AAAC0AAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPUAAACeAAAAIQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEAAAD/AAAA/wAA - AP8AAAD/AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnAAAA/wAAAP8AAAD/AAAA/wAA - AP8AAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAAiAAAAMUAAADxAAAA/gAA - AP8AAAD4AAAA3QAAAKMAAABiAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAAtAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAKQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAA - AP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAigAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAP4AAAD/AAAA/wAAAP8AAAD+AAAABAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAABBAAAA/wAAAP8AAAD/AAAA/wAAAP8AAABiAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAA - AP8AAAD/AAAA/wAAAP8AAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5AAAA/wAA - AP8AAAD/AAAA/wAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2AAAA/wAAAP8AAAD/AAAA/wAAAIkAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADrAAAA/wAAAP8AAADYAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AGIAAAD/AAAA/wAAAP8AAAD/AAAA+QAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAA - AP8AAAD/AAAA/wAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAADCAAAA4AAA - AGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAANYAAAD/AAAA/wAAAP8AAAD/AAAA9gAA - AH0AAAAiAAAAAAAAAAAAAAAIAAAAQAAAAKYAAAD/AAAA/wAAAP8AAADrAAAADwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAATAAAA6AAAAP8AAAD/AAAA/AAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAANQAAAPQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD4AAAA8gAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIoAAAD/AAAA/wAA - AP8AAAD/AAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAA - AMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAPIAAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACvAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAA6AAAAP8AAAD/AAAA/wAAAP8AAAD5AAAADwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAMIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD+AAAAmwAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAABHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAA - AP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AD4AAACfAAAA4QAAAP8AAAD/AAAA/wAAAP8AAADsAAAApQAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAB8AAAAmAAAAFAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxAAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAAkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAA - AP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAMAAAA6AAAAbgAAAI4AAACbAAAAmQAAAIwAAAByAAAAQgAA - AAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACgAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAA0AAACDAAAA6gAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9QAAAKMAAAAtAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAA - AP8AAAD/AAAA/wAAAMgAAAAyAAAA4AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAPwAAACIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABMAAAAUAAAABAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAkQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAA5QAAAO8AAAD/AAAA/wAA - AP8AAADiAAAAngAAAHIAAABgAAAAZwAAAIUAAADPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAACgAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAMgAAAKYAAADvAAAA/wAAAP8AAAD7AAAA0AAAAIAAAAAYAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAADgAAADVAAAA/gAAAPIAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ADMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADEAAAARwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABSAAAA8AAAAP8AAAD/AAAA/wAAAP8AAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAI4AAAD9AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAPAAAABiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAA7gAAAP8AAAD/AAAA/wAA - AP8AAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAAbwAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAA+wAAAP8AAAD/AAAA/wAA - APMAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAUAAACwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACGAAAAAAAA - AAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAvgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ADIAAAD/AAAA/wAAAP8AAAD/AAAA9AAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAACTAAAA/wAAAP8AAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - APQAAAC8AAAApQAAAMYAAAD9AAAA/wAAAP8AAABvAAAAAAAAAAAAAAALAAAA9QAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAAD/AAAA/wAA - AP8AAAD/AAAAzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AEkAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACTAAAAFAAAAAAAAAAAAAAAAAAAACsAAADbAAAA/wAA - APsAAAA3AAAAAAAAAE4AAAD/AAAA/wAAAP8AAAD/AAAA/QAAAP8AAAD/AAAAbQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAACYAAAD/AAAA/wAAAP8AAAD/AAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO8AAAD/AAAA/wAAAP8AAAD9AAAAEQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA2wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAagAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAD0AAAA/wAAANwAAAAJAAAAjQAAAP8AAAD/AAAA/wAA - AMkAAAAPAAAAKwAAAOEAAACiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM4AAAD/AAAA/wAA - AP8AAADGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAA - AP8AAAD/AAAA/wAAAP8AAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AF4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AIIAAAD/AAAA/wAAAIQAAAC+AAAA/wAAAP8AAAD/AAAAPQAAAAAAAAAAAAAAagAAAMwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAAAJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyAAAA/wAAAP8AAAD/AAAA/wAAAEUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAP8AAAD/AAAA/wAAAP8AAADuAAAADgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAPsAAAD/AAAA+AAAAPMAAAD/AAAA/wAA - AN8AAAAAAAAAAAAAAAAAAAApAAAA7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAA9wAA - AP8AAAD/AAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAA - AMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AKgAAAD/AAAA/wAAAP8AAAD/AAAAUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ABwAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAwgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAoQAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChAAAA/wAAAP8AAABOAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAP8AAAD/AAAA/wAAAP8AAABHAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYgAAAP8AAAD/AAAA/wAAAP8AAAD9AAAAGgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAABtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AHAAAAD/AAAA/wAAAJsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAA - AP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAC6AAAA/wAAAP8AAAD/AAAA/wAAADsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACdAAAA/wAAAP8AAAD/AAAA/wAAAMcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAADcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkgAAAP8AAAD/AAAA9QAAABUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANcAAAD/AAAA/wAAAP8AAAD/AAAAGAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAD/AAAA/wAAAP8AAAD/AAAAfAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAPUAAAD/AAAA/wAA - AP8AAAD/AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAADBAAAA/wAAAP8AAAD/AAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAA - AP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAADAAAA9wAAAP8AAAD/AAAA/wAAAOsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAA5gAAAP8AAAD/AAAA/wAAAP8AAABHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAvgAAAP8AAAD/AAAA/wAAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAPUAAAD/AAAAqgAAAP8AAADzAAAAFgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAD/AAAA/wAAAP8AAAD/AAAApQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7AAAA/wAAAP8AAAD/AAAA/wAA - AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAAAA/wAA - AP8AAAD/AAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAA8AAAA/wAAAO0AAAAfAAAA/AAAAP8AAACVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAA - AP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAegAAAP8AAAD/AAAA/wAAAP8AAABNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABAAAAP8AAAD/AAAA/wAAAP8AAAD9AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkAAAD/AAAA/wAAAP8AAAD5AAAACwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAD/AAAAtAAAAAAAAAC3AAAA/wAA - APoAAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADdAAAA/wAAAP8AAAD/AAAAygAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/QAAAP8AAAD/AAAA/wAA - AO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATQAA - AP8AAAD/AAAA/wAAAP8AAABLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAA2QAAAP8AAAB4AAAAAAAAAE0AAAD/AAAA/wAAALMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAA - AP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAaQAAAP8AAAD/AAAA/wAAAPYAAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAADwAAAA/wAAAP8AAAD/AAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAAA/wAAAP8AAAD/AAAA/wAAAI8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUAAAD/AAAA/wAAADgAAAAAAAAAAgAA - ANwAAAD/AAAA/wAAAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAADwAAAA/wAAAP8AAAD8AAAAVwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANcAAAD/AAAA/wAA - AP8AAADiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AIoAAAD/AAAA/wAAAP8AAAD/AAAAygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAkgAAAP8AAADzAAAABAAAAAAAAAAAAAAAcAAAAP8AAAD/AAAA1AAAAAQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACQAAAAAAAAAAAAAAAAAA - AAAAAAAZAAAA2AAAAP8AAAD/AAAA+AAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAswAAAP8AAAD/AAAA/wAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArwAAAP8AAAD/AAAA/wAAAP8AAAD6AAAACQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADtAAAA/wAAALcAAAAAAAAAAAAA - AAAAAAAOAAAA8gAAAP8AAAD/AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAA - AAAAAAAEAAAAmwAAAPcAAAD+AAAA2QAAAI8AAAAdAAAAMAAAANwAAAD/AAAA/wAAANsAAAAzAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAA/wAA - AP8AAAD/AAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAADdAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAYQAAAP8AAAD/AAAAcwAAAAAAAAAAAAAAAAAAAAAAAACSAAAA/wAAAP8AAADtAAAAEgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAFEAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - APkAAAD4AAAA/wAAAPoAAACNAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAD/AAAA/wAAAP8AAAD/AAAACQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAAAA/wAAAP8AAAAuAAAAAAAA - AAAAAAAAAAAAAAAAACUAAAD9AAAA/wAAAP8AAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAA - AAAAAAAAAAAATgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAApQAAAAcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAA - APQAAAD/AAAA/wAAAP8AAAAxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABDAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAQgAAAP8AAAD/AAAA5AAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALUAAAD/AAAA/wAA - APsAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAPAAAA6AAAAP8AAAD/AAAA/wAA - AO4AAAC6AAAA/wAAAP8AAAD/AAAA0wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqgAAAP8AAAD/AAAA/wAAAFwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAADqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAA/wAAAP8AAACYAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAP8AAAD/AAAA/wAAALsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAA - AMgAAAAAAAAAAAAAAAAAAAAeAAAAgQAAAIcAAABRAAAABwAAAAAAAACEAAAA/wAAAP8AAAD/AAAA6QAA - ACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABKAAAA/wAAAP8AAAD/AAAAmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAA0AAAAP8AAAD/AAAA/gAAAP8AAAD/AAAA/wAAAP8AAAAmAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAOAAAAP4AAAD/AAAA/wAAAEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA4AAA - AP8AAAD/AAAA/wAAAEoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAADHAAAA/wAAAP8AAAD/AAAA2gAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAADYAAAA/wAAAP8AAADmAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0AAAD/AAAA/wAAAP8AAACuAAAA/QAA - AP8AAAD/AAAA/wAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAAA/wAAAP8AAADwAAAABgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7AAAA/wAAAP8AAAD/AAAA1AAAAAMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAP8AAAD/AAAA/wAA - AP8AAADNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AAAD/AAAA/wAA - AP8AAAD/AAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAFYAAAD/AAAA/wAAAP8AAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAkgAAAP8AAAD/AAAA/wAAAEcAAADUAAAA/wAAAP8AAAD/AAAAmQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAARQAAAP8AAAD/AAAA/wAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AB0AAAD9AAAA/wAAAP8AAAD/AAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAkAAAA/wAAAP8AAAD/AAAA/wAAAN0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAPsAAAD/AAAA/wAAAP8AAADhAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMIAAAD/AAAA/wAA - AL4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAD1AAAA/wAAAP8AAADfAAAAAgAA - AJsAAAD/AAAA/wAAAP8AAADTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADUAAAA/wAAAP8AAAD/AAAARwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL0AAAD/AAAA/wAAAP8AAADgAAAABgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAD9AAAA/wAA - AP8AAAD/AAAA9gAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0wAA - AP8AAAD/AAAA/wAAAP8AAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAPMAAAD/AAAA/wAAAF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAsgAAAP8AAAD/AAAA/wAAAGYAAAAAAAAAYgAAAP8AAAD/AAAA/wAAAP0AAAAQAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWgAAAIsAAAAEAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAdAAAAP8AAAD/AAAA/wAAAOUAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAABqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANUAAAD/AAAA/wAAAP8AAAD/AAAAMwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAAA/wAAAP8AAAD/AAAA/wAAAEMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgAA - APwAAAD/AAAA8wAAAEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4AAAD/AAAA/wAAAP8AAADDAAAAAwAA - AAAAAAAoAAAA/wAAAP8AAAD/AAAA/wAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAADqAAAA/wAAAHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAD3AAAA/wAAAP8AAAD/AAAAhQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA+gAAAP8AAAD/AAAA/wAA - AOIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAA - AP8AAAD/AAAA/wAAAP8AAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AK4AAAD/AAAA/wAAAP8AAAD/AAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAPoAAAD/AAAA+QAAAIsAAAAtAAAAGQAA - AEYAAADAAAAA/wAAAP8AAAD/AAAA0wAAABcAAAAAAAAAAAAAAAEAAADtAAAA/wAAAP8AAAD/AAAAggAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAP0AAAD/AAAA7wAAABgAAAAAAAAAAAAA - AAAAAAANAAAA0wAAAP8AAAD/AAAA/wAAAPsAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAC5AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtAAAA/gAAAP8AAAD/AAAA/wAAAOYAAAAKAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAAP8AAAD/AAAA/wAAAP8AAAA4AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAARAAAAOIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+wAAAJwAAAANAAAAAAAA - AAAAAAAAAAAAAAAAALUAAAD/AAAA/wAAAP8AAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAADAAAA+AAAAP8AAAD/AAAAsAAAAAAAAAAAAAAACwAAALkAAAD/AAAA/wAAAP8AAAD/AAAApwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAA - AP8AAAD/AAAA0wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAACtAAAA/wAAAP8AAAD/AAAA/wAAAIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAMAAADrAAAA/wAAAP8AAAD/AAAA9wAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAHEAAADFAAAA6wAA - AOwAAADZAAAAugAAAHcAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAwAAAAMAAAADAAA - AAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAA/wAAAP8AAAD/AAAApwAA - AHEAAADTAAAA/wAAAP8AAAD/AAAA/wAAAP0AAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAPQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAADsAAAA/wAAAP8AAAD/AAAA/QAA - AF4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAP8AAAD/AAAA/wAAAP8AAACpAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAApQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA - AP8AAAD/AAAA/wAAAP8AAACiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAEEAAAD3AAAA/wAAAP8AAAD/AAAA/AAAAIYAAAAJAAAAAAAAAAAAAAAAAAAAAAAA - ADQAAADpAAAA/wAAAP8AAAD/AAAA+QAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAPUAAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPIAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAA/wAAAP8AAAD/AAAA/wAAAPIAAAAGAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAADvAAAA/wAA - AP8AAAD/AAAA/wAAAPAAAACnAAAAhwAAAIwAAAC8AAAA/QAAAP8AAAD/AAAA/wAAAP8AAABmAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAZgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AIoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAADAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA - AP8AAAD/AAAA/wAAAP8AAAD6AAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAA5QAA - AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAeQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABOAAAAuwAAAPsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD1AAAAoAAAACsAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAA8gAAAP8AAAD/AAAA/wAAAP8AAACTAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABiAAAA9wAAAPcAAAD3AAAA9wAAAPcAAACPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAEUAAABoAAAAdwAA - AG4AAABdAAAANwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAzAAAAvAAAANoAAACuAAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////4D///////////////////+A///////// - ///////////gP///wA//////////////4D///4AD///////8AP///+A///4AAf//////8AB////gP//8 - AID///////AAP///4D///Afgf//////gMB///+A///gP8D//////wfwf///gP//wH/gf/////8P8D/// - 4D//8B/8H//////H/g///+A//+A//A////////4P///gP//gf/4P///////+D///4D//4H/+D/////// - /A///+A//8B//gf///////gf///gP//A//4H///////wH///4D//wP/+B///////gD///+A//8D//wP/ - ////gAA/gf/gP//A//8D/////gAA/4H/4D//wP//A/////wAA/+B/+A//8D//wP////4AP//gf/gP//A - //8D////+Af//4H/4D//wP//A/////AP//+B/+A//8D//wP////wH///gf/gP//A//8D////8D///4H/ - 4D//wP/+A////+A///+B/+A//8D//gP////gf///gf/gP//A//4D////4H///4H/4D//4H/+A////+B/ - //+B/+A//+B//gP////gf///gf/gP//gf/4D////4H///4H/4D//8D/8B////+B///+B/+A///A//Af/ - ///gf///gf/gP//4H/gH////4H///4H/4D///A/4D/8Af+B///+B/+A///4H8A/4AB/gf///gf/gf/// - A/Af8AAH4H///4H/4H///4DgH+AAA+B///+B/+B////AAD/AAAHgf///gf/gf///8AB/wB8B4H///4H/ - wH////gA/4B/4PB//8+A/8B////gAf+A//BwP//HgP/Af///wAf/gf/4cD//x4B/gP///4Af/4H//PA/ - /8MAPwD///8Af/+B///4H//AAAAB///+Af//gf//+B//4AAAAf///Af//4H///gP/+ACAAP///wP//+B - ///8D//wBwAP///4P/wfgP///Af//B/AP///+D/4H4D///4D4P////////h/8A/AI///AAD////////4 - f+APwAP//4AAf///////+H/AD+AB///AAH////////g/wA/wAf//wAD////////4P4Af+AGD/4EA//// - /////A4AH/ADg/+D//////////wAAD/gPwH/x///gf/////+AAB/4D8B/+f//4H//////wAB/+B/Af// - //+B///////AB//gfwH/////gf///////P//wH8B/////4H//////////8B/Af////+B///////////g - f4H/////gf//////////4H+D/////4H//////////+A/g/w///+B///////////gDAP4H///gf////// - ////8AAH+B///4H///////////gAB/AP//+B///////////8AA/wD///gf///////////wA/8A///4H/ - ///////////h//AP//+BwA/////////////wD///gQAD////////////8A///4AAAP/////h/+f///AP - //+AAAD/////gD+D///wD///gA/Af////gAfAf//8A///4A/4D////wADwH///gP//+A//A////8AAYA - ///4D///gf/wP///+AOCAP//+B///4H/+B////APwAD///wf//+B//gf///wH+AM///8H///gf/4H/// - 8B/gHP///B///4H/+B///+A/8B7///4f//+B//gf///gP/Af///+H///gf/4H///4H/wH////g///4H/ - +B///+B/8B////4P//+B//A////gf/g////8B///gf/wP///4H/4P////Af//4H/8D///8B/+B////xD - //+B/+A////A//gf///8Q///gf/gf///4P/4H///+EH//4H/wP///+D/+B////hg//+B54H////g//gP - ///w4P//gYAD////4P/4D///8PB//4GAB////+B/8A////Dwf/+BgA/////gf/AP///g+D//gYAH//// - 8H/wD///4fg//4HBA/////B/8Af//8H4H/+B/wH////wP+AH///B/A//gf+B////+D/gB///g/wP/4H/ - gf////w/wAf//wP+B/+A/8D////8H4ED/j8D/gf/wP/A/////g+BA/4+B/4D/8D/wP////8AAwP8HAf/ - A//Af8D/////gAeD/BgP/wP/4H+A/////8Afg/4AD/8B/+A/gf/////////+AB//gf/wDwH///////// - /gAf/4D/+AAD//////////8AP/+A//wAB///////////AH//gP//AA///////////4B//4D//8A///// - ///////B//////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////8oAAAAQAAAAIAAAAABACAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAA - AFEAAABRAAAAKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAEsAAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABMAAACOAAAA5AAAAP8AAAD3AAAAuAAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAgAAAAaQAAAH0AAABmAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAA/wAAAP8AAACBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4AAADkAAAA/wAAAOoAAACOAAAAdwAAAMQAAAD9AAAAdwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAA/AAAAPkAAADkAAAA/QAAAPoAAABzAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAP8AAAD/AAAAgQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAADmAAAA/wAAAMwAAAAVAAAAAAAA - AAAAAAABAAAAoAAAAP4AAABjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKAAAA+gAAAHoAAAAOAAAAAAAA - ACoAAADkAAAA/wAAAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AEsAAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAAAA/wAA - APEAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAsAAADnAAAA8gAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgwAA - AGAAAAAAAAAAAAAAAAAAAAAAAAAAagAAAP8AAACbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAABLAAAA/wAAAP8AAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAhAAAA/AAAAP8AAACFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgwAAAP8AAACSAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAD/AAAApgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAP8AAAD/AAAAgQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ADcAAAD/AAAA8QAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAC/AAAA/wAA - AHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAD/AAAA/wAA - AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgAAAD/AAAA4wAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAJAAAA/AAAAP8AAABOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA - ACgAAACnAAAA/wAAAOQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABLAAAA/wAAAP8AAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADiAAAA/wAA - ALYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOkAAAD/AAAAjQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAcwAA - ANMAAAD7AAAA/wAAAP8AAAD/AAAA/wAAAMQAAAAmAAAAAAAAAAAAAAAAAAAASgAAAO8AAADvAAAAdwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAP8AAAD/AAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAA+AAAAP8AAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeAAAA/wAA - ALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAtAAAAP8AAAD/AAAA7QAAAJkAAABsAAAAWQAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AE8AAAD/AAAA/wAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAD/AAAA/wAAAIEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPsAAAD/AAAAkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAA4QAAAP8AAADVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAP8AAAD/AAAApgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAABPAAAA/wAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAA/wAA - AP8AAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpAAAA/wAAAJgAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO8AAAD/AAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMIAAAD/AAAA1QAAAAUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATwAAAP8AAAD/AAAAfwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAASwAAAP8AAAD/AAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvQAA - AP8AAAC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAD9AAAA/wAAANoAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAD7AAAA/wAA - AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AAAD/AAAA/wAA - AH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAHcAAAD/AAAA6QAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAA/wAA - AP8AAADFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAyAAAA/wAAAP8AAAA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABPAAAA/wAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAA/wAAAP8AAACBAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA+QAAAP8AAABAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAYgAAAP8AAAD/AAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAASgAAAP8AAAD/AAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAATwAAAP8AAAD/AAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAA - AP8AAAD/AAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAAugAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK8AAAD/AAAA/wAAAF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAD/AAAA/wAAAAwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AAAD/AAAA/wAAAH8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAEsAAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAMAAAA1gAAAP8AAABnAAAAAAAAAAAAAAAAAAAAAAAAABwAAAD5AAAA/wAAAPIAAAAOAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAkAAAATwAAAFwAAABHAAAACwAAAAAAAAAAAAAAAAAAAAAAAABPAAAA/wAA - AP8AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPAAAA/wAA - AP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAAAA/wAAAP8AAACAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAADdAAAA+wAAAGIAAAAAAAAAAAAAAAAAAACdAAAA/wAA - AP8AAACCAAAAAAAAAAAAAAAAAAAAAAAAADsAAADOAAAA/wAAAP8AAAD/AAAA/wAAAPAAAABtAAAAAAAA - AAAAAAAAAAAAQQAAAP8AAAD/AAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAATwAAAP8AAAD/AAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgAAAP8AAAD/AAAAegAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAALEAAAD/AAAAsAAA - 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 - AAAAAAAZAAAA/wAAAP8AAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQAAAG0AAACEAAAAdQAA - AEEAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAP8AAAD/AAAADgAAAAAAAAAAAAAAAAAA - AMsAAAD/AAAA/wAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAD/AAAA/gAA - AAsAAAAAAAAAAAAAAAAAAAB+AAAA/wAAAP8AAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAD/AAAA/wAAAGQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABGAAAA/wAAAP8AAABvAAAAAAAAAAAAAAAAAAAAIAAAAPoAAADTAAAAAAAAAAAAAAAAAAAAAAAA - ADsAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAA/wAA - AP8AAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAL8AAAD/AAAA/AAAAKcAAAB6AAAAkQAAAOgAAAD/AAAAWQAA - AAAAAAAAAAAAAAAAACcAAAD5AAAA/gAAADsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAtQAAAP8AAAD/AAAA/wAA - AP8AAAD+AAAAkwAAAAAAAAAAAAAAAAAAAAAAAACEAAAA/wAAAP8AAACUAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAA3AAAAewAAAJEAAACAAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsQAAAP8AAAD/AAAAwAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAA/wAAAP8AAABkAAAAAAAA - AA8AAAA/AAAATQAAAD8AAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ALsAAAD/AAAA/wAAAM8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAA - AP8AAAD/AAAAcAAAAJsAAAD5AAAA/wAAAP8AAAD/AAAA/AAAALMAAAAiAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAABlAAAAiQAA - AHQAAAAmAAAAAAAAAAAAAAAAAAAADgAAAHcAAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAACkAAAA/wAAAP8AAADCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABkAAAD/AAAA/wAAAPQAAADwAAAAigAAAEQAAAAxAAAAVQAAANAAAAD/AAAA5wAA - ABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AC4AAADiAAAA/wAAAP8AAAD/AAAA+wAAAHkAAAAAAAAAAAAAAKcAAAD/AAAA/wAAAEYAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAApAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAA/wAAAP8AAADLAAAAHAAAAAAAAAAAAAAAAAAA - AAAAAAAOAAAA4wAAAP8AAAChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAABIAAADkAAAA/wAAAP8AAACmAAAAWAAAAHsAAAD2AAAAaAAAABYAAAD8AAAA/wAA - AP4AAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAD/AAAA/wAA - AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIcAAAD/AAAA8gAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPAAAA/wAAAP8AAACBAAAAAAAAAAAAAAAAAAAAZgAA - APYAAAB2AAAA/wAAAMEAAAAOAAAArgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAzgAAAP8AAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ABkAAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdAAAA/wAAAP8AAAAeAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAA8AAAAP8AAADaAAAAAwAA - AAAAAAAAAAAAAAAAAAcAAADvAAAA+gAAAP8AAABgAAAAAAAAAEkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGsAAAD/AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAZAAAA/wAAAP8AAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAA - AP8AAAD/AAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAA - AP8AAAD/AAAAdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqwAAAP8AAAD/AAAAKgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAA/wAAAGkAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAGQAAAD/AAAA/wAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAGsAAAD/AAAA/wAAADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG4AAAD/AAAA+QAA - AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAA - AOkAAADeAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAD/AAAA/wAA - AGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLAAAA/wAAAOMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAA/wAAAP4AAAAIAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAzAAAA/wAAAPEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAALEAAABwAAAA7AAAAG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAZAAAA/wAAAP8AAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1QAAAP8AAACFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAewAAAP8AAADzAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAALgAAAP8AAAD/AAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAD1AAAALAAAAIoAAADsAAAAEQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAA - AP8AAADSAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AGIAAAD/AAAA8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE4AAAD/AAAA/wAAAHMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiAAAA6gAAAAEAAAAfAAAA+wAA - AJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAD/AAAA/wAAAGQAAAABAAAAZQAA - AHgAAAArAAAASQAAAPUAAADBAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP0AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6AAAA/wAA - AP8AAACsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAygAA - AKcAAAAAAAAAAAAAAKwAAAD6AAAAKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAA/wAA - AP8AAABkAAAAKAAAAP8AAAD/AAAA/QAAAP0AAACNAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAOcAAAD/AAAAIwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAsgAAAP8AAAD/AAAA5gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAPgAAAP8AAABfAAAAAAAAAAAAAABAAAAA/wAAALgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAAAAMAAAChAAAAtQAAAGwAAADgAAAA9AAAAE4AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAA/wAA - AGAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAPMAAADqAAAA/gAAAP8AAAAhAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAD7AAAAFAAAAAAAAAAAAAAAAAAAANYAAAD/AAAASAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAARQAA - AP8AAAD1AAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAFQAAAO8AAADAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAAiQAAANsAAAD/AAAAWwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcAAAD/AAAAuQAAAAAAAAAAAAAAAAAA - AAAAAAB2AAAA/wAAANAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAA/gAAAP8AAAB2AAAAAAAA - AAAAAAAAAAAAAAAAAAMAAADzAAAA/wAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaAAAA/gAAAGQAAAAAAAAAAAAAACQAAADrAAAA8AAA - ABoAAACiAAAA/wAAAJUAAAAAAAAAAAAAAAAAAAAAAAAAUQAAAIEAAAAAAAAAAAAAAAoAAADaAAAA/wAA - AFsAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAP0AAAD/AAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ANgAAAD/AAAArQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2gAAAP8AAACjAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgAAAD2AAAArQAA - AJcAAADvAAAA5QAAAD4AAAAAAAAAaQAAAP8AAADPAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAD7AAAAMgAA - AAIAAACmAAAA/wAAAOgAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAA/wAAAMwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAAAPgAAAAlAAAAAAAAAAAAAAAAAAAAAAAAAOkAAAD/AAAAjgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAHwAAAGwAAABxAAAATAAAAAgAAAAAAAAAAAAAAAEAAAAGAAAABQAAAAAAAAAAAAAAAAAA - AAAAAABPAAAA/wAAAOkAAADQAAAA/wAAAP8AAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAA - AP8AAAD/AAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAMgAAAD/AAAA1QAAACQAAAAAAAAAAAAA - AFwAAAD/AAAA/QAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAOEAAAD/AAAA/wAAAP8AAADVAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAE4AAAD/AAAA/wAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAtAAA - AP8AAAD7AAAAywAAANEAAAD+AAAA/QAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAAAA+wAAAP8AAADkAAAAKAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAA+wAAAPsAAAC/AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAABCAAAAkwAAALcAAACyAAAAjAAAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ADwAAABiAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////+H//////// - /4f/Af///g//h/4A///8B/+H/Bh///hD/4f8PD//+eP/h/h+P///4/+H+H4f///D/4f4/h///wP/h/j/ - H//gBw+H+P8f/8AfD4f4/x//wf8Ph/j/H//D/w+H+P4f/4f/D4f4fh//h/8Ph/h+H/+H/w+H/H4f/4f/ - D4f8PB8Hh/8Ph/4cPAOH/w+H/wA4AYf/D4f/wHhwh/sPh/+A8PxH+QcH/wPw/sP4AA/+D/D/w/gAD/w+ - MP/h/BA//HwwH+AP///8eDgP8Af///xwPAH4D////gA4EPH/D//+APhw+f8P//+B+HD//w/////4cP// - D/////hx5/8P////+AHD/w/////8A8P/D/////8Hw/8IP//////D/wAP//Bx/8P/AAf/4DD/w/8Hh//A - AP/D/w/D/8OA/+P/D8P/g4L/4/8Pw/+Hw//j/w/D/4fD/+H/D8f/h8P/4f8Px/+Pw//A/w+H/4/D/8D/ - AA//h8P/zH8AH/+Hw/+MfwAf/8eB/44/Dw//x4H/Hh8PD//jAeYeH4+P//AR4B8fh4//+DHgPw+DD/// - /+A/D8Af////8H8P8D/////4////////////////////////////////////////////////KAAAADAA - AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAPQAA - ABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAPgAAADMAAAAFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAI8AAAD3AAAA7AAA - AN0AAADWAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAALAAAAhAAAANIAAADXAAAAnQAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAogAA - AP4AAACMAAAACgAAAAEAAABgAAAA8wAAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChAAAAsgAAAD8AAAA8AAAA0AAAANUAAAAHAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAABMAAAA/gAAALYAAAABAAAAAAAAAAAAAAAAAAAApgAAANUAAAAGAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAB6AAAAAgAAAAAAAAAAAAAASgAA - AP4AAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAC5AAAA/gAAAD4AAAAAAAAAAAAAAAAAAAAAAAAARAAAAP4AAABWAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAZAAAAP4AAAAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAA - AGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAD1AAAA7wAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADAAA - AP0AAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAUAAABGAAAA5wAAAMcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0AAAD+AAAAxAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAO0AAADpAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAGAAAAKMAAADwAAAA/gAAAPkAAADtAAAAoQAAABUAAAAAAAAAAAAAAHUAAADzAAAAmAAA - AAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0AAAD+AAAAsAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOYAAAD+AAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAEAAAAyAAAAP4AAACzAAAAPgAAABQAAAAGAAAAAAAAAAAAAAAAAAAAAAAA - AHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ADIAAAD+AAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEAAAD+AAAAJwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGAAAA/gAAALcAAAADAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAA8AAAD2AAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAP4AAAD+AAAAIgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKAAAA/gAAAEsAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAA - AGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2AAAA+gAAABMAAAAAAAAAAAAAAAAAAAAAAAAANAAA - AP4AAAD4AAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvAAAA/gAA - ABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAA - AAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAA/AAAAHsAAAAAAAAAAAAA - AAAAAAAAAAAAeAAAAP4AAADNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAC8AAAA/gAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHsAAAD+AAAAnwAA - AAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAA - APQAAAA1AAAAAAAAAAAAAAAGAAAA2gAAAP4AAABxAAAAAAAAAAAAAAAAAAAAFwAAAGEAAACCAAAAeAAA - ADAAAAAAAAAAAAAAAAAAAAC5AAAA/gAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAAAAAAAAC5AAAA/gAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAwAAAJAAAADrAAAAWgAAAAMAAAB/AAAA/gAAANQAAAALAAAAAAAAAAAAAABTAAAA8QAA - AP4AAAD7AAAA+wAAAPsAAACGAAAAAgAAAAAAAACnAAAA/gAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAAAAAAAADDAAAA/gAAAFUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAA2gAAAOIAAAD9AAAA2wAAACMAAAAAAAAAAAAA - ABkAAADxAAAA/AAAAHMAAAATAAAAEwAAAFgAAADZAAAAcwAAAAAAAACDAAAA/gAAAEQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAIAAAAOAAAAAAAAAHsAAAD+AAAAoQAAAAAAAAAAAAAAAAAAAAMAAADgAAAA/gAA - ADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAAC2AAAA/gAAAPQAAACOAAAADgAA - AAAAAAAAAAAAAAAAAGcAAAD+AAAAmQAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAoQAAAAUAAABLAAAA/gAA - AHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAACaAAAAAAAAAI4AAAD+AAAA7QAAACUAAAAAAAAAAAAA - AEcAAAD+AAAA5gAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAANwAAADuAAAAhAAA - ABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIMAAAD+AAAAYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAMAAAA7AAAAMsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAUAAADFAAAAnQAAAPAAAAD+AAAAtgAA - APAAAACiAAAAnQAAAPMAAAD3AAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAAA - ANIAAAAdAAAAAAAAAAAAAAAAAAAAHAAAADAAAAAAAAAAAAAAAHAAAAD+AAAAhwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAegAAAP4AAABdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAoAAA - AMEAAABrAAAAAgAAAF4AAAC2AAAAxQAAAJsAAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAA5wAAAFQAAAAAAAAAAAAAAAAAAAApAAAA6wAAAPoAAAAoAAAAAAAAACEAAADzAAAA7QAA - AEUAAABJAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAALAAAAD4AAAAegAAAE0AAAC9AAAAvgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAA6QAAAFsAAAAAAAAAAAAAABQAAADWAAAA/gAAAP0AAAAxAAAAAAAA - AAAAAABEAAAA5QAAAP4AAAD+AAAAQQAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAA4AAADlAAAA2AAA - AOoAAAD9AAAA4AAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAOAAAABRAAAATAAAANEAAAD+AAAA/gAA - AJcAAAAAAAAAAAAAAAAAAABDAAAA9gAAANIAAAB2AAAADgAAAIUAAADqAAAALQAAAAAAAAAAAAAAAAAA - ACcAAAC8AAAABwAAAAUAAAAPAAAACAAAAAAAAAAAAAAAAAAAAA8AAAAvAAAAGgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAJUAAADxAAAA/gAA - APoAAADRAAAAXgAAAAAAAAAAAAAAAAAAAAAAAADAAAAA/gAAADQAAAAAAAAAAAAAANoAAAD+AAAAdQAA - AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAD+AAAAigAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAALAAAAIQAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA/gAAAAUAAAAAAAAAAAAA - AMIAAAD/AAAAagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AFIAAAD+AAAAigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9AAAA/wAA - AEMAAAAAAAAAAAAAAF4AAAD9AAAAKwAAAAAAAAAAAAAAIQAAAC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAFIAAAD+AAAAigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAA9AAAA9gAAAPMAAACmAAAAqAAAAPIAAACsAAAAAAAAAAAAAAAHAAAA3wAAAOsAAAANAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAD+AAAAigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAALMAAADjAAAA4AAAAJcAAAAPAAAAAAAAAAAAAAA3AAAA/gAA - AP4AAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAD+AAAAigAAAAAAAAAAAAAABgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAABMAAAA/gAAAP4AAABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAD+AAAAkgAA - AIQAAADdAAAA8gAAAOgAAACsAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAEYAAACeAAAAmgAAAEgAAAAAAAAAAAAAAEEAAACbAAAAHQAAAAAAAAAAAAAAAAAA - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAA8AAAAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAKAAAADQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///////////////////////////+P///4f////4///+A//8D/j///4B//wH+P///Dj - /+Mf4///8eP//x/j///h4//8H+P//+Px/8Ax4///4/H/gPHj///j8f+H8eP//+Ph/4/x4///8eH/j/Hj - ///x4/+P8eP///jDg4/x4///+AMAj/Hj///+BgCPkcP///wOPA+Qw///+D4/h4AH///45j/HwA////HC - B8B/////8YMF4D/////4BwDgcf////gPGPfx/////j8Y//H//////xjP8f//////AYfx//////+Bh/Gf - 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 - AAAAAAAAAAAAAAAAAAAAAAALAAAAAgAAAAAAAAASAAAAfAAAAGMAAAAGAAAAAAAAAAAAAAAAAAAAAAAA - ADUAAABlAAAAGwAAAAAAAAAAAAAAkgAAACAAAAAAAAAAjQAAABsAAAAbAAAAbgAAAAAAAAAAAAAAAAAA - AAAAAAAOAAAANQAAAFoAAAAAAAAAAAAAAJIAAAAgAAAAAAAAAKMAAAAAAAAAAAAAAKkAAAAAAAAAAAAA - AAAAAAA9AAAAlQAAAEoAAAACAAAAsAAAAAAAAACSAAAAIAAAAAAAAACHAAAADwAAABQAAACpAAAAAAAA - AAAAAAAAAAAAjAAAAAwAAAAAAAAAAAAAALMAAAAAAAAAkgAAACAAAAAAAAAAEAAAAHQAAACRAAAARQAA - AGAAAACMAAAAXwAAAIoAAAAMAAAAAAAAAAEAAACzAAAAAAAAAJgAAAAaAAAAAAAAABMAAACQAAAAMgAA - AAUAAACmAAAAAAAAABMAAABOAAAASgAAAAAAAABTAAAAswAAAHcAAACUAAAAAAAAAAAAAABEAAAAPgAA - AKUAAABSAAAAfQAAAHYAAAAuAAAAAAAAAIoAAACFAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AEwAAABAAAAAAAAAAJgAAAANAAAAqgAAAAMAAAAFAAAAAAAAAAAAAACeAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAoAAAAhwAAAEAAAABgAAAAZQAAAAAAAAAAAAAAnwAAAEMAAAAyAAAAAAAA - AAAAAAAAAAAAKwAAAJwAAABVAAAAngAAAAAAAAAAAAAAUAAAAGMAAAAAAAAAAAAAAK4AAAAgAAAAfQAA - AC0AAAAAAAAAAAAAAJEAAAAZAAAAYwAAAEwAAAAAAAAAAAAAABwAAABiAAAAAAAAAAAAAACeAAAAAAAA - AGEAAAA6AAAAAAAAAAAAAACNAAAAAgAAAFoAAABjAAAAAAAAAAAAAABVAAAAZAAAAA4AAAAAAAAAngAA - AF8AAAB/AAAAAAAAAAAAAAAAAAAALgAAAFIAAACAAAAAjAAAAA0AAAAmAAAAfwAAABYAAAB/AAAAAAAA - AJ4AAAACAAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAABQAAAAAAAAAFAAAAtwAAACcAAAAAAAAAhwAA - AAAAAAApAAAAbQAAAFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8nEGHjJxBh4ycQbcEnEGHNJxBgCScQYIhnEGAl5xByDecQfgx - nEHDMJxBwzScQcMRnEHAEZxB5FGcQf//nEE= + + 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 + AAAfAAAAAAAAAAAAFwADAAAAAAAABgMAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAGQAAAAAAAAAA + AAAAAAAAHwAAAAAAAAAAAAEAHgAAAAAAAB8AGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAA + AAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA + AAAAAAAAAAAAAAAAAAAfAAAAAAAAAAARAAcAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + FgAGAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAABwASAAAAAAAAAAAFABwAAAAAAAAAAAAAAAAAAAAAAAAL + AQAAAAAOAAAAAAAEBAAAAAAAAAAAAB8AAAAAAAAAAAEAGAAAAAAAAAAACAARAAAAAAAAAAAAAAAAAAAA + ABIAAAQZAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAABABsAAAAAAAAAAAcACgAAAAAAAAAAAAAA + AAAAAAAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAABQAZAAAAAAAAAAAEAAcAAAAAAAAA + AAAAAAAAAAAPAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAABAAEgAAAAAAAAAAAAAJAAAA + AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAUAAAAAAAAAAAAA + DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAEAAAAAAAAA + AAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAbABEA + AAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAA + AAoAAAAAAAAAAQADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAA + AAAAAAAACAEAAAAAGAAAHwAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAATABMAAAAADgAAAAAAAQAACRMOAQAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAFAAAADwAAAAAACwABAAAAAAAdAQAAAAIAAAAAAAAAAAAAAAAAAAAAHwAA + AAAAHAAAAAAAAAAAAAAAAAAAAAAHAAAEAAAAAAAAAAAAHQAAAAAAAAAHAAAOABkAAAAAAAAAAAQAAAAA + AAcAAAAAAAcABAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAS + GAAQAAABCgAAABEAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA + AAAAAAUAAAAPAAMAAAAAAB0AAAAAAAAAAAAAAAAIBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAJ + AAAAAAAAAAAAGhMfAAAAHhMTHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAIAAcAAAAAAAAAAAAA + AAAPAAsAAAAIGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAUAAAAAAQAAgUGAAAA + AAAAAAAAABUAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAAAHAAAAAAAAAAAAAwAA + AgAAAAAAAAAAAAANBQAcEhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwAXAAAFAAAAFwAAAAAA + DgAHAAAAHwAFAAAAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAGAAAA + AAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAA + AAAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAQAAEWABsFAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAABsAAAAAHgAAGgAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbHwAAAAAAABMAAA8AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAMAAAAAAAAAAAAAAAA + AAAZAQAAAAETAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAFgAADwAAAAAAAAAA + AAAAAAACBB0AAAALAAYAAAAAAAAAAAAAAAAAAAAABwAAAAEAAAAWAAAAAAAAAAAAAAAAAAAAABYAAAAA + AAAAAAAAAAAADQAAAAAAAAcAFwAAAAAAAAAAAAAAAAAABgAAFgAAAgAAAQAAFgAAAAAAAAAAAAAAAAAf + AAAAAAAAAAAAAAAAAAAAAAAAAAAeAAMAAAAAAAAAAAAAAAAAHAAAHwAAAAACAAAPABQAAAAAAAAAAAAA + AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQACQAAAAAABAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA + AAAAAAAAAAAAAAAAAAAFCAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAADAAAAAAAAAAAAAAAAAAATAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAoAHgAAAAAAAAAAAAAAAAAAAwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAdBQAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAA + AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAEbAAAAAAAAAAAAAAAAAAAAAAACDwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAA0WAAAUAQAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAA + AAAAAAAAAAAGAAAAAAAAABMAAAYAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAFxIABwIAAAAA + AAAAAAAAAAAAAAAAHQAAAAAAAAADBQAAAAAAAAAAAAAAAAAQAQAAAAAKAAAAAAAAAAAAAAAAAAAAAAAA + AgAAAAAAAAAAAAAAAAAAAAAEDwAAAAAAAB0JAAAAAAAAAAAAAAAAABEAAAAAAAALAAAAAAAAAAAAAAAA + AAAAAwAfAAAAAAAAAAAAAAAAAAAAAAAAAAAABQQAFwAaAAAAAAAfAAAACQAAAAAAAAAAAAAAAAAAAAAJ + ABQAAAAAAAkAFwAAAAAAAAAAAAAAAAAAAAAAAhQaBAYAAAAADAAAAAAAAQAAFgAFAAAAAAAADQAMAAAA + AAAAAAABAAAAAAAFABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCwAAAAAAAAAAAB8A + AAAAAAAAAAANAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAACgAAAAAA + AAAAAAAcAAAAAAAAABIAAQ0LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABgAA + AAAAAAAAAAEBEAAAAAAAAAAAABsSExwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + ///////////////////////////////////////H/4P//////8f/Cf///g//x/48///95//H/H5///vz + /8f8fj////P/x/z/P///5//H+P8////H/8f4/x//+A+fx/j/H//g/5/H+P8f/+P/n8f4/x//x/+fx/j/ + H//P/5/H/P8f/8//n8f8/x//z/+fx/x+P//P/5/H/n4//8//n8f/PD4Hz/+fz/+MfAHP/5/P/+D4+c// + j4//w/j+x/uPj/+P+f/n+Qcf/z/5/+f8EB/+f/n/4/44f/7+eP/xz////vw8H/gP///+eH4f+R////4w + fHH7/////wH88f//n///7/zx//+f/////Pn//5/////8+f//n/////wj5/+f/////gPD/5//////z8P/ + n///////w/+QH//9///D/4OP//Bx/+P/j8f/4bD/4/+fx//D0v/n/5/n/8fH//f/n+f/z8f/9/+f5//P + 5//z/5/H/8/n/+v/n8f/z+f/6f+fz//P5//s/5+f/8/j/8z/mD//z8P/3n+ZP//Pw/+ef5+f/+fD/58/ + n4//95H3Pz+Pj//4OfY/H8+P////8H8fx5/////wf4/gP/////j/j/h///////////////////////// + /////////////////////////////ygAAAAwAAAAYAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAABQUFAAkJCQANDQ0AERERABUVFQAZGRkAHR0dACEhIQAlJSUAKSkpAC0tLQAyMjIANjY2ADk5 + OQA9PT0AQkJCAEZGRgBISEgATU1NAFFRUQBWVlYAWVlZAF1dXQBgYGAAZWVlAGlpaQBubm4AcXFxAHV1 + dQB5eXkAfHx8AAAAAAAALC8AAEtQAABocAAAhpAAAKWwAADDzwAA4fAAEe//ADHx/wBR8/8AcfX/AJH3 + /wCx+f8A0fv/AP///wAAAAAAAC8hAABQNwAAcEwAAJBjAACweQAAz48AAPCmABH/tAAx/74AUf/IAHH/ + 0wCR/9wAsf/lANH/8AD///8AAAAAAAAvDgAAUBgAAHAiAACQLAAAsDYAAM9AAADwSgAR/1sAMf9xAFH/ + hwBx/50Akf+yALH/yQDR/98A////AAAAAAACLwAABFAAAAZwAAAIkAAACrAAAAvPAAAO8AAAIP8SAD3/ + MQBb/1EAef9xAJj/kQC1/7EA1P/RAP///wAAAAAAFC8AACJQAAAwcAAAPZAAAEywAABZzwAAZ/AAAHj/ + EQCK/zEAnP9RAK7/cQDA/5EA0v+xAOT/0QD///8AAAAAACYvAABAUAAAWnAAAHSQAACOsAAAqc8AAMLw + AADR/xEA2P8xAN7/UQDj/3EA6f+RAO//sQD2/9EA////AAAAAAAvJgAAUEEAAHBbAACQdAAAsI4AAM+p + AADwwwAA/9IRAP/YMQD/3VEA/+RxAP/qkQD/8LEA//bRAP///wAAAAAALxQAAFAiAABwMAAAkD4AALBN + AADPWwAA8GkAAP95EQD/ijEA/51RAP+vcQD/wZEA/9KxAP/l0QD///8AAAAAAC8DAABQBAAAcAYAAJAJ + AACwCgAAzwwAAPAOAAD/IBIA/z4xAP9cUQD/enEA/5eRAP+2sQD/1NEA////AAAAAAAvAA4AUAAXAHAA + IQCQACsAsAA2AM8AQADwAEkA/xFaAP8xcAD/UYYA/3GcAP+RsgD/scgA/9HfAP///wAAAAAALwAgAFAA + NgBwAEwAkABiALAAeADPAI4A8ACkAP8RswD/Mb4A/1HHAP9x0QD/kdwA/7HlAP/R8AD///8AAAAAACwA + LwBLAFAAaQBwAIcAkAClALAAxADPAOEA8ADwEf8A8jH/APRR/wD2cf8A95H/APmx/wD70f8A////AAAA + AAAbAC8ALQBQAD8AcABSAJAAYwCwAHYAzwCIAPAAmRH/AKYx/wC0Uf8AwnH/AM+R/wDcsf8A69H/AP// + /wAAAAAACAAvAA4AUAAVAHAAGwCQACEAsAAmAM8ALADwAD4R/wBYMf8AcVH/AIxx/wCmkf8Av7H/ANrR + /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAHAIECAoAAAAAAAAAAAAAAAAAAAAAAAAfCwoYAAAAAAAAAAAA + ABIAAAAAAAAAAAAXABwAAAADAAAAAAAAAAAAAAAAAAAAABcTAAALCgAAAAAAAAAAABIAAAAAAAAAAAAA + EgAAAAAWCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAABEAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAIEAAAAAAAAABMAAAAAAAAAAAAAAAAAAAAA + AAAGDgAAAAAAAAAAABIAAAAAAAAAAAAOAAAAAAAABAUAAAAAAAAAAAAAAAAAFwMAAQQXAAAAAAMZAAAA + ABIAAAAAAAAAAAATAAAAAAAABgAAAAAAAAAAAAAAAAANABMAAAAAAAAAAAAYAAAAABIAAAAAAAAAAAAT + AAAAAAAAAwAAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAYAAAAABIAAAAAAAAAAAIMAAAAAAAAAAAAAAAA + AAAAAAAAAB0AAAAAAAAAAAAAAAAYAAAAABIAAAAAAAAAABIBAAAAAAAAAAEAAAAAAAAAAAAAABQAAAAA + AAAAAAAAAAAYAAAAABIAAAAAAAAAAAABAAAAAAAAAAwAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAYAAAA + ABIAAAAAAAAAAAAcAgAAAAAJAAAAAAAAAB8AAAAAABEAAAAAAAAAAAAAAAAYAAAAABEAAAAAAAAAAAAA + GwUAAAAACgAAAAADAAEBAR4AABYAAAAAAAAAAAAAAAAYAAAAAA8AAAAAAAAAAAAAAAAJBwAJAAAAAAMB + AAAAAAkAAB8AAAAAAAAAAAAAAAAXAAAAAAcAAAAAAAAAAAAAABIAAhwAAAAAAAAZAAAAAAAXAAAAAAAA + AAAAABkAHAAEAAAAAAAGAAAAAAAAAAAACAQfAAAAAAAAHwAAAAAAAAAAAAAEDAAAAAAAAA4YAwASAxcY + AwIAAAAAAAAAAAAZCwAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAYDwAAABIOGQAAAAAAAAAAAAAG + AAAAAAAFAQAAAAMEAAAAAAAAAAAAEwEAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAoAAAAAAAAG + AAAAAAAAAAAAAAYJBQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAaBwAACwAAGgAAAAACCwAAHgUAAAAAABAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgMAAQsAAAAAAA8AAAAACQAAAAAAAAAAAAAAAAAAAAAdAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAADwAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC + AxYVAxQAAAAIBQAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwcHGgAAAAAAAAAA + AAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbHwgD + BRQAAAAAAAAAAAAAAAAAABgZAAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAABEgAAAAgDAAAAAAAAAAAA + AAAAAAENBwAABgAZAAAAAAAAAAAEAAAAAAAAAAAAAAAVAAAAAAAAGQAAAAAAAAAAAAACAQAAAAsAAAAZ + AAAAAAAAAAAWAgAAAAAAAAAAAAAdAAAAAAABCwAAAAAAAAAAAB8AGQAAAAABAgAAAAAAAAAAAAAABgAA + AAAAAAAAAAAdAAAAAAACCQAAAAAAAAAAAA8AAAAAAAAADAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAdAAAA + AAABEAAAAAAAAAAAAAgAAAAAAAAFEgAAAAAAAAAAAAAAGRAAAAAAAAAAAAAdAAAAAAAAAAAAAAAAAAAA + AAkCAAAAAAAGBQAAAAAAAAAAAAAMAAoAAAAAAAAAAAAdAAAAAAsPAAAAAAAAAAAAABEBAAAAAAACAAAA + AAAAAAAAAAAKAAAJAAAAAAAAAAAdAAkVDxoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgbAAAE + AAAAAAAAAAAdAAwZBR0AAAAAAAAAAAAAAAACAAAAAB0HARgAAAAAAAAAAAEAAAAaBAAAAAAAAAAcAAAA + AAAAAAAAAAAAAAAAAAAeDwAAAAQADAkAAAAAAAAAFAcAAAAAABwAAAAAAAAVAAAAAAATAAAAAAAAAAAA + AAAAFhIAChMAGgEAAAAADQAAAB8AAAAACAMAAAAAAAgDAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAkBBAAAAAAAGQAAAAAAAAACDgAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAAA + AAAPAAAAAAAAEAMBCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////////////////////////n + ///8H//4f+f///jv//M/5///+ef//7/n///z9///v+f///Pz//8/5///8/P/4Hnn///z8//H+ef///Pz + /8/55///8/P/n/nn///z8/+f+ef///vz/5/55///+efvn/nn///854Gf+ef///8PPZ/55////h8+39Hn + ///8fn/PwA////n/P+/nH///++c/5n/////7x4/wf/////mHmff//////B85//n//////zn/+f////// + Pf/5//////+Bz/n//////8PP+f///////8/4D////89/z/jn////hj/P+fP///86v8/58////jz/7/nz + ///+fP/v+fP///58/+f59////nz/1/nn///+fP/b+Q////98/5v5D////3h/ufnv////On88+ef///+S + ezz55//////4fPzP//////j+fh///////f//////////////////////////////////////KAAAACAA + AABAAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUACgoKAA0NDQAQEBAAFRUVABkZ + GQAdHR0AISEhACUlJQAoKCgALi4uADExMQA1NTUAOTk5AD09PQBAQEAARUVFAEpKSgBNTU0AUVFRAFZW + VgBYWFgAXV1dAGFhYQBmZmYAampqAGxsbABycnIAdnZ2AHp6egB+fn4AAAAAAAAsLwAAS1AAAGhwAACG + kAAApbAAAMPPAADh8AAR7/8AMfH/AFHz/wBx9f8Akff/ALH5/wDR+/8A////AAAAAAAALyEAAFA3AABw + TAAAkGMAALB5AADPjwAA8KYAEf+0ADH/vgBR/8gAcf/TAJH/3ACx/+UA0f/wAP///wAAAAAAAC8OAABQ + GAAAcCIAAJAsAACwNgAAz0AAAPBKABH/WwAx/3EAUf+HAHH/nQCR/7IAsf/JANH/3wD///8AAAAAAAIv + AAAEUAAABnAAAAiQAAAKsAAAC88AAA7wAAAg/xIAPf8xAFv/UQB5/3EAmP+RALX/sQDU/9EA////AAAA + AAAULwAAIlAAADBwAAA9kAAATLAAAFnPAABn8AAAeP8RAIr/MQCc/1EArv9xAMD/kQDS/7EA5P/RAP// + /wAAAAAAJi8AAEBQAABacAAAdJAAAI6wAACpzwAAwvAAANH/EQDY/zEA3v9RAOP/cQDp/5EA7/+xAPb/ + 0QD///8AAAAAAC8mAABQQQAAcFsAAJB0AACwjgAAz6kAAPDDAAD/0hEA/9gxAP/dUQD/5HEA/+qRAP/w + sQD/9tEA////AAAAAAAvFAAAUCIAAHAwAACQPgAAsE0AAM9bAADwaQAA/3kRAP+KMQD/nVEA/69xAP/B + kQD/0rEA/+XRAP///wAAAAAALwMAAFAEAABwBgAAkAkAALAKAADPDAAA8A4AAP8gEgD/PjEA/1xRAP96 + cQD/l5EA/7axAP/U0QD///8AAAAAAC8ADgBQABcAcAAhAJAAKwCwADYAzwBAAPAASQD/EVoA/zFwAP9R + hgD/cZwA/5GyAP+xyAD/0d8A////AAAAAAAvACAAUAA2AHAATACQAGIAsAB4AM8AjgDwAKQA/xGzAP8x + vgD/UccA/3HRAP+R3AD/seUA/9HwAP///wAAAAAALAAvAEsAUABpAHAAhwCQAKUAsADEAM8A4QDwAPAR + /wDyMf8A9FH/APZx/wD3kf8A+bH/APvR/wD///8AAAAAABsALwAtAFAAPwBwAFIAkABjALAAdgDPAIgA + 8ACZEf8ApjH/ALRR/wDCcf8Az5H/ANyx/wDr0f8A////AAAAAAAIAC8ADgBQABUAcAAbAJAAIQCwACYA + zwAsAPAAPhH/AFgx/wBxUf8AjHH/AKaR/wC/sf8A2tH/AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAABQAADgAAAAAAAAAAAAAAEQAPAAAAAAAAAAAAAAAAAAYAAAAAFgAAAAAA + AAAAAAAAAAAMAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAAAAAAAAGRkAAAAAAAAAAAAAAAAKAAAAAAMA + AAAAAAAAAAALBxMAAAAXEQAAAAAAAAAAAA0AAAAAAwAAAAAAAAAADhgAAAAAABYQAAAAAAAAAAAABgAA + AAAAAAAAAAAAAAAAAAAAAAAAFhAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAWEAAAAAAAAAAA + AAAMAAAUCAAAABgVAAAAAAAAAAAAABYQAAAAAAAAAAAAAAARFQQAAAABHAAWAAAAAAAAAAAAFhAAAAAA + AAAAAAAAAAMXAAAAGBQAAAAAAAwAAAAAAAAOAgAAFQoAAAAAAAAQAAAAAAAXFgAAAAAAAA0AAAAAFgwA + FgoUAAAAAAAAGAAAAAwNAAADHwAAAAAAGA8ZCQAAAAAAAAAAAAAAAAAAGwARAB4AABEMAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAERQAAAAAAAAABhcAAAAAAAAAABwTAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAA + AAAAAAAAHBMAAAAAAAAAAAAAAAAAAAAAABcFDwgAABUTAAAAAAAcEwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAACQcAAAAAABwSABcbAAAAAAAAAAAAGhAAAB0AAAAAAAAOCQAAAAAAHAQAAAADAAAAAAAAABcIAAAA + BBkAAAAAAAASAAAAAAAcEwAAABEeAAAAAAAAAQAAAAYXAAAAAAAAABYAAAAAABwTAAAAFBwAAAAAAAAA + AAAAFgAAAAAAAAAADQAAAAAAHBMAAAAKAAAAAAAAAAEAAAAYFQAAAAAAABsAFwAAAAAcEwAAABUAAAAA + AAAAAQAAAA0GAAAAAAAAEgARAAAAABwTAA4KAAAAAAAAAAAXAAAACQIAAAAAAB8AAAAOAAAAHRIAABwW + AAAAAAAAAAATABEADwAAAAAABAAAAAQAAAAABQAAAA0AAAAAAAAAAAAAAAAAAAAAAwMaAAAAExMAAAAX + EAAKAAAAAAAAAAAAAAAAAAAAAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHFxcRsbGwAAAAgICEdHRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAABsbGwAAABUVFXFxcQAAADs7OwICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwYGBhsbGwICAgUFBQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAABkZGQAAADMzMwAAAAAAAAAAAAAAAF9fXwEBAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBQAAAAAA + AAAAAAAAABsbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+ + fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxcXAAAAA4ODgAAAAAAAAAAAAAAAAAAAAAAABgYGA0N + DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHx8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAHp6egAAAAAAAAAAAAAA + AAAAAAAAAHx8fAAAAG1tbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlZWQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AEdHRwAAABwcHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWAAAABsb + GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAB0dHQAAAElJSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWFgAAAHJycgAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsLAQEBAAAAAAA + AAAAAAAAADs7OwAAAAAAAAAAAAAAAAAAABAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+ + fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcHBwAAAGNjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEh + IQAAAEVFRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtLSwAA + AAAAABISEmZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAG5ubgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAB4eHgAAACoqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAFlZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWFgAAAGdnZwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAB8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAD09PQAAACoqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AEJCQgAAAEtLSwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgAAACUlJQAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAABYWFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6OgAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+ + fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAGJiYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9vbwAAAEVFRQAAAAAAAAAAAAAA + AAAAAAAAAFBQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkpKQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAA0NDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAACIiIgQEBAAAAAAAAAAAAAAAAGJiYgAAAAAAAH19fQAAAAAAAAAAAAAAAAAAADExMQAA + AAAAAAAAAAAAAA8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5OTgAAAE9PTwAAAAAAAAEBAQAAADo6OgAAAAAAAAAAAAAA + AAAAAAcHBwAAAAAAACYmJk9PTzo6OgYGBgAAAGlpaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUVFQAAAAAAAAAAAD8/PwAA + AAAAAAAAAAAAAAAAAC4uLgAAAAQEBAAAAAAAAAAAAAAAAAAAAHZ2dgQEBAAAAAAAAAAAAAgICAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH19fQAAAAAAAAAAAAAAAAAA + AHFxcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4eHgAAAAAA + AA8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZ2dgAAAAAAAAAAAAAAAAAAAAAAAAAAAB8fHwAA + AAAAADo6OgAAAGdnZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAB8fHwAA + AAAAAAAAAAAAAAAAAB4eHgAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEBAQAAABcXFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAElJSWNjYwAAAEFB + QQAAAAAAAAcHBysrKwAAAAAAAAAAAEdHRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAEBARAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAABQUFAAAAAAAAAAAAD09PQAAAA0NDQAAAAAAAAAAAAAAAAICAnR0dAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAACEhIRcXFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHV1dQAAACQkJAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAGtra0xMTH5+fgAAAAAAAAAAAHt7e09PT09PT3h4eAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBQAA + AAAAAAAAAAAAAAAAACEhIQAAAB8fHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/ + PwAAAC0tLQAAAAAAAAAAACMjI2pqagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAwMDAAAAAAAAFJSUgAAAAAAAAAAAAAAABAQEAAAAAgICBcXFxgYGAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAFdXVwAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAVRU + VAAAAAAAAAAAAAAAAB0dHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAgICAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2NhYWFgAAAHFxcUpKSkBAQAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAE9PTwAAAF1dXQAAAAAAABYWFgAAAAAAAAAAAFxcXAAAAAAAAAAAAAAAAAAAADg4OAAAAB0d + HQAAAAAAAAAAAH5+fgAAABQUFAAAAAAAAAAAAAAAAAAAAAAAAE1NTQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUAEBAQAAAAAAAAAAAAAAABsbGwAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt7ewAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAUFBSwsLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAMD + A1hYWAAAAG5ubhcXFwAAAAAAAAAAAAAAAAAAAAAAAAYGBgEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEpKSgAAAAAAAAAAAAAAAAEBAWxsbAAAAAAAAAAAAAAAAHt7ewAAAAAAAGtrawAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5ubn9/fwAAAAAAAAAAAAAAAAAAAAAAAE5OTgAAAAAA + AD8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAERERAAAAAAAADAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRk + ZAYGBgAAAAAAAAAAAAMDA0xMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHZ2dgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAFtbWwAAAAAAAD09PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAsLCw8PD3V1dQAAAAAAAAAAAC8vLwAAABgYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0dHQAAAAAAAAAAAAQEBAAAAAAAAAAAAFhYWAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtbWwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAADQ0NAAAAAAAAAAAAAAAAAAAAAAAABwcHAAAAF5eXgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsbGwAAAAAAAFlZWQAAAAAAAAkJCQAAAAAAAAMD + AwAAAAEBAVtbWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh4eAAAAA0N + DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcAAAAAAAAH5+fgAAAAAAAAAA + AAAAAAkJCQAAAAAAAD4+PgAAAFFRUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8PDwAAACUl + JQAAAAAAAAAAAAAAAAAAABAQEAUFBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRUVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWFiEhIQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHR0dAAAABwcHAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4O + DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5OTgAAABMTEwAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgAAAHp6 + egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoKCgAA + AHV1dRMTEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAC0tLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAABUVFQAAAAAAAAQEBG9vbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAoKCj4+PgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNTUwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAADU1NVhYWAAAAAAAAFNTUwUFBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAnJycgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAABgYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1NTQAAAAAAABkZGQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEdHRwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5eXkpKSgAAAB8fHwsLCwAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHd3dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDBUVFQEB + AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQwQEBAAAAAAAAAAAAAAAACkpKQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoKCgAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQED8/PwAAAAAAAAAAAAAA + AAAAAAAAAHZ2diQkJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEZGRgAAAAAA + AAAAAAAAAAAAAAAAAC8vLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAwMDAAAAH9/fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB + AQAAAAAAAAAAAAAAABQUFA8PDwAAAF1dXQAAAGpqagAAAAAAAAAAAAAAAAAAAH5+fgAAAAAAAAAAACUl + JQAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcnJwAAAFJSUgAA + AAAAAAAAAAAAAAAAACUlJQAAAFxcXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAkJCVJSUmhoaBAQEBoaGgAAAAAAAAAAAAAAADAwMAAAAAAAAAAAAAAAAAAAAAQE + BAAAAAAAAFlZWQAAABcXFwAAAAAAAAAAAAAAAAAAAAAAADc3NwAAADMzMwAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAcHBwAAAAAAAAAAAAAAAAAAABYWFgAAAHFxcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABYWFi8vLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/fwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAADc3NwAAACoqKgAAAAAAAAAAAAAAAAAAAAICAgAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4eHgAAAAAAAAAAACoqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAHFxcQAAAAAAAAAAAAAAAAAAAAAAAAAAAEtLSwAAAAQEBDQ0NC4uLgEBAQICAgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAABsbGwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAQEBAQEBEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxsbEhISE1NTXNz + cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////////// + /8f/g///////x/8J///+D//H/jz///3n/8f8fn//+/P/x/x+P///8//H/P8////n/8f4/z///8f/x/j/ + H//4D5/H+P8f/+D/n8f4/x//4/+fx/j/H//H/5/H+P8f/8//n8f8/x//z/+fx/z/H//P/5/H/H4//8// + n8f+fj//z/+fx/88PgfP/5/P/4x8Ac//n8//4Pj5z/+Pj//D+P7H+4+P/4/5/+f5Bx//P/n/5/wQH/5/ + +f/j/jh//v54//HP///+/Dwf+A////54fh/5H////jB8cfv/////Afzx//+f///v/PH//5/////8+f// + n/////z5//+f/////CPn/5/////+A8P/n//////Pw/+f///////D/5Af//3//8P/g4//8HH/4/+Px//h + sP/j/5/H/8PS/+f/n+f/x8f/9/+f5//Px//3/5/n/8/n//P/n8f/z+f/6/+fx//P5//p/5/P/8/n/+z/ + n5//z+P/zP+YP//Pw//ef5k//8/D/55/n5//58P/nz+fj//3kfc/P4+P//g59j8fz4/////wfx/Hn/// + //B/j+A/////+P+P+H//////////////////////////////////////////////////////KAAAADAA + AABgAAAAAQAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhISAEB + AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcAgICBMTEyIiIikpKQAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt7ey0tLSgoKGJiYgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEhISAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF1dXQEBAXNzcwAA + AAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5e + Xk1NTQAAAAAAAC8vLyoqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhISAEBAQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAEBAUlJSQAAAAAAAAAAAAAAAFlZWSoqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEhISAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAEZGRgEBAQAAAAAAAAAAAAAAAAAAAAAAAAEB + AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhISAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAoK + ChAQEAAAAAAAAAAAAAAAAAAAAAAAAAICAk9PTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABgYGDg4OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhISAEB + AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBATs7OwAAAAAAAAAAAAAAAAAAAAAAABISEhYWFgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxcXA8PDwEBAQYGBhISEl5eXgAAAAAAAAAAAAAA + AAwMDGdnZwAAAAAAAAAAAAAAAEhISAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAU9PTwAAAAAAAAAA + AAAAAAAAAAAAABkZGQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADc3NwEBAUxM + TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAWBgYAAAAAAAAAAAAAAAAEhISAEBAQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAEBAU9PTwAAAAAAAAAAAAAAAAAAAAAAAA4ODgEBAQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAEBAUhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAWBgYAAAAAAA + AAAAAAAAAEhISAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCTIyMgAAAAAAAAAAAAAAAAAAAAAAAAEB + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAEBAT8/PwAAAAAAAAAAAAAAAAAAAAAAAENDQwwMDAYGBiQkJAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHl5eQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + ////////////////////5////B//+H/n///47//zP+f///nn//+/5///8/f//7/n///z8///P+f///Pz + /+B55///8/P/x/nn///z8//P+ef///Pz/5/55///8/P/n/nn///78/+f+ef///nn75/55////OeBn/nn + ////Dz2f+ef///4fPt/R5////H5/z8AP///5/z/v5x////vnP+Z/////+8eP8H/////5h5n3//////wf + Of/5//////85//n//////z3/+f//////gc/5///////Dz/n////////P+A/////Pf8/45////4Y/z/nz + ////Or/P+fP///48/+/58////nz/7/nz///+fP/n+ff///58/9f55////nz/2/kP////fP+b+Q////94 + f7n57////zp/PPnn////kns8+ef/////+Hz8z//////4/n4f//////3///////////////////////// + /////////////ygAAAAgAAAAQAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBQAAAAAAAA7 + OzsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEREQAAAA+Pj4AAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgAAAAAAAAAAAAAAABYWFgAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH + BwcAAAAAAAAAAAAAAAAFBQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmZmZmZmYA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArKysAAAAAAAAAAAAAAAAODg4AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAuLi4fHx9OTk4AAAAAAAAAAABeXl5GRkYAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAA1NTUAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ODhgYGAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAowAAAKMAAACjAAAAowAA + AKMAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABWAAAArAAA + AOYAAAD/AAAA/wAAAP4AAADgAAAAoQAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABPAAAA3QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ALwAAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAHAAAAC5AAAA6wAAAP0AAAD6AAAA5QAAALIAAABoAAAACwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAlgAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAPgAAADiAAAA+AAAAP8AAAD/AAAA/wAAAPgAAABhAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAGwAAADzAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADsAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAABAAAAK8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAK8AAAA/AAAABQAAAAAAAAADAAAARAAA + AM4AAAD/AAAA/wAAAP8AAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACLAAAA/wAAAP8AAAD/AAAA/wAAAOoAAADGAAAAzwAAAPoAAAD/AAAA/wAA + AP8AAAD/AAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAA/wAAAP8AAAD/AAAA/wAA + APUAAABVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAALAAAAD/AAAA/wAAAP4AAABlAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgAAAP8AAAD/AAAA/gAA + AKYAAAA4AAAAAQAAAAAAAAAAAAAAEgAAAJcAAAD/AAAA/wAAAP8AAAD/AAAASQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYAAAAP8AAAD/AAAA/wAAAP8AAAD5AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAABAAAAMwAAAD/AAAA/wAAAPkAAAAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAMAAADWAAAA/wAAAO4AAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJMAAAD/AAAA/wAAAP8AAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAADtAAAA/wAAAP8AAAD/AAAA/wAA + AHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgAAAPoAAAD/AAAA/wAA + AMwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAP8AAADzAAAAMAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAO4AAAD/AAAA/wAAAP8AAAAlAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAjwAAAP8AAAD/AAAA/wAAAP8AAADKAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAApQAAAP8AAAD/AAAA/wAAAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAGAAAA2gAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAArAAAAP8AAAD/AAAA/wAAAEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAAAD2AAAA/wAAAP8AAAD/AAAA/wAA + AEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAA/wAA + AP8AAAD/AAAA4QAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChAAAA/wAAAP8AAAD/AAAAVwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAcgAAAP8AAAD/AAAA/wAAAP8AAADTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAA/wAAAP8AAAD/AAAAYQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANIAAAD/AAAA/wAAAP8AAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJAAAA/wAAAP8AAAD/AAAA/wAA + AHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJAAAAD/AAAA/wAAAP8AAADHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AAAA/wAAAP8AAAD/AAAA/AAA + ABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAFwAAAP4AAAD/AAAA/wAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATgAAAP8AAAD/AAAA/wAAAP8AAAApAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAABAAAAMsAAAD/AAAA/wAAAP8AAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAA/wAAAP8AAAD/AAAA/wAA + AOIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAjAAAA/wAAAP8AAAD/AAAA/wAAAHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAACvAAAA/wAAAP8AAAD/AAAA/gAA + AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAIwAAAD/AAAA/wAAAP8AAAD/AAAArQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAD2AAAA/wAAAP8AAAD/AAAAxAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAA + ACwAAAB2AAAA4QAAAP8AAAD/AAAA/wAAAP8AAACVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtgAAAP8AAAD/AAAA/wAA + AP8AAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAANoAAAD/AAAA/wAAAP8AAAD4AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJwAA + AIUAAADJAAAA8QAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAlwAA + AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiwAAAN8AAADfAAAA3wAAAN8AAADfAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADUAAAA/wAAAP8AAAD/AAAA/wAAAF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzQAAAP8AAAD/AAAA/wAA + AP8AAAA2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAKcAAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAyQAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACeAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAD/AAAA/wAA + AP8AAAD/AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADAAAAA/wAAAP8AAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAADiAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAADiAAAAzgAAAMAAAACnAAAAdgAAACwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA9wAAAP8AAAD/AAAA/wAAAP8AAAAxAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALoAAAD/AAAA/wAA + AP8AAAD/AAAAhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAGAAAA0wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAALgAAABYAAAAEQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAngAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9AAAA/wAA + AP8AAAD/AAAA/wAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAP8AAAD/AAAA/wAAAP8AAACkAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAANEAAAA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPQAAAD/AAAA/wAAAP8AAAD/AAAAIQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAA/wAA + AP8AAAD/AAAA/wAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAKAAAA7QAAAP8AAAD/AAAA/wAAAP8AAAC+AAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4gAA + AP8AAAD/AAAA/wAAAP8AAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANcAAAD/AAAA/wAAAP8AAAD/AAAAwAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAA + AP8AAAD/AAAA6AAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAngAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEAAAA/wAAAP8AAAD/AAAA/wAAADkAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5wAA + AP8AAAD/AAAA/wAAAP8AAADDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAArQAAAP8AAAD/AAAA/wAAAP8AAABuAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACeAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJgAAAD/AAAA/wAAAP8AAAD/AAAAUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAD6AAAA/wAAAP8AAAD/AAAA/wAAALwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAADxAAAA/wAA + AP8AAAD/AAAA+AAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAP8AAAD/AAAA/wAAAP8AAACBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAJwAAAP8AAAD/AAAA/wAAAP8AAAC7AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAngAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAbAAAA/gAAAP8AAAD/AAAA/wAAALIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACZAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVAAAA/wAA + AP8AAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFAAAA/wAAAP8AAAD/AAAA8wAA + AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AG4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIAAAD/AAAA/wAAAP8AAAD/AAAAVAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGQAAAD/AAAA/wAAAP8AAAD/AAAATQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAVQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjQAA + AP8AAAD/AAAA/wAAAP8AAAA3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAngAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAOgAAAD/AAAA/wAA + AP8AAAC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADhAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbAAAA/wAAAP8AAAD/AAAA/wAAACEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAbQAAAP8AAAD/AAAA/wAAAP4AAAAzAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA4gAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AKMAAAD/AAAA/wAAAP8AAAD/AAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA0QAA + AP8AAAD/AAAA/wAAALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACLAAAA/wAAAP8AAAD/AAAA/wAAAP8AAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAAP8AAAD/AAAA/wAAAP8AAAAWAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAngAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAA+AAAAP8AAAD/AAAA/wAAAGcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAOgAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACiAAAA/wAAAP8AAAD/AAAA/wAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACeAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABkAAAA/wAAAP8AAAD/AAAA+AAAAD0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABpAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAGcAAACSAAAArQAAALoAAAC5AAAApQAAAHcAAAAtAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJwAAAD/AAAA/wAAAP8AAAD/AAAAIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkAAAD/AAAA/wAA + AP8AAAD/AAAA/gAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA/wAAAP8AAAD/AAAA7wAA + ADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAZQAAANUAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADEAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAjAAAAP8AAAD/AAAA/wAAAP8AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAngAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAnwAAAP8AAAD/AAAA/wAAAP8AAAD4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB6AAAA/gAAAP8AAAD/AAAA9QAAAFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACNAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAHwAAAMsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD8AAAAggAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAA/wAAAP8AAAD/AAAA/wAA + AEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrAAAA/wAA + AP8AAAD/AAAA/wAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAA8QAA + AP8AAAD/AAAA/wAAAKwAAAAfAAAAAAAAAAAAAAAAAAAAZQAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA5QAA + ABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAADkAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAArAAAAAUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAF4AAAD/AAAA/wAAAP8AAAD/AAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAD/AAAA/wAAAP8AAAD/AAAA2wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAtgAAAP8AAAD/AAAA/wAAAPkAAACbAAAANQAA + AIAAAAD9AAAA/wAAAP8AAAD/AAAA/wAAAPgAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAFAAAAxgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANoAAACMAAAAZwAAAF0AAABzAAAAowAA + AOcAAAD/AAAA/wAAAP8AAAD/AAAAqAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAOgAAAP8AAAD/AAAA/wAA + AP8AAACGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAngAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1wAA + AP8AAAD/AAAA/wAAAP8AAADCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAARgAAAMMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADyAAAARAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGcAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + APIAAABgAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEoAAADFAAAA/wAAAP8AAAD/AAAAdAAA + AAAAAAAAAAAAAAAAAAAAAAAUAAAA/wAAAP8AAAD/AAAA/wAAAK0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACeAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAD4AAAA/wAAAP8AAAD/AAAA/wAAAJwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAKwAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA3QAAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAADAAAA3wAAAP8AAAD/AAAA/wAAAP8AAADwAAAALgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABhAAAA8AAAAP8AAAD3AAAAKQAAAAAAAAAAAAAAAAAAAAAAAADhAAAA/wAA + AP8AAAD/AAAA3gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAEkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ4AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAADgAAAJAAAAD3AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAJsAAAANAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnAAAA2QAA + AP8AAADIAAAAAwAAAAAAAAAAAAAAAAAAAK0AAAD/AAAA/wAAAP8AAAD+AAAAEgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeAAAA8QAA + AAcAAAAAAAAAAAAAAAAAAAAAAAAApgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAiAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAA/wAAAP8AAAD/AAAA/wAAAP4AAAAhAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAADlAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAMUAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAegAAAP8AAAD/AAAA/wAAAP8AAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAxwAAAPMAAAAgAAAAAAAAAAAAAAAAAAAAawAA + AP8AAAD/AAAA/wAAAP8AAABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAD/AAAATAAAAAAAAAAAAAAAAAAAAAAAAADMAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD6AAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAA + APUAAAD/AAAA/wAAAP8AAAD/AAAAwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABxAAAA/AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMUAAABJAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfAAAA/wAAAP8AAAD/AAAA/wAA + AIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAMAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAA/wAAAP8AAAD/AAAA/wAAAJUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqwAA + AP8AAADDAAAAAgAAAAAAAAAAAAAAKQAAAP0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADzAAAAYAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAADTAAAA/wAAAP8AAAD/AAAA/wAAAP8AAABBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+wAA + AKkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAALEAAAD/AAAA/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADKAAAA/wAAAP8AAAD/AAAA6QAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAA/QAAAP8AAACrAAAAMQAAAEAAAADTAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAADlAAAA/wAAAP8AAAD/AAAAzwAAAHEAAAA7AAAAJgAAADwAAAB/AAAA8gAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AE8AAAD+AAAA/wAAAP8AAAD/AAAA+gAAAJUAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAAP8AAAD/AAAA/wAA + AP8AAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAAAP8AAAD/AAAAUgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2wAAABgAAADfAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAKwAAAAFAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAA6gAAAP8AAAD/AAAA/wAAAMIAAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACwAAAA/wAAAP8AAAD/AAAA/wAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAACQAAAOcAAAD/AAAA/wAAAP8AAADQAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAPMAAAA8AAAAAAAAAB4AAADOAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAPoAAAB/AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AIkAAAD/AAAA/wAAAP8AAACPAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4AAAD/AAAA/wAA + AP8AAAD/AAAAqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAagAAAP8AAAD/AAAA/wAA + AP8AAAB1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAMAAAB6AAAA8QAAAP8AAAD/AAAA/wAAAP8AAADVAAAAOAAAAAAAAAAAAAAAAAAA + AAcAAAByAAAA4gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOsAAACWAAAAIgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAA8gAAAP8AAAD/AAAApQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAACnAAAAzAAAAIUAAAAHAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAP8AAAD/AAAA/wAAAP8AAAD2AAAADwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAvwAAAP8AAAD/AAAA/wAAAPoAAABPAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAUAAA + AG4AAABhAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAALgAAAFgAAABtAAAAawAA + AFkAAAAvAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AEkAAAD/AAAA/wAAAPgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAA2AAAA7QAAAP8AAAD/AAAA/wAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAA9AAA + AP8AAAD/AAAA/wAAAP8AAACFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAA5QAA + AP8AAAD/AAAA/wAAAPkAAABTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAApgAAAM4AAACbAAAAEAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAP8AAAD/AAAAzgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAOwAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHAAAA/wAAAP8AAAD/AAAA/wAAAP0AAAB5AAAABAAA + AAAAAAARAAAATgAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAA7QAAAP8AAAD/AAAA/wAAAP4AAACZAAAAOAAA + ABAAAAAYAAAAZQAAAPEAAAD/AAAA/wAAAP8AAACqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACTAAAA/wAAAP8AAACyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAsAAADSAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAgAAADNAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADhAAAArQAAAPUAAAD/AAAAqAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAsAAAA2wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + APwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAD/AAAA/wAAAMYAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAArgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAADBAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD5AAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAvAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAbAAAAP8AAAD/AAAA+gAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AI0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+AAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAIAAABmAAAA4QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAbAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAE0AAAD+AAAA/wAAAP8AAADRAAAAzgAAAPsAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAACXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAA/gAAAP8AAAD/AAAAngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAACNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkAAADuAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA4gAAAAIAAAAAAAAAAAAAAA8AAACFAAAAsQAAAH8AAAAKAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA3AAAAP8AAAD/AAAAqgAA + AAUAAAAAAAAACQAAADgAAABdAAAAewAAAH8AAAB+AAAAVwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACzAAAA/wAAAP8AAAD/AAAAkgAAAAsAAAAAAAAAAAAAAAAAAAAVAAAApwAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAwwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABBAAAA+QAAAP8AAAD/AAAA/wAAAP8AAAC7AAAAhwAAAKcAAAA0AAAAAAAA + AAAAAAAAAAAAvwAAAP8AAAD/AAAA/wAAAK8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABgAAADpAAAA/wAAAN8AAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAADvAAAA/wAA + AP8AAAD/AAAA7AAAAKcAAACSAAAAsgAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ALwAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAOMAAAD/AAAA/wAA + AP8AAAD/AAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + ADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADFAAAAagAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAH8AAAB/AAAAfwAAAH8AAABkAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAAB/AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABtAAAA/wAAAP8AAAD/AAAA/wAAANgAAAADAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAjQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAA + AP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AB0AAAC0AAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPUAAACeAAAAIQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEAAAD/AAAA/wAA + AP8AAAD/AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACnAAAA/wAAAP8AAAD/AAAA/wAA + AP8AAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAAiAAAAMUAAADxAAAA/gAA + AP8AAAD4AAAA3QAAAKMAAABiAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAAtAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAKQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAA + AP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAigAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAP4AAAD/AAAA/wAAAP8AAAD+AAAABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABBAAAA/wAAAP8AAAD/AAAA/wAAAP8AAABiAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAA + AP8AAAD/AAAA/wAAAP8AAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5AAAA/wAA + AP8AAAD/AAAA/wAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2AAAA/wAAAP8AAAD/AAAA/wAAAIkAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADrAAAA/wAAAP8AAADYAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AGIAAAD/AAAA/wAAAP8AAAD/AAAA+QAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAA + AP8AAAD/AAAA/wAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAADCAAAA4AAA + AGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAANYAAAD/AAAA/wAAAP8AAAD/AAAA9gAA + AH0AAAAiAAAAAAAAAAAAAAAIAAAAQAAAAKYAAAD/AAAA/wAAAP8AAADrAAAADwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAATAAAA6AAAAP8AAAD/AAAA/AAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAANQAAAPQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD4AAAA8gAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIoAAAD/AAAA/wAA + AP8AAAD/AAAAswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAA + AMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAPIAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACvAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAA6AAAAP8AAAD/AAAA/wAAAP8AAAD5AAAADwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAMIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD+AAAAmwAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAABHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAA + AP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AD4AAACfAAAA4QAAAP8AAAD/AAAA/wAAAP8AAADsAAAApQAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAB8AAAAmAAAAFAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAAkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAA + AP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAMAAAA6AAAAbgAAAI4AAACbAAAAmQAAAIwAAAByAAAAQgAA + AAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACgAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAA0AAACDAAAA6gAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9QAAAKMAAAAtAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAA + AP8AAAD/AAAA/wAAAMgAAAAyAAAA4AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAPwAAACIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABMAAAAUAAAABAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAGAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAkQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAA5QAAAO8AAAD/AAAA/wAA + AP8AAADiAAAAngAAAHIAAABgAAAAZwAAAIUAAADPAAAA/wAAAP8AAAD/AAAA/wAAAP8AAACgAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAMgAAAKYAAADvAAAA/wAAAP8AAAD7AAAA0AAAAIAAAAAYAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAADgAAADVAAAA/gAAAPIAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ADMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADEAAAARwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABSAAAA8AAAAP8AAAD/AAAA/wAAAP8AAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAI4AAAD9AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAPAAAABiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAA7gAAAP8AAAD/AAAA/wAA + AP8AAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAAbwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAA+wAAAP8AAAD/AAAA/wAA + APMAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAUAAACwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACGAAAAAAAA + AAAAAAAAAAAAAAAAAJYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAM0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAvgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ADIAAAD/AAAA/wAAAP8AAAD/AAAA9AAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACTAAAA/wAAAP8AAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + APQAAAC8AAAApQAAAMYAAAD9AAAA/wAAAP8AAABvAAAAAAAAAAAAAAALAAAA9QAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAAD/AAAA/wAA + AP8AAAD/AAAAzwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AEkAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACTAAAAFAAAAAAAAAAAAAAAAAAAACsAAADbAAAA/wAA + APsAAAA3AAAAAAAAAE4AAAD/AAAA/wAAAP8AAAD/AAAA/QAAAP8AAAD/AAAAbQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAACYAAAD/AAAA/wAAAP8AAAD/AAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO8AAAD/AAAA/wAAAP8AAAD9AAAAEQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA2wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAagAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAD0AAAA/wAAANwAAAAJAAAAjQAAAP8AAAD/AAAA/wAA + AMkAAAAPAAAAKwAAAOEAAACiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM4AAAD/AAAA/wAA + AP8AAADGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAA + AP8AAAD/AAAA/wAAAP8AAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AF4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AIIAAAD/AAAA/wAAAIQAAAC+AAAA/wAAAP8AAAD/AAAAPQAAAAAAAAAAAAAAagAAAMwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAA/wAAAJoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyAAAA/wAAAP8AAAD/AAAA/wAAAEUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAP8AAAD/AAAA/wAAAP8AAADuAAAADgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAPsAAAD/AAAA+AAAAPMAAAD/AAAA/wAA + AN8AAAAAAAAAAAAAAAAAAAApAAAA7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAA9wAA + AP8AAAD/AAAAbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAA + AMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AKgAAAD/AAAA/wAAAP8AAAD/AAAAUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ABwAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAwgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAoQAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChAAAA/wAAAP8AAABOAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAP8AAAD/AAAA/wAAAP8AAABHAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYgAAAP8AAAD/AAAA/wAAAP8AAAD9AAAAGgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAABtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHAAAAD/AAAA/wAAAJsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAA + AP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAC6AAAA/wAAAP8AAAD/AAAA/wAAADsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACdAAAA/wAAAP8AAAD/AAAA/wAAAMcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAADcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkgAAAP8AAAD/AAAA9QAAABUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANcAAAD/AAAA/wAAAP8AAAD/AAAAGAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAD/AAAA/wAAAP8AAAD/AAAAfAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAPUAAAD/AAAA/wAA + AP8AAAD/AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADBAAAA/wAAAP8AAAD/AAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAA + AP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAADAAAA9wAAAP8AAAD/AAAA/wAAAOsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA5gAAAP8AAAD/AAAA/wAAAP8AAABHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAvgAAAP8AAAD/AAAA/wAAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAPUAAAD/AAAAqgAAAP8AAADzAAAAFgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAD/AAAA/wAAAP8AAAD/AAAApQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7AAAA/wAAAP8AAAD/AAAA/wAA + AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAAAA/wAA + AP8AAAD/AAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAA8AAAA/wAAAO0AAAAfAAAA/AAAAP8AAACVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAA + AP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAegAAAP8AAAD/AAAA/wAAAP8AAABNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAABAAAAP8AAAD/AAAA/wAAAP8AAAD9AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkAAAD/AAAA/wAAAP8AAAD5AAAACwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAD/AAAAtAAAAAAAAAC3AAAA/wAA + APoAAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADdAAAA/wAAAP8AAAD/AAAAygAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/QAAAP8AAAD/AAAA/wAA + AO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATQAA + AP8AAAD/AAAA/wAAAP8AAABLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA2QAAAP8AAAB4AAAAAAAAAE0AAAD/AAAA/wAAALMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAA + AP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAaQAAAP8AAAD/AAAA/wAAAPYAAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAADwAAAA/wAAAP8AAAD/AAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAAA/wAAAP8AAAD/AAAA/wAAAI8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUAAAD/AAAA/wAAADgAAAAAAAAAAgAA + ANwAAAD/AAAA/wAAAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAADwAAAA/wAAAP8AAAD8AAAAVwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANcAAAD/AAAA/wAA + AP8AAADiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AIoAAAD/AAAA/wAAAP8AAAD/AAAAygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkgAAAP8AAADzAAAABAAAAAAAAAAAAAAAcAAAAP8AAAD/AAAA1AAAAAQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACQAAAAAAAAAAAAAAAAAA + AAAAAAAZAAAA2AAAAP8AAAD/AAAA+AAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAswAAAP8AAAD/AAAA/wAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArwAAAP8AAAD/AAAA/wAAAP8AAAD6AAAACQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADtAAAA/wAAALcAAAAAAAAAAAAA + AAAAAAAOAAAA8gAAAP8AAAD/AAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAA + AAAAAAAEAAAAmwAAAPcAAAD+AAAA2QAAAI8AAAAdAAAAMAAAANwAAAD/AAAA/wAAANsAAAAzAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAA/wAA + AP8AAAD/AAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADdAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYQAAAP8AAAD/AAAAcwAAAAAAAAAAAAAAAAAAAAAAAACSAAAA/wAAAP8AAADtAAAAEgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAAAMgAAAAAAAAAAAAAAFEAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + APkAAAD4AAAA/wAAAPoAAACNAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUAAAD/AAAA/wAAAP8AAAD/AAAACQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMAAAA/wAAAP8AAAAuAAAAAAAA + AAAAAAAAAAAAAAAAACUAAAD9AAAA/wAAAP8AAACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAA + AAAAAAAAAAAATgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAApQAAAAcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAA + APQAAAD/AAAA/wAAAP8AAAAxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABDAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAQgAAAP8AAAD/AAAA5AAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALUAAAD/AAAA/wAA + APsAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAMgAAAP8AAAD/AAAA/wAAAP8AAADIAAAAAAAAAAAAAAAPAAAA6AAAAP8AAAD/AAAA/wAA + AO4AAAC6AAAA/wAAAP8AAAD/AAAA0wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqgAAAP8AAAD/AAAA/wAAAFwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAADqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAA/wAAAP8AAACYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAP8AAAD/AAAA/wAAALsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP8AAAD/AAAA/wAA + AMgAAAAAAAAAAAAAAAAAAAAeAAAAgQAAAIcAAABRAAAABwAAAAAAAACEAAAA/wAAAP8AAAD/AAAA6QAA + ACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABKAAAA/wAAAP8AAAD/AAAAmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA0AAAAP8AAAD/AAAA/gAAAP8AAAD/AAAA/wAAAP8AAAAmAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAOAAAAP4AAAD/AAAA/wAAAEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA4AAA + AP8AAAD/AAAA/wAAAEoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAADIAAAD/AAAA/wAAAP8AAAD/AAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAEAAADHAAAA/wAAAP8AAAD/AAAA2gAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAADYAAAA/wAAAP8AAADmAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0AAAD/AAAA/wAAAP8AAACuAAAA/QAA + AP8AAAD/AAAA/wAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAAA/wAAAP8AAADwAAAABgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7AAAA/wAAAP8AAAD/AAAA1AAAAAMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAP8AAAD/AAAA/wAA + AP8AAADNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AAAD/AAAA/wAA + AP8AAAD/AAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAFYAAAD/AAAA/wAAAP8AAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAkgAAAP8AAAD/AAAA/wAAAEcAAADUAAAA/wAAAP8AAAD/AAAAmQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAARQAAAP8AAAD/AAAA/wAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AB0AAAD9AAAA/wAAAP8AAAD/AAAAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAkAAAA/wAAAP8AAAD/AAAA/wAAAN0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAPsAAAD/AAAA/wAAAP8AAADhAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMIAAAD/AAAA/wAA + AL4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAD1AAAA/wAAAP8AAADfAAAAAgAA + AJsAAAD/AAAA/wAAAP8AAADTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADUAAAA/wAAAP8AAAD/AAAARwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL0AAAD/AAAA/wAAAP8AAADgAAAABgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAD9AAAA/wAA + AP8AAAD/AAAA9gAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0wAA + AP8AAAD/AAAA/wAAAP8AAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAPMAAAD/AAAA/wAAAF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAsgAAAP8AAAD/AAAA/wAAAGYAAAAAAAAAYgAAAP8AAAD/AAAA/wAAAP0AAAAQAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWgAAAIsAAAAEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAdAAAAP8AAAD/AAAA/wAAAOUAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAABqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANUAAAD/AAAA/wAAAP8AAAD/AAAAMwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAAA/wAAAP8AAAD/AAAA/wAAAEMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgAA + APwAAAD/AAAA8wAAAEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4AAAD/AAAA/wAAAP8AAADDAAAAAwAA + AAAAAAAoAAAA/wAAAP8AAAD/AAAA/wAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADqAAAA/wAAAHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAD3AAAA/wAAAP8AAAD/AAAAhQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA+gAAAP8AAAD/AAAA/wAA + AOIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAA + AP8AAAD/AAAA/wAAAP8AAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AK4AAAD/AAAA/wAAAP8AAAD/AAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAPoAAAD/AAAA+QAAAIsAAAAtAAAAGQAA + AEYAAADAAAAA/wAAAP8AAAD/AAAA0wAAABcAAAAAAAAAAAAAAAEAAADtAAAA/wAAAP8AAAD/AAAAggAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAP0AAAD/AAAA7wAAABgAAAAAAAAAAAAA + AAAAAAANAAAA0wAAAP8AAAD/AAAA/wAAAPsAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAC5AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtAAAA/gAAAP8AAAD/AAAA/wAAAOYAAAAKAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAAP8AAAD/AAAA/wAAAP8AAAA4AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAARAAAAOIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+wAAAJwAAAANAAAAAAAA + AAAAAAAAAAAAAAAAALUAAAD/AAAA/wAAAP8AAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAADAAAA+AAAAP8AAAD/AAAAsAAAAAAAAAAAAAAACwAAALkAAAD/AAAA/wAAAP8AAAD/AAAApwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAAD/AAAA/wAA + AP8AAAD/AAAA0wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACtAAAA/wAAAP8AAAD/AAAA/wAAAIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAMAAADrAAAA/wAAAP8AAAD/AAAA9wAAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAHEAAADFAAAA6wAA + AOwAAADZAAAAugAAAHcAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAwAAAAMAAAADAAA + AAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAAA/wAAAP8AAAD/AAAApwAA + AHEAAADTAAAA/wAAAP8AAAD/AAAA/wAAAP0AAAAtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAPQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAADsAAAA/wAAAP8AAAD/AAAA/QAA + AF4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAP8AAAD/AAAA/wAAAP8AAACpAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAApQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAA + AP8AAAD/AAAA/wAAAP8AAACiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAEEAAAD3AAAA/wAAAP8AAAD/AAAA/AAAAIYAAAAJAAAAAAAAAAAAAAAAAAAAAAAA + ADQAAADpAAAA/wAAAP8AAAD/AAAA+QAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAPUAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPIAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAA/wAAAP8AAAD/AAAA/wAAAPIAAAAGAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAADvAAAA/wAA + AP8AAAD/AAAA/wAAAPAAAACnAAAAhwAAAIwAAAC8AAAA/QAAAP8AAAD/AAAA/wAAAP8AAABmAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAZgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AIoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAADAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD6AAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAA5QAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAeQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABOAAAAuwAAAPsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD1AAAAoAAAACsAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAA8gAAAP8AAAD/AAAA/wAAAP8AAACTAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABiAAAA9wAAAPcAAAD3AAAA9wAAAPcAAACPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAEUAAABoAAAAdwAA + AG4AAABdAAAANwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAzAAAAvAAAANoAAACuAAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////4D///////////////////+A///////// + ///////////gP///wA//////////////4D///4AD///////8AP///+A///4AAf//////8AB////gP//8 + AID///////AAP///4D///Afgf//////gMB///+A///gP8D//////wfwf///gP//wH/gf/////8P8D/// + 4D//8B/8H//////H/g///+A//+A//A////////4P///gP//gf/4P///////+D///4D//4H/+D/////// + /A///+A//8B//gf///////gf///gP//A//4H///////wH///4D//wP/+B///////gD///+A//8D//wP/ + ////gAA/gf/gP//A//8D/////gAA/4H/4D//wP//A/////wAA/+B/+A//8D//wP////4AP//gf/gP//A + //8D////+Af//4H/4D//wP//A/////AP//+B/+A//8D//wP////wH///gf/gP//A//8D////8D///4H/ + 4D//wP/+A////+A///+B/+A//8D//gP////gf///gf/gP//A//4D////4H///4H/4D//4H/+A////+B/ + //+B/+A//+B//gP////gf///gf/gP//gf/4D////4H///4H/4D//8D/8B////+B///+B/+A///A//Af/ + ///gf///gf/gP//4H/gH////4H///4H/4D///A/4D/8Af+B///+B/+A///4H8A/4AB/gf///gf/gf/// + A/Af8AAH4H///4H/4H///4DgH+AAA+B///+B/+B////AAD/AAAHgf///gf/gf///8AB/wB8B4H///4H/ + wH////gA/4B/4PB//8+A/8B////gAf+A//BwP//HgP/Af///wAf/gf/4cD//x4B/gP///4Af/4H//PA/ + /8MAPwD///8Af/+B///4H//AAAAB///+Af//gf//+B//4AAAAf///Af//4H///gP/+ACAAP///wP//+B + ///8D//wBwAP///4P/wfgP///Af//B/AP///+D/4H4D///4D4P////////h/8A/AI///AAD////////4 + f+APwAP//4AAf///////+H/AD+AB///AAH////////g/wA/wAf//wAD////////4P4Af+AGD/4EA//// + /////A4AH/ADg/+D//////////wAAD/gPwH/x///gf/////+AAB/4D8B/+f//4H//////wAB/+B/Af// + //+B///////AB//gfwH/////gf///////P//wH8B/////4H//////////8B/Af////+B///////////g + f4H/////gf//////////4H+D/////4H//////////+A/g/w///+B///////////gDAP4H///gf////// + ////8AAH+B///4H///////////gAB/AP//+B///////////8AA/wD///gf///////////wA/8A///4H/ + ///////////h//AP//+BwA/////////////wD///gQAD////////////8A///4AAAP/////h/+f///AP + //+AAAD/////gD+D///wD///gA/Af////gAfAf//8A///4A/4D////wADwH///gP//+A//A////8AAYA + ///4D///gf/wP///+AOCAP//+B///4H/+B////APwAD///wf//+B//gf///wH+AM///8H///gf/4H/// + 8B/gHP///B///4H/+B///+A/8B7///4f//+B//gf///gP/Af///+H///gf/4H///4H/wH////g///4H/ + +B///+B/8B////4P//+B//A////gf/g////8B///gf/wP///4H/4P////Af//4H/8D///8B/+B////xD + //+B/+A////A//gf///8Q///gf/gf///4P/4H///+EH//4H/wP///+D/+B////hg//+B54H////g//gP + ///w4P//gYAD////4P/4D///8PB//4GAB////+B/8A////Dwf/+BgA/////gf/AP///g+D//gYAH//// + 8H/wD///4fg//4HBA/////B/8Af//8H4H/+B/wH////wP+AH///B/A//gf+B////+D/gB///g/wP/4H/ + gf////w/wAf//wP+B/+A/8D////8H4ED/j8D/gf/wP/A/////g+BA/4+B/4D/8D/wP////8AAwP8HAf/ + A//Af8D/////gAeD/BgP/wP/4H+A/////8Afg/4AD/8B/+A/gf/////////+AB//gf/wDwH///////// + /gAf/4D/+AAD//////////8AP/+A//wAB///////////AH//gP//AA///////////4B//4D//8A///// + ///////B//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////8oAAAAQAAAAIAAAAABACAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAA + AFEAAABRAAAAKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAEsAAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABMAAACOAAAA5AAAAP8AAAD3AAAAuAAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAgAAAAaQAAAH0AAABmAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAA/wAAAP8AAACBAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4AAADkAAAA/wAAAOoAAACOAAAAdwAAAMQAAAD9AAAAdwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAA/AAAAPkAAADkAAAA/QAAAPoAAABzAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAP8AAAD/AAAAgQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAADmAAAA/wAAAMwAAAAVAAAAAAAA + AAAAAAABAAAAoAAAAP4AAABjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKAAAA+gAAAHoAAAAOAAAAAAAA + ACoAAADkAAAA/wAAAEYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AEsAAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjAAAA/wAA + APEAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAsAAADnAAAA8gAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgwAA + AGAAAAAAAAAAAAAAAAAAAAAAAAAAagAAAP8AAACbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABLAAAA/wAAAP8AAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAhAAAA/AAAAP8AAACFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgwAAAP8AAACSAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAD/AAAApgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAP8AAAD/AAAAgQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAP8AAAD/AAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ADcAAAD/AAAA8QAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAC/AAAA/wAA + AHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAD/AAAA/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgAAAD/AAAA4wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAJAAAA/AAAAP8AAABOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA + ACgAAACnAAAA/wAAAOQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABLAAAA/wAAAP8AAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADiAAAA/wAA + ALYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOkAAAD/AAAAjQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAcwAA + ANMAAAD7AAAA/wAAAP8AAAD/AAAA/wAAAMQAAAAmAAAAAAAAAAAAAAAAAAAASgAAAO8AAADvAAAAdwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAP8AAAD/AAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA+AAAAP8AAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADeAAAA/wAA + ALoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAtAAAAP8AAAD/AAAA7QAAAJkAAABsAAAAWQAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AE8AAAD/AAAA/wAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAD/AAAA/wAAAIEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPsAAAD/AAAAkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAA4QAAAP8AAADVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAP8AAAD/AAAApgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABPAAAA/wAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAA/wAA + AP8AAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpAAAA/wAAAJgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO8AAAD/AAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMIAAAD/AAAA1QAAAAUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATwAAAP8AAAD/AAAAfwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAASwAAAP8AAAD/AAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvQAA + AP8AAAC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAD9AAAA/wAAANoAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAD7AAAA/wAA + AHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AAAD/AAAA/wAA + AH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAHcAAAD/AAAA6QAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArAAAA/wAA + AP8AAADFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAyAAAA/wAAAP8AAAA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABPAAAA/wAAAP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAA/wAAAP8AAACBAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAA+QAAAP8AAABAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAYgAAAP8AAAD/AAAAnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAASgAAAP8AAAD/AAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAATwAAAP8AAAD/AAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAA + AP8AAAD/AAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAD/AAAAugAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK8AAAD/AAAA/wAAAF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAD/AAAA/wAAAAwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AAAD/AAAA/wAAAH8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAEsAAAD/AAAA/wAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAMAAAA1gAAAP8AAABnAAAAAAAAAAAAAAAAAAAAAAAAABwAAAD5AAAA/wAAAPIAAAAOAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAkAAAATwAAAFwAAABHAAAACwAAAAAAAAAAAAAAAAAAAAAAAABPAAAA/wAA + AP8AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPAAAA/wAA + AP8AAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAAAA/wAAAP8AAACAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAADdAAAA+wAAAGIAAAAAAAAAAAAAAAAAAACdAAAA/wAA + AP8AAACCAAAAAAAAAAAAAAAAAAAAAAAAADsAAADOAAAA/wAAAP8AAAD/AAAA/wAAAPAAAABtAAAAAAAA + AAAAAAAAAAAAQQAAAP8AAAD/AAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAATwAAAP8AAAD/AAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgAAAP8AAAD/AAAAegAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAALEAAAD/AAAAsAAA + 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 + AAAAAAAZAAAA/wAAAP8AAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQAAAG0AAACEAAAAdQAA + AEEAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAP8AAAD/AAAADgAAAAAAAAAAAAAAAAAA + AMsAAAD/AAAA/wAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAD/AAAA/gAA + AAsAAAAAAAAAAAAAAAAAAAB+AAAA/wAAAP8AAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAD/AAAA/wAAAGQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABGAAAA/wAAAP8AAABvAAAAAAAAAAAAAAAAAAAAIAAAAPoAAADTAAAAAAAAAAAAAAAAAAAAAAAA + ADsAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAA/wAA + AP8AAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAL8AAAD/AAAA/AAAAKcAAAB6AAAAkQAAAOgAAAD/AAAAWQAA + AAAAAAAAAAAAAAAAACcAAAD5AAAA/gAAADsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAtQAAAP8AAAD/AAAA/wAA + AP8AAAD+AAAAkwAAAAAAAAAAAAAAAAAAAAAAAACEAAAA/wAAAP8AAACUAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAA3AAAAewAAAJEAAACAAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsQAAAP8AAAD/AAAAwAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAA/wAAAP8AAABkAAAAAAAA + AA8AAAA/AAAATQAAAD8AAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ALsAAAD/AAAA/wAAAM8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAA + AP8AAAD/AAAAcAAAAJsAAAD5AAAA/wAAAP8AAAD/AAAA/AAAALMAAAAiAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAABlAAAAiQAA + AHQAAAAmAAAAAAAAAAAAAAAAAAAADgAAAHcAAABbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACkAAAA/wAAAP8AAADCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABkAAAD/AAAA/wAAAPQAAADwAAAAigAAAEQAAAAxAAAAVQAAANAAAAD/AAAA5wAA + ABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AC4AAADiAAAA/wAAAP8AAAD/AAAA+wAAAHkAAAAAAAAAAAAAAKcAAAD/AAAA/wAAAEYAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAAAP8AAAD/AAAApAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAA/wAAAP8AAADLAAAAHAAAAAAAAAAAAAAAAAAA + AAAAAAAOAAAA4wAAAP8AAAChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABIAAADkAAAA/wAAAP8AAACmAAAAWAAAAHsAAAD2AAAAaAAAABYAAAD8AAAA/wAA + AP4AAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcAAAD/AAAA/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIcAAAD/AAAA8gAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPAAAA/wAAAP8AAACBAAAAAAAAAAAAAAAAAAAAZgAA + APYAAAB2AAAA/wAAAMEAAAAOAAAArgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAzgAAAP8AAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ABkAAAD/AAAA/wAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdAAAA/wAAAP8AAAAeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAA8AAAAP8AAADaAAAAAwAA + AAAAAAAAAAAAAAAAAAcAAADvAAAA+gAAAP8AAABgAAAAAAAAAEkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGsAAAD/AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAZAAAA/wAAAP8AAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVgAA + AP8AAAD/AAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAA + AP8AAAD/AAAAdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqwAAAP8AAAD/AAAAKgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAA/wAAAGkAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGQAAAD/AAAA/wAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAGsAAAD/AAAA/wAAADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG4AAAD/AAAA+QAA + AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwAA + AOkAAADeAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAD/AAAA/wAA + AGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLAAAA/wAAAOMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAA/wAAAP4AAAAIAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAzAAAA/wAAAPEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAALEAAABwAAAA7AAAAG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAZAAAA/wAAAP8AAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1QAAAP8AAACFAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAewAAAP8AAADzAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAALgAAAP8AAAD/AAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAD1AAAALAAAAIoAAADsAAAAEQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAP8AAAD/AAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAA + AP8AAADSAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AGIAAAD/AAAA8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE4AAAD/AAAA/wAAAHMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiAAAA6gAAAAEAAAAfAAAA+wAA + AJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAD/AAAA/wAAAGQAAAABAAAAZQAA + AHgAAAArAAAASQAAAPUAAADBAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAyAAAA/wAAAP0AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6AAAA/wAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAOEAAAD/AAAA/wAAAP8AAADVAAAABwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAE4AAAD/AAAA/wAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAtAAA + AP8AAAD7AAAAywAAANEAAAD+AAAA/QAAAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAAAA+wAAAP8AAADkAAAAKAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAA+wAAAPsAAAC/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABCAAAAkwAAALcAAACyAAAAjAAAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ADwAAABiAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////+H//////// + /4f/Af///g//h/4A///8B/+H/Bh///hD/4f8PD//+eP/h/h+P///4/+H+H4f///D/4f4/h///wP/h/j/ + H//gBw+H+P8f/8AfD4f4/x//wf8Ph/j/H//D/w+H+P4f/4f/D4f4fh//h/8Ph/h+H/+H/w+H/H4f/4f/ + D4f8PB8Hh/8Ph/4cPAOH/w+H/wA4AYf/D4f/wHhwh/sPh/+A8PxH+QcH/wPw/sP4AA/+D/D/w/gAD/w+ + MP/h/BA//HwwH+AP///8eDgP8Af///xwPAH4D////gA4EPH/D//+APhw+f8P//+B+HD//w/////4cP// + D/////hx5/8P////+AHD/w/////8A8P/D/////8Hw/8IP//////D/wAP//Bx/8P/AAf/4DD/w/8Hh//A + AP/D/w/D/8OA/+P/D8P/g4L/4/8Pw/+Hw//j/w/D/4fD/+H/D8f/h8P/4f8Px/+Pw//A/w+H/4/D/8D/ + AA//h8P/zH8AH/+Hw/+MfwAf/8eB/44/Dw//x4H/Hh8PD//jAeYeH4+P//AR4B8fh4//+DHgPw+DD/// + /+A/D8Af////8H8P8D/////4////////////////////////////////////////////////KAAAADAA + AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAPQAA + ABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAPgAAADMAAAAFAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAI8AAAD3AAAA7AAA + AN0AAADWAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAALAAAAhAAAANIAAADXAAAAnQAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAogAA + AP4AAACMAAAACgAAAAEAAABgAAAA8wAAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChAAAAsgAAAD8AAAA8AAAA0AAAANUAAAAHAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABMAAAA/gAAALYAAAABAAAAAAAAAAAAAAAAAAAApgAAANUAAAAGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAB6AAAAAgAAAAAAAAAAAAAASgAA + AP4AAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAC5AAAA/gAAAD4AAAAAAAAAAAAAAAAAAAAAAAAARAAAAP4AAABWAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAZAAAAP4AAAAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAA + AGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAD1AAAA7wAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADAAA + AP0AAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAUAAABGAAAA5wAAAMcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0AAAD+AAAAxAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAO0AAADpAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAGAAAAKMAAADwAAAA/gAAAPkAAADtAAAAoQAAABUAAAAAAAAAAAAAAHUAAADzAAAAmAAA + AAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0AAAD+AAAAsAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOYAAAD+AAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAEAAAAyAAAAP4AAACzAAAAPgAAABQAAAAGAAAAAAAAAAAAAAAAAAAAAAAA + AHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ADIAAAD+AAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEAAAD+AAAAJwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGAAAA/gAAALcAAAADAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAA8AAAD2AAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAP4AAAD+AAAAIgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKAAAA/gAAAEsAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAA + AGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2AAAA+gAAABMAAAAAAAAAAAAAAAAAAAAAAAAANAAA + AP4AAAD4AAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvAAAA/gAA + ABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAA + AAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAA/AAAAHsAAAAAAAAAAAAA + AAAAAAAAAAAAeAAAAP4AAADNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAC8AAAA/gAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHsAAAD+AAAAnwAA + AAAAAAAAAAAAAAAAAAAAAAC3AAAA/gAAAGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAA + APQAAAA1AAAAAAAAAAAAAAAGAAAA2gAAAP4AAABxAAAAAAAAAAAAAAAAAAAAFwAAAGEAAACCAAAAeAAA + ADAAAAAAAAAAAAAAAAAAAAC5AAAA/gAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAAAAAAAAC5AAAA/gAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAwAAAJAAAADrAAAAWgAAAAMAAAB/AAAA/gAAANQAAAALAAAAAAAAAAAAAABTAAAA8QAA + AP4AAAD7AAAA+wAAAPsAAACGAAAAAgAAAAAAAACnAAAA/gAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAHsAAAD+AAAAnwAAAAAAAAAAAAAAAAAAAAAAAADDAAAA/gAAAFUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAA2gAAAOIAAAD9AAAA2wAAACMAAAAAAAAAAAAA + ABkAAADxAAAA/AAAAHMAAAATAAAAEwAAAFgAAADZAAAAcwAAAAAAAACDAAAA/gAAAEQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAIAAAAOAAAAAAAAAHsAAAD+AAAAoQAAAAAAAAAAAAAAAAAAAAMAAADgAAAA/gAA + ADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAAC2AAAA/gAAAPQAAACOAAAADgAA + AAAAAAAAAAAAAAAAAGcAAAD+AAAAmQAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAoQAAAAUAAABLAAAA/gAA + AHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIAAACaAAAAAAAAAI4AAAD+AAAA7QAAACUAAAAAAAAAAAAA + AEcAAAD+AAAA5gAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAANwAAADuAAAAhAAA + ABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIMAAAD+AAAAYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAMAAAA7AAAAMsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAUAAADFAAAAnQAAAPAAAAD+AAAAtgAA + APAAAACiAAAAnQAAAPMAAAD3AAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAAA + ANIAAAAdAAAAAAAAAAAAAAAAAAAAHAAAADAAAAAAAAAAAAAAAHAAAAD+AAAAhwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAegAAAP4AAABdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAoAAA + AMEAAABrAAAAAgAAAF4AAAC2AAAAxQAAAJsAAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAA5wAAAFQAAAAAAAAAAAAAAAAAAAApAAAA6wAAAPoAAAAoAAAAAAAAACEAAADzAAAA7QAA + AEUAAABJAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAALAAAAD4AAAAegAAAE0AAAC9AAAAvgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAA6QAAAFsAAAAAAAAAAAAAABQAAADWAAAA/gAAAP0AAAAxAAAAAAAA + AAAAAABEAAAA5QAAAP4AAAD+AAAAQQAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAA4AAADlAAAA2AAA + AOoAAAD9AAAA4AAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAOAAAABRAAAATAAAANEAAAD+AAAA/gAA + AJcAAAAAAAAAAAAAAAAAAABDAAAA9gAAANIAAAB2AAAADgAAAIUAAADqAAAALQAAAAAAAAAAAAAAAAAA + ACcAAAC8AAAABwAAAAUAAAAPAAAACAAAAAAAAAAAAAAAAAAAAA8AAAAvAAAAGgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAJUAAADxAAAA/gAA + APoAAADRAAAAXgAAAAAAAAAAAAAAAAAAAAAAAADAAAAA/gAAADQAAAAAAAAAAAAAANoAAAD+AAAAdQAA + AAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAD+AAAAigAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAALAAAAIQAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA/gAAAAUAAAAAAAAAAAAA + AMIAAAD/AAAAagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AFIAAAD+AAAAigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9AAAA/wAA + AEMAAAAAAAAAAAAAAF4AAAD9AAAAKwAAAAAAAAAAAAAAIQAAAC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAFIAAAD+AAAAigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAA9AAAA9gAAAPMAAACmAAAAqAAAAPIAAACsAAAAAAAAAAAAAAAHAAAA3wAAAOsAAAANAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAD+AAAAigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAALMAAADjAAAA4AAAAJcAAAAPAAAAAAAAAAAAAAA3AAAA/gAA + AP4AAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAD+AAAAigAAAAAAAAAAAAAABgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAABMAAAA/gAAAP4AAABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAAAD+AAAAkgAA + AIQAAADdAAAA8gAAAOgAAACsAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAEYAAACeAAAAmgAAAEgAAAAAAAAAAAAAAEEAAACbAAAAHQAAAAAAAAAAAAAAAAAA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAA8AAAAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAKAAAADQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///////////////////////////+P///4f////4///+A//8D/j///4B//wH+P///Dj + /+Mf4///8eP//x/j///h4//8H+P//+Px/8Ax4///4/H/gPHj///j8f+H8eP//+Ph/4/x4///8eH/j/Hj + ///x4/+P8eP///jDg4/x4///+AMAj/Hj///+BgCPkcP///wOPA+Qw///+D4/h4AH///45j/HwA////HC + B8B/////8YMF4D/////4BwDgcf////gPGPfx/////j8Y//H//////xjP8f//////AYfx//////+Bh/Gf + /////+eH8Af///+GP4fwA////wA/h/Dj///+ED/H8eP///44P8fx4////jj/x/Hj///+OP/D8eP///58 + f8Pxw////nh/kfAH///+OH+R8Af///44fxjxx////xAzGPHH////ADA8cMf////GcDx4B//////4fHwP + //////j8fx///////////////////////////////////ygAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAGAAAAKAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAB4AAAAawAA + AA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA5AAAAIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAD/AAAAQAAAAAAAAAAAAAAAAAAAAAAAAABLAAAA6wAA + AGMAAABPAAAAxAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAuwAA + AHsAAADBAAAAbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAP8AAABAAAAAAAAAAAAAAAAAAAAACAAA + AOcAAABlAAAAAAAAAAAAAABdAAAApwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ACAAAAAYAAAAAAAAADEAAADPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlAAAA/wAAAEAAAAAAAAAAAAAA + AAAAAABMAAAA+AAAAAkAAAAAAAAAAAAAABAAAAD6AAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAKAAAAmQAAAJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAAD/AAAAQAAA + AAAAAAAAAAAAAAAAAHYAAADUAAAAAAAAAAAAAAAAAAAAAAAAAPEAAABRAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAC4AAADRAAAA4AAAALEAAAB6AAAACQAAAAAAAAChAAAAuQAAAAAAAAAAAAAAJQAA + AP8AAABAAAAAAAAAAAAAAAAAAAAAeQAAAMoAAAAAAAAAAAAAAAAAAAAAAAAA8wAAAG0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAxwAAAJ8AAAADAAAAAAAAAAAAAAAAAAAAAAAAAKcAAAC/AAAAAAAA + AAAAAAAlAAAA/wAAAEAAAAAAAAAAAAAAAAAAAABNAAAA5gAAAAAAAAAAAAAAAAAAAA0AAAD+AAAAZwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAD+AAAAKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApwAA + AL8AAAAAAAAAAAAAACUAAAD/AAAAQAAAAAAAAAAAAAAAAAAAAAYAAADiAAAAPgAAAAAAAAAAAAAARAAA + AP8AAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJwAAAP8AAAAIAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACnAAAAvwAAAAAAAAAAAAAAJQAAAP8AAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADPAAAAGAAA + AAAAAACsAAAA3AAAAAMAAAAAAAAAQgAAAJwAAACoAAAAWgAAAAAAAAAkAAAA/wAAAAsAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAKcAAAC/AAAAAAAAAAAAAAAnAAAA/wAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ADEAAAC4AAAAqgAAAO8AAAA3AAAAAAAAAEIAAAD8AAAAjgAAAF0AAAClAAAAfQAAAAoAAAD9AAAAJwAA + AAAAAAAAAAAAAAAAAAcAAAAAAAAApwAAAMAAAAAAAAAAAAAAADwAAAD/AAAAKgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAcQAAAPIAAACgAAAAHQAAAAAAAAAAAAAAnwAAAK8AAAAAAAAAAAAAAAAAAABNAAAAAgAA + AM8AAABeAAAAAAAAAAAAAAAAAAAAaQAAADMAAADGAAAA9QAAAE0AAAARAAAAqAAAANgAAAACAAAAAAAA + AAAAAAAAAAAAAAAAAE0AAAC/AAAAHQAAAAAAAAAMAAAAFQAAAAAAAACkAAAApwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAaAAAAMgAAAAEAAAAAAAAAAAAAAAJAAAApwAAAMwAAABFAAAApQAAANcAAACsAAAAIwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAnQAAADUAAAAAAAAACwAAAM8AAADIAAAAAAAAAEcAAADzAAAAgAAA + AD8AAAAAAAAAAAAAAAAAAAABAAAAnAAAAMEAAACZAAAA2wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAAkwAAAC8AAAC6AAAA/wAAAIMAAAAAAAAAAAAA + ALkAAADMAAAATQAAAHQAAABGAAAAAAAAAAAAAABgAAAAaQAAAFEAAABOAAAAAAAAAAAAAAARAAAAFgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAB2AAAAuwAAAK0AAABTAAAAAAAA + AAAAAAAyAAAA/wAAABgAAAAAAAAA5QAAAKIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AIwAAACxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAADAAAAD+AAAAHgAAAAAAAACmAAAAfQAAAAAAAAAOAAAAFAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAjAAAALEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAAADoAAAAwgAAAN4AAAAWAAAAAAAAAKkAAACzAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACMAAAAsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAABEAAAADQAAAAAAAAAAAAAA2gAA + AOMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAAC0AAAAaQAAAKIAAACTAAAANQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAALAAAAlAAAAL4AAABmAAAAAAAAAIoAAABoAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAADEAAAA2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjAAAAO8AAABlAAAAHQAAAEwAAADyAAAALwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEAAADfAAAAPwAAAHYAAAB6AAAA7gAAAJgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAH0AAAC1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMAAAAsQAAAAAAAAAAAAAAAAAA + ALgAAACFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAA+wAAAFUAAAAAAAAAAQAAAOQAAACiAAAAEgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAKUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAAACxAAAAAAAA + AAAAAAAAAAAArgAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAD+AAAADgAAAAAAAAAAAAAApwAA + AHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAyQAAABwAAAAAAAAAAAAAAAAAAAAAAAAAjAAA + ALEAAAAAAAAAAAAAAAAAAADXAAAAWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAAPkAAAAAAAAAAAAA + AAAAAACeAAAAqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMAAAA1AAAAogAAAAAAAAAAAAAAAAAA + AAAAAACMAAAAsQAAABkAAAAoAAAAZwAAAKkAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAA+AAA + AAkAAAAAAAAAAAAAAMoAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAtAAAAAAAAAC5AAAAOAAA + AAAAAAAAAAAAAAAAAIwAAACxAAAAcwAAAMcAAADXAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACjAAAASAAAAAAAAAAdAAAA2QAAAPUAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAByAAAAAAAA + AFMAAADFAAAAAAAAAAAAAAAAAAAAiAAAALYAAAAAAAAAAAAAAI4AAAClAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAABYAAACwAAAAUQAAALkAAABSAAAAwgAAAFkAAAAAAAAANAAAAGsAAAAsAAAA8AAA + ABgAAAAAAAAABwAAAPAAAABIAAAAAAAAAAAAAABTAAAA6QAAAAkAAAAAAAAAcQAAAMsAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAAAFQAAAAAAAAABAAAAAQAAAAAAAAAVAAAA8gAA + APMAAACUAAAAAAAAAAAAAAAAAAAAswAAALEAAAAAAAAAAAAAAAEAAACjAAAAvQAAAGcAAADWAAAAaQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABhAAAAlQAAAAoAAAAAAAAAAAAAAAAAAABLAAAAbgAAAAAAAAAAAAAAAAAAAAAAAAA1AAAAWgAA + AC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////Hw/+Px4H/B8cZ/yfHGP/Hxzz+BMc8/ + jzHOPx8xxj8fMeIhHzHwQB0x8M4cAeJPjAPkQ4H/4GDDP+DE/z//xJ8//+CfP//xnwP4T58B+A+fOfEP + nznxn48585+PAfGfJwP5Dycz+AgjE/xIcwP//HPH//////////8oAAAAEAAAACAAAAABACAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAALAAAAAgAAAAAAAAASAAAAfAAAAGMAAAAGAAAAAAAAAAAAAAAAAAAAAAAA + ADUAAABlAAAAGwAAAAAAAAAAAAAAkgAAACAAAAAAAAAAjQAAABsAAAAbAAAAbgAAAAAAAAAAAAAAAAAA + AAAAAAAOAAAANQAAAFoAAAAAAAAAAAAAAJIAAAAgAAAAAAAAAKMAAAAAAAAAAAAAAKkAAAAAAAAAAAAA + AAAAAAA9AAAAlQAAAEoAAAACAAAAsAAAAAAAAACSAAAAIAAAAAAAAACHAAAADwAAABQAAACpAAAAAAAA + AAAAAAAAAAAAjAAAAAwAAAAAAAAAAAAAALMAAAAAAAAAkgAAACAAAAAAAAAAEAAAAHQAAACRAAAARQAA + AGAAAACMAAAAXwAAAIoAAAAMAAAAAAAAAAEAAACzAAAAAAAAAJgAAAAaAAAAAAAAABMAAACQAAAAMgAA + AAUAAACmAAAAAAAAABMAAABOAAAASgAAAAAAAABTAAAAswAAAHcAAACUAAAAAAAAAAAAAABEAAAAPgAA + AKUAAABSAAAAfQAAAHYAAAAuAAAAAAAAAIoAAACFAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AEwAAABAAAAAAAAAAJgAAAANAAAAqgAAAAMAAAAFAAAAAAAAAAAAAACeAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAoAAAAhwAAAEAAAABgAAAAZQAAAAAAAAAAAAAAnwAAAEMAAAAyAAAAAAAA + AAAAAAAAAAAAKwAAAJwAAABVAAAAngAAAAAAAAAAAAAAUAAAAGMAAAAAAAAAAAAAAK4AAAAgAAAAfQAA + AC0AAAAAAAAAAAAAAJEAAAAZAAAAYwAAAEwAAAAAAAAAAAAAABwAAABiAAAAAAAAAAAAAACeAAAAAAAA + AGEAAAA6AAAAAAAAAAAAAACNAAAAAgAAAFoAAABjAAAAAAAAAAAAAABVAAAAZAAAAA4AAAAAAAAAngAA + AF8AAAB/AAAAAAAAAAAAAAAAAAAALgAAAFIAAACAAAAAjAAAAA0AAAAmAAAAfwAAABYAAAB/AAAAAAAA + AJ4AAAACAAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAABQAAAAAAAAAFAAAAtwAAACcAAAAAAAAAhwAA + AAAAAAApAAAAbQAAAFsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/8nEGHjJxBh4ycQbcEnEGHNJxBgCScQYIhnEGAl5xByDecQfgx + nEHDMJxBwzScQcMRnEHAEZxB5FGcQf//nEE= - False + False - CenterParent + CenterParent - Writing System Properties + Writing System Properties - helpProvider + helpProvider - System.Windows.Forms.HelpProvider, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.HelpProvider, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - WritingSystemPropertiesDialog + WritingSystemPropertiesDialog - System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + \ No newline at end of file diff --git a/Src/Kernel/FwKernel_GUIDs.cpp b/Src/Kernel/FwKernel_GUIDs.cpp index 0f60cb1c5a..90998a0371 100644 --- a/Src/Kernel/FwKernel_GUIDs.cpp +++ b/Src/Kernel/FwKernel_GUIDs.cpp @@ -50,6 +50,7 @@ DEFINE_UUIDOF(ILgSearchEngine, 0x09FCA8D5, 0x5BF6, 0x4BFF, 0xA3, 0x17, 0xE0, 0x1 DEFINE_UUIDOF(ILgWritingSystem, 0x9F74A170, 0xE8BB, 0x466d, 0x88, 0x48, 0x5F, 0xDB, 0x28, 0xAC, 0x5A, 0xF8); DEFINE_UUIDOF(ILgIcuCharPropEngine, 0xE8689492, 0x7622, 0x427b, 0x85, 0x18, 0x63, 0x39, 0x29, 0x4F, 0xD2, 0x27); DEFINE_UUIDOF(ILgNumericEngine, 0xCBBF35E1, 0xCE39, 0x4EEC, 0xAE, 0xBD, 0x5B, 0x4A, 0xAA, 0xA5, 0x2B, 0x6C); +DEFINE_UUIDOF(ILgKeymanHandler, 0x3F42144B, 0x509F, 0x4def, 0x8D, 0xD3, 0x6D, 0x8D, 0x26, 0x67, 0x70, 0x01); DEFINE_UUIDOF(ILgIcuConverterEnumerator, 0x8E6D558E, 0x8755, 0x4EA1, 0x9F, 0xF6, 0x03, 0x9D, 0x37, 0x53, 0x12, 0xE9); DEFINE_UUIDOF(ILgIcuTransliteratorEnumerator, 0x50F2492C, 0x6C46, 0x48BA, 0x8B, 0x7F, 0x5F, 0x04, 0x15, 0x3A, 0xB2, 0xCC); DEFINE_UUIDOF(ILgIcuLocaleEnumerator, 0x08F649D0, 0xD8AB, 0x447B, 0xAA, 0xB6, 0x21, 0xF8, 0x5C, 0xFA, 0x74, 0x3C); @@ -63,6 +64,7 @@ DEFINE_UUIDOF(LgCPWordTokenizer, 0x7CE7CE94, 0xAC47, 0x42A5, 0x82, 0x3F, 0x2F, 0 DEFINE_UUIDOF(LgWfiSpellChecker, 0x818445E2, 0x0282, 0x4688, 0x8B, 0xB7, 0x14, 0x7F, 0xAA, 0xCF, 0xF7, 0x3A); DEFINE_UUIDOF(LgMSWordSpellChecker, 0x5CF96DA5, 0x299E, 0x4FC5, 0xA9, 0x90, 0x2D, 0x2F, 0xCE, 0xE7, 0x83, 0x4D); DEFINE_UUIDOF(LgNumericEngine, 0xFF22A7AB, 0x223E, 0x4D04, 0xB6, 0x48, 0x0A, 0xE4, 0x05, 0x88, 0x26, 0x1D); +DEFINE_UUIDOF(LgKeymanHandler, 0x69ACA99C, 0xF852, 0x4C2C, 0x9B, 0x5F, 0xFF, 0x83, 0x23, 0x8A, 0x17, 0xA5); DEFINE_UUIDOF(LgIcuConverterEnumerator, 0x9E729461, 0xF80D, 0x4796, 0xBA, 0x17, 0x08, 0x6B, 0xC6, 0x19, 0x07, 0xF1); DEFINE_UUIDOF(LgIcuTransliteratorEnumerator, 0x3F1FD0A4, 0xB2B1, 0x4589, 0xBC, 0x82, 0x9C, 0xEF, 0x5B, 0xA8, 0x4F, 0x4E); DEFINE_UUIDOF(LgIcuResourceBundle, 0x0DD7FC1A, 0xAB97, 0x4A39, 0x88, 0x2C, 0x26, 0x97, 0x60, 0xD8, 0x66, 0x19); diff --git a/Src/Language/Language.idh b/Src/Language/Language.idh index c2e4897afd..7e4002d1a8 100644 --- a/Src/Language/Language.idh +++ b/Src/Language/Language.idh @@ -1501,6 +1501,41 @@ Description: [in] int ws); }; +/******************************************************************************************* + Interface ILgKeymanHandler + + Last vestigaes of an interface that manages Keyman, being able to find out which + one is active, if any. This is not implemented for Mono, since the one remaining caller + is simply coded to know there is no Keyman keyboard. + + @h3{When to implement} + The standard implementation should suffice. + + @h3{When to use} + Whenever you want to manipulate or query Keyman + + @h3{Hungarian: lkh} +*******************************************************************************************/ +DeclareInterface(LgKeymanHandler, Unknown, 3F42144B-509F-4def-8DD3-6D8D26677001) +{ + + // Initialize the Keyboard handler. Set fForce to re-initialize even if already + // initialized, for example, if a keyboard has been added or removed. + // All data is static, so it is only necessary to call this for one instance. + // Actually, it is not strictly necessary to call it at all, as other methods will + // do so if necessary. + HRESULT Init( + [in] ComBool fForce); + + // Gracefully shut down the keyboard handler. We need this for calling from .NET so + // that we don't rely on garbage collection. + HRESULT Close(); + + // Get the active keyboard. + [propget] HRESULT ActiveKeyboardName( + [out, retval] BSTR * pbstrName); +}; + /******************************************************************************************* Interface ILgIcuConverterEnumerator @@ -1780,6 +1815,10 @@ DeclareInterface(RegexMatcher, Unknown, 6C62CCF0-4EE1-493C-8092-319B6CFBEEBC) interface ILgNumericEngine; }; + DeclareCoClass(LgKeymanHandler, 69ACA99C-F852-4C2C-9B5F-FF83238A17A5) + { + interface ILgKeymanHandler; + }; DeclareCoClass(LgIcuConverterEnumerator, 9E729461-F80D-4796-BA17-086BC61907F1) { interface ILgIcuConverterEnumerator; diff --git a/Src/Language/Language.mak b/Src/Language/Language.mak index 7c48d0853a..0e382e62f2 100644 --- a/Src/Language/Language.mak +++ b/Src/Language/Language.mak @@ -67,6 +67,7 @@ OBJ_LANG=\ $(INT_DIR)\autopch\LgSimpleEngines.obj\ $(INT_DIR)\autopch\LgIcuCharPropEngine.obj\ $(INT_DIR)\autopch\LgUnicodeCollater.obj\ + $(INT_DIR)\autopch\LgKeymanHandler.obj\ $(INT_DIR)\autopch\ModuleEntry.obj\ $(INT_DIR)\autopch\FwStyledText.obj\ $(INT_DIR)\autopch\WriteXml.obj\ diff --git a/Src/Language/Language.vcxproj b/Src/Language/Language.vcxproj index 387be729e1..847e71362b 100644 --- a/Src/Language/Language.vcxproj +++ b/Src/Language/Language.vcxproj @@ -96,6 +96,7 @@ + @@ -110,6 +111,7 @@ + @@ -135,4 +137,4 @@ - + \ No newline at end of file diff --git a/Src/Language/LanguageExtra_GUIDs.cpp b/Src/Language/LanguageExtra_GUIDs.cpp index 1da6026992..b113448168 100644 --- a/Src/Language/LanguageExtra_GUIDs.cpp +++ b/Src/Language/LanguageExtra_GUIDs.cpp @@ -6,6 +6,5 @@ #include -DEFINE_UUIDOF(KeyboardSwitcher,0x4ED1E8bC,0xDAdE,0x11DE,0xB3,0x50,0x00,0x19,0xDB,0xf4,0x56,0x6E); DEFINE_UUIDOF(UniscribeSegment,0x61299C3B,0x54D6,0x4c46,0xAC,0xE5,0x72,0xB9,0x12,0x8F,0x20,0x48); DEFINE_UUIDOF(RomRenderSegment,0xA124E0C1,0xDD4B,0x11d2,0x80,0x78,0x00,0x00,0xC0,0xFB,0x81,0xB5); diff --git a/Src/Language/Language_GUIDs.cpp b/Src/Language/Language_GUIDs.cpp index 19791219a4..3678dc48b2 100644 --- a/Src/Language/Language_GUIDs.cpp +++ b/Src/Language/Language_GUIDs.cpp @@ -50,6 +50,7 @@ DEFINE_UUIDOF(ILgSearchEngine, 0x09FCA8D5, 0x5BF6, 0x4BFF, 0xA3, 0x17, 0xE0, 0x1 DEFINE_UUIDOF(ILgWritingSystem, 0x9F74A170, 0xE8BB, 0x466d, 0x88, 0x48, 0x5F, 0xDB, 0x28, 0xAC, 0x5A, 0xF8); DEFINE_UUIDOF(ILgIcuCharPropEngine, 0xE8689492, 0x7622, 0x427b, 0x85, 0x18, 0x63, 0x39, 0x29, 0x4F, 0xD2, 0x27); DEFINE_UUIDOF(ILgNumericEngine, 0xCBBF35E1, 0xCE39, 0x4EEC, 0xAE, 0xBD, 0x5B, 0x4A, 0xAA, 0xA5, 0x2B, 0x6C); +DEFINE_UUIDOF(ILgKeymanHandler, 0x3F42144B, 0x509F, 0x4def, 0x8D, 0xD3, 0x6D, 0x8D, 0x26, 0x67, 0x70, 0x01); DEFINE_UUIDOF(ILgIcuConverterEnumerator, 0x8E6D558E, 0x8755, 0x4EA1, 0x9F, 0xF6, 0x03, 0x9D, 0x37, 0x53, 0x12, 0xE9); DEFINE_UUIDOF(ILgIcuTransliteratorEnumerator, 0x50F2492C, 0x6C46, 0x48BA, 0x8B, 0x7F, 0x5F, 0x04, 0x15, 0x3A, 0xB2, 0xCC); DEFINE_UUIDOF(ILgIcuLocaleEnumerator, 0x08F649D0, 0xD8AB, 0x447B, 0xAA, 0xB6, 0x21, 0xF8, 0x5C, 0xFA, 0x74, 0x3C); @@ -63,6 +64,7 @@ DEFINE_UUIDOF(LgCPWordTokenizer, 0x7CE7CE94, 0xAC47, 0x42A5, 0x82, 0x3F, 0x2F, 0 DEFINE_UUIDOF(LgWfiSpellChecker, 0x818445E2, 0x0282, 0x4688, 0x8B, 0xB7, 0x14, 0x7F, 0xAA, 0xCF, 0xF7, 0x3A); DEFINE_UUIDOF(LgMSWordSpellChecker, 0x5CF96DA5, 0x299E, 0x4FC5, 0xA9, 0x90, 0x2D, 0x2F, 0xCE, 0xE7, 0x83, 0x4D); DEFINE_UUIDOF(LgNumericEngine, 0xFF22A7AB, 0x223E, 0x4D04, 0xB6, 0x48, 0x0A, 0xE4, 0x05, 0x88, 0x26, 0x1D); +DEFINE_UUIDOF(LgKeymanHandler, 0x69ACA99C, 0xF852, 0x4C2C, 0x9B, 0x5F, 0xFF, 0x83, 0x23, 0x8A, 0x17, 0xA5); DEFINE_UUIDOF(LgIcuConverterEnumerator, 0x9E729461, 0xF80D, 0x4796, 0xBA, 0x17, 0x08, 0x6B, 0xC6, 0x19, 0x07, 0xF1); DEFINE_UUIDOF(LgIcuTransliteratorEnumerator, 0x3F1FD0A4, 0xB2B1, 0x4589, 0xBC, 0x82, 0x9C, 0xEF, 0x5B, 0xA8, 0x4F, 0x4E); DEFINE_UUIDOF(LgIcuResourceBundle, 0x0DD7FC1A, 0xAB97, 0x4A39, 0x88, 0x2C, 0x26, 0x97, 0x60, 0xD8, 0x66, 0x19); diff --git a/Src/Language/LgKeymanHandler.cpp b/Src/Language/LgKeymanHandler.cpp new file mode 100644 index 0000000000..a2653e3aff --- /dev/null +++ b/Src/Language/LgKeymanHandler.cpp @@ -0,0 +1,456 @@ +/*--------------------------------------------------------------------*//*:Ignore this sentence. +Copyright (C) 1999-2007 SIL International. All rights reserved. + +Distributable under the terms of either the Common Public License or the +GNU Lesser General Public License, as specified in the LICENSING.txt file. + +File: LgKeymanHandler.cpp +Responsibility: John Thomson +Last reviewed: Not yet. + +Description: A wrapper for the keyman program. +-------------------------------------------------------------------------------*//*:End Ignore*/ + +//:>******************************************************************************************** +//:> Include files +//:>******************************************************************************************** +#include "Main.h" + +#pragma hdrstop +#include "limits.h" +#undef THIS_FILE +DEFINE_THIS_FILE + +//:>******************************************************************************************** +//:>A bit of special header information needed only in this file, for interacting with Keyman. +//:>******************************************************************************************** + +#ifndef _KEYMANAPI_H +#define _KEYMANAPI_H + +typedef struct tagKEYBOARDINFO +{ + DWORD KeymanID; + DWORD HotKey; + DWORD KeyboardID; + char Name[256]; + // The original type for pKeyboard was LPKEYBOARD Keyboard, but we don't have defn of + // LPKEYBOARD + int * pKeyboard; + DWORD nIMDLLs; + DWORD /*LPIMDLL*/ IMDLLs; + // JohnT: The definition Marc gave me didn't have this, but the objects version 6 returns + // are four bytes bigger than Marc's typedef indicated. This aligns things properly and + // makes sure we allocate enough memory. + //DWORD Dummy; +} KEYBOARDINFO, *LPKEYBOARDINFO; + +typedef BOOL (WINAPI *PFNKeyman_BuildKeyboardList)(LPKEYBOARDINFO kbd, int*n); +//extern "C" HWND WINAPI Keyman_GetLastActiveWindow(); +//extern "C" HWND WINAPI Keyman_GetLastFocusWindow(); + +// Marc Durdin gave me a header with this, but not LPKEYBOARD; hopefully we don't need it. +//extern "C" PWSTR WINAPI GetSystemStore(LPKEYBOARD kb, DWORD SystemID); +// I'm making the first argument int * to correspond to what I made pKeyboard in KEYBOARDINFO, +// since that's the only place we get an argument from. +typedef PWSTR (WINAPI *PFNGetSystemStore)(int * pKeyboard, DWORD SystemID); +#define TSS_NAME 7 // from Tavultesoft FAQ4 sample + +typedef DWORD (WINAPI *PFNGetActiveKeymanID)(); + +#define KEYMAN_API_V6 0x0600 + +//extern "C" DWORD WINAPI Keyman_GetAPIVersion(); + +#endif + +// statics required for Keyman +//:>******************************************************************************************** +//:> Local Constants and static variables +//:>******************************************************************************************** +struct KbdInfo +{ + StrUni m_stuName; + int m_id; +}; +typedef Vector VecKbdInfo; +static int s_wm_kmselectlang = 0; // Windows message Keyman uses to change language +static int s_wm_kmkbchange = 0; +static bool s_fKeymanInitialized = false; // flag set when keyman has initialized +static bool s_fKeymanFailed = false; // flag set when keyman has failed to initialized +static VecKbdInfo s_vkiKeyboards; // Info about them. +const int knKeymanID = 1; // skKeymanID in Marc's code; param to PostMessage. +#define KEYMANID_NONKEYMAN 0xFFFFFFFF //Keyboard default (off) ID + +typedef DWORD (WINAPI *PGETACTIVEKEYMANIDFUNC)(); + +static PFNKeyman_BuildKeyboardList pKeyman_BuildKeyboardList = 0; +static PFNGetActiveKeymanID pGetActiveKeymanID = 0; +static PFNGetSystemStore pGetSystemStore = 0; +//:>******************************************************************************************** +//:> Local methods. +//:>******************************************************************************************** + +// Keyman is up and running if its window exists (even if not visible). +// Marc's sample code indicates this works for version 5 and 6 (and presumably will keep +// working :-). +bool KeymanOn() +{ + // Finding a window called Keyman50 is the recommended technique for detecting Keyman 5 + // AND ALSO Keyman 6. +#if WIN32 + if (::FindWindowA(NULL, "Keyman50") != 0) + return true; + // Keyman 7 can typically be found by this code: + //::FindWindowA(NULL, "Keyman") != 0); + // But Marc Durdin recommends this: + HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, false, L"KeymanEXE70"); + if (hMutex != 0) + { + // keyman is running + ::CloseHandle(hMutex); + return true; + } +#endif + return false; // Keyman is not running. +} + +//:>******************************************************************************************** +//:> Constructor/Destructor +//:>******************************************************************************************** + +LgKeymanHandler::LgKeymanHandler() +{ + m_cref = 1; + ModuleEntry::ModuleAddRef(); +} + +LgKeymanHandler::~LgKeymanHandler() +{ + Close(); + ModuleEntry::ModuleRelease(); +} + +//:>******************************************************************************************** +//:> Generic factory stuff to allow creating an instance with CoCreateInstance. +//:>******************************************************************************************** +static GenericFactory g_fact( + L"SIL.Language1.LgKeymanHandler", + &CLSID_LgKeymanHandler, + _T("SIL Keyman Handler"), + _T("Apartment"), + &LgKeymanHandler::CreateCom); + + +void LgKeymanHandler::CreateCom(IUnknown *punkCtl, REFIID riid, void ** ppv) +{ + AssertPtr(ppv); + Assert(!*ppv); + if (punkCtl) + ThrowHr(WarnHr(CLASS_E_NOAGGREGATION)); + + ComSmartPtr qlkh; + qlkh.Attach(NewObj LgKeymanHandler()); // ref count initialy 1 + CheckHr(qlkh->QueryInterface(riid, ppv)); +} + +//:>******************************************************************************************** +//:> IUnknown Methods +//:>******************************************************************************************** +STDMETHODIMP LgKeymanHandler::QueryInterface(REFIID riid, void **ppv) +{ + AssertPtr(ppv); + if (!ppv) + return WarnHr(E_POINTER); + *ppv = NULL; + + if (riid == IID_IUnknown) + *ppv = static_cast(this); + else if (riid == IID_ILgKeymanHandler) + *ppv = static_cast(this); + else if (riid == IID_ISupportErrorInfo) + { + *ppv = NewObj CSupportErrorInfo(static_cast(this), + IID_ILgKeymanHandler); + return S_OK; + } + else + return E_NOINTERFACE; + + AddRef(); + return NOERROR; +} + +//:>******************************************************************************************** +//:> Error Handling Methods +//:>******************************************************************************************** +/*---------------------------------------------------------------------------------------------- + Creates an error object and then sets a description from a resource id. Also sets a full + help URL as required by HtmlHelp. Uses ierr as an index for both resource id and help URL. + @param ierr Index to a set of htm help files (second part of full help URL) and matching + resource strings for Message Box text. + @param pei [out] Error info object +----------------------------------------------------------------------------------------------*/ +void LgKeymanHandler::ThrowErrorWithInfo(HRESULT hrErr, int stidDescription) +{ + IErrorInfoPtr qei; + ICreateErrorInfoPtr qcei; + + // Create error info object. + CheckHr(CreateErrorInfo(&qcei)); + + StrUni stu(stidDescription); + CheckHr(qcei->SetDescription((wchar *)stu.Chars())); + + // Now get the IErrorInfo interface of the error object and set it for the current thread. + CheckHr(qcei->QueryInterface(IID_IErrorInfo, (void **)&qei)); + SetErrorInfo(0, qei); + + ThrowHr(hrErr, stu.Chars(), -1, qei); // An error object exists. +} + +//:>******************************************************************************************** +//:> Interface Methods +//:>******************************************************************************************** + +/*---------------------------------------------------------------------------------------------- + Initialize the Keyboard handler. Set fForce to re-initialize even if already + initialized, for example, if a keyboard has been added or removed. + + Load the Keyman library, initialize address pointers and messages, and load keyboards into + memory. + + If Keyman isn't installed or isn't registered or isn't running, we just return S_OK. + FieldWorks does not require Keyman except where a writing system indicates it is used. +----------------------------------------------------------------------------------------------*/ +STDMETHODIMP LgKeymanHandler::Init(ComBool fForce) +{ + BEGIN_COM_METHOD + + if (fForce) + s_fKeymanInitialized = false; + // If not forcing, and already initialized, done. + if (s_fKeymanInitialized) + return S_OK; + + // TE-5637, 27 JUL 2007: Moved this line up from below to prevent crash + // Get rid of any info from previous Init calls. + s_vkiKeyboards.Clear(); + + +#if WIN32 + // Keyman must be running - but don't start it here to avoid possible conflicts + if (!KeymanOn()) + return S_OK; + + if (!s_wm_kmselectlang) + s_wm_kmselectlang = ::RegisterWindowMessageW(L"WM_KMSELECTLANG"); + + // This really only needs to be done once, even if fForce is true; + if (!pGetActiveKeymanID) + { + // Load the Keyman library and initialize needed function pointers. + // This correctly handles keyman 5-8. Perhaps 9-10? + // Review: for 7, might be good enough to test as far as keyman engine, leave off 7.0. That should + // verify AT LEAST keyman 7. + // Note: try 7 first. This works better if more than one is installed, or if registry keys + // got left behind. + RegKey rk; + rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman engine\\10.0")); // Anticipate 9/10 even though it may be years away. + if (rk == 0) + rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman engine\\9.0")); + if (rk == 0) + rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman engine\\8.0")); + if (rk == 0) + rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman engine\\7.0")); + if (rk == 0) + rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman\\6.0")); + if (rk == 0) + rk.InitLm(_T("SOFTWARE\\Tavultesoft\\keyman\\5.0")); + if (rk == 0) + ThrowErrorWithInfo(E_UNEXPECTED, kstidKeymanNotRegisteredMsg); + + wchar rgch[MAX_PATH]; + DWORD cb = isizeof(rgch); + DWORD dwT; + LONG lRet = ::RegQueryValueExW(rk, L"root path", NULL, &dwT, (BYTE *)rgch, &cb); + if (lRet != ERROR_SUCCESS) + ThrowErrorWithInfo(WarnHr(E_UNEXPECTED), kstidKeymanRootNotRegisteredMsg); + Assert(dwT == REG_SZ); + StrUni stuKeymanDllPath; + stuKeymanDllPath.Assign(rgch); + if (stuKeymanDllPath.Chars()[stuKeymanDllPath.Length() - 1] != '\\') + stuKeymanDllPath.Append(L"\\"); + stuKeymanDllPath.Append(L"Keyman32.dll"); + HMODULE hm = ::LoadLibraryW(stuKeymanDllPath.Chars()); + if (hm == NULL) + ThrowErrorWithInfo(WarnHr(E_UNEXPECTED), kstidKeymanDllLoadFailureMsg); + /* + From Marc Durdin: + + Keyman doesn't initialize for a given process until after the first + POSTED message is received. This is due to the way that Windows handles + hookprocs... the DLL does not get loaded for the process until it is + needed. It is possible to force Keyman to initialize early by posting a + thread message and then handling it immediately with GetMessage, something + like this (you may need to add a dose of error checking of course...): + */ + MSG msg; + while (!::PostThreadMessage(::GetCurrentThreadId(), WM_NULL, 0, 0) && + ::GetLastError() == ERROR_INVALID_THREAD_ID) + { + ::Sleep(0); + } + ::GetMessage(&msg, NULL, WM_NULL, WM_NULL); + + pKeyman_BuildKeyboardList = (PFNKeyman_BuildKeyboardList) + ::GetProcAddress(hm, "Keyman_BuildKeyboardList"); + pGetActiveKeymanID = (PFNGetActiveKeymanID) + ::GetProcAddress(hm, "GetActiveKeymanID"); + pGetSystemStore = (PFNGetSystemStore) + ::GetProcAddress(hm, "GetSystemStore"); + } + +//- // Register Keyman message. May as well use A version to save memory on constant. +//- s_wm_kmselectlang = ::RegisterWindowMessageA("WM_KMSELECTLANG"); + + Vector vkbi; + int nKeyboards = 0; + (*pKeyman_BuildKeyboardList)(NULL, &nKeyboards); + if (nKeyboards == 0) + return S_OK; // no keyboards installed. + vkbi.Resize(nKeyboards); + (*pKeyman_BuildKeyboardList)(vkbi.Begin(), &nKeyboards); + + // TE-5637, 27 JUL 2007: Removed this line and moved it up to prevent crash + // Get rid of any info from previous Init calls. + //s_vkiKeyboards.Clear(); + + // Get actual keyboard name where possible + for (int ikbd = 0; ikbd < nKeyboards; ++ikbd) + { + KEYBOARDINFO & kbi = vkbi[ikbd]; + // From comments in Marc's code, it seems if this is 0 it isn't a valid, + // useable keyboard. Ignore it. + if (kbi.pKeyboard == 0) + continue; + + KbdInfo ki; + ki.m_stuName = (*pGetSystemStore)(kbi.pKeyboard, TSS_NAME); + ki.m_id = kbi.KeymanID; + s_vkiKeyboards.Push(ki); + } + + s_fKeymanInitialized = true; +#endif + END_COM_METHOD(g_fact, IID_ILgKeymanHandler); +} + +/*---------------------------------------------------------------------------------------------- + Gracefully shut down the keyboard handler. We need this for calling from .NET so that we + don't rely on garbage collection. +----------------------------------------------------------------------------------------------*/ +STDMETHODIMP LgKeymanHandler::Close() +{ + BEGIN_COM_METHOD + + END_COM_METHOD(g_fact, IID_ILgKeymanHandler); +} + +/*---------------------------------------------------------------------------------------------- + Initialize the Keyboard handler if not already initialized. + If Keyman couldn't be initialized, we just return false. + FieldWorks does not require Keyman except where a writing system indicates it is used. +----------------------------------------------------------------------------------------------*/ +bool LgKeymanHandler::InitInternal() +{ + if (s_fKeymanInitialized) + return true; + if (s_fKeymanFailed) + { + Warn("Skipping Keyman initialization due to previous failure."); + return false; + } + StrUni stuCaption(kstidKeymanInitFailedCaption); + StrUni stuMsg; + try + { + if (!s_fKeymanInitialized) + { + HRESULT hr = Init(false); + if (SUCCEEDED(hr)) + return true; + IErrorInfo * pIErrorInfo = NULL; + ::GetErrorInfo(0, &pIErrorInfo); + BSTR bstrDescription; + pIErrorInfo->GetDescription(&bstrDescription); + stuMsg.Assign(bstrDescription); + } + } + catch (Throwable error) + { + stuMsg.Load(kstidKeymanInitUnexpectedFailMsg); + } + s_fKeymanFailed = true; +#if WIN32 + ::MessageBox(NULL, stuMsg.Chars(), stuCaption.Chars(), MB_OK | MB_ICONINFORMATION); +#endif // !WIN32 + return s_fKeymanInitialized; +} + +/*---------------------------------------------------------------------------------------------- + Get the active keyboard. Returns NULL if Keyman is not running or otherwise can't be + initialized; "(None)" if no keyman keyboard active. +----------------------------------------------------------------------------------------------*/ +STDMETHODIMP LgKeymanHandler::get_ActiveKeyboardName(BSTR * pbstrName) +{ + BEGIN_COM_METHOD + ChkComOutPtr(pbstrName); + if (!InitInternal()) + return S_OK; +#if WIN32 + //int nActiveKeymanId = (*pGetActiveKeymanID)(); + HMODULE hKeyman = GetModuleHandleA("keyman32.dll"); + if(hKeyman == 0) + return S_OK; // leave name null + + PGETACTIVEKEYMANIDFUNC pGetActiveKeymanID = + (PGETACTIVEKEYMANIDFUNC) GetProcAddress(hKeyman, "GetActiveKeymanID"); + if(!pGetActiveKeymanID) + return S_OK; // leave name null + + int nActiveKeymanId = (*pGetActiveKeymanID)(); + + if (nActiveKeymanId == -1) + { + *pbstrName = ::SysAllocString(L"(None)"); // Todo JohnT: localize? +#ifdef TRACING_KEYMAN + StrAnsi staMsg; + staMsg.Format("Keyman active ID is %d name is %S\n", nActiveKeymanId, *pbstrName); + OutputDebugStringA(staMsg.Chars()); +#endif + return S_OK; + } + for (int iki = 0; iki < s_vkiKeyboards.Size(); ++iki) + { + if (s_vkiKeyboards[iki].m_id == nActiveKeymanId) + { + s_vkiKeyboards[iki].m_stuName.GetBstr(pbstrName); +#ifdef TRACING_KEYMAN + StrAnsi staMsg; + staMsg.Format("Keyman active ID is %d name is %S\n", nActiveKeymanId, *pbstrName); + OutputDebugStringA(staMsg.Chars()); +#endif + return S_OK; + } + } +#endif + Assert(false); // Keyman gave us an ID, but it didn't match! + return E_UNEXPECTED; + END_COM_METHOD(g_fact, IID_ILgKeymanHandler); +} + +// Explicit instantiation. +#include "Vector_i.cpp" +template class Vector; +template class Vector; // VecKbdInfo; diff --git a/Src/Language/LgKeymanHandler.h b/Src/Language/LgKeymanHandler.h new file mode 100644 index 0000000000..e20faf0894 --- /dev/null +++ b/Src/Language/LgKeymanHandler.h @@ -0,0 +1,65 @@ +/*--------------------------------------------------------------------*//*:Ignore this sentence. +Copyright (C) 1999, 2001 SIL International. All rights reserved. + +Distributable under the terms of either the Common Public License or the +GNU Lesser General Public License, as specified in the LICENSING.txt file. + +File: LgKeymanHandler.h +Responsibility: John Thomson +Last reviewed: Not yet. + +Description: + +-------------------------------------------------------------------------------*//*:End Ignore*/ +#pragma once +#ifndef LgKeymanHandler_INCLUDED +#define LgKeymanHandler_INCLUDED + +/*---------------------------------------------------------------------------------------------- +Class: LgKeymanHandler +Description: A class that manages Keyman, being able to invoke a keyboard, find out which + one is active, find out which keyboards are available, return the windows message that + Keyman sends when a keyboard is selected, and so forth. +Hungarian: lkh +----------------------------------------------------------------------------------------------*/ +class LgKeymanHandler : + public ILgKeymanHandler +{ +public: + + // Static methods + static void CreateCom(IUnknown *punkOuter, REFIID iid, void ** ppv); + + // Constructors/destructors/etc. + LgKeymanHandler(); + virtual ~LgKeymanHandler(); + + // IUnknown methods + STDMETHOD(QueryInterface)(REFIID iid, void ** ppv); + STDMETHOD_(UCOMINT32, AddRef)(void) + { + return InterlockedIncrement(&m_cref); + } + STDMETHOD_(UCOMINT32, Release)(void) + { + long cref = InterlockedDecrement(&m_cref); + if (cref == 0) { + m_cref = 1; + delete this; + } + return cref; + } + + STDMETHOD(Init)(ComBool fForce); + STDMETHOD(Close)(); + STDMETHOD(get_ActiveKeyboardName)(BSTR * pbstrName); + + // Other public methods +protected: + // Member variables + long m_cref; // standard COM ref count + + bool InitInternal(); + void ThrowErrorWithInfo(HRESULT hrErr, int stidDescription); +}; +#endif //LgKeymanHandler_INCLUDED diff --git a/Src/Language/Main.h b/Src/Language/Main.h index 6b0df6f341..ac4503d8c7 100644 --- a/Src/Language/Main.h +++ b/Src/Language/Main.h @@ -192,6 +192,7 @@ DEFINE_COM_PTR(UniscribeEngine); #include "StringToNumHelpers.h" #include "WriteXml.h" // From AppCore. #include "xmlparse.h" +#include "LgKeymanHandler.h" #include "LgIcuWrappers.h" #include "RegexMatcherWrapper.h" diff --git a/Src/Language/Makefile b/Src/Language/Makefile index 6e9e817d27..884adfa561 100644 --- a/Src/Language/Makefile +++ b/Src/Language/Makefile @@ -85,6 +85,7 @@ OBJ_LANG = \ $(INT_DIR)/LgSimpleEngines.o \ $(INT_DIR)/LgIcuCharPropEngine.o \ $(INT_DIR)/LgUnicodeCollater.o \ + $(INT_DIR)/LgKeymanHandler.o \ $(INT_DIR)/LocaleIndex.o \ $(INT_DIR)/FwXml.o \ $(INT_DIR)/WriteXml.o \ diff --git a/Src/Language/Test/Makefile b/Src/Language/Test/Makefile index a04ea63651..91201898c6 100644 --- a/Src/Language/Test/Makefile +++ b/Src/Language/Test/Makefile @@ -82,6 +82,7 @@ FWLANG_OBJ := \ $(LANGUAGE_OBJ)/RomRenderSegment.o \ $(LANGUAGE_OBJ)/LgSimpleEngines.o \ $(LANGUAGE_OBJ)/LgIcuCharPropEngine.o \ + $(LANGUAGE_OBJ)/LgKeymanHandler.o \ $(LANGUAGE_OBJ)/LocaleIndex.o \ $(GENERIC_OBJ)/TextProps1.o \ $(GR_LIB_OBJ)/GrUtil.o \ diff --git a/Src/Language/Test/testLanguage.mak b/Src/Language/Test/testLanguage.mak index f87aa39b28..149b253285 100644 --- a/Src/Language/Test/testLanguage.mak +++ b/Src/Language/Test/testLanguage.mak @@ -57,6 +57,7 @@ OBJ_LANGUAGETESTSUITE=\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LgSimpleEngines.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LgIcuCharPropEngine.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LgUnicodeCollater.obj\ + $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\LgKeymanHandler.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\FwStyledText.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\autopch\WriteXml.obj\ $(BUILD_ROOT)\Obj\$(BUILD_CONFIG)\Language\usepch\TextProps1.obj\ diff --git a/Src/TeDll/TeDll.csproj b/Src/TeDll/TeDll.csproj index 14f86d161b..0cd402a918 100644 --- a/Src/TeDll/TeDll.csproj +++ b/Src/TeDll/TeDll.csproj @@ -158,10 +158,6 @@ FwUtils ..\..\Output\Debug\FwUtils.dll - - False - ..\..\Output\Debug\Keyboarding.dll - False ..\..\Lib\Common\LibronixLinker.dll @@ -174,6 +170,10 @@ False ..\..\Output\Debug\OxesIO.dll + + False + ..\..\Downloads\Palaso.dll + False ..\..\DistFiles\ParatextShared.dll @@ -317,9 +317,7 @@ Code - - Component - + UserControl @@ -327,21 +325,11 @@ DockableUsfmBrowser.cs - - UserControl - - - UserControl - - - UserControl - - - Component - - - UserControl - + + + + + Form @@ -356,16 +344,12 @@ ScrTextListSelectionForm.cs - - Component - + Code - - Form - + Code @@ -376,12 +360,8 @@ TrainingAvailable.cs - - Component - - - UserControl - + + Designer BtDraftSplitWrapper.cs diff --git a/Src/TeDll/TeMainWnd.cs b/Src/TeDll/TeMainWnd.cs index 53456d3c80..077b9215ea 100644 --- a/Src/TeDll/TeMainWnd.cs +++ b/Src/TeDll/TeMainWnd.cs @@ -22,12 +22,12 @@ using System.Media; using System.Windows.Forms; using Microsoft.Win32; +using Palaso.WritingSystems; using Paratext; using SIL.FieldWorks.Common.COMInterfaces; using SIL.FieldWorks.Common.Controls; using SIL.FieldWorks.Common.Framework; using SIL.FieldWorks.Common.FwUtils; -using SIL.FieldWorks.Common.Keyboarding; using SIL.FieldWorks.Common.PrintLayout; using SIL.FieldWorks.Common.RootSites; using SIL.FieldWorks.Common.ScriptureUtils; @@ -5459,7 +5459,7 @@ protected bool OnUnsQuestions(object args) m_StyleSheet.GetUiFontForWritingSystem(Cache.DefaultVernWs, 0), vernWs.IcuLocale, vernWs.RightToLeftScript, Path.Combine(ScrTextCollection.SettingsDirectory ?? @"c:\My Paratext Projects", "cms"), ccSettings, App.ApplicationName, start, end, - vern => KeyboardController.SetKeyboard(vern ? vernWs : defaultWs), + vern => ((IWritingSystemDefinition)(vern ? vernWs : defaultWs)).LocalKeyboard.Activate(), () => ShowHelp.ShowHelpTopic(m_app, "khtpNoHelpTopic"), LookupTerm); // TODO: Come up with a Help topic diff --git a/Src/views/VwTextStore.cpp b/Src/views/VwTextStore.cpp index ad55983e35..821ec988ff 100644 --- a/Src/views/VwTextStore.cpp +++ b/Src/views/VwTextStore.cpp @@ -2673,14 +2673,11 @@ int VwTextStore::LogToAcp(int ichReq) ----------------------------------------------------------------------------------------------*/ bool VwTextStore::IsNfdIMEActive() { - if (!m_qws) - return false; - - // at this point, we assume that all Keyman keyboards require NFD and all other IMEs require - // NFC. - SmartBstr sbstrKeymanKbd; - CheckHr(m_qws->get_Keyboard(&sbstrKeymanKbd)); - return BstrLen(sbstrKeymanKbd) > 0; + // Historically, we tried to give Keyman NFD, since normal operation requires Keyman keyboards + // for FLEx to be NFD-based. With the 2013 approach to keyboarding, we are not using TSF + // with Keyman 7 or 8. Marc promises that Keyman 9 will handle NFC context. Keeping the method + // in case we find we need NFD context for something... + return false; } void VwTextStore::GetCurrentWritingSystem() From 342c3c0383632b4d620df6c4ffc2d5373482d3fa Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Mon, 26 Aug 2013 17:00:28 +0200 Subject: [PATCH 12/15] Properly shutdown keyboard controller Change-Id: I1c6fbae0f4e799487945cbc352726788a7a114fe --- Src/Common/FieldWorks/FieldWorks.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Src/Common/FieldWorks/FieldWorks.cs b/Src/Common/FieldWorks/FieldWorks.cs index 6d51f49adf..3a6419db5b 100644 --- a/Src/Common/FieldWorks/FieldWorks.cs +++ b/Src/Common/FieldWorks/FieldWorks.cs @@ -3406,6 +3406,8 @@ private static void StaticDispose() s_serviceChannel = null; } + KeyboardController.Shutdown(); + GracefullyShutDown(); if (s_threadHelper != null) From e9617ba1e80953fa368c086cc44a9a178cbce00f Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 27 Aug 2013 16:09:24 +0200 Subject: [PATCH 13/15] Fix failing tests on Linux PalasoUIWindowsForms.dll requires Enchant.Net.dll otherwise trying to instantiate WritingSystemSetupModel fails with a TypeLoadException. Also fix a bug in ViewInputManager: OnMouseEvent has to always return false otherwise no further processing happens. Change-Id: I47e29617d5c86cbf25778fdaa391b23fa03452ca --- Build/mkall.targets | 21 +++++++++++++++++-- Src/Common/SimpleRootSite/ViewInputManager.cs | 3 ++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Build/mkall.targets b/Build/mkall.targets index bc3da2cecd..541fdb16a8 100644 --- a/Build/mkall.targets +++ b/Build/mkall.targets @@ -352,11 +352,22 @@ - + + + + + + + + + + + @@ -432,16 +443,22 @@ + + + + - + + + diff --git a/Src/Common/SimpleRootSite/ViewInputManager.cs b/Src/Common/SimpleRootSite/ViewInputManager.cs index f30d3d01de..ab73b4b3c4 100644 --- a/Src/Common/SimpleRootSite/ViewInputManager.cs +++ b/Src/Common/SimpleRootSite/ViewInputManager.cs @@ -92,13 +92,14 @@ public bool OnUpdateProp() /// /// Called when a mouse event happened. /// + /// Returns false. Returning true would mean that no further + /// processing of the mouse event should happen. public bool OnMouseEvent(int xd, int yd, Rect rcSrc, Rect rcDst, VwMouseEvent me) { var mouseEvent = (MouseEvent) me; if (mouseEvent == MouseEvent.kmeDown) { Keyboard.Activate(); - return true; } return false; } From 0a7d958d07e3ed14c7306cc211f222ad0b1aabc0 Mon Sep 17 00:00:00 2001 From: MarkS Date: Thu, 29 Aug 2013 15:21:21 -0600 Subject: [PATCH 14/15] Import SSL certificates before build package Needed for mono dependency download build task to connect to https Change-Id: I95e65263bbae1c7c200a4e871ab31b20211ef6aa --- Build/Agent/dependencies.config | 2 +- Makefile | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Build/Agent/dependencies.config b/Build/Agent/dependencies.config index ef8bec80b8..22c27e47c4 100644 --- a/Build/Agent/dependencies.config +++ b/Build/Agent/dependencies.config @@ -20,7 +20,7 @@ # any=@precise.any [common] -any=build-essential automake uuid-dev libenchant-dev xutils-dev libboost-dev libboost-test-dev graphicsmagick-libmagick-dev-compat libxklavier-dev libgraphite-dev libgtkmm-2.4-dev mono-gmcs mono-devel gtk-sharp2 git-gui openjdk-6-jre unzip gawk tofrodos ttf-mscorefonts-installer ttf-sil-charis xvfb xserver-xephyr metacity ibus bison mono-devel libgif-dev libjpeg-dev libexif-dev libhunspell-dev libtool xulrunner-geckofx geckofx +any=build-essential automake uuid-dev libenchant-dev xutils-dev libboost-dev libboost-test-dev graphicsmagick-libmagick-dev-compat libxklavier-dev libgraphite-dev libgtkmm-2.4-dev mono-gmcs mono-devel gtk-sharp2 git-gui openjdk-6-jre unzip gawk tofrodos ttf-mscorefonts-installer ttf-sil-charis xvfb xserver-xephyr metacity ibus bison mono-devel libgif-dev libjpeg-dev libexif-dev libhunspell-dev libtool xulrunner-geckofx geckofx wget [precise] any=libtiff4-dev diff --git a/Makefile b/Makefile index fc953d271e..c8d89b764f 100644 --- a/Makefile +++ b/Makefile @@ -707,7 +707,10 @@ Fw: Fw-build: (cd $(BUILD_ROOT)/Build && xbuild /t:remakefw) +# Import certificates so mono applications can check ssl certificates, specifically when a build task +# downloads dependency dlls. Output md5sum of certificates imported for the record. Fw-build-package: + (cd $(mktemp -d) && wget -q "http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1" && md5sum "certdata.txt?raw=1" && mozroots --import --sync --file "certdata.txt?raw=1") (cd $(BUILD_ROOT)/Build && xbuild /t:remakefw /property:config=release && xbuild /t:zipLocalizedLists) TE-run: ComponentsMap-nodep From 2a503b64fef3d551cdb265678562553177cbfa13 Mon Sep 17 00:00:00 2001 From: John Thomson Date: Wed, 11 Sep 2013 09:27:49 -0500 Subject: [PATCH 15/15] LT-14853 FW LDML reader sets WindowsLcid The main point of this change is that the FieldWorks code that reads LDML files needs to set the (legacy) WindowsLcid field that the Palaso code uses to figure out the active keyboard. Turns out the PalasoWritingSystem.LCID property is made obsolete by this, so I removed it. Unfortunately it was inherited from a COM interface, so that generated a lot of changes. Change-Id: I853c113469a31c2239c6d7e32851b43a819f5a4b --- Lib/linux/Common/FwKernelTlb.h | 24 +------ Lib/linux/Common/FwKernelTlb.idl | 53 +++++++-------- Lib/linux/Common/FwKernelTlb.tlb | Bin 95140 -> 95028 bytes Lib/linux/Common/LanguageTlb.h | 24 +------ Lib/linux/Common/LanguageTlb.idl | 55 +++++++--------- Lib/linux/Common/LanguageTlb.tlb | Bin 95148 -> 95036 bytes Lib/linux/Common/ViewsTlb.h | 4 +- Lib/linux/Common/ViewsTlb.idl | 46 ++++++------- Lib/linux/Common/ViewsTlb.tlb | Bin 83976 -> 83976 bytes Lib/linux/Common/idhfiles.MD5 | 2 +- .../PalasoWritingSystemManagerTests.cs | 9 ++- Src/Common/CoreImpl/PalasoWritingSystem.cs | 61 ------------------ .../CoreImpl/PalasoWritingSystemManager.cs | 10 +-- Src/Language/Language.idh | 7 -- Src/xWorks/NotebookExportDialog.cs | 6 +- 15 files changed, 91 insertions(+), 210 deletions(-) diff --git a/Lib/linux/Common/FwKernelTlb.h b/Lib/linux/Common/FwKernelTlb.h index b65ed24ef3..44bf793ce4 100644 --- a/Lib/linux/Common/FwKernelTlb.h +++ b/Lib/linux/Common/FwKernelTlb.h @@ -4,9 +4,9 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Mon Aug 26 13:18:10 2013 +/* at Tue Sep 10 15:51:54 2013 */ -/* Compiler settings for d:\fwrepo\fw\Output\Common\FwKernelTlb.idl: +/* Compiler settings for C:\fwrepo\fw\Output\Common\FwKernelTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 protocol : dce , ms_ext, c_ext, robust error checks: allocation ref bounds_check enum stub_data @@ -9447,12 +9447,6 @@ FwGraphiteProcess; virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ISO3( /* [retval][out] */ BSTR *pbstr) = 0; - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_LCID( - /* [retval][out] */ int *pnLocale) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_LCID( - /* [in] */ int nLocale) = 0; - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SpellCheckingId( /* [retval][out] */ BSTR *pbstr) = 0; @@ -9535,14 +9529,6 @@ FwGraphiteProcess; ILgWritingSystem * This, /* [retval][out] */ BSTR *pbstr); - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_LCID )( - ILgWritingSystem * This, - /* [retval][out] */ int *pnLocale); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_LCID )( - ILgWritingSystem * This, - /* [in] */ int nLocale); - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SpellCheckingId )( ILgWritingSystem * This, /* [retval][out] */ BSTR *pbstr); @@ -9639,12 +9625,6 @@ FwGraphiteProcess; #define ILgWritingSystem_get_ISO3(This,pbstr) \ ( (This)->lpVtbl -> get_ISO3(This,pbstr) ) -#define ILgWritingSystem_get_LCID(This,pnLocale) \ - ( (This)->lpVtbl -> get_LCID(This,pnLocale) ) - -#define ILgWritingSystem_put_LCID(This,nLocale) \ - ( (This)->lpVtbl -> put_LCID(This,nLocale) ) - #define ILgWritingSystem_get_SpellCheckingId(This,pbstr) \ ( (This)->lpVtbl -> get_SpellCheckingId(This,pbstr) ) diff --git a/Lib/linux/Common/FwKernelTlb.idl b/Lib/linux/Common/FwKernelTlb.idl index 7e8fe25695..63a8827ba3 100644 --- a/Lib/linux/Common/FwKernelTlb.idl +++ b/Lib/linux/Common/FwKernelTlb.idl @@ -1,4 +1,4 @@ -#line 1 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" +#line 1 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" @@ -15,7 +15,7 @@ import "oaidl.idl"; import "ocidl.idl"; import "objidl.idl"; -#line 1 "d:\\fwrepo\\fw\\src\\Generic\\common.idh" +#line 1 "C:\\fwrepo\\fw\\src\\Generic\\common.idh" @@ -119,11 +119,11 @@ cpp_quote("// This is for code that uses a 64-bit integer for SilTime.") cpp_quote("typedef __int64 SilTime;") cpp_quote("#endif") cpp_quote("") -#line 18 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" +#line 18 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("F1EF76E0-BE04-11d3-8D9A-005004DEFEC4") cpp_quote(",") cpp_quote("FwKernelLib") cpp_quote(");") [ uuid(F1EF76E0-BE04-11d3-8D9A-005004DEFEC4), version(1.0), helpstring("FieldWorks Kernel") ] library FwKernelLib { - #line 1 "d:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" + #line 1 "c:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" @@ -442,7 +442,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("6A46D810-7F14-4151-80F5-0B13 { interface IActionHandler; }; -#line 320 "d:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" +#line 320 "c:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" @@ -829,9 +829,9 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("24636FD1-DB8D-4b2c-B4C0-44C2 { interface IDebugReport; }; -#line 707 "d:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" +#line 707 "c:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" -#line 709 "d:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" +#line 709 "c:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" @@ -872,7 +872,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IUndoGrouper") cpp_ -#line 750 "d:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" +#line 750 "c:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" @@ -893,10 +893,10 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IComDisposable") cp -#line 771 "d:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" +#line 771 "c:\\fwrepo\\fw\\src\\kernel\\FwKernel.idh" -#line 22 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" - #line 1 "d:\\fwrepo\\fw\\src\\kernel\\TextServ.idh" +#line 22 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" + #line 1 "c:\\fwrepo\\fw\\src\\kernel\\TextServ.idh" @@ -2373,10 +2373,10 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 { interface ITsMultiString; }; -#line 1478 "d:\\fwrepo\\fw\\src\\kernel\\TextServ.idh" +#line 1478 "c:\\fwrepo\\fw\\src\\kernel\\TextServ.idh" -#line 23 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" - #line 1 "d:\\fwrepo\\fw\\src\\Language\\Render.idh" +#line 23 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" + #line 1 "C:\\fwrepo\\fw\\src\\Language\\Render.idh" @@ -2867,7 +2867,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 { interface IVwGraphicsWin32; }; - #line 492 "d:\\fwrepo\\fw\\src\\Language\\Render.idh" + #line 492 "C:\\fwrepo\\fw\\src\\Language\\Render.idh" @@ -3020,7 +3020,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 { interface IVwJustifier; }; - #line 645 "d:\\fwrepo\\fw\\src\\Language\\Render.idh" + #line 645 "C:\\fwrepo\\fw\\src\\Language\\Render.idh" @@ -3493,7 +3493,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 { interface IRenderEngine; }; - #line 1118 "d:\\fwrepo\\fw\\src\\Language\\Render.idh" + #line 1118 "C:\\fwrepo\\fw\\src\\Language\\Render.idh" @@ -3579,7 +3579,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 { interface IJustifyingRenderer; }; - #line 1204 "d:\\fwrepo\\fw\\src\\Language\\Render.idh" + #line 1204 "C:\\fwrepo\\fw\\src\\Language\\Render.idh" @@ -3627,10 +3627,10 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 -#line 1252 "d:\\fwrepo\\fw\\src\\Language\\Render.idh" +#line 1252 "C:\\fwrepo\\fw\\src\\Language\\Render.idh" -#line 24 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" - #line 1 "d:\\fwrepo\\fw\\src\\Language\\Language.idh" +#line 24 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" + #line 1 "C:\\fwrepo\\fw\\src\\Language\\Language.idh" @@ -3877,13 +3877,6 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 [out, retval] BSTR * pbstr); - [propget] HRESULT LCID( - [out, retval] int * pnLocale); - - [propput] HRESULT LCID( - [in] int nLocale); - - [propget] HRESULT SpellCheckingId( @@ -5468,7 +5461,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IRegexMatcher") cpp { interface ILgIcuLocaleEnumerator; }; -#line 1839 "d:\\fwrepo\\fw\\src\\Language\\Language.idh" +#line 1832 "C:\\fwrepo\\fw\\src\\Language\\Language.idh" -#line 25 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" +#line 25 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernelTlb.idl" }; diff --git a/Lib/linux/Common/FwKernelTlb.tlb b/Lib/linux/Common/FwKernelTlb.tlb index c919b14415ed957e36496bb0c1d0116af87dfc95..3bcde465569231fa6d4db84200a8873c22028c70 100644 GIT binary patch delta 30942 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 delta 30929 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 T9~*h-(97YnACf;zl%oGXpB!7~ diff --git a/Lib/linux/Common/LanguageTlb.h b/Lib/linux/Common/LanguageTlb.h index 0959f142b3..adc7aa0459 100644 --- a/Lib/linux/Common/LanguageTlb.h +++ b/Lib/linux/Common/LanguageTlb.h @@ -4,9 +4,9 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Mon Aug 26 13:18:09 2013 +/* at Tue Sep 10 15:51:53 2013 */ -/* Compiler settings for d:\fwrepo\fw\Output\Common\LanguageTlb.idl: +/* Compiler settings for C:\fwrepo\fw\Output\Common\LanguageTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 protocol : dce , ms_ext, c_ext, robust error checks: allocation ref bounds_check enum stub_data @@ -9448,12 +9448,6 @@ FwGraphiteProcess; virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ISO3( /* [retval][out] */ BSTR *pbstr) = 0; - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_LCID( - /* [retval][out] */ int *pnLocale) = 0; - - virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_LCID( - /* [in] */ int nLocale) = 0; - virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_SpellCheckingId( /* [retval][out] */ BSTR *pbstr) = 0; @@ -9536,14 +9530,6 @@ FwGraphiteProcess; ILgWritingSystem * This, /* [retval][out] */ BSTR *pbstr); - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_LCID )( - ILgWritingSystem * This, - /* [retval][out] */ int *pnLocale); - - /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_LCID )( - ILgWritingSystem * This, - /* [in] */ int nLocale); - /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_SpellCheckingId )( ILgWritingSystem * This, /* [retval][out] */ BSTR *pbstr); @@ -9640,12 +9626,6 @@ FwGraphiteProcess; #define ILgWritingSystem_get_ISO3(This,pbstr) \ ( (This)->lpVtbl -> get_ISO3(This,pbstr) ) -#define ILgWritingSystem_get_LCID(This,pnLocale) \ - ( (This)->lpVtbl -> get_LCID(This,pnLocale) ) - -#define ILgWritingSystem_put_LCID(This,nLocale) \ - ( (This)->lpVtbl -> put_LCID(This,nLocale) ) - #define ILgWritingSystem_get_SpellCheckingId(This,pbstr) \ ( (This)->lpVtbl -> get_SpellCheckingId(This,pbstr) ) diff --git a/Lib/linux/Common/LanguageTlb.idl b/Lib/linux/Common/LanguageTlb.idl index f05a20c3e3..35b7ff3af7 100644 --- a/Lib/linux/Common/LanguageTlb.idl +++ b/Lib/linux/Common/LanguageTlb.idl @@ -1,4 +1,4 @@ -#line 1 "d:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" +#line 1 "C:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" @@ -20,7 +20,7 @@ import "oaidl.idl"; import "ocidl.idl"; import "objidl.idl"; -#line 1 "d:\\fwrepo\\fw\\Src\\Generic\\common.idh" +#line 1 "C:\\fwrepo\\fw\\Src\\Generic\\common.idh" @@ -124,14 +124,14 @@ cpp_quote("// This is for code that uses a 64-bit integer for SilTime.") cpp_quote("typedef __int64 SilTime;") cpp_quote("#endif") cpp_quote("") -#line 23 "d:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" +#line 23 "C:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("b80ee180-c0f1-11d2-8078-0000c0fb81b5") cpp_quote(",") cpp_quote("LanguageLib") cpp_quote(");") [ uuid(b80ee180-c0f1-11d2-8078-0000c0fb81b5), version(1.0), helpstring("Language 1.0 Type Library") ] library LanguageLib -#line 26 "d:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" +#line 26 "C:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" { interface IOleDbEncap; - #line 1 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" + #line 1 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" @@ -450,7 +450,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("6A46D810-7F14-4151-80F5-0B13 { interface IActionHandler; }; -#line 320 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" +#line 320 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" @@ -837,9 +837,9 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("24636FD1-DB8D-4b2c-B4C0-44C2 { interface IDebugReport; }; -#line 707 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" +#line 707 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" -#line 709 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" +#line 709 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" @@ -880,7 +880,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IUndoGrouper") cpp_ -#line 750 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" +#line 750 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" @@ -901,10 +901,10 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IComDisposable") cp -#line 771 "d:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" +#line 771 "C:\\fwrepo\\fw\\src\\Kernel\\FwKernel.idh" -#line 30 "d:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" - #line 1 "d:\\fwrepo\\fw\\src\\Kernel\\TextServ.idh" +#line 30 "C:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" + #line 1 "C:\\fwrepo\\fw\\src\\Kernel\\TextServ.idh" @@ -2381,11 +2381,11 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 { interface ITsMultiString; }; -#line 1478 "d:\\fwrepo\\fw\\src\\Kernel\\TextServ.idh" +#line 1478 "C:\\fwrepo\\fw\\src\\Kernel\\TextServ.idh" -#line 31 "d:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" +#line 31 "C:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" - #line 1 "d:\\fwrepo\\fw\\src\\language\\Render.idh" + #line 1 "c:\\fwrepo\\fw\\src\\language\\Render.idh" @@ -2876,7 +2876,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 { interface IVwGraphicsWin32; }; - #line 492 "d:\\fwrepo\\fw\\src\\language\\Render.idh" + #line 492 "c:\\fwrepo\\fw\\src\\language\\Render.idh" @@ -3029,7 +3029,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 { interface IVwJustifier; }; - #line 645 "d:\\fwrepo\\fw\\src\\language\\Render.idh" + #line 645 "c:\\fwrepo\\fw\\src\\language\\Render.idh" @@ -3502,7 +3502,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 { interface IRenderEngine; }; - #line 1118 "d:\\fwrepo\\fw\\src\\language\\Render.idh" + #line 1118 "c:\\fwrepo\\fw\\src\\language\\Render.idh" @@ -3588,7 +3588,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 { interface IJustifyingRenderer; }; - #line 1204 "d:\\fwrepo\\fw\\src\\language\\Render.idh" + #line 1204 "c:\\fwrepo\\fw\\src\\language\\Render.idh" @@ -3636,10 +3636,10 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 -#line 1252 "d:\\fwrepo\\fw\\src\\language\\Render.idh" +#line 1252 "c:\\fwrepo\\fw\\src\\language\\Render.idh" -#line 33 "d:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" - #line 1 "d:\\fwrepo\\fw\\src\\language\\Language.idh" +#line 33 "C:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" + #line 1 "c:\\fwrepo\\fw\\src\\language\\Language.idh" @@ -3886,13 +3886,6 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("7A1B89C0-C2D6-11d3-9BB7-0040 [out, retval] BSTR * pbstr); - [propget] HRESULT LCID( - [out, retval] int * pnLocale); - - [propput] HRESULT LCID( - [in] int nLocale); - - [propget] HRESULT SpellCheckingId( @@ -5477,7 +5470,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IRegexMatcher") cpp { interface ILgIcuLocaleEnumerator; }; -#line 1839 "d:\\fwrepo\\fw\\src\\language\\Language.idh" +#line 1832 "c:\\fwrepo\\fw\\src\\language\\Language.idh" -#line 34 "d:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" +#line 34 "C:\\fwrepo\\fw\\Src\\Language\\LanguageTlb.idl" }; diff --git a/Lib/linux/Common/LanguageTlb.tlb b/Lib/linux/Common/LanguageTlb.tlb index 48339f7ef1466e38d362fe1dad6466fece3335a8..e036d6ae9fa9ef35483e5d4c7128d7ffbc611e2a 100644 GIT binary patch delta 30699 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 delta 30836 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 diff --git a/Lib/linux/Common/ViewsTlb.h b/Lib/linux/Common/ViewsTlb.h index 8b9acaef75..a856b4b653 100644 --- a/Lib/linux/Common/ViewsTlb.h +++ b/Lib/linux/Common/ViewsTlb.h @@ -4,9 +4,9 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Mon Aug 26 13:18:11 2013 +/* at Tue Sep 10 15:51:55 2013 */ -/* Compiler settings for d:\fwrepo\fw\Output\Common\ViewsTlb.idl: +/* Compiler settings for C:\fwrepo\fw\Output\Common\ViewsTlb.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 protocol : dce , ms_ext, c_ext, robust error checks: allocation ref bounds_check enum stub_data diff --git a/Lib/linux/Common/ViewsTlb.idl b/Lib/linux/Common/ViewsTlb.idl index 0416032ea5..bac77d9218 100644 --- a/Lib/linux/Common/ViewsTlb.idl +++ b/Lib/linux/Common/ViewsTlb.idl @@ -1,4 +1,4 @@ -#line 1 "d:\\fwrepo\\fw\\Src\\Views\\ViewsTlb.idl" +#line 1 "C:\\fwrepo\\fw\\Src\\Views\\ViewsTlb.idl" @@ -18,7 +18,7 @@ import "oaidl.idl"; import "ocidl.idl"; import "objidl.idl"; -#line 1 "d:\\fwrepo\\fw\\Src\\Generic\\common.idh" +#line 1 "C:\\fwrepo\\fw\\Src\\Generic\\common.idh" @@ -122,15 +122,15 @@ cpp_quote("// This is for code that uses a 64-bit integer for SilTime.") cpp_quote("typedef __int64 SilTime;") cpp_quote("#endif") cpp_quote("") -#line 21 "d:\\fwrepo\\fw\\Src\\Views\\ViewsTlb.idl" +#line 21 "C:\\fwrepo\\fw\\Src\\Views\\ViewsTlb.idl" cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000c0fb81b5") cpp_quote(",") cpp_quote("Views") cpp_quote(");") [ uuid(f6d10640-c00c-11d2-8078-0000c0fb81b5), version(1.0), helpstring("Views 1.0 Type Library") ] library Views -#line 24 "d:\\fwrepo\\fw\\Src\\Views\\ViewsTlb.idl" +#line 24 "C:\\fwrepo\\fw\\Src\\Views\\ViewsTlb.idl" { importlib("FwKernelTlb.tlb"); - #line 1 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 1 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -1514,7 +1514,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 interface IVwCacheDa; interface IStructuredTextDataAccess; }; - #line 1385 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 1385 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -1728,7 +1728,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 -#line 1599 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 1599 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -2530,7 +2530,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwRootBox; }; -#line 2401 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 2401 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -4376,14 +4376,14 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 -#line 4247 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 4247 "c:\\fwrepo\\fw\\src\\views\\Views.idh" }; cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("CCE2A7ED-464C-4ec7-A0B0-E3C1F6B94C5A") cpp_quote(",") cpp_quote("VwStylesheet") cpp_quote(");") [ uuid(CCE2A7ED-464C-4ec7-A0B0-E3C1F6B94C5A) ] coclass VwStylesheet { interface IVwStylesheet; }; -#line 4254 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 4254 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -4460,7 +4460,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwPropertyStore; }; - #line 4331 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 4331 "c:\\fwrepo\\fw\\src\\views\\Views.idh" typedef [v1_enum] enum VwOverlayFlags @@ -4744,7 +4744,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwOverlay; }; - #line 4615 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 4615 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -4956,7 +4956,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwPrintContext; }; - #line 4827 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 4827 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5267,7 +5267,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwPattern; }; - #line 5138 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5138 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5301,7 +5301,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 interface IVwTxtSrcInit2; interface IVwTextSource; }; - #line 5172 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5172 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5333,7 +5333,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 interface IVwTxtSrcInit; interface IVwTextSource; }; - #line 5204 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5204 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5375,7 +5375,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwSearchKiller; }; - #line 5246 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5246 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5455,7 +5455,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwDrawRootBuffered; }; - #line 5326 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5326 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5503,7 +5503,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("f6d10640-c00c-11d2-8078-0000 { interface IVwSynchronizer; }; - #line 5374 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5374 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5672,7 +5672,7 @@ cpp_quote("ATTACH_GUID_TO_CLASS(class,") cpp_quote("1CD09E06-6978-4969-A1FC-4627 { interface IVwLayoutStream; }; -#line 5543 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 5543 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -5785,7 +5785,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IVwLayoutManager") { interface IPictureFactory; }; -#line 5656 "d:\\fwrepo\\fw\\src\\views\\Views.idh" +#line 5656 "c:\\fwrepo\\fw\\src\\views\\Views.idh" @@ -6019,7 +6019,7 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IVwLayoutManager") { interface IVwWindow; }; - #line 5890 "d:\\fwrepo\\fw\\src\\views\\Views.idh" + #line 5890 "c:\\fwrepo\\fw\\src\\views\\Views.idh" typedef [v1_enum] enum VwMouseEvent @@ -6088,6 +6088,6 @@ cpp_quote("GENERIC_DECLARE_SMART_INTERFACE_PTR(") cpp_quote("IViewInputMgr") cpp HRESULT OnTextChange(); } -#line 29 "d:\\fwrepo\\fw\\Src\\Views\\ViewsTlb.idl" +#line 29 "C:\\fwrepo\\fw\\Src\\Views\\ViewsTlb.idl" }; diff --git a/Lib/linux/Common/ViewsTlb.tlb b/Lib/linux/Common/ViewsTlb.tlb index f025abc5890d463477af55d147796f2a6d44bda2..0e8bd010126e4837e87674ca71e7a4d83aff6df5 100644 GIT binary patch delta 45 zcmeB}z}hi^b%XFqxscLSh2Ycz1w#V`LsKhLLn~8L1tSAPV=iHaoHqT - /// Gets or sets the Windows locale ID, consisting of sort-id (4 bits) and language-id - /// (16 bits, low word). - /// - /// NOTE: the LCID consists of sort-id (4 bits) and language id (16bits, low - /// word). This is different from the input locale identifier (ILID), which consist of - /// input method id (16 bits) and language id (16 bits, low word). Often LCID and ILID - /// will be the same, but not necessarily. - public int LCID - { - get - { - lock (m_syncRoot) - { - if (m_lcid == 0) - { - // On Linux InstalledInputLanguages or DefaultInputLanguage doesn't do anything sensible. - // see: https://bugzilla.novell.com/show_bug.cgi?id=613014 - // so just default to en-US. - if (MiscUtils.IsUnix) - return new CultureInfo("en-US").LCID; - var defaultLang = InputLanguage.DefaultInputLanguage; - - InputLanguage first = null; - foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages) - { - try - { - if (lang.Culture.IetfLanguageTag != Id) - continue; - first = lang; - break; - } - catch (ArgumentException e) - { - // Skip unsupported cultures. - } - } - var inputLanguage = first ?? InputLanguage.DefaultInputLanguage; - return inputLanguage.Culture.LCID; - } - return m_lcid; - } - } - - set - { - lock (m_syncRoot) - { - if (m_lcid != value) - { - m_lcid = value; - m_currentLcid = value; - Modified = true; - } - } - } - } - /// /// Gets or sets a value indicating whether the script is right-to-left. /// @@ -1146,7 +1087,6 @@ public void Copy(IWritingSystem source) lock (pws.m_syncRoot) { // ILgWritingSystem properties - lcid = pws.LCID; spellCheckingId = pws.SpellCheckingId; rtol = pws.RightToLeftScript; defFontFeats = pws.DefaultFontFeatures; @@ -1179,7 +1119,6 @@ public void Copy(IWritingSystem source) lock (m_syncRoot) { // ILgWritingSystem properties - LCID = lcid; SpellCheckingId = spellCheckingId; RightToLeftScript = rtol; DefaultFontFeatures = defFontFeats; diff --git a/Src/Common/CoreImpl/PalasoWritingSystemManager.cs b/Src/Common/CoreImpl/PalasoWritingSystemManager.cs index 0116b78f5f..ef9ed8fe3f 100644 --- a/Src/Common/CoreImpl/PalasoWritingSystemManager.cs +++ b/Src/Common/CoreImpl/PalasoWritingSystemManager.cs @@ -1189,9 +1189,8 @@ protected override void ReadTopLevelSpecialElement(XmlReader reader, WritingSyst } } } - int lcid; - if (int.TryParse(GetSpecialValue(reader, "fw", "windowsLCID"), out lcid)) - fwWs.LCID = lcid; + var lcidString = GetSpecialValue(reader, "fw", "windowsLCID"); + ((ILegacyWritingSystemDefinition)fwWs).WindowsLcid = lcidString; while (reader.NodeType != XmlNodeType.EndElement) reader.Read(); @@ -1222,8 +1221,9 @@ protected override void WriteTopLevelSpecialElements(XmlWriter writer, XmlReader WriteSpecialValue(writer, "fw", "scriptName", fwWs.ScriptName); WriteSpecialValue(writer, "fw", "validChars", fwWs.ValidChars); WriteSpecialValue(writer, "fw", "variantName", fwWs.VariantName); - if (fwWs.LCID != 0) - WriteSpecialValue(writer, "fw", "windowsLCID", fwWs.LCID.ToString()); + var legacyWs = (ILegacyWritingSystemDefinition)fwWs; + if (!string.IsNullOrEmpty(legacyWs.WindowsLcid)) + WriteSpecialValue(writer, "fw", "windowsLCID", legacyWs.WindowsLcid); writer.WriteEndElement(); } } diff --git a/Src/Language/Language.idh b/Src/Language/Language.idh index 7e4002d1a8..13b3f58ca7 100644 --- a/Src/Language/Language.idh +++ b/Src/Language/Language.idh @@ -243,13 +243,6 @@ Description: [propget] HRESULT ISO3( [out, retval] BSTR * pbstr); - // Get the locale assigned to this writing system. - [propget] HRESULT LCID( - [out, retval] int * pnLocale); - // Set the locale for this writing system. - [propput] HRESULT LCID( - [in] int nLocale); - // Get the name of the spelling dictionary to use for this writing system. // Currently returns a generally-useful default, unless explicitly set to empty // to prevent this. diff --git a/Src/xWorks/NotebookExportDialog.cs b/Src/xWorks/NotebookExportDialog.cs index 7f6dbba6d0..35e8b779ec 100644 --- a/Src/xWorks/NotebookExportDialog.cs +++ b/Src/xWorks/NotebookExportDialog.cs @@ -22,6 +22,7 @@ using System.Diagnostics; using System.IO; using System.Xml; +using Palaso.WritingSystems; using XCore; using System.Text; using SIL.CoreImpl; @@ -228,7 +229,10 @@ private void ExportLanguages(TextWriter writer) XmlUtils.MakeSafeXml(wsLocal.LanguageName)); writer.WriteLine("{0}", XmlUtils.MakeSafeXml(wsLocal.Abbreviation)); - writer.WriteLine("", wsLocal.LCID); + // We previously wrote out the LCID, but this is obsolete. It would be unreliable to output the WindowsLcid, which only + // old writing systems will have. If something needs this, we need to output something new in its place. But I'm pretty sure + // nothing does...Locale is not used in any of the notebook output transforms. + //writer.WriteLine("", ((ILegacyWritingSystemDefinition)wsLocal).WindowsLcid); writer.WriteLine("", wsLocal.RightToLeftScript ? "true" : "false"); if (ws == m_cache.DefaultAnalWs)